From cacf5366512f83295d2e2809e4a6a09378f63f42 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Sat, 20 May 2023 12:33:21 -0400 Subject: [PATCH] initial commit --- .gitignore | 13 + LICENSE | 619 +++++++++++++++++++++++++++++ README.md | 26 ++ project.clj | 11 + resources/public/Jost-400-Book.otf | Bin 0 -> 28228 bytes resources/public/favicon.ico | Bin 0 -> 9662 bytes resources/public/logo.jpg | Bin 0 -> 6246 bytes resources/public/main.css | 97 +++++ src/bitgloo_web/core.clj | 86 ++++ 9 files changed, 852 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 project.clj create mode 100755 resources/public/Jost-400-Book.otf create mode 100644 resources/public/favicon.ico create mode 100644 resources/public/logo.jpg create mode 100644 resources/public/main.css create mode 100644 src/bitgloo_web/core.clj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d956ab0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +/target +/classes +/checkouts +profiles.clj +pom.xml +pom.xml.asc +*.jar +*.class +/.lein-* +/.nrepl-port +/.prepl-port +.hgignore +.hg/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..281d399 --- /dev/null +++ b/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 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 General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is 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. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + 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. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + 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 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 +sue 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. Use with the GNU Affero General Public License. + + 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 Affero 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 special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 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 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 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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..39fcc8f --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# bitgloo-web + +This is the code for [bitgloo.com](https://bitgloo.com)'s frontend. + +The frontend uses a directory tree of folders, Markdown files, and images to +create webpages. Primary assets, like the logo and CSS script, are kept as +internal resources. + +Given the URI `/projects/thing`, the frontend will render Markdown files from +`/projects/thing` in a sorted order. The files can display images +in their directory like so: `![](thing/image.jpg)`. + +## Usage + +Either run with Leiningen: + +``` +lein run +``` + +...or with the compiled JAR file: + +``` +java -jar bitgloo-web.jar +``` + diff --git a/project.clj b/project.clj new file mode 100644 index 0000000..8c544a7 --- /dev/null +++ b/project.clj @@ -0,0 +1,11 @@ +(defproject bitgloo-web "0.2" + :description "bitgloo website framework" + :url "https://bitgloo.com" + :license {:name "GPL-3.0-or-later" :url "https://www.gnu.org/licenses/gpl-3.0.en.html"} + :dependencies [[org.clojure/clojure "1.10.3"] + [ring/ring-core "1.9.6"] + [ring/ring-jetty-adapter "1.9.6"] + [hiccup "1.0.5"] + [markdown-clj "1.11.4"]] + :main ^:skip-aot bitgloo-web.core + :profiles {:uberjar {:aot :all}}) diff --git a/resources/public/Jost-400-Book.otf b/resources/public/Jost-400-Book.otf new file mode 100755 index 0000000000000000000000000000000000000000..cbc8e8461c895685f62bc3f5ce7501d2a8de2f90 GIT binary patch literal 28228 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 F{1-wbm(>6O literal 0 HcmV?d00001 diff --git a/resources/public/favicon.ico b/resources/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..818b332b739c7a8af02202abdbaa3c32d8639451 GIT binary patch literal 9662 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 UC%*?$djDUhY5%Jt`4#^E0M3??(EtDd literal 0 HcmV?d00001 diff --git a/resources/public/main.css b/resources/public/main.css new file mode 100644 index 0000000..3911cd9 --- /dev/null +++ b/resources/public/main.css @@ -0,0 +1,97 @@ +@font-face { + /* https://indestructibletype.com/Jost.html */ + font-family: Jost; + src: url('/Jost-400-Book.otf'); +} + +html, body { + background: #d8f0ff; + font-family: Jost; +} + +#title-container { + padding-top: 4em; + padding-bottom: 0.5em; +} + +#container { + padding: 0em 1.5em; +} +#posts { + min-height: 400px; +} +#logo { + height: 90px; +} + +.block { + padding-bottom: 20px; + border-top: 1px solid #888; +} + +.block img { + max-width: 40em; + border: 1px solid #888; +} + +h1 { + font-size: 4em; + display: inline; + padding-left: 0.1em; +} + +h1 { + color: black; +} + +h1:hover { + color: #ff3300; +} + +h2 { + font-size: 2.2em; +} + +h3 { + font-size: 1.7em; +} + +h4, h5 { + font-size: 1.6em; +} + +p, li { + font-size: 1.5em; + max-width: 50em; +} + +a, a code { + text-decoration: none; + color: #ff3300; +} + +p, li, span { +} + +#footer { + color: #666; + text-align: right; +} + +code { + padding: 2px; + font-family: monospace, monospace; + font-size: 0.8em; +} + +pre { + padding: 4px; + background: #333; + color: #ccc; + font-family: fixed; +} + +.codecolor0 { color: #2c6; } +.codecolor1 { color: yellow; } +.codecolor2 { color: pink; } +.codecolor3 { color: #c44; } diff --git a/src/bitgloo_web/core.clj b/src/bitgloo_web/core.clj new file mode 100644 index 0000000..169b545 --- /dev/null +++ b/src/bitgloo_web/core.clj @@ -0,0 +1,86 @@ +(ns bitgloo-web.core + (:gen-class) + (:require [clojure.java.io :as io]) + (:require [clojure.string :as str]) + (:require [hiccup.core :as hiccup]) + (:require [hiccup.page :as page]) + (:require [ring.adapter.jetty :refer [run-jetty]]) + (:require [ring.middleware.resource :refer [wrap-resource]]) + (:require [ring.middleware.content-type :refer [wrap-content-type]]) + (:require [ring.middleware.not-modified :refer [wrap-not-modified]]) + (:require [ring.util.response :as resp]) + (:require [markdown.core :refer [md-to-html-string]])) + +(def image-extensions [".jpg" ".bmp"]) + +(def page-header + [:div#title-container + [:a {:href "/"} + [:img#logo {:src "/logo.jpg" :alt "bitgloo logo"}] + [:h1 "bitgloo"]]]) + +(def page-footer [:div#footer [:span "© Clyne Sullivan 2023"]]) + +(def page-not-found [:div "Page not found"]) + +(defn md-file? [path] (str/ends-with? path ".md")) +(defn image? [path] (some (partial str/ends-with? path) image-extensions)) + +(defn get-file-list [path] (->> path io/file .listFiles sort)) + +(defn parse-md-file [file] (-> file slurp md-to-html-string)) + +(defn render-md-files [file-list] (for [file file-list] [:div.block (parse-md-file file)])) + +(defn load-page-contents [path] + (let [file-list (filter md-file? (get-file-list path))] + (if (empty? file-list) + page-not-found + [:div#posts (render-md-files file-list)]))) + +(defn load-page [path content-path] + (let [true-path (str content-path (if (= 1 (count path)) "/home" path))] + (hiccup/html + (page/html5 + [:head [:title "bitgloo"] (page/include-css "/main.css")] + [:body [:div#container page-header (load-page-contents true-path) page-footer]])))) + +(defn request-handler [content-path request] + (when (= :get (:request-method request)) + (-> request + :uri + (load-page content-path) + (resp/response) + (resp/content-type "text/html") + (resp/charset "utf8")))) + +(defn wrap-content-images [handler content-path] + (fn [request] + (let [uri (:uri request)] + (if (and (= :get (:request-method request)) (image? uri)) + (resp/file-response (str content-path uri)) + (handler request))))) + +(defn wrap-log-request [handler] + (fn [request] + (-> request + (select-keys [:headers :protocol :request-method :uri]) + (update :headers get "x-forwarded-for") + (vals) + (conj "request:") + ((partial apply println))) + (handler request))) + +(defn -main [& args] + (if (= 2 (count args)) + (let [port (-> args first Integer/parseInt) + content-path (second args)] + (-> (partial request-handler content-path) + (wrap-content-images content-path) + (wrap-resource "public") + (wrap-content-type) + (wrap-not-modified) + (wrap-log-request) + (run-jetty {:port port}))) + (println "usage: bitgloo port content-path"))) + -- 2.39.5