diff --git a/.github/workflows/arise-deploy.yml b/.github/workflows/arise-deploy.yml new file mode 100644 index 0000000..bb3e791 --- /dev/null +++ b/.github/workflows/arise-deploy.yml @@ -0,0 +1,45 @@ +# .github/workflows/arise-deploy.yml +name: Deploy Arise to html branch + +on: + # Runs on pushes targeting the default branch + # Only runs when the push contains changes to the site source itself. No need to rebuild the site if it's just program files that have changed. + push: + branches: ["main"] + paths: ['arise-source/**'] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + +# Default to bash +defaults: + run: + shell: bash + +jobs: + build: + runs-on: ubuntu-latest + name: Deploy Arise + steps: + - name: git-checkout + uses: actions/checkout@v2 + + - name: Install pandoc + run: sudo apt-get install -y pandoc + + - name: Build Arise + run: bash arise build + + - name: Push to live branch + uses: s0/git-publish-subdir-action@develop + env: + REPO: self + BRANCH: html # Feel free to change this. This is where Arise artefacts will be pushed. + FOLDER: arise-out # The Arise build output location. Don't change this. + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Handled automatically -- Don't change this unless you're pushing to a different repo + MESSAGE: "Commit: ({sha}) {msg}" # Copies commit msg from main to the deploy version branch diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..af5fff1 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +arise-out/ diff --git a/LICENSE/README.md b/LICENSE/README.md new file mode 100644 index 0000000..b8b1e44 --- /dev/null +++ b/LICENSE/README.md @@ -0,0 +1,1233 @@ +© 2022 Spectra Secure + +Contact: https://twitter.com/spectrasecure + +--- + +The files that are included in this repository are defined as the "Arise Components". The Arise Contents can be broken up into three parts: the Example Site, the Arise Logo, and the Arise Software. The set of files that compose each of these parts are defined below. Different parts of the Arise Components are licensed under different terms. + +This document discusses the the terms that the Arise Components are licensed under, the disclaimers for the usage of the Arise Components, as well as all potentially relevant legal acknowledgements. + +Please review this entire document. Your usage, modification, copying, or distribution of the Arise Components is considered an acceptance of the relevant license terms. + +Buckle up, because this is going to be a bit of a long ride. + +# Example Site + +## Definition + +The "Example Site" is defined as the contents of `/arise-source/` within this repository (Not including the Arise logo-- that is discussed further below.). + +## License Terms + +The Example Site is licensed to you under the MIT License: + +``` +Copyright 2022 Spectra Secure + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software code (the "Example Site"), to deal in the Example Site without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Example Site, and to permit persons to whom the Example Site is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Example Site. + +THE EXAMPLE SITE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE EXAMPLE SITE OR THE USE OR OTHER DEALINGS IN THE EXAMPLE SITE. +``` + +# Arise Logo + +## Definition + +The "Arise Logo" is defined as the stylised depiction of the word 'Arise' and the source files used to generate it. These files can be found within `/docs/logo/` in this repository. + +## License Terms + +The Arise Logo is licensed to you under the Creative Commons BY-SA 4.0 License: + +``` +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. +``` + +## Acknowledgements + +The Arise Logo was created using two different font assets, both of which are licensed under Creative Commons Share-Alike (CC-BY-SA). These assets and their associated copyright notices are reproduced below. + +The logo assets are bundled and redistributed within this repository in the unmodified form that they were originally downloaded in. + +### Woodwarrior Typeface + +The Arise Logo makes use of the [Woodwarrior Typeface by Anton Bohlin](https://fontlibrary.org/en/font/woodwarrior). Its bundled copyright notice is reproduced below: + +``` + You have downloaded the typeface family + + WW WWWW WW WWWWWWW WWWWWWW WWWWWWW WW WWWW WW WWWW WWWWWWW WWWWWWW WW WWWWWW WWWWWWW + WWW WWW WW WWWW WWW WWWW WW WWW WW WW WWW WW WWWW WW WW WW W WW WWWW WWW WW WW + WWW WW WW WW WWW WW W WW W WWWWW W WW WW WW WW WW WW W WW W WW WW WWW WW WW WW + WWWWWWW WW WW WW WW WWWWW WW WWWW WW WWWWW WWWWWW WWWWWWW WWWWWWW WW WW WW WW WWWWWWW + WWWWWW WWW WWW WWW WWW WW WWW WWWWWWW WW WWW WW WW WW WW WW WWW WWW WW WW + WW WW WWWW WWWWW WWWWWW WWW WW WW WW WW WW WW WW WW WWWW WW WWW + + By Anton Bohlin + + + Woodwarrior is a typeface inspired by the north, and the contrast between modern man made + structures and untouched nature shaped by wind and ice alone. + + http://antonbohlin.com/projects/woodwarrior + + + Licensed under Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) + http://creativecommons.org/licenses/by-sa/3.0/ which means it's free to use for all purposes, + even commercial, as long as proper credit is given. For those interested in purchasing an + exclusive unlimited license - drop me a line! + + If you've found this typeface useful, awful or just want to get in contact, drop me a line at + thismeanswar@antonbohlin.com +``` + +### ROBOTECH GP Typeface + +The Arise Logo makes use of the [ROBOTECH GP Typeface by Gustavo Paz L.](https://fontlibrary.org/en/font/robotech-gp). Its bundled copyright notice is reproduced below: + +``` +http://creativecommons.org/licenses/by-sa/4.0/deed.en_US +Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +You are free to: + Share — copy and redistribute the material in any medium or format + Adapt — remix, transform, and build upon the material + for any purpose, even commercially. + The licensor cannot revoke these freedoms as long as you follow the license terms. +Under the following terms: + Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. + ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. + No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. +Notices: + You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. + No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. +``` + +# Arise Software + +The "Arise Software" is defined as all of the Bash programming code files that make up the Arise program and its subfunctions, all of the Arise documentation files, the Arise cloud deployment workflows/CICD scripts, as well as any other file present in the Arise Contents not separately defined elsewhere in this document. + +## License Terms + +The Arise Software is licensed to you under the GNU Affero General Public Licence, Version 3: + +``` + 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 +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. 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 +. +``` + + +## Acknowledgements + +The Arise CI/CD workflow calls for the use of a GitHub Action [s0/git-publish-subdir-action by Sam Lanning](https://github.com/s0/git-publish-subdir-action). This GitHub Action is not bundled or redistributed in this repository, so it is not part of the Arise Contents. However, just in case it is necessary, the copyright notice for s0/git-publish-subdir-action by Sam Lanning is reproduced below for your review: + +``` +MIT License + +Copyright (c) 2018 Sam Lanning + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` diff --git a/README.md b/README.md new file mode 100644 index 0000000..f8b844a --- /dev/null +++ b/README.md @@ -0,0 +1,94 @@ +![ARISE](./docs/logo/arise-logo_transparent.png) + +# Arise // Bash Static Site Generator +*Cyberpunk websites for the modern web.* + +--- + +## Overview + +There was a time before React, before Wordpress, and before even javascript and php. And the webmasters who ran the 'net back then made do with what they had. They wrangled their webservers to the fullest and they hacked together sites that could do what they need-- somehow. + +The web has grown up a lot since then, but unfortunately many of the modern tools we've built on top of are just way too complicated to maintain on the day-to-day without a fully staffed corporate webdev team. + +The goal of Arise is to take the lessons of yesteryear and make something novel. Arise is a cloud-native static site generator written in Bash, designed to be a fusion of ultra-stable timeless 90s technology and modern DevOps paradigms. Arise is designed around use cases like individual blogs and personal websites. + +## Why Use Arise + +Arise is written in Bash with very few dependencies outside of the standard GNU toolchain. Arise is designed with longterm simplicity and maintainability in mind. It is unlikely that the core code Arise runs on will break in the near future due to language or dependency updates. + +Arise supports modern SEO features that are built into your pages out of the box without any extra effort necessary: +- [OpenGraph](https://ogp.me/) and [TwitterCard](https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards) support for rich embed details +- Dynamically generated RSS feed +- Dynamically generated search engine sitemap + +Arise is built to be practical and let you build a website that actually has real content on it and isn't just a single-page placeholder. Arise uses a modular page architecture with support for dynamically generated metadata-rich index pages to keep your site hierarchy traversable by end users. + +## Live Example + +A live demo of Arise can be found at https://ari.se.net + +The example site is actually deployed straight from this repository, so the contents you see there are exactly what you get if you were to fork this exact repo and host it yourself. + +## Getting Started / Documentation + +All of the documentation for getting started with Arise can be found within this repository. + +- [Getting Started with Arise](docs/guides/getting-started/README.md) + - [Cloudflare Pages](docs/guides/getting-started/cloudflare/README.md) + - [DigitalOcean](docs/guides/getting-started/digitalocean/README.md) + - [GitHub Pages](docs/guides/getting-started/github-pages/README.md) +- [Creating Arise Pages](docs/guides/creating-arise-pages/README.md) +- [Running Arise Locally](docs/guides/running-arise-locally/README.md) + +## Dependencies +- Bash 5.1 + - **Used for:** 😐 + - **Why:** Do you see what language this program is written in? +- [pandoc](https://pandoc.org/) + - **Used for:** `build_page` - Function that builds pages from a `.md` source file + - **Why:** Arise uses Pandoc for conversion of Markdown to HTML. If your source pages are already in HTML and you don't need Markdown conversion, you can disable Markdown conversion on individual pages with the use of an Arise page option (see above). +- GNU `date` + - **Used for:** `build_rss` - RSS feed generator function + - **Why:** You see, RSS is kind of ridiculous because it asks for dates in RFC-822 (stupid) rather than the usual ISO 8601 format used by developers who weren't dropped on their head as a child. GNU's implementation of the date command has a flag to accomodate this, but it's not available on BSD/macOS. +- GNU `find` + - **Used for:** `build_toc` - Function that builds TOC/index pages + - **Why:** Only the GNU version supports `-maxdepth`. This flag is used for the TOC indexer function to ensure that only folders in the current directory (and not subfolders of those) get put into your indices. +- GNU `awk` + - **Used for:** `evaluate_inline` - Function that performs inline bash snippet evaluations. This is disabled by default because this functionality is still WIP. + - **Why:** Using `awk` in any capacity is the equivalent of staring into a horrific eldrich abyss not meant for mere mortals. Making those commands portable is another story entirely. +- GNU `sed` + - **Used for:** `build_header` - Function that populates headers with metadata from page source files + Dependency for the header metadata tag population. + - **Why:** This script makes use of the GNU version of the '-i' flag. BSD sed will not let you run inline sed replacements without forcing you to do an extra file write to create a backup of the original file, which you then have to run ANOTHER command to delete (literally why). + +## Wishlist / To-Do / Feature Ideas +- Refactor inline bash evaluation function and enable its usage. Right now it only works on very tiny/simple snippets. The main reason I wrote the logic was because I thought it would be funny to implement (it was). Some refactoring is absolutely necessary to make this feature practical/useful and not just a good meme. + - Allow inline bash evaluations in the site headers and footers +- Add support for metadata tag usage in the site footer. +- Move the hardcoded TOC formatting in `build_toc` into a configurable template within `.config` +- Bundle and implement [Markdown.pl](https://daringfireball.net/projects/markdown/) as a fallback rendering engine for systems that do not have pandoc installed. +- Add support for inline include statements for html snippets saved in the `/config` folder so that it's possible to write reusable little bits for pages. +- Implement better error handling. Right now it's wishy washy and in many ways basically nonexistent-- most stuff will silently error or otherwise not gracefully cause an abort. + - As far as dependency checks, right now it only checks if your bash version is good. Maybe could consider implementing checks for the other dependencies. It's really hard to determine if something is GNU or not, though. + +## License, Disclaimers, and Acknowledgements +All the legal bulldrek relevant to this repository can be found [here](LICENSE/README.md). + +A summary\* of the license terms (which is not a substitute for the above-linked licensing information itself) is: +- The example site is MIT License + - **TL;DR:** You can edit and do whatever with it. Go crazy, choom. You can license your own website built off my example however you damn please. +- The logo is Creative Commons CC-BY-SA 4.0 + - **TL;DR:** You can do what you want with it as long as you let anyone else do the same with any derivatives you redistribute. +- All the Arise code itself is AGPL 3.0 + - **TL;DR:** You have to give people a copy of your version of the source code if you modify and/or redistribute it in any way when you use it to create and deploy your website. + - If you don't modify the Arise software code itself and don't redistribute it, you don't need to host the source code for other people. But, to be clear, removing the link to this repository from the help function constitutes as modification as far as AGPL is concerned. + - AGPL scares a lot of people. I'm not a lawyer and this is not legal advice, but check out [this cool article about AGPL](https://writing.kemitchell.com/2021/01/24/Reading-AGPL.html) and maybe it will make it a little less scary for you :) + +\*This summary highlights only some of the key features and terms of the actual license. It is not a license and has no legal value. You should carefully review all of the terms and conditions of the actual license before using the licensed material. Also, I am not a lawyer and none of this is legal advice. + +--- + +*Made with 💙 by [Spectra Secure](https://twitter.com/spectrasecure)* + +*Inspired by the geniuses over at [motherfuckingwebsite.com](https://motherfuckingwebsite.com/)* diff --git a/arise b/arise new file mode 100644 index 0000000..4eb863a --- /dev/null +++ b/arise @@ -0,0 +1,159 @@ +#!/bin/bash +###################################### +# ARISE +# https://github.com/neonspectra/arise +arise_version="1.0.0" +###################################### + +############################################################## +# Begin main script function +# Don't edit below this line unless you know what you're doing +############################################################## + +cd "$(dirname $0)" + +# Set the site config directories. Don't touch this-- changing the config location is not supported at this time +config="arise-out/config" +source arise-source/config/arise.conf + +# Check if we're running a current version of bash before potentially causing code that won't run properly on ancient bash versions +[ "$BASH_VERSINFO" -lt 5 ] && echo -e 'ERROR: Arise requires Bash version 5 or greater to run. Please install a newer version of Bash or ensure that you are using the newest version installed on your computer.\n\nYour current version of Bash is: '"$BASH_VERSINFO"'\n\nYou can verify the current running version of Bash by running the following command: echo "$BASH_VERSINFO"' && exit 1 + +# Makes sure that our paths have or don't have a '/' as expected regardless of user input. +## Favicon should have a '/' at the start of the path. +[[ $favicon != '' ]] && [[ ${favicon:0:1} != '/' ]] && favicon='/'"$favicon" +## Base URL should not have a '/' at the end. +[[ ${base_url: -1} == '/' ]] && base_url=${base_url::-1} + +# Source functions +for FILE in lib/functions/inline/* ; do [[ $FILE == *.sh ]] && source $FILE ; done +for FILE in lib/functions/subshell/* ; do [[ $FILE == *.sh ]] && source $FILE ; done + +# Display our pretty logo no matter what when the program is run :) +arise_logo + +# Set default build settings +force_overwrite=false +keep_source=false + +# Read our arguments and set the build mode for processing. Display help if an invalid option is made. +if [[ $@ == "build" ]]; then + arise_build="full" + echo "Starting site deploy. Building full site." +elif [[ $@ == "build -k" ]]; then + arise_build="full" + keep_source=true + echo "Starting site deploy. Building full site. Source .md files will be retained in the final output." +elif [[ $@ == "build -f" ]]; then + arise_build="full" + echo "Starting site deploy. Building full site." + echo; + read -p 'WARNING: Specifying "-f" will DELETE the current contents of '"$(realpath arise-out)"'. Proceed? [y/N]: ' -n 1 -r; + echo; + if [[ $REPLY =~ ^[Yy]$ ]]; then + force_overwrite=true; + else + echo 'Aborting.'; + exit 1; + fi; +elif [[ $@ == "build -kf" ]] || [[ $@ == "build -fk" ]]; then + arise_build="full" + keep_source=true + echo "Starting site deploy. Building full site. Source .md files will be retained in the final output." + echo; + read -p 'WARNING: Specifying "-f" will DELETE the current contents of '"$(realpath arise-out)"'. Proceed? [y/N]: ' -n 1 -r; + echo; + if [[ $REPLY =~ ^[Yy]$ ]]; then + force_overwrite=true; + else + echo 'Aborting.'; + exit 1; + fi; +else + while getopts ":psrkf" options; do + case "${options}" in + p) + [[ -n "$arise_build" ]] && { arise_help; echo -e '\n\nERROR: Multiple exclusive build options detected. Aborting.'; exit 1; } + arise_build="pages_only"; + echo "Starting site deploy. Building pages only."; + ;; + s) + [[ -n "$arise_build" ]] && { arise_help; echo -e '\n\nERROR: Multiple exclusive build options detected. Aborting.'; exit 1; } + arise_build="sitemap_only"; + echo "Starting site deploy. Building sitemap only."; + ;; + r) + [[ -n "$arise_build" ]] && { arise_help; echo -e '\n\nERROR: Multiple exclusive build options detected. Aborting.'; exit 1; } + arise_build="rss_only"; + echo "Starting site deploy. Building RSS feed only."; + ;; + k) + keep_source=true; + echo "Source .md files will be retained in the final output."l + ;; + f) + echo; + read -p 'WARNING: Specifying "-f" will DELETE the current contents of '"$(realpath arise-out)"'. Proceed? [y/N]: ' -n 1 -r; + echo; + if [[ $REPLY =~ ^[Yy]$ ]]; then + force_overwrite=true; + else + echo 'Aborting.'; + exit 1; + fi; + ;; + esac + done +fi + +[[ -z "$arise_build" ]] && { arise_help; exit 1; } +echo + +# Make sure "arise_out" is empty and copy the source files over there to work from during the build process. +[[ -d arise-out ]] && [[ "$force_overwrite" == true ]] && rm -rf arise-out +mkdir -p arise-out +[[ -n "$(ls -A arise-out)" ]] && echo -e 'ERROR: The build output directory "/arise-out" is not empty. Program aborted to prevent overwrite of existing data.\n\nPlease empty the output directory before running Arise again or run your command with the "-f" flag to overwrite the existing output (dangerous).' && exit 1 +cp -r "arise-source/". "arise-out" +## Set an absolute path for $config +config=$(realpath $config) + +# Define a temporary file for a list of all source files for post-build cleanup +removelist="arise-out/arise-remove-$RANDOM.tmp" +touch $removelist +removelist=$(realpath $removelist) + +# Run the build process depending on whatever options have been set +if [[ "$arise_build" == "full" ]] || [[ "$arise_build" == "pages_only" ]]; then + echo -n "Building pages..." + build_page_tree arise-out || { echo "ERROR: An error was encountered while building pages. Aborting build cycle."; exit 1; } + echo " DONE." +fi + +if [[ "$arise_build" == "full" ]] || [[ "$arise_build" == "rss_only" ]]; then + echo -n "Building RSS feed..." + build_rss arise-out/rss.xml || { echo "ERROR: An error was encountered while building the RSS feed. Aborting build cycle."; exit 1; } + echo " DONE." +fi + +if [[ "$arise_build" == "full" ]] || [[ "$arise_build" == "sitemap_only" ]]; then + echo -n "Building sitemap..." + build_sitemap arise-out/sitemap.xml || { echo "ERROR: An error was encountered while building the sitemap. Aborting build cycle."; exit 1; } + echo " DONE." +fi + +if [[ "$keep_source" == false ]]; then + echo -n "Cleaning up build source files from output..." + # Remove every page that we built from as part of the build cycle + while read fname; do + [[ -f "$fname" ]] && rm "$fname" + done <$removelist + # Remove site config templates + rm "$config/header.html" + rm "$config/content_header.html" + rm "$config/footer.html" + rm "$config/arise.conf" + echo " DONE." +fi + +rm $removelist +echo -e '\nBuild completed! Built artefacts have been generated at:\n'"$(realpath arise-out)" diff --git a/arise-source/arise-icon.png b/arise-source/arise-icon.png new file mode 100644 index 0000000..3a0c9dc Binary files /dev/null and b/arise-source/arise-icon.png differ diff --git a/arise-source/config/arise.conf b/arise-source/config/arise.conf new file mode 100644 index 0000000..b24d0bc --- /dev/null +++ b/arise-source/config/arise.conf @@ -0,0 +1,15 @@ +#!/bin/bash + +############################################################## +# ARISE SITE CONFIG - Edit these variables to fit your website +############################################################## + +# Set your base website URL here. +export base_url='https://ari.se.net' + +# Set the path to your favicon. This should be an absolute path with reference to your siteroot. +# This variable is only used for your RSS feed, hence why it only allows up to a singular image to be set. Your primary site favicons should be configured by editing the /config/header.html file. +export favicon="/config/favicon/favicon.ico" + +# Set the global human-readable site name for your website. This string is usable in your site header as {{global_name}}. This is also used as the title for your RSS feed. +export global_name="Arise" diff --git a/arise-source/config/content_header.html b/arise-source/config/content_header.html new file mode 100644 index 0000000..332168c --- /dev/null +++ b/arise-source/config/content_header.html @@ -0,0 +1 @@ +

// {{published_date}} // by {{author}}

diff --git a/arise-source/config/favicon/android-chrome-192x192.png b/arise-source/config/favicon/android-chrome-192x192.png new file mode 100644 index 0000000..e39412a Binary files /dev/null and b/arise-source/config/favicon/android-chrome-192x192.png differ diff --git a/arise-source/config/favicon/android-chrome-256x256.png b/arise-source/config/favicon/android-chrome-256x256.png new file mode 100644 index 0000000..764d962 Binary files /dev/null and b/arise-source/config/favicon/android-chrome-256x256.png differ diff --git a/arise-source/config/favicon/apple-touch-icon.png b/arise-source/config/favicon/apple-touch-icon.png new file mode 100644 index 0000000..410c13e Binary files /dev/null and b/arise-source/config/favicon/apple-touch-icon.png differ diff --git a/arise-source/config/favicon/browserconfig.xml b/arise-source/config/favicon/browserconfig.xml new file mode 100644 index 0000000..14d054e --- /dev/null +++ b/arise-source/config/favicon/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #00aba9 + + + diff --git a/arise-source/config/favicon/favicon-16x16.png b/arise-source/config/favicon/favicon-16x16.png new file mode 100644 index 0000000..c73aa23 Binary files /dev/null and b/arise-source/config/favicon/favicon-16x16.png differ diff --git a/arise-source/config/favicon/favicon-32x32.png b/arise-source/config/favicon/favicon-32x32.png new file mode 100644 index 0000000..88eeb84 Binary files /dev/null and b/arise-source/config/favicon/favicon-32x32.png differ diff --git a/arise-source/config/favicon/favicon.ico b/arise-source/config/favicon/favicon.ico new file mode 100644 index 0000000..bcd4b86 Binary files /dev/null and b/arise-source/config/favicon/favicon.ico differ diff --git a/arise-source/config/favicon/mstile-150x150.png b/arise-source/config/favicon/mstile-150x150.png new file mode 100644 index 0000000..05c2c4c Binary files /dev/null and b/arise-source/config/favicon/mstile-150x150.png differ diff --git a/arise-source/config/favicon/safari-pinned-tab.svg b/arise-source/config/favicon/safari-pinned-tab.svg new file mode 100644 index 0000000..0df0ee0 --- /dev/null +++ b/arise-source/config/favicon/safari-pinned-tab.svg @@ -0,0 +1,30 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + + + diff --git a/arise-source/config/favicon/site.webmanifest b/arise-source/config/favicon/site.webmanifest new file mode 100644 index 0000000..53521b0 --- /dev/null +++ b/arise-source/config/favicon/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/config/favicon/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/config/favicon/android-chrome-256x256.png", + "sizes": "256x256", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/arise-source/config/footer.html b/arise-source/config/footer.html new file mode 100644 index 0000000..9fe5c3e --- /dev/null +++ b/arise-source/config/footer.html @@ -0,0 +1,10 @@ + + + + + + + diff --git a/arise-source/config/header.html b/arise-source/config/header.html new file mode 100644 index 0000000..64f8775 --- /dev/null +++ b/arise-source/config/header.html @@ -0,0 +1,65 @@ + + + + + + + + + + {{title}} · {{global_name}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/arise-source/config/logo.png b/arise-source/config/logo.png new file mode 100644 index 0000000..cc065b1 Binary files /dev/null and b/arise-source/config/logo.png differ diff --git a/arise-source/config/main.css b/arise-source/config/main.css new file mode 100644 index 0000000..3a59ead --- /dev/null +++ b/arise-source/config/main.css @@ -0,0 +1,166 @@ + +/*** Core page styles to set the primary colours and styles to be inherited by everything else ***/ + +/* Core Styling */ +html * { + font-family:sans-serif; +} +body{ + margin:40px auto; + max-width:650px; + line-height:1.6; + font-size:18px; + color:#65f85a; + background-color:#121619; + padding:0 10px; +} +/********************************/ +/********************************/ + +/*** Post styling. This section is for defining markup classes to make it easier to write prettier posts. ***/ + +img { + max-width: 100%; + max-height: 100%; + margin-top:20px; + margin-bottom:20px; + border-radius:16px; + margin-left: auto; + margin-right: auto; + display: block; +} + +code { + background-color:#293137; + border-radius:16px; + padding-left:30px; + padding-right:30px; + line-height:2em; + + padding-top:1px; + padding-bottom:1px; + color:#65f85a; + font-family:monospace; +} + +pre { + overflow-x: auto; + white-space: pre-wrap; + white-space: -moz-pre-wrap; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; +} + +blockquote { + border-left:1px solid #65f85a; + display:block; + margin-top: 1em; + margin-bottom: 1em; + margin-left: 30px; + padding-left: 10px; + margin-right: 40px; + font-style: italic; + color:#46ab3e; +} + +hr { + color:#65f85a; + margin-left: auto; + margin-right: auto; + max-width: 300px; +} + +#endline { /* Special kind of
for spacing out footnotes from the rest of a post */ + color:#65f85a; + margin-left: auto; + margin-right: auto; + max-width: 300px; + margin-top: 80px; +} + +a { + color:#b8f1b4 +} + +h1{ + line-height:1.2 +} + +h2,h3{ + padding-top:24px; + line-height:1.2 +} + +/* Style for inline dates. These are configured via a separate include file in /config/content_header.html. See notes on Arise page creation for more details. */ +.date { + padding-bottom:0; + margin-bottom:0; + font-size:14px; +} + +@media screen and (max-width: 900px) { +.date { + text-align:right; +} +} +@media screen and (min-width: 901px) { +.date { + float:right; + margin-left:30px; +} +} + +/********************************/ +/********************************/ + + +/*** Modular component styles. Includes styling for the headers, navigation controls, and footer. ***/ + +/* Site logo. Styled to responsively move to either left or be centred, depending if the page is being viewed on desktop or mobile respectively. */ +.logo { + margin-bottom:20px; + text-align:center; +} + +/* Navbar styling. */ +.topbar { + padding-right:10px; + border-top:1px solid #65f85a; + border-bottom:1px solid #65f85a; + margin-bottom:20px; + text-align:center; +} +.topbar a { +color:#65f85a; +text-decoration:none; +} + +/* Site footer styling */ +.footer { + border-top:2px solid #65f85a; + font-size:12px; + margin-top:120px; + text-align:center; +} + +/********************************/ +/********************************/ + + +/*** Other misc garbage ***/ + +/* Arise Index Style */ +.arise-toc-td { + border-width: 1px; + border-color: #65f85a; + border-top-style: solid; + text-align: center; + padding-right: 10px; + padding-bottom: 5px +} +.arise-toc-th { + padding-bottom: 20px; + border-bottom: 1px; + border-bottom-style: solid; +} diff --git a/arise-source/index.md b/arise-source/index.md new file mode 100644 index 0000000..e922431 --- /dev/null +++ b/arise-source/index.md @@ -0,0 +1,49 @@ + + +# Retro doesn't have to be regressive + +Arise is a static site generator written in Bash, designed to be a fusion of ultra-stable timeless 90s technology and modern DevOps paradigms. Arise is designed around use cases like individual blogs and personal websites. + +You ever see one of those nineties zombie websites that hasn't been updated in like thirty years but is still somehow running today? [Stuff like this](http://home.mcom.com/home/welcome.html). Can you imagine a modern website lasting that long without becoming a completely broken mess? + +We live in a world where the mindset of "move fast, break things" has trained web developers to keep stacking more and more overdesigned trash, one node framework or polyfill at a time, onto our websites. Over time, we've lost sight of the fact that at the end of the day a website is just a tool to share information with other people. + +Arise was built to show that you can take simple technology like Bash that is so set in stone as to be basically indestructible and use it to create modern web tools. + +## Simplify deployment + +90s websites may have lasted forever, but no one likes setting up a janky webserver on a computer in their closet. Arise is a modern cloud-native application that supports easy deployment to your cloud static site host of choice. + +Simply fork [Arise on Github](https://github.com/spectrasecure/arise), edit your site, and point your cloud vendor to your repository. The included CI workflow does all the hard work of building and deploying your site straight from the cloud. + +## Timeless tech built for the modern web + +Arise websites may be spartan on the surface, but they are designed to take advantage of modern web conventions for rich content presence and SEO. + +- Rich metadata for cross-site embeds with support for [OpenGraph](https://ogp.me/) and [TwitterCard](https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards) +- Dynamic sitemap generation for SEO +- Dynamic RSS feed generation + +## Practical pages for real-world use + +Real websites don't have just one page, but rather are built on top of hierarchies of linked pages filled with content. Arise builds websites that are designed to be modular and traversable. + +Arise supports the creation of dynamic index pages based on individual page metadata. Just tell Arise where you need an index, and it will build it for you all on its own. + +For an example of what the index pages created by Arise look like, check out the [Sample Posts](posts) on this website. + +## Get started with Arise + +Arise is free open-source software, available on [GitHub](https://github.com/spectrasecure/arise) under the [GNU AGPL License](https://www.gnu.org/licenses/agpl-3.0.en.html). diff --git a/arise-source/posts/abolish-arasaka/index.md b/arise-source/posts/abolish-arasaka/index.md new file mode 100644 index 0000000..ab290c2 --- /dev/null +++ b/arise-source/posts/abolish-arasaka/index.md @@ -0,0 +1,23 @@ + + +# Abolish Arasaka + +I saw Saburo Arasaka at a grocery store in Night City yesterday. I told him how cool it was to meet him in person, but I didn’t want to be a douche and bother him and ask him for photos or anything. + +He said, “Oh, like you’re doing now?” + +I was taken aback, and all I could say was “Huh?” but he kept cutting me off and going “huh? huh? huh?” and closing his hand shut in front of my face. I walked away and continued with my shopping, and I heard him chuckle as I walked off. When I came to pay for my stuff up front I saw him trying to walk out the doors with like fifteen Yikes! Tofu bars in his hands without paying. + +The girl at the counter was very nice about it and professional, and was like “Sir, you need to pay for those first.” At first he kept pretending to be tired and not hear her, but eventually turned back around and brought them to the counter. + +When she took one of the bars and started scanning it multiple times, he stopped her and told her to scan them each individually “to prevent any electrical infetterence,” and then turned around and winked at me. I don’t even think that’s a word. After she scanned each bar and put them in a bag and started to say the price, he kept interrupting her by yawning really loudly. diff --git a/arise-source/posts/index.md b/arise-source/posts/index.md new file mode 100644 index 0000000..e700ff5 --- /dev/null +++ b/arise-source/posts/index.md @@ -0,0 +1,13 @@ + diff --git a/arise-source/posts/my-cool-post/index.md b/arise-source/posts/my-cool-post/index.md new file mode 100644 index 0000000..a09721c --- /dev/null +++ b/arise-source/posts/my-cool-post/index.md @@ -0,0 +1,19 @@ + + +# Look, a cool post + +You can make cool posts on your Arise website! + +You can even use images, look: + +![The Great Wave off Kanagawa](kanagawa.jpg) diff --git a/arise-source/posts/my-cool-post/kanagawa.jpg b/arise-source/posts/my-cool-post/kanagawa.jpg new file mode 100644 index 0000000..c7ecb7e Binary files /dev/null and b/arise-source/posts/my-cool-post/kanagawa.jpg differ diff --git a/arise-source/robots.txt b/arise-source/robots.txt new file mode 100644 index 0000000..6fe47da --- /dev/null +++ b/arise-source/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Disallow: https://ari.se.net/config/* + +Sitemap: https://ari.se.net/sitemap.xml diff --git a/docs/guides/creating-arise-pages/README.md b/docs/guides/creating-arise-pages/README.md new file mode 100644 index 0000000..1e8fbd7 --- /dev/null +++ b/docs/guides/creating-arise-pages/README.md @@ -0,0 +1,121 @@ +# Creating Arise Pages + +This documentation page will explain how Arise websites are structured, how to create new pages, and the options that are available when configuring a new page. + +## Site Architecture Overview + +All pages in Arise have a common modular structure. Each page is made up of a folder with an `index.md` at the root of the page. Thumbnails, images, and other page assets should be stored in the same folder as the page `index.md` file. The basic structure of every page in Arise can be visualised like this: + +``` + . + ├── pagename/ + │ ├── index.md + │ ├── thumbnail.png + │ └── [other assets] + └── ... +``` + +When Arise builds your site, it traverses the folder structure of the entire site and builds everything with the above structure in mind. + +For large folders full of pages, Arise also supports the creation of dynamically generated index pages. You can tell Arise to create an index page at a given folder by using the `toc` setting (see: [Optional Settings](#optional-settings)) in your index folder's `index.md`. + +The structure of an Arise website making use of indices should look something like this: + +``` + . + ├── index1/ + │ ├── index.md + │ ├── page1/.. + │ └── page2/.. + │ + ├── index2/ + │ ├── index.md + │ ├── page1/.. + │ └── page2/.. + └── ... +``` + + +## Creating New Pages + +To create a new page, simply create a folder and make an `index.md` file with an Arise metadata header at the very top of the file. A standard Arise metadata header looks like this: + +``` + +``` + +The Arise metadata header is broken up into three sections **Critical** settings, **Standard** settings, and **Optional** settings. The setting variable names are case sensitive. + +### Critical Settings + +If critical settings are not included or are left blank your page will not build. There is currently only one critical setting: + +- **Title**: This is the human-readable title of your web page. It cannot be left blank or your page will not build. + +### Standard Settings + +Standard settings must be present in your page header, but they can optionally be left blank. However, it is not recommended to leave them blank because your page will be missing SEO data if these settings are not populated. + +- **Author**: Who wrote this page +- **Description**: A brief human-readable description of your page. This will be what appears in the subtext of search engine results or social media that supports rich embeds, so you are advised (but not required) to keep this field under 120 characters in length. +- **Language**: The [ISO 639-1 language code](https://www.w3schools.com/tags/ref_language_codes.asp) for the language your page is written in. +- **Thumbnail**: The filename of your thumbnail image. The thumbnail image must be in the same folder as your `index.md` for your page. +- **Published Date**: The [ISO-8601 short date](https://en.wikipedia.org/wiki/ISO_8601#Calendar_dates) (aka: YYYY-MM-DD) for when your page was originally published to your site. +- **Modified Date**: The [ISO-8601 short date](https://en.wikipedia.org/wiki/ISO_8601#Calendar_dates) (aka: YYYY-MM-DD) for when your page was last modified. + +### Optional Settings + +Optional settings can be omitted entirely from your header. These settings contain advanced options for special functionality within Arise. If you choose to omit one of these options, Arise will build your page with the default setting for any omitted optional setting. Optional page settings that are available include: + +- **content_header**: (Default: **true**) Arise has a special build file `config/content_header.html` with content to be appended to every page immediately after the opening `` tag. However, for some special pages on your website, you may want to format the body of your page in a completely unique way that omits your standard site elements within the ``. If you set `content_header` to `"false"`, the content header (but not SEO header) will be omitted from your special page so that you can format the body individually for that page. + - By default, the only thing included in the content header is a tag to display the post date and author of any given post. You can always add more or change the default content header to your liking if you have other standard content you'd like included in the body of your page! +- **process_markdown**: (Default: **true**) Arise is designed to build pages written in [Markdown](https://daringfireball.net/projects/markdown/). However, let's say you have a page that is already written in HTML. When you set `process_markdown` to `"false"`, Arise will skip the step of converting Markdown into HTML and just pass the raw contents of your `index.md` as the body of your page. + - This setting is particularly useful if you are porting content from another website that already has the body of your content in HTML format and you don't want any additional processing beyond the addition of a header+footer to be done to it. +- **toc**: (Default: **false**) This is a special setting that instructs Arise that the folder containing this `index.md` isn't actually a normal page, but rather a folder containing other pages that you'd like a traversable index/TOC built for. If you set `toc` to `"true"`, Arise will look through all the folders contained in the current folder, grab their metadata if they are Arise-formatted pages, and generate a pretty index for you. + - If this setting is enabled, Arise will ignore all content present after the Arise metadata header and create an index/TOC page instead. +- **rss_hide**: (Default: **false**) When set to "true", this setting hides your page from the RSS feed. This is useful for meta pages (privacy policy, contact, etc) that you don't want to send to the feeds for your RSS readers. + - Note that dynamically generated TOC pages are automatically hidden from your RSS feed, so you do not need to manually add this setting for those pages. + +## Page Themes + +All pages in Arise are built by concatenating the following files in the following order: +- [/config/header.html](/arise-source/config/header.html) +- [/config/content_header.html](/arise-source/config/content_header.html) +- The `index.md` for the page being built +- [/config/footer.html](/arise-source/config/footer.html) + +If you want to change the style or overall layout of your website, you need to edit the `/config/header.html` file for your website. + +By default, the stylesheet used by `/config/header.html` is [/config/main.css](/arise-source/config/main.css). + +The Arise header supports the following dynamic metadata tags, which will be populated with info from the page being built at build time: +- `{{base_url}}` - The base url for your website, in the format of `https://example.com` +- `{{global_name}}` - The human-readable global name of your website +- `{{title}}` - The title of the page being built +- `{{author}}` - The author of the page being built +- `{{description}}` - The human-readable description of the page being built +- `{{language}}` - The [ISO 639-1 language code](https://www.w3schools.com/tags/ref_language_codes.asp) for the language your page is written in. +- `{{thumbnail}}` - The filename of your thumbnail image. +- `{{published_date}}` - The [ISO-8601 short date](https://en.wikipedia.org/wiki/ISO_8601#Calendar_dates) (aka: YYYY-MM-DD) for when your page was originally published to your site. +- `{{modified_date}}` - The [ISO-8601 short date](https://en.wikipedia.org/wiki/ISO_8601#Calendar_dates) (aka: YYYY-MM-DD) for when your page was last modified. + +## Caveats & Gotchas + +There are some caveats to how this data is processed that you should be mindful of. + +- The metadata in the Arise header is used to generate your site's RSS feed, which is an XML document. Remember to always use [XML escape codes](https://docs.oracle.com/cd/A97335_02/apps.102/bc4j/developing_bc_projects/obcCustomXml.htm) for any of the five XML-reserved characters (`<>&'"`) for text variables in your Arise header or you will break your RSS feed. +- Arise specifically looks for files titled `index.md` for its build process. Do yourself a favour and don't name files `index.md` if you don't want Arise to include them. +- `/config` is a specially directory reserved for site templates and live sitewide assets. Arise will not build pages in this folder or its subfolders. diff --git a/docs/guides/getting-started/README.md b/docs/guides/getting-started/README.md new file mode 100644 index 0000000..e4dd4fb --- /dev/null +++ b/docs/guides/getting-started/README.md @@ -0,0 +1,26 @@ +# Getting Started with Arise + +Welcome to Arise! Arise is designed to be a cloud-native application. This guide will walk you through the basics of how to build and deploy your website to the cloud using Arise. + +It's actually very simple to get a website up and running using Arise. + +## Cloud Deployments + +1. Fork this repo +2. Edit the global Arise site configuration file at `/arise-source/config/arise.conf` +3. Edit the example site in `/arise-source/` to your liking + - Check out the page on [creating pages](../creating-arise-pages/README.md) for more information on the specifics of how Arise pages work +4. Configure your `/arise-source/robots.txt` with your site domain and any additional crawler settings you'd like to set. +5. Upon any new commit to the site source files, the GitHub Actions workflow present in `/.github/workflows/` will automatically build your website based on the contents of `/arise-source/` and output the built files to your `html` branch. +6. Configure your cloud web host of choice to automatically deploy a static site from the `html` branch of your repo. Specific instructions for several notable providers can be found below: + - [Cloudflare Pages](cloudflare/README.md) + - [DigitalOcean](digitalocean/README.md) + - [GitHub Pages](github-pages/README.md) + +Congrats! Your site is now up and running! If you want to make changes to your website, you can simply make a commit to the `main` branch of your repo source files and it will automatically be deployed to your live website! Pretty wiz, yeah? + +## Running Arise Locally (Not Recommended) + +You can also clone this repo and run Arise locally. However, this not recommended because you are honestly wasting your time by manually running the build process and managing the build artefacts instead of just sitting back and letting CI/CD do the work for you. + +If you REALLY want to run Arise locally, please refer to [this guide](../running-arise-locally/README.md). diff --git a/docs/guides/getting-started/cloudflare/README.md b/docs/guides/getting-started/cloudflare/README.md new file mode 100644 index 0000000..4cc2d06 --- /dev/null +++ b/docs/guides/getting-started/cloudflare/README.md @@ -0,0 +1,21 @@ +# Deploying to Cloudflare Pages + +This guide assumes that you have completed steps 1-3 from [Getting Started](../README.md) and have a successfully build website in your `html` branch. + +1. Navigate to your [Cloudflare Dashboard](https://dash.cloudflare.com) and click **Pages** in the sidebar. +2. Click **Create a project** > **Connect to Git**. +3. Add your account and select your repository. Click **Begin setup** to proceed. +4. Name your project whatever you'd like and select `html` as your **Production branch**. Leave all the optional **Build settings** blank-- we don't need any of these. +

Screenshot: Cloudflare Pages Deploy Settings

+ +5. Click **Save and Deploy** +6. **IMPORTANT**: Click **Pages** in the sidebar and click on your site. +7. Click **Settings**. +8. Click **Builds & deployments**. +9. Click **Configure Preview deployments**. +10. Click **None** and **Save**. +

Screenshot: Disable Cloudflare Preview deployments

+ +As of this writing, if you don't IMMEDIATELY disable preview deployments, Cloudflare will automatically generate live externally-accessible "preview" URLs for every single branch in your website repo (even if your repo is private). Based on how Arise works, this will not only result in previews that are broken and do not work, but it will disclose literally everything in your repo including potentially WIP pages if your repo is private. To put a cherry on top, after preview deployments have been build for a branch, you cannot delete them without deleting and re-adding your entire damn website. What a stupid-ass system. + +Anyway, rants aside, your site should now be up and running on Cloudflare Pages! Congrats! If you'd like to use a custom domain, please review Cloudflare's [custom domains guide](https://developers.cloudflare.com/pages/platform/custom-domains/) as that is outside of the scope of this documentation. diff --git a/docs/guides/getting-started/cloudflare/cloudflare-1.png b/docs/guides/getting-started/cloudflare/cloudflare-1.png new file mode 100755 index 0000000..d3ce34d Binary files /dev/null and b/docs/guides/getting-started/cloudflare/cloudflare-1.png differ diff --git a/docs/guides/getting-started/cloudflare/cloudflare-2.png b/docs/guides/getting-started/cloudflare/cloudflare-2.png new file mode 100755 index 0000000..a81ac63 Binary files /dev/null and b/docs/guides/getting-started/cloudflare/cloudflare-2.png differ diff --git a/docs/guides/getting-started/digitalocean/README.md b/docs/guides/getting-started/digitalocean/README.md new file mode 100644 index 0000000..d20e520 --- /dev/null +++ b/docs/guides/getting-started/digitalocean/README.md @@ -0,0 +1,13 @@ +# Deploying to DigitalOcean + +This guide assumes that you have completed steps 1-3 from [Getting Started](../README.md) and have a successfully build website in your `html` branch. + +1. Navigate to the [Apps](https://cloud.digitalocean.com/apps) pane in your DigitalOcean account. +2. Click **Create App**. +2. Select **GitHub** as your source, select your repository, and define `html` as your target branch. Leave `/` as your source directory. Leave the box checked next to **Autodeploy** so that your site will automatically pull new updates whenever you push a commit to `main` in your Arise site repo on GitHub. Hit **Next** to proceed. +

Screenshot: DigitalOcean Deploy Settings

+ +3. Click **Skip to Review** to skip past all the other optional settings-- we don't need any of them. +4. Click **Create Resources**. + +Congrats! Your Arise website is now live on DigitalOcean. If you'd like to use a custom domain, please review DigitalOcean's [custom domains guide](https://docs.digitalocean.com/products/app-platform/how-to/manage-domains/) as that is outside of the scope of this documentation. diff --git a/docs/guides/getting-started/digitalocean/digitalocean-1.png b/docs/guides/getting-started/digitalocean/digitalocean-1.png new file mode 100755 index 0000000..f0fbac9 Binary files /dev/null and b/docs/guides/getting-started/digitalocean/digitalocean-1.png differ diff --git a/docs/guides/getting-started/github-pages/README.md b/docs/guides/getting-started/github-pages/README.md new file mode 100644 index 0000000..9fbc186 --- /dev/null +++ b/docs/guides/getting-started/github-pages/README.md @@ -0,0 +1,15 @@ +# Deploying to GitHub Pages + +This guide assumes that you have completed steps 1-3 from [Getting Started](../README.md) and have a successfully build website in your `html` branch. + +This guide will also assume that you don't already have a GitHub Pages site and are using Arise to host your User Site. For Project Sites, please review [GitHub's documentation](https://docs.github.com/en/pages/getting-started-with-github-pages/about-github-pages#types-of-github-pages-sites). + +Frankly, the configuration annoyance of GitHub Pages with multiple hosted sites is a pretty good reason to use a provider like [Cloudflare Pages](../cloudflare/README.md) or [DigitalOcean](../digitalocean/README.md) instead. + +1. Name your repo to **yourusername.github.io**. +2. Navigate to your repo and click **Settings** in the navbar. +3. Click **Pages** in the sidebar. +4. Under the dropdown for **Source**, click **Deploy from a branch**. +5. Select the `html` branch. Leave `/ (root)` as the folder and click **Save**. + +Congrats! Your Arise website is now live on GitHub Pages. If you'd like to use a custom domain, please review GitHub's [custom domains guide](https://docs.github.com/articles/using-a-custom-domain-with-github-pages/) as that is outside of the scope of this documentation. diff --git a/docs/guides/running-arise-locally/README.md b/docs/guides/running-arise-locally/README.md new file mode 100644 index 0000000..40b56f5 --- /dev/null +++ b/docs/guides/running-arise-locally/README.md @@ -0,0 +1,39 @@ +# Running Arise Locally + +The following instructions will walk you through how to build an Arise website by running Arise on your local machine. This is primarily intended for development and not regular use. If you just want to throw up an Arise website as easily as possible, please use the cloud native instructions in the [Getting Started](../getting-started/README.md) guide. + +1. Ensure you have the [proper dependencies](/README.md#dependencies) installed. +2. Clone this repo and cd into it: `git clone https://github.com/spectrasecure/arise && cd arise` +3. Edit the global Arise site configuration file at `/arise-source/config/arise.conf` +4. Edit the example site in `/arise-source/` to your liking + - Check out the page on [creating pages](../creating-arise-pages/README.md) for more information on the specifics of how Arise pages work +5. Configure your `robots.txt` in the root of the repository with your site domain and any additional crawler settings you'd like to set. +6. Build Arise by running `bash arise build` +7. Your built site will be output to `arise-out/`. It is up to you to upload these wherever to host your site. + +### Command Line Arguments for Arise + +The Arise shell script allows for several partial build modes, largely for testing purposes. These options are also displayed to you in the Help prompt which is displayed if you attempt to run Arise without any options or with invalid options. + +``` +Usage: +------ +bash arise build -[k][f] + # Builds the entire site + available in all build modes: + -k: Keeps source files in output + -f: Force overwrite pre-existing output +bash arise -[p|s|r][k][f] + # Builds only specific parts of the site + # Useful for testing purposes + mutually exclusive options: + -p: Build pages only mode + -s: Build sitemap only mode + -r: Build rss only mode +``` + +- `bash arise -p` - Running Arise in this manner will only build (p)ages. It will not build the sitemap or the RSS feed. +- `bash arise -s` - Running Arise in this manner will only build the (s)itemap. It won't build anything else. +- `bash arise -r` - Running Arise in this manner will only build the (r)ss feed. It won't build anything else. +- `-k` - Adding this flag to any build mode will (k)eep the source files in the output directory rather than deleting them from the output. +- `-f` - By default, Arise will throw an error if the output folder `arise-out` already has contents in it in order to prevent you from accidentally overwriting your current built output. If you would like to override this safeguard and (f)orce Arise to delete the current contents of `arise-out`, this is the flag to do so. diff --git a/docs/logo/arise-icon.png b/docs/logo/arise-icon.png new file mode 100644 index 0000000..3a0c9dc Binary files /dev/null and b/docs/logo/arise-icon.png differ diff --git a/docs/logo/arise-icon.xcf b/docs/logo/arise-icon.xcf new file mode 100644 index 0000000..4d6051b Binary files /dev/null and b/docs/logo/arise-icon.xcf differ diff --git a/docs/logo/arise-logo.svg b/docs/logo/arise-logo.svg new file mode 100644 index 0000000..8c6b3cd --- /dev/null +++ b/docs/logo/arise-logo.svg @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + e + $ + I + R + A + + diff --git a/docs/logo/arise-logo_flattened.svg b/docs/logo/arise-logo_flattened.svg new file mode 100644 index 0000000..9c3f7ce --- /dev/null +++ b/docs/logo/arise-logo_flattened.svg @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/logo/arise-logo_transparent.png b/docs/logo/arise-logo_transparent.png new file mode 100644 index 0000000..cc065b1 Binary files /dev/null and b/docs/logo/arise-logo_transparent.png differ diff --git a/docs/logo/fonts/robotech-gp.zip b/docs/logo/fonts/robotech-gp.zip new file mode 100644 index 0000000..eadeac9 Binary files /dev/null and b/docs/logo/fonts/robotech-gp.zip differ diff --git a/docs/logo/fonts/woodwarrior.zip b/docs/logo/fonts/woodwarrior.zip new file mode 100644 index 0000000..384c765 Binary files /dev/null and b/docs/logo/fonts/woodwarrior.zip differ diff --git a/lib/functions/README.md b/lib/functions/README.md new file mode 100644 index 0000000..a2defa7 --- /dev/null +++ b/lib/functions/README.md @@ -0,0 +1,13 @@ +# Arise Functions + +Like most larger projects build in Bash, Arise is a modular program split up into functions. The folders in this directory contain the source files for each function defined for use by Arise. + +## Implementation Notes + +Bash is an interesting language because its functions are "fake" in the sense that they are simply a reader-friendly way of performing command grouping operations and nothing more. They are not capable of actually returning data in the way that functions do in most other programming languages. What's more fun is that unless you're careful, modifications to environment variables within a function will carry over to subsequent actions outside of that function due to the dynamic variable scoping in Bash. + +As a result of this limitation, Arise makes use of subshells to work around limitations with variable scoping and shell variables. While this may not be the most efficient workaround, it prevents the dynamic scoping of environment conditions from within subshell functions from contaminating parent functions. Not all functions need this, and thus many functions are simply run inline instead of being routed into a subshell. + +There are two types of functions Arise uses are referred to as **Inline** and **Subshell**. The difference between these two function categories is that **Inline** functions are declared with `{}` and **Subshell** functions are declared with `()`. For organisational purposes, these two respective function categories have their own respective folder for source files + +Upon program run, Arise pulls in all `*.sh` files in both the `inline` and `subshell` directories. As a convention, each function is broken up into its own source file. The convention used for naming source files is `function_name.sh`. Documentation for individual functions and their usage can be found in the comments at the top of each function source file. diff --git a/lib/functions/inline/arise_help.sh b/lib/functions/inline/arise_help.sh new file mode 100644 index 0000000..c831ae9 --- /dev/null +++ b/lib/functions/inline/arise_help.sh @@ -0,0 +1,37 @@ +#!/bin/bash +############# +# DESCRIPTION +############# +# Prints help +# +############# +# Usage: +# arise_help + +arise_help() { +cat <> $1 +} diff --git a/lib/functions/inline/build_header.sh b/lib/functions/inline/build_header.sh new file mode 100644 index 0000000..a3bbd6e --- /dev/null +++ b/lib/functions/inline/build_header.sh @@ -0,0 +1,50 @@ +#!/bin/bash +############# +# DESCRIPTION +############# +# Builds the page header +# +# This function assumes that metadata has already been fetched in the current subshell. If no metadata is present, it will do nothing. +# +############# +# Usage: +# build_header destination.html + +build_header() { + # Verify that metadata variables are populated before running. + [[ $title != '' ]] && { + cat $config/header.html > $1 + + # If enabled (default:true), add a configurable content header after the metadata header. The purpose of this is to enable a standardised header for stuff like post dates that should be on *most* pages, but can be disabled on pages the user considers special and wants to build out completely on their own. + [[ $content_header == "true" ]] && cat $config/content_header.html >> $1 + + # Replace all tags with their value. Ampersands are a special character in sed, so we have to clean them up using bash string manipulation before running the sed global replace. + title=${title//&/\\&} + sed -i "s^{{title}}^$title^g" $1 + + author=${author//&/\\&} + sed -i "s^{{author}}^$author^g" $1 + + description=${description//&/\\&} + sed -i "s^{{description}}^$description^g" $1 + + language=${language//&/\\&} + sed -i "s^{{language}}^$language^g" $1 + + thumbnail=${thumbnail//&/\\&} + sed -i "s^{{thumbnail}}^$thumbnail^g" $1 + + sed -i "s^{{published_date}}^$published_date^g" $1 + + sed -i "s^{{modified_date}}^$modified_date^g" $1 + + canonical_url=${canonical_url//&/\\&} + sed -i "s^{{canonical_url}}^$canonical_url^g" $1 + + base_url=${base_url//&/\\&} + sed -i "s^{{base_url}}^$base_url^g" $1 + + global_name=${global_name//&/\\&} + sed -i "s^{{global_name}}^$global_name^g" $1 + } +} diff --git a/lib/functions/inline/clear_metadata.sh b/lib/functions/inline/clear_metadata.sh new file mode 100644 index 0000000..e250792 --- /dev/null +++ b/lib/functions/inline/clear_metadata.sh @@ -0,0 +1,22 @@ +#!/bin/bash +############# +# DESCRIPTION +############# +# Clears the metadata variables to prevent metadata from carrying over to the wrong page. This is important because of how promiscuous bash is with its variables. +# +############# +# Usage: +# clear_metadata + +clear_metadata() { + metadata='' + title='' + author='' + description='' + language='' + thumbnail='' + published_date='' + modified_date='' + relative_url='' + canonical_url='' +} diff --git a/lib/functions/inline/get_page_metadata.sh b/lib/functions/inline/get_page_metadata.sh new file mode 100644 index 0000000..f4a6abf --- /dev/null +++ b/lib/functions/inline/get_page_metadata.sh @@ -0,0 +1,60 @@ +#!/bin/bash +############# +# DESCRIPTION +############# +# Pulls all the Arise-specific metadata from the header of a given page. +# +# This function is meant to be run inline before other functions so that it can populate the information other functions need to operate upon. +# +############# +# Usage: +# get_page_metadata source.md + +get_page_metadata() { + if [[ -e $1 ]]; then + metadata=$(sed -e '/END ARISE/,$d' < $1) + + # Main page metadata + title=$(grep "Title::" <<< $metadata | cut -d '"' -f2) + author=$(grep "Author::" <<< $metadata | cut -d '"' -f2) + description=$(grep "Description::" <<< $metadata | cut -d '"' -f2) + language=$(grep "Language::" <<< $metadata | cut -d '"' -f2) + thumbnail=$(grep "Thumbnail::" <<< $metadata | cut -d '"' -f2) + published_date=$(grep "Published Date::" <<< $metadata | cut -d '"' -f2) + modified_date=$(grep "Modified Date::" <<< $metadata | cut -d '"' -f2) + + # Optional page settings with default settings + + # is_toc default: false + is_toc=$(grep "toc::" <<< $metadata | cut -d '"' -f2) + if [[ $is_toc != "true" ]]; then + is_toc="false" + fi + + # process_markdown default: true + process_markdown=$(grep "process_markdown::" <<< $metadata | cut -d '"' -f2) + if [[ $process_markdown != "false" ]]; then + process_markdown="true" + fi + + # content_header default: true + content_header=$(grep "content_header::" <<< $metadata | cut -d '"' -f2) + if [[ $content_header != "false" ]]; then + content_header="true" + fi + + # rss_hide default: false + rss_hide=$(grep "rss_hide::" <<< $metadata | cut -d '"' -f2) + if [[ $rss_hide != "true" ]]; then + rss_hide="false" + fi + + # URL + relative_url="$(realpath $(dirname $1) | sed 's@.*arise-out@@g')"'/' + canonical_url="$base_url""$relative_url" + else + # Clear out metadata so that anything calling this function expecting to get new data cannot get old values on accident if the requested file does not exist. + clear_metadata + fi + +} diff --git a/lib/functions/subshell/build_page.sh b/lib/functions/subshell/build_page.sh new file mode 100644 index 0000000..881b40b --- /dev/null +++ b/lib/functions/subshell/build_page.sh @@ -0,0 +1,35 @@ +#!/bin/bash +############# +# DESCRIPTION +############# +# Builds a page from a source .md file and outputs the built version to 'index.html' in the same directory +# +############# +# Usage: +# build_page source.md + +build_page() ( + +# Switch to page directory +page=$(basename $1) +cd $(dirname $1) + +get_page_metadata $page + +if [[ $is_toc == "true" ]]; then + build_toc $page +elif [[ $process_markdown == "false" ]]; then + build_header index.html + cat $page | sed -e '1,/END ARISE/d' | cat >> index.html + build_footer index.html +else + build_header index.html + # Grab everything after the Arise metadata block, run it through pandoc to convert to html, and append to our file in progress + cat $page | sed -e '1,/END ARISE/d' | pandoc -f markdown -t html >> index.html + build_footer index.html +fi + +# Inline Evaluations - DISABLED, WIP, ENABLE AT YOUR OWN PERIL +# evaluate_inline index.html + +) diff --git a/lib/functions/subshell/build_page_tree.sh b/lib/functions/subshell/build_page_tree.sh new file mode 100644 index 0000000..6118972 --- /dev/null +++ b/lib/functions/subshell/build_page_tree.sh @@ -0,0 +1,22 @@ +#!/bin/bash +############# +# DESCRIPTION +############# +# Builds all pages on the site by calling "build_page" for every markdown file it can find outside of /config. +# +# Note that this function actually takes the root site directory to recursively build from as an argument. +# +############# +# Usage: +# build_page /path/to/arise-out/ + +build_page_tree() ( +cd $1 + +find . -type f -name "index.md" -not \( -path ./config -prune \) | while read fname; do +build_page $fname + +# Add the source file to the list of files to remove in cleanup +echo "$(realpath $fname)" >> $removelist +done +) diff --git a/lib/functions/subshell/build_rss.sh b/lib/functions/subshell/build_rss.sh new file mode 100644 index 0000000..2bffd73 --- /dev/null +++ b/lib/functions/subshell/build_rss.sh @@ -0,0 +1,78 @@ +#!/bin/bash +############# +# DESCRIPTION +############# +# Recursively crawls through the site and reads page metadata to generate an RSS feed for all content on the website. +# +# The script will output the completed RSS feed to the location specified as an argument. +# +############# +# Usage: +# build_rss rss.xml + +build_rss() ( + +# Switch to rss file's directory +touch $1 +rss=$(realpath $1) +cd $(dirname $1) + +# Wipe out the existing rss feed, if there is one, and declare our new rss feed +# Note that metadata descriptors are pulled from the index.md file that lives in the same folder as the destination for the rss.xml file. +get_page_metadata index.md +cat > $rss < + + + $global_name + $description + $base_url + $language + Arise +EOF + +[[ $favicon != '' ]] && { + cat >> $rss < + $base_url$favicon + $global_name + $base_url + +EOF +} + +cat >> $rss < + 60 +$(date --rfc-822) +EOF + +# List every directory in our sitemap (except config). This makes up our sitemap since Arise is built to use directory roots as page URLs +find . -type d -not \( -path ./config -prune \) | while read fname; do +page_index=$(realpath "$fname"'/index.md') + + if [ -e $page_index ]; then + get_page_metadata $page_index + + if [[ $rss_hide != "true" ]] && [[ $is_toc != "true" ]]; then + # Convert html's ISO8601 date to RSS's RFC-822. Fuck you RSS. + rss_date=$(date -d "$published_date" --rfc-822) + + cat >> $rss < + $title + $author + $description + $canonical_url + $rss_date + +EOF + fi + clear_metadata + fi +done + +# Close up the rss feed +echo -e '\n' >> $rss + +) diff --git a/lib/functions/subshell/build_sitemap.sh b/lib/functions/subshell/build_sitemap.sh new file mode 100644 index 0000000..bb2b5fe --- /dev/null +++ b/lib/functions/subshell/build_sitemap.sh @@ -0,0 +1,44 @@ +#!/bin/bash +############# +# DESCRIPTION +############# +# Automatically generates a sitemap at the given file location. +# +# Note that this function will map out your site using the specified location as the root of its mapping crawl. If you define a sitemap location in a subdirectory of your website, it will only map subfolders of that location. +# +############# +# Usage: +# build_sitemap /path/to/sitemap.xml + +build_sitemap() ( + +# Switch to sitemap directory +touch $1 +sitemap=$(basename $1) +cd $(dirname $1) + +# Wipe out the existing sitemap, if there is one, and declare our new sitemap +echo '' > $sitemap +echo '' >> $sitemap + +# List every directory in our sitemap (except config). This makes up our sitemap since Arise is built to use directory roots as page URLs +find . -type d -not \( -path ./config -prune \) | while read fname; do + + # Rewrite the local path from the find command as the live web URL as the tag for the sitemap standard + echo -e '\n'"$base_url"'/'"$(echo $fname | sed -n -e 's|\.\/||p')"'' >> $sitemap + + # If this page contains a Arise-style index page with a date modified, include that as a for the sitemap standard + modified_date='' + get_page_metadata $fname/index.md + if [ -n "$modified_date" ]; then + echo ''"$modified_date"'' >> $sitemap + fi + clear_metadata + + # Close the tag for the current URL being looped through + echo '' >> $sitemap +done + +# Close up the sitemap +echo '' >> $sitemap +) diff --git a/lib/functions/subshell/build_toc.sh b/lib/functions/subshell/build_toc.sh new file mode 100644 index 0000000..382d435 --- /dev/null +++ b/lib/functions/subshell/build_toc.sh @@ -0,0 +1,51 @@ +#!/bin/bash +############# +# DESCRIPTION +############# +# Creates a table of contents at the location of the specified source file. +# +############# +# Usage: +# build_toc index.md + +build_toc() ( + +# Throw the metadata header together and add the source file to the list of files to remove in cleanup +toc_source=$(basename $1) +cd $(dirname $1) +get_page_metadata $toc_source +echo "$(realpath $toc_source)" >> $removelist +build_header index.html + +# Add the title and start of the table for the TOC +cat >> index.html <$title +

+ + + + + + +EOF +clear_metadata + +# Make each entry into an individual table row. For now we're storing these in a temp file so that we can sort if after we're done generating all the entries in the TOC. +toc_tmp="arise-toc-$RANDOM.tmp" +find . -mindepth 2 -maxdepth 2 -type f -name 'index.md' | while read fname; do +get_page_metadata $fname +echo '' >> $toc_tmp +clear_metadata +done + +# Sort all of our contents by date so that they're not in random order +sort -r $toc_tmp >> index.html +rm $toc_tmp + +# Final page bits +cat >> index.html < +

+EOF +build_footer index.html +) diff --git a/lib/functions/subshell/evaluate_inline.sh b/lib/functions/subshell/evaluate_inline.sh new file mode 100644 index 0000000..8864872 --- /dev/null +++ b/lib/functions/subshell/evaluate_inline.sh @@ -0,0 +1,26 @@ +#!/bin/bash +############# +# DESCRIPTION +############# +# Evaluates inline bash snippets when building pages. +# +# This functionality is currently disabled for initial release because even though it "works". When called by build_page, the parsing isn't very good and the syntax for calling an inline evaluation could use some work. +# +############# +# Function Usage: +# evaluate_inline index.html +# +# Inline Snippet Usage: +#
sh# echo "Hello World!" 
+ +evaluate_inline() ( + +evaluation_source=$(basename $1) +cd $(dirname $1) + +while grep "
sh#" $evaluation_source
+do
+        replacement=$(bash <<< $(sed -n -e s$'\001''
sh#\(.*\)
'$'\001''\1'$'\001''p' < $evaluation_source | head -1)) + awk 'NR==1,/
sh#.*<\/pre>/{sub(/
sh#.*<\/pre>/, "'"$replacement"'")}{print >"'"$evaluation_source"'"}' $evaluation_source || break
+done
+)
DateTitleDescription
'"$published_date"''"$title"''"$description"'