From 9fe2894efe29427613e31aaa946afc2ec7a12f05 Mon Sep 17 00:00:00 2001 From: Knah Tsaeb Date: Mon, 14 Jun 2021 14:36:23 +0200 Subject: [PATCH] First release --- .gitignore | 7 + .htaccess | 19 ++ LICENSE | 613 +++++++++++++++++++++++++++++++++++ README.md | 47 +++ android-chrome-192x192.png | Bin 0 -> 9736 bytes apple-touch-icon.png | Bin 0 -> 9684 bytes apps/apps.php | 147 +++++++++ browserconfig.xml | 9 + composer.json | 7 + config/.htaccess | 4 + content/.htaccess | 4 + content/default.md | 47 +++ css/dark.css | 631 +++++++++++++++++++++++++++++++++++++ css/main.css | 130 ++++++++ favicon-16x16.png | Bin 0 -> 7841 bytes favicon-32x32.png | Bin 0 -> 7977 bytes favicon.ico | Bin 0 -> 15086 bytes humans.txt | 16 + index.php | 87 +++++ mstile-150x150.png | Bin 0 -> 1465 bytes safari-pinned-tab.svg | 1 + site.webmanifest | 14 + tpl/aside.html | 6 + tpl/footer.html | 9 + tpl/header.html | 36 +++ tpl/main.html | 11 + 26 files changed, 1845 insertions(+) create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 LICENSE create mode 100644 README.md create mode 100644 android-chrome-192x192.png create mode 100644 apple-touch-icon.png create mode 100644 apps/apps.php create mode 100644 browserconfig.xml create mode 100644 composer.json create mode 100644 config/.htaccess create mode 100644 content/.htaccess create mode 100644 content/default.md create mode 100644 css/dark.css create mode 100644 css/main.css create mode 100644 favicon-16x16.png create mode 100644 favicon-32x32.png create mode 100644 favicon.ico create mode 100644 humans.txt create mode 100644 index.php create mode 100644 mstile-150x150.png create mode 100644 safari-pinned-tab.svg create mode 100644 site.webmanifest create mode 100644 tpl/aside.html create mode 100644 tpl/footer.html create mode 100644 tpl/header.html create mode 100644 tpl/main.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..03c02dc --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +composer.lock +vendor/ +content/* +!content/default.md +!content/.htaccess +.vscode +config/config.php \ No newline at end of file diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..a70d0d5 --- /dev/null +++ b/.htaccess @@ -0,0 +1,19 @@ +Options -Indexes + + +RewriteEngine On +RewriteCond $1 !^(css) +RewriteRule ^([^/]*)/([^/]*)$ /?dir=$1&file=$2 [L] +AddType text/css .css + + + +Header always set X-FRAME-OPTIONS "DENY" +Header set Content-Security-Policy "script-src 'self'" +Header set Content-Security-Policy "base-uri 'self';" + + + +ExpiresActive On +ExpiresDefault "access plus 1 day" + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e37e32e --- /dev/null +++ b/LICENSE @@ -0,0 +1,613 @@ +GNU AFFERO GENERAL PUBLIC LICENSE + +Version 3, 19 November 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +Preamble + +The GNU Affero General Public License is a free, copyleft license for software +and other kinds of works, specifically designed to ensure cooperation with +the community in the case of network server software. + +The licenses for most software and other practical works are designed to take +away your freedom to share and change the works. By contrast, our General +Public Licenses are intended to guarantee your freedom to share and change +all versions of a program--to make sure it remains free software for all its +users. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom +to distribute copies of free software (and charge for them if you wish), that +you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs, and that you know you +can do these things. + +Developers that use our General Public Licenses protect your rights with two +steps: (1) assert copyright on the software, and (2) offer you this License +which gives you legal permission to copy, distribute and/or modify the software. + +A secondary benefit of defending all users' freedom is that improvements made +in alternate versions of the program, if they receive widespread use, become +available for other developers to incorporate. Many developers of free software +are heartened and encouraged by the resulting cooperation. However, in the +case of software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and letting +the public access it on a server without ever releasing its source code to +the public. + +The GNU Affero General Public License is designed specifically to ensure that, +in such cases, the modified source code becomes available to the community. +It requires the operator of a network server to provide the source code of +the modified version running there to the users of that server. Therefore, +public use of a modified version, on a publicly accessible server, gives the +public access to the source code of the modified version. + +An older license, called the Affero General Public License and published by +Affero, was designed to accomplish similar goals. This is a different license, +not a version of the Affero GPL, but Affero has released a new version of +the Affero GPL which permits relicensing under this license. + +The precise terms and conditions for copying, distribution and modification +follow. + +TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of works, +such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this License. +Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals +or organizations. + +To "modify" a work means to copy from or adapt all or part of the work in +a fashion requiring copyright permission, other than the making of an exact +copy. The resulting work is called a "modified version" of the earlier work +or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based on the +Program. + +To "propagate" a work means to do anything with it that, without permission, +would make you directly or secondarily liable for infringement under applicable +copyright law, except executing it on a computer or modifying a private copy. +Propagation includes copying, distribution (with or without modification), +making available to the public, and in some countries other activities as +well. + +To "convey" a work means any kind of propagation that enables other parties +to make or receive copies. Mere interaction with a user through a computer +network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" to the +extent that it includes a convenient and prominently visible feature that +(1) displays an appropriate copyright notice, and (2) tells the user that +there is no warranty for the work (except to the extent that warranties are +provided), that licensees may convey the work under this License, and how +to view a copy of this License. If the interface presents a list of user commands +or options, such as a menu, a prominent item in the list meets this criterion. + + 1. Source Code. + +The "source code" for a work means the preferred form of the work for making +modifications to it. "Object code" means any non-source form of a work. + +A "Standard Interface" means an interface that either is an official standard +defined by a recognized standards body, or, in the case of interfaces specified +for a particular programming language, one that is widely used among developers +working in that language. + +The "System Libraries" of an executable work include anything, other than +the work as a whole, that (a) is included in the normal form of packaging +a Major Component, but which is not part of that Major Component, and (b) +serves only to enable use of the work with that Major Component, or to implement +a Standard Interface for which an implementation is available to the public +in source code form. A "Major Component", in this context, means a major essential +component (kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to produce +the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all the source +code needed to generate, install, and (for an executable work) run the object +code and to modify the work, including scripts to control those activities. +However, it does not include the work's System Libraries, or general-purpose +tools or generally available free programs which are used unmodified in performing +those activities but which are not part of the work. For example, Corresponding +Source includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically linked +subprograms that the work is specifically designed to require, such as by +intimate data communication or control flow between those + + subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate +automatically from other parts of the Corresponding Source. + + The Corresponding Source for a work in source code form is that same work. + + 2. Basic Permissions. + +All rights granted under this License are granted for the term of copyright +on the Program, and are irrevocable provided the stated conditions are met. +This License explicitly affirms your unlimited permission to run the unmodified +Program. The output from running a covered work is covered by this License +only if the output, given its content, constitutes a covered work. This License +acknowledges your rights of fair use or other equivalent, as provided by copyright +law. + +You may make, run and propagate covered works that you do not convey, without +conditions so long as your license otherwise remains in force. You may convey +covered works to others for the sole purpose of having them make modifications +exclusively for you, or provide you with facilities for running those works, +provided that you comply with the terms of this License in conveying all material +for which you do not control copyright. Those thus making or running the covered +works for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of your copyrighted +material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions +stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological measure +under any applicable law fulfilling obligations under article 11 of the WIPO +copyright treaty adopted on 20 December 1996, or similar laws prohibiting +or restricting circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention +of technological measures to the extent such circumvention is effected by +exercising rights under this License with respect to the covered work, and +you disclaim any intention to limit operation or modification of the work +as a means of enforcing, against the work's users, your or third parties' +legal rights to forbid circumvention of technological measures. + + 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you receive +it, in any medium, provided that you conspicuously and appropriately publish +on each copy an appropriate copyright notice; keep intact all notices stating +that this License and any non-permissive terms added in accord with section +7 apply to the code; keep intact all notices of the absence of any warranty; +and give all recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you +may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to produce +it from the Program, in the form of source code under the terms of section +4, provided that you also meet all of these conditions: + +a) The work must carry prominent notices stating that you modified it, and +giving a relevant date. + +b) The work must carry prominent notices stating that it is released under +this License and any conditions added under section 7. This requirement modifies +the requirement in section 4 to "keep intact all notices". + +c) You must license the entire work, as a whole, under this License to anyone +who comes into possession of a copy. This License will therefore apply, along +with any applicable section 7 additional terms, to the whole of the work, +and all its parts, regardless of how they are packaged. This License gives +no permission to license the work in any other way, but it does not invalidate +such permission if you have separately received it. + +d) If the work has interactive user interfaces, each must display Appropriate +Legal Notices; however, if the Program has interactive interfaces that do +not display Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, +which are not by their nature extensions of the covered work, and which are +not combined with it such as to form a larger program, in or on a volume of +a storage or distribution medium, is called an "aggregate" if the compilation +and its resulting copyright are not used to limit the access or legal rights +of the compilation's users beyond what the individual works permit. Inclusion +of a covered work in an aggregate does not cause this License to apply to +the other parts of the aggregate. + + 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of sections +4 and 5, provided that you also convey the machine-readable Corresponding +Source under the terms of this License, in one of these ways: + +a) Convey the object code in, or embodied in, a physical product (including +a physical distribution medium), accompanied by the Corresponding Source fixed +on a durable physical medium customarily used for software interchange. + +b) Convey the object code in, or embodied in, a physical product (including +a physical distribution medium), accompanied by a written offer, valid for +at least three years and valid for as long as you offer spare parts or customer +support for that product model, to give anyone who possesses the object code +either (1) a copy of the Corresponding Source for all the software in the +product that is covered by this License, on a durable physical medium customarily +used for software interchange, for a price no more than your reasonable cost +of physically performing this conveying of source, or (2) access to copy the +Corresponding Source from a network server at no charge. + +c) Convey individual copies of the object code with a copy of the written +offer to provide the Corresponding Source. This alternative is allowed only +occasionally and noncommercially, and only if you received the object code +with such an offer, in accord with subsection 6b. + +d) Convey the object code by offering access from a designated place (gratis +or for a charge), and offer equivalent access to the Corresponding Source +in the same way through the same place at no further charge. You need not +require recipients to copy the Corresponding Source along with the object +code. If the place to copy the object code is a network server, the Corresponding +Source may be on a different server (operated by you or a third party) that +supports equivalent copying facilities, provided you maintain clear directions +next to the object code saying where to find the Corresponding Source. Regardless +of what server hosts the Corresponding Source, you remain obligated to ensure +that it is available for as long as needed to satisfy these requirements. + +e) Convey the object code using peer-to-peer transmission, provided you inform +other peers where the object code and Corresponding Source of the work are +being offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from +the Corresponding Source as a System Library, need not be included in conveying +the object code work. + +A "User Product" is either (1) a "consumer product", which means any tangible +personal property which is normally used for personal, family, or household +purposes, or (2) anything designed or sold for incorporation into a dwelling. +In determining whether a product is a consumer product, doubtful cases shall +be resolved in favor of coverage. For a particular product received by a particular +user, "normally used" refers to a typical or common use of that class of product, +regardless of the status of the particular user or of the way in which the +particular user actually uses, or expects or is expected to use, the product. +A product is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent the +only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, procedures, +authorization keys, or other information required to install and execute modified +versions of a covered work in that User Product from a modified version of +its Corresponding Source. The information must suffice to ensure that the +continued functioning of the modified object code is in no case prevented +or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically +for use in, a User Product, and the conveying occurs as part of a transaction +in which the right of possession and use of the User Product is transferred +to the recipient in perpetuity or for a fixed term (regardless of how the +transaction is characterized), the Corresponding Source conveyed under this +section must be accompanied by the Installation Information. But this requirement +does not apply if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has been installed +in ROM). + +The requirement to provide Installation Information does not include a requirement +to continue to provide support service, warranty, or updates for a work that +has been modified or installed by the recipient, or for the User Product in +which it has been modified or installed. Access to a network may be denied +when the modification itself materially and adversely affects the operation +of the network or violates the rules and protocols for communication across +the network. + +Corresponding Source conveyed, and Installation Information provided, in accord +with this section must be in a format that is publicly documented (and with +an implementation available to the public in source code form), and must require +no special password or key for unpacking, reading or copying. + + 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this License +by making exceptions from one or more of its conditions. Additional permissions +that are applicable to the entire Program shall be treated as though they +were included in this License, to the extent that they are valid under applicable +law. If additional permissions apply only to part of the Program, that part +may be used separately under those permissions, but the entire Program remains +governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any +additional permissions from that copy, or from any part of it. (Additional +permissions may be written to require their own removal in certain cases when +you modify the work.) You may place additional permissions on material, added +by you to a covered work, for which you have or can give appropriate copyright +permission. + +Notwithstanding any other provision of this License, for material you add +to a covered work, you may (if authorized by the copyright holders of that +material) supplement the terms of this License with terms: + +a) Disclaiming warranty or limiting liability differently from the terms of +sections 15 and 16 of this License; or + +b) Requiring preservation of specified reasonable legal notices or author +attributions in that material or in the Appropriate Legal Notices displayed +by works containing it; or + +c) Prohibiting misrepresentation of the origin of that material, or requiring +that modified versions of such material be marked in reasonable ways as different +from the original version; or + +d) Limiting the use for publicity purposes of names of licensors or authors +of the material; or + +e) Declining to grant rights under trademark law for use of some trade names, +trademarks, or service marks; or + +f) Requiring indemnification of licensors and authors of that material by +anyone who conveys the material (or modified versions of it) with contractual +assumptions of liability to the recipient, for any liability that these contractual +assumptions directly impose on those licensors and authors. + +All other non-permissive additional terms are considered "further restrictions" +within the meaning of section 10. If the Program as you received it, or any +part of it, contains a notice stating that it is governed by this License +along with a term that is a further restriction, you may remove that term. +If a license document contains a further restriction but permits relicensing +or conveying under this License, you may add to a covered work material governed +by the terms of that license document, provided that the further restriction +does not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, +in the relevant source files, a statement of the additional terms that apply +to those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form +of a separately written license, or stated as exceptions; the above requirements +apply either way. + + 8. Termination. + +You may not propagate or modify a covered work except as expressly provided +under this License. Any attempt otherwise to propagate or modify it is void, +and will automatically terminate your rights under this License (including +any patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from +a particular copyright holder is reinstated (a) provisionally, unless and +until the copyright holder explicitly and finally terminates your license, +and (b) permanently, if the copyright holder fails to notify you of the violation +by some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently +if the copyright holder notifies you of the violation by some reasonable means, +this is the first time you have received notice of violation of this License +(for any work) from that copyright holder, and you cure the violation prior +to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses +of parties who have received copies or rights from you under this License. +If your rights have been terminated and not permanently reinstated, you do +not qualify to receive new licenses for the same material under section 10. + + 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy +of the Program. Ancillary propagation of a covered work occurring solely as +a consequence of using peer-to-peer transmission to receive a copy likewise +does not require acceptance. However, nothing other than this License grants +you permission to propagate or modify any covered work. These actions infringe +copyright if you do not accept this License. Therefore, by modifying or propagating +a covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives +a license from the original licensors, to run, modify and propagate that work, +subject to this License. You are not responsible for enforcing compliance +by third parties with this License. + +An "entity transaction" is a transaction transferring control of an organization, +or substantially all assets of one, or subdividing an organization, or merging +organizations. If propagation of a covered work results from an entity transaction, +each party to that transaction who receives a copy of the work also receives +whatever licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the Corresponding +Source of the work from the predecessor in interest, if the predecessor has +it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights +granted or affirmed under this License. For example, you may not impose a +license fee, royalty, or other charge for exercise of rights granted under +this License, and you may not initiate litigation (including a cross-claim +or counterclaim in a lawsuit) alleging that any patent claim is infringed +by making, using, selling, offering for sale, or importing the Program or +any portion of it. + + 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this License +of the Program or a work on which the Program is based. The work thus licensed +is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned or controlled +by the contributor, whether already acquired or hereafter acquired, that would +be infringed by some manner, permitted by this License, of making, using, +or selling its contributor version, but do not include claims that would be +infringed only as a consequence of further modification of the contributor +version. For purposes of this definition, "control" includes the right to +grant patent sublicenses in a manner consistent with the requirements of this +License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent +license under the contributor's essential patent claims, to make, use, sell, +offer for sale, import and otherwise run, modify and propagate the contents +of its contributor version. + +In the following three paragraphs, a "patent license" is any express agreement +or commitment, however denominated, not to enforce a patent (such as an express +permission to practice a patent or covenant not to s ue for patent infringement). +To "grant" such a patent license to a party means to make such an agreement +or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the +Corresponding Source of the work is not available for anyone to copy, free +of charge and under the terms of this License, through a publicly available +network server or other readily accessible means, then you must either (1) +cause the Corresponding Source to be so available, or (2) arrange to deprive +yourself of the benefit of the patent license for this particular work, or +(3) arrange, in a manner consistent with the requirements of this License, +to extend the patent + +license to downstream recipients. "Knowingly relying" means you have actual +knowledge that, but for the patent license, your conveying the covered work +in a country, or your recipient's use of the covered work in a country, would +infringe one or more identifiable patents in that country that you have reason +to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, +you convey, or propagate by procuring conveyance of, a covered work, and grant +a patent license to some of the parties receiving the covered work authorizing +them to use, propagate, modify or convey a specific copy of the covered work, +then the patent license you grant is automatically extended to all recipients +of the covered work and works based on it. + +A patent license is "discriminatory" if it does not include within the scope +of its coverage, prohibits the exercise of, or is conditioned on the non-exercise +of one or more of the rights that are specifically granted under this License. +You may not convey a covered work if you are a party to an arrangement with +a third party that is in the business of distributing software, under which +you make payment to the third party based on the extent of your activity of +conveying the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by you +(or copies made from those copies), or (b) primarily for and in connection +with specific products or compilations that contain the covered work, unless +you entered into that arrangement, or that patent license was granted, prior +to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied +license or other defenses to infringement that may otherwise be available +to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or otherwise) +that contradict the conditions of this License, they do not excuse you from +the conditions of this License. If you cannot convey a covered work so as +to satisfy simultaneously your obligations under this License and any other +pertinent obligations, then as a consequence you may + +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey the +Program, the only way you could satisfy both those terms and this License +would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + +Notwithstanding any other provision of this License, if you modify the Program, +your modified version must prominently offer all users interacting with it +remotely through a computer network (if your version supports such interaction) +an opportunity to receive the Corresponding Source of your version by providing +access to the Corresponding Source from a network server at no charge, through +some standard or customary means of facilitating copying of software. This +Corresponding Source shall include the Corresponding Source for any work covered +by version 3 of the GNU General Public License that is incorporated pursuant +to the following paragraph. + +Notwithstanding any other provision of this License, you have permission to +link or combine any covered work with a work licensed under version 3 of the +GNU General Public License into a single combined work, and to convey the +resulting work. The terms of this License will continue to apply to the part +which is the covered work, but the work with which it is combined will remain +governed by version 3 of the GNU General Public License. + + 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the +GNU Affero General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to address +new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies +that a certain numbered version of the GNU Affero General Public License "or +any later version" applies to it, you have the option of following the terms +and conditions either of that numbered version or of any later version published +by the Free Software Foundation. If the Program does not specify a version +number of the GNU Affero General Public License, you may choose any version +ever published by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of +the GNU Affero General Public License can be used, that proxy's public statement +of acceptance of a version permanently authorizes you to choose that version +for the Program. + +Later license versions may give you additional or different permissions. However, +no additional obligations are imposed on any author or copyright holder as +a result of your choosing to follow a later version. + + 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE +LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM +PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + + 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL +ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM +AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, +INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO +USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED +INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE +PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot +be given local legal effect according to their terms, reviewing courts shall +apply local law that most closely approximates an absolute waiver of all civil +liability in connection with the Program, unless a warranty or assumption +of liability accompanies a copy of the Program in return for a fee. END OF +TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively state the exclusion +of warranty; and each file should have at least the "copyright" line and a +pointer to where the full notice is found. + + + +Copyright (C) + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +details. + +You should have received a copy of the GNU Affero General Public License along +with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, +you should also make sure that it provides a way for users to get its source. +For example, if your program is a web application, its interface could display +a "Source" link that leads users to an archive of the code. There are many +ways you could offer source, and different solutions will be better for different +programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. For +more information on this, and how to apply and follow the GNU AGPL, see . diff --git a/README.md b/README.md new file mode 100644 index 0000000..4318526 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# Welcome to MyNoVi + +MyNovi | My Notes Viewer is simple markdown viewer made for my usage. + +## Features +- No configuration +- Easy install +- Auto ToC (Table of Content) +- Browser lazy loading in image +- KISS + +### Limitations + +MyNovi only work with one level dir (for moment). + +--- + +## Setup +Clone this Mynovi using git + +`git clone https://forge.leslibres.org/Knah-Tsaeb/MyNoVi.git` + +Use composer to install external lib (Parsedown and Parsedown-toc) + +`cd MyNoVi` + +`composer install` + +--- + +## Usage +Put your markdown file in 'content' dir via FTP OR SSH. + +That's all. + +You can personalize the default page by creating file **content/index.md**. + +### Advanced usage + +Use synchronisation tools like NextCloud. Sync 'content' dir with your desktop. +Now just edit your local file and when you save file, after synchro your file is online. + +--- + +## License + +This project is licensed under the terms of the **[AGPLv3](https://www.gnu.org/licenses/agpl-3.0.txt)** license. \ No newline at end of file diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..58c46f3429d1f66f6322c84adaa06422be1633db GIT binary patch literal 9736 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 K*;;9f@c#!_QE|xt literal 0 HcmV?d00001 diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7946025826b8f8d0376f07b60586e93f913f8e GIT binary patch literal 9684 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 W7ZG&wLN%2D0000 + * @global + * @param mixed $data + * @param string $name Default: '' + * @return void + */ +function n_print($data, $name = '') +{ + $aBackTrace = debug_backtrace(); + echo '

', $name, '

'; + echo '
'; + echo '', basename($aBackTrace[0]['file']), ' ligne => ', $aBackTrace[0]['line'], ''; + echo '
', htmlentities(print_r($data, 1)), '
'; + echo '

'; +} + +/** + * Return list dir of content + * + * @author Knah Tsaeb + * @global + * @return array + */ +function listDir() +{ + $dirList = array(); + foreach (glob("content/*", GLOB_ONLYDIR) as $dir) { + $dirList[basename($dir)] = listFile($dir); + } + if (empty($dirList)) { + $dirList = array(); + } + return $dirList; +} + +/** + * Return list file in dir + * + * @author Knah Tsaeb + * @global + * @param mixed $dir + * @return mixed + */ +function listFile($dir) +{ + $fileList = array(); + foreach (glob($dir . "/*.md") as $dir) { + $fileList[] = str_replace('.md', '', basename($dir)); + } + if (empty($fileList)) { + $fileList = array(); + } + + return $fileList; +} + +/** + * Gen navigation menu + * + * @author Knah Tsaeb + * @global + * @param string $getDir Default: null + * @return string + */ +function makeMenu($getDir = null) +{ + $dirList = listDir(); + $menu = ''; + foreach ($dirList as $dir => $files) { + if ($getDir === $dir) { + $expand = 'open'; + } else { + $expand = ''; + } + $menu .= ' +
+ ' . $dir . ' +
    '; + + foreach ($files as $value) { + $menu .= '
  • ' . $value . '
  • '; + } + $menu .= ' +
+
'; + } + return $menu; +} + +/** + * Add lazy loading attribute for img + * + * @author Knah Tsaeb + * @see ParsedownToc + * @global + */ +class ExtendParsedownToc extends ParsedownToc +{ + public function inlineImage($Excerpt) + { + if (!isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') { + return; + } + + $Excerpt['text'] = substr($Excerpt['text'], 1); + + $Link = $this->inlineLink($Excerpt); + + if ($Link === null) { + return; + } + + $Inline = array( + 'extent' => $Link['extent'] + 1, + 'element' => array( + 'name' => 'img', + 'attributes' => array( + 'src' => $Link['element']['attributes']['href'], + 'alt' => $Link['element']['text'], + 'loading' => 'lazy', + ), + ), + ); + + $Inline['element']['attributes'] += $Link['element']['attributes']; + + unset($Inline['element']['attributes']['href']); + + return $Inline; + } +} diff --git a/browserconfig.xml b/browserconfig.xml new file mode 100644 index 0000000..b3930d0 --- /dev/null +++ b/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..92275d5 --- /dev/null +++ b/composer.json @@ -0,0 +1,7 @@ +{ + "require": { + "erusev/parsedown": "^1.7", + "hoegh/parsedown-toc": "^1.3", + "taufik-nurrohman/parsedown-extra-plugin": "^1.3" + } +} diff --git a/config/.htaccess b/config/.htaccess new file mode 100644 index 0000000..ffb2587 --- /dev/null +++ b/config/.htaccess @@ -0,0 +1,4 @@ +Order deny,allow +Deny from all + +Require all denied \ No newline at end of file diff --git a/content/.htaccess b/content/.htaccess new file mode 100644 index 0000000..ffb2587 --- /dev/null +++ b/content/.htaccess @@ -0,0 +1,4 @@ +Order deny,allow +Deny from all + +Require all denied \ No newline at end of file diff --git a/content/default.md b/content/default.md new file mode 100644 index 0000000..555f297 --- /dev/null +++ b/content/default.md @@ -0,0 +1,47 @@ +# Welcome to MyNoVi + +MyNovi | My Notes Viewer is simple markdown viewer made for my usage. + +## Features +- No configuration +- Easy install +- Auto ToC (Table of Content) +- Browser lazy loading in image +- KISS + +### Limitations + +MyNovi only work with one level dir (for moment). + +--- + +## Setup +Clone this Mynovi using git + +`git clone https://forge.leslibres.org/Knah-Tsaeb/MyNoVi.git` + +Use composer to install external lib (Parsedown and Parsedown-toc) + +`cd MyNoVi` + +`composer install` + +--- + +## Usage +Put your markdown file in 'content' dir via FTP OR SSH. + +That's all. + +You can personalize the default start page by creating file **content/index.md**. + +### Advanced usage + +Use synchronisation tools like NextCloud. Sync 'content' dir with your desktop. +Now just edit your local file and when you save file, after synchro, your file is online. + +--- + +## License + +This project is licensed under the terms of the **[AGPLv3](https://www.gnu.org/licenses/agpl-3.0.txt)** license. \ No newline at end of file diff --git a/css/dark.css b/css/dark.css new file mode 100644 index 0000000..a7462cc --- /dev/null +++ b/css/dark.css @@ -0,0 +1,631 @@ +:root { + --background-body: #202b38; + --background: #161f27; + --background-alt: #1a242f; + --selection: #1c76c5; + --text-main: #dbdbdb; + --text-bright: #fff; + --text-muted: #a9b1ba; + --links: #41adff; + --focus: rgba(0, 150, 191, 0.67); + --border: #526980; + --code: #ffbe85; + --animation-duration: 0.1s; + --button-hover: #324759; + --scrollbar-thumb: var(--button-hover); + --scrollbar-thumb-hover: #415c73; + --form-placeholder: #a9a9a9; + --form-text: #fff; + --variable: #d941e2; + --highlight: #efdb43; + --select-arrow: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='63' width='117' fill='%23efefef'%3E%3Cpath d='M115 2c-1-2-4-2-5 0L59 53 7 2a4 4 0 00-5 5l54 54 2 2 3-2 54-54c2-1 2-4 0-5z'/%3E%3C/svg%3E") +} + +html { + scrollbar-color: #324759 #202b38; + scrollbar-color: var(--scrollbar-thumb) var(--background-body); + scrollbar-width: thin +} + +body { + font-family: system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, Segoe UI Emoji, Apple Color Emoji, Noto Color Emoji, sans-serif; + line-height: 1.4; + max-width: 800px; + margin: 20px auto; + padding: 0 10px; + word-wrap: break-word; + color: #dbdbdb; + color: var(--text-main); + background: #202b38; + background: var(--background-body); + text-rendering: optimizeLegibility +} + +button, +input, +textarea { + transition: background-color .1s linear, border-color .1s linear, color .1s linear, box-shadow .1s linear, transform .1s ease; + transition: background-color var(--animation-duration) linear, border-color var(--animation-duration) linear, color var(--animation-duration) linear, box-shadow var(--animation-duration) linear, transform var(--animation-duration) ease +} + +h1 { + font-size: 2.2em; + margin-top: 0 +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin-bottom: 12px; + margin-top: 24px +} + +h1, +h2, +h3, +h4, +h5, +h6, +strong { + color: #fff; + color: var(--text-bright) +} + +b, +h1, +h2, +h3, +h4, +h5, +h6, +strong, +th { + font-weight: 600 +} + +q:after, +q:before { + content: none +} + +blockquote, +q { + border-left: 4px solid rgba(0, 150, 191, .67); + border-left: 4px solid var(--focus); + margin: 1.5em 0; + padding: .5em 1em; + font-style: italic +} + +blockquote>footer { + font-style: normal; + border: 0 +} + +address, +blockquote cite { + font-style: normal +} + +a[href^=mailto\:]:before { + content: "📧 " +} + +a[href^=tel\:]:before { + content: "📞 " +} + +a[href^=sms\:]:before { + content: "💬 " +} + +mark { + background-color: #efdb43; + background-color: var(--highlight); + border-radius: 2px; + padding: 0 2px; + color: #000 +} + +button, +input[type=button], +input[type=checkbox], +input[type=radio], +input[type=range], +input[type=submit], +select { + cursor: pointer +} + +input:not([type=checkbox]):not([type=radio]), +select { + display: block +} + +button, +input, +select, +textarea { + color: #fff; + color: var(--form-text); + background-color: #161f27; + background-color: var(--background); + font-family: inherit; + font-size: inherit; + margin-right: 6px; + margin-bottom: 6px; + padding: 10px; + border: none; + border-radius: 6px; + outline: none +} + +input[type=checkbox], +input[type=radio] { + height: 1em; + width: 1em +} + +input[type=radio] { + border-radius: 100% +} + +input { + vertical-align: top +} + +label { + vertical-align: middle; + margin-bottom: 4px; + display: inline-block +} + +button, +input:not([type=checkbox]):not([type=radio]), +input[type=range], +select, +textarea { + -webkit-appearance: none +} + +textarea { + display: block; + margin-right: 0; + box-sizing: border-box; + resize: vertical +} + +textarea:not([cols]) { + width: 100% +} + +textarea:not([rows]) { + min-height: 40px; + height: 140px +} + +select { + background: #161f27 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' height='63' width='117' fill='%23efefef'%3E%3Cpath d='M115 2c-1-2-4-2-5 0L59 53 7 2a4 4 0 00-5 5l54 54 2 2 3-2 54-54c2-1 2-4 0-5z'/%3E%3C/svg%3E") calc(100% - 12px) 50%/12px no-repeat; + background: var(--background) var(--select-arrow) calc(100% - 12px) 50%/12px no-repeat; + padding-right: 35px +} + +select::-ms-expand { + display: none +} + +select[multiple] { + padding-right: 10px; + background-image: none; + overflow-y: auto +} + +button, +input[type=button], +input[type=submit] { + padding-right: 30px; + padding-left: 30px +} + +button:hover, +input[type=button]:hover, +input[type=submit]:hover { + background: #324759; + background: var(--button-hover) +} + +button:focus, +input:focus, +select:focus, +textarea:focus { + box-shadow: 0 0 0 2px rgba(0, 150, 191, .67); + box-shadow: 0 0 0 2px var(--focus) +} + +button:active, +input[type=button]:active, +input[type=checkbox]:active, +input[type=radio]:active, +input[type=range]:active, +input[type=submit]:active { + transform: translateY(2px) +} + +button:disabled, +input:disabled, +select:disabled, +textarea:disabled { + cursor: not-allowed; + opacity: .5 +} + +::-moz-placeholder { + color: #a9a9a9; + color: var(--form-placeholder) +} + +:-ms-input-placeholder { + color: #a9a9a9; + color: var(--form-placeholder) +} + +::-ms-input-placeholder { + color: #a9a9a9; + color: var(--form-placeholder) +} + +::placeholder { + color: #a9a9a9; + color: var(--form-placeholder) +} + +fieldset { + border: 1px solid rgba(0, 150, 191, .67); + border: 1px solid var(--focus); + border-radius: 6px; + margin: 0 0 12px; + padding: 10px +} + +legend { + font-size: .9em; + font-weight: 600 +} + +input[type=range] { + margin: 10px 0; + padding: 10px 0; + background: transparent +} + +input[type=range]:focus { + outline: none +} + +input[type=range]::-webkit-slider-runnable-track { + width: 100%; + height: 9.5px; + -webkit-transition: .2s; + transition: .2s; + background: #161f27; + background: var(--background); + border-radius: 3px +} + +input[type=range]::-webkit-slider-thumb { + box-shadow: 0 1px 1px #000, 0 0 1px #0d0d0d; + height: 20px; + width: 20px; + border-radius: 50%; + background: #526980; + background: var(--border); + -webkit-appearance: none; + margin-top: -7px +} + +input[type=range]:focus::-webkit-slider-runnable-track { + background: #161f27; + background: var(--background) +} + +input[type=range]::-moz-range-track { + width: 100%; + height: 9.5px; + -moz-transition: .2s; + transition: .2s; + background: #161f27; + background: var(--background); + border-radius: 3px +} + +input[type=range]::-moz-range-thumb { + box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; + height: 20px; + width: 20px; + border-radius: 50%; + background: #526980; + background: var(--border) +} + +input[type=range]::-ms-track { + width: 100%; + height: 9.5px; + background: transparent; + border-color: transparent; + border-width: 16px 0; + color: transparent +} + +input[type=range]::-ms-fill-lower, +input[type=range]::-ms-fill-upper { + background: #161f27; + background: var(--background); + border: .2px solid #010101; + border-radius: 3px; + box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d +} + +input[type=range]::-ms-thumb { + box-shadow: 1px 1px 1px #000, 0 0 1px #0d0d0d; + border: 1px solid #000; + height: 20px; + width: 20px; + border-radius: 50%; + background: #526980; + background: var(--border) +} + +input[type=range]:focus::-ms-fill-lower, +input[type=range]:focus::-ms-fill-upper { + background: #161f27; + background: var(--background) +} + +a { + text-decoration: none; + color: #41adff; + color: var(--links) +} + +a:hover { + text-decoration: underline +} + +code, +samp, +time { + background: #161f27; + background: var(--background); + color: #ffbe85; + color: var(--code); + padding: 2.5px 5px; + border-radius: 6px; + font-size: 1em +} + +pre>code { + padding: 10px; + display: block; + overflow-x: auto +} + +var { + color: #d941e2; + color: var(--variable); + font-style: normal; + font-family: monospace +} + +kbd { + background: #161f27; + background: var(--background); + border: 1px solid #526980; + border: 1px solid var(--border); + border-radius: 2px; + color: #dbdbdb; + color: var(--text-main); + padding: 2px 4px +} + +img, +video { + max-width: 100%; + height: auto +} + +hr { + border: none; + border-top: 1px solid #526980; + border-top: 1px solid var(--border) +} + +table { + border-collapse: collapse; + margin-bottom: 10px; + width: 100%; + table-layout: fixed +} + +table caption, +td, +th { + text-align: left +} + +td, +th { + padding: 6px; + vertical-align: top; + word-wrap: break-word +} + +thead { + border-bottom: 1px solid #526980; + border-bottom: 1px solid var(--border) +} + +tfoot { + border-top: 1px solid #526980; + border-top: 1px solid var(--border) +} + +tbody tr:nth-child(2n) { + background-color: #1a242f; + background-color: var(--background-alt) +} + +::-webkit-scrollbar { + height: 10px; + width: 10px +} + +::-webkit-scrollbar-track { + background: #161f27; + background: var(--background); + border-radius: 6px +} + +::-webkit-scrollbar-thumb { + background: #324759; + background: var(--scrollbar-thumb); + border-radius: 6px +} + +::-webkit-scrollbar-thumb:hover { + background: #415c73; + background: var(--scrollbar-thumb-hover) +} + +::-moz-selection { + background-color: #1c76c5; + background-color: var(--selection); + color: #fff; + color: var(--text-bright) +} + +::selection { + background-color: #1c76c5; + background-color: var(--selection); + color: #fff; + color: var(--text-bright) +} + +details { + display: flex; + flex-direction: column; + align-items: flex-start; + background-color: #1a242f; + background-color: var(--background-alt); + padding: 10px 10px 0; + margin: 1em 0; + border-radius: 6px; + overflow: hidden +} + +details[open] { + padding: 10px +} + +details>:last-child { + margin-bottom: 0 +} + +details[open] summary { + margin-bottom: 10px +} + +summary { + display: list-item; + background-color: #161f27; + background-color: var(--background); + padding: 10px; + margin: -10px -10px 0; + cursor: pointer; + outline: none +} + +summary:focus, +summary:hover { + text-decoration: underline +} + +details>:not(summary) { + margin-top: 0 +} + +summary::-webkit-details-marker { + color: #dbdbdb; + color: var(--text-main) +} + +footer { + border-top: 1px solid #526980; + border-top: 1px solid var(--border); + padding-top: 10px; + color: #a9b1ba; + color: var(--text-muted) +} + +body>footer { + margin-top: 40px +} + +@media print { + + body, + button, + code, + details, + input, + pre, + summary, + textarea { + background-color: #fff + } + + button, + input, + textarea { + border: 1px solid #000 + } + + body, + button, + code, + footer, + h1, + h2, + h3, + h4, + h5, + h6, + input, + pre, + strong, + summary, + textarea { + color: #000 + } + + summary::marker { + color: #000 + } + + summary::-webkit-details-marker { + color: #000 + } + + tbody tr:nth-child(2n) { + background-color: #f2f2f2 + } + + a { + color: #00f; + text-decoration: underline + } +} + +/*# sourceMappingURL=dark.min.css.map */ \ No newline at end of file diff --git a/css/main.css b/css/main.css new file mode 100644 index 0000000..468fa6e --- /dev/null +++ b/css/main.css @@ -0,0 +1,130 @@ +@media (min-width: 540px) { + body { + display: grid; + grid-template-columns: 15% 1fr 12%; + + gap: 0em 1em; + grid-template-areas: + "menu main toc" + "footer footer footer"; + } + + .toc { + top: 0; + height: 100vh; + position: sticky; + } +} + +@media (max-width: 539px) { + .a, .m { + max-width: 90%; + } +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + max-width: 1300px; +} + +h1 { + text-shadow: 2px 2px 3px black, 0 0 0.1rem; +} + +.main { + grid-area: main; + display: flex; + flex-direction: column; + width: 100%; + overflow: hidden; + padding-left: 0.2rem; +} + +form { + padding: .2rem; + display: flex; + justify-content: flex-end; + width: 50%; + margin: auto; +} + +label { + padding: .5em 1em .5em 0; +} + +input { + flex: 1; +} + +.backTop { + content: "top"; +} + +.menu { + grid-area: menu; + font-size: .9rem; +} + +.toc { + grid-area: toc; + font-size: .8rem; +} + +.toc ul { + position: relative; + padding: 0 0 0 .5em; + overflow-y: auto; +} + +.toc li { + list-style: none; +} + +p { + margin: .1em 0; + padding: .2em; +} + +.m, +.a { + max-width: 70%; + min-width: 1%; + padding: 5px 10px; + border-radius: .4em; + font-size: 0.85rem; + margin-bottom: 0.2rem; +} + +.m { + background-color: #323348; + box-shadow: -1px 3px 5px 0px #1e1f2c; + align-self: flex-start; +} + +.a { + box-shadow: 1px 3px 5px 0px #1b1b1b; + background-color: #292929; + align-self: flex-end; + text-align: left; +} + +.linkTop { + position: fixed; + bottom: 3em; + right: 3em; +} + +h3 { + padding: .2em .3em; +} + +.footer { + grid-area: footer; +} \ No newline at end of file diff --git a/favicon-16x16.png b/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..255ec976d672c5afbab06326677ca734cc3f27a2 GIT binary patch literal 7841 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 L==Jr6W7z%&rxMr_ literal 0 HcmV?d00001 diff --git a/humans.txt b/humans.txt new file mode 100644 index 0000000..734dff9 --- /dev/null +++ b/humans.txt @@ -0,0 +1,16 @@ +/* TEAM */ + Contact: Knah-Tsaeb_mynovi [at] knah-tsaeb.org + + +/* DEV */ + OS: ArchLinux + IDE: Code + OTHER: GIT + + +/* TECHNOLOGY */ + PHP + HTML5 + CSS Water.css https://watercss.netlify.app/ + Parsedown http://parsedown.org + Parsedown ToC https://github.com/KEINOS/parsedown-extension_table-of-contents diff --git a/index.php b/index.php new file mode 100644 index 0000000..168f6f4 --- /dev/null +++ b/index.php @@ -0,0 +1,87 @@ + + + + '; +}*/ + +if (!empty($_POST['FormPassword'])) { + require 'config/config.php'; + $FormPassword = htmlspecialchars($_POST['FormPassword']); + + if (password_verify($FormPassword, $passProtect)) { + $_SESSION['login'] = true; + } else { + $_SESSION['login'] = false; + } +} + + +if (empty($_SESSION['login']) or $_SESSION['login'] !== true) { + $body = ' +
+ + +
'; +} else { + $dir = $_GET['dir'] ?? ''; + $file = $_GET['file'] ?? ''; + $body = ''; + + if (!empty($dir)) { + $dir = filter_input(INPUT_GET, 'dir', FILTER_SANITIZE_STRING); + } + + if (isset($file)) { + $file = filter_input(INPUT_GET, 'file', FILTER_SANITIZE_STRING); + } + + if (empty($file) || !file_exists('./content/' . urldecode($dir) . '/' . urldecode($file) . '.md')) { + $dir = ''; + if (file_exists('./content/index.md')) { + $file = 'index'; + } else { + $file = 'default'; + } + } + /* + sed -E 's/[0-9]{2}:[0-9]{2}//' new.md > test.md + sed '/^$/d' test.md > new.md + */ + + $content = file_get_contents('content/' . urldecode($dir) . '/' . urldecode($file) . '.md'); + $options = array('selectors' => array('h2', 'h3'), 'setBreaksEnabled' => true, 'setSafeMode' => true); + + $content = preg_replace('/([0-9]{2}):([0-9]{2})/i', '', $content); + $content = preg_replace('/\[([0-9]{2})\/([0-9]{2})\/([0-9]{4}) ]/i', '', $content); + $content = preg_replace('/\[([0-9]{2})\/([0-9]{2}) ]/i', '', $content); + + $content = str_replace('Morgane Mongin', '

', $content); + $content = str_replace('Adrien Passos', '

', $content); + $content = str_replace('morganemongin', '

', $content); + $content = str_replace('knah-tsaeb', '

', $content); + $Parsedown = new ExtendParsedownToc($options); + $body = $Parsedown->setMarkupEscaped(false) + ->setSafeMode(false) + ->setBreaksEnabled(false) + ->text($content); + $toc = $Parsedown->contentsList(); + + #$body = str_replace("[ ]", '', $body); + #$body = str_replace("[x]", '', $body); + $body = str_replace("", ' ⬆️', $body); + $body = str_replace("", ' ⬆️', $body); + $menu = makeMenu($dir); +} +require 'tpl/header.html'; +require 'tpl/aside.html'; +require 'tpl/main.html'; +require 'tpl/footer.html'; diff --git a/mstile-150x150.png b/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..0d74ede5930b203fbc701017aaca65699502eab6 GIT binary patch literal 1465 zcmZ`(dpOez7@o6^YvV`<#hB(6j!7*24r$nC%x$fPj#G09ncMogha}cB5qhor|Ty zW*NmGv5zcBay|vg7Kz^NZZ2ur>u+VQiIZ6bI}AB`VxjO=(W7yOY4$AtL{|<}Tex zujunx9h5^v@nB(7=i3I|S=Y%(0t4lWvhMo;EN)cKdg)ak!moJq4S_|!))OSHZii0; znUswn@cxtS?W7;z;TsDTzk`#G9)N}>kYPMrx|N7bCPkQ%AF9I!gt?Z`4O3p?iFGNq4+!P5!Tr4zI=9@D@4 zK~J@c=Hgty9Bt8-Q)!E$`Fil5Fg^ZN&1KX8`6}?bb|B&M$gJvjjC^fsf2i`*2_`Q^ zfnqBNRgK@w3s$8lOcfP)VV(;n8c=P(YjF?RW`j@Z2MW@uWaoMJ$;g9=8fOg@X5Beyg}n6gJ4P7G0l{^~ zy}i2eTT-CedVV@?3w~Mj%fWhOi=r>Nmte3ZD8msL4IY^ojLcpCs}#Pl`$}4!iMACW zliCl!)u`mAR|ZiC5uMPTB;;zr@vEpP@P0CN1P1ShGL!%!ZTvC+{H_iG{}u)UtZIBK zuN3wjuro&c?e6o<66Zwa`Z^3SYy?D zzJ^&0TcxqBYERR6Zm5ZXkICrykt3Ygv$ca0JAl&qneI2ihc+X06GYOn>VgJfCb$;e z+^^l=(3{L@oydCRPcf+S0{Y^H);qB5Y_EdOX1!;}KeS!lHsa+lm5e)D`rmmFGAM?E z7spjdi-TRe!cNzhW4Fm4v%#vDEs8yF#%?d)vikpNm+<8PRr_ide>L2k1PTXDkcWrk zj5Q)6mhfIFrl63AFmuUaS~k*&MR}aC_7INmb=HH_A@MmN(j3vX6?REWDOa? n9Upn#(bu8gA;rC7U*cd4nNv{&S8dF*zwSZ6I@>+6Ie+y(+uV_o literal 0 HcmV?d00001 diff --git a/safari-pinned-tab.svg b/safari-pinned-tab.svg new file mode 100644 index 0000000..7da829c --- /dev/null +++ b/safari-pinned-tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 0000000..0e0e858 --- /dev/null +++ b/site.webmanifest @@ -0,0 +1,14 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/tpl/aside.html b/tpl/aside.html new file mode 100644 index 0000000..245cffb --- /dev/null +++ b/tpl/aside.html @@ -0,0 +1,6 @@ +

diff --git a/tpl/footer.html b/tpl/footer.html new file mode 100644 index 0000000..bd75539 --- /dev/null +++ b/tpl/footer.html @@ -0,0 +1,9 @@ +
+
+
+ MyNoVi is under AGPLv3 | Made in 2020 by Knah Tsaeb +
+
+ + + \ No newline at end of file diff --git a/tpl/header.html b/tpl/header.html new file mode 100644 index 0000000..917342a --- /dev/null +++ b/tpl/header.html @@ -0,0 +1,36 @@ + + + + + + + + + + HisMA + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tpl/main.html b/tpl/main.html new file mode 100644 index 0000000..9dfdf95 --- /dev/null +++ b/tpl/main.html @@ -0,0 +1,11 @@ + + +
+ ⬆️ +
+
+ + +
\ No newline at end of file