{"id":24627878,"url":"https://github.com/ceticamarco/rhino","last_synced_at":"2025-05-07T20:04:40.078Z","repository":{"id":273994476,"uuid":"912881829","full_name":"ceticamarco/rhino","owner":"ceticamarco","description":"🦏 Simple markup language for building static websites","archived":false,"fork":false,"pushed_at":"2025-04-17T09:03:34.000Z","size":78,"stargazers_count":12,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-07T20:01:58.738Z","etag":null,"topics":["functional-programming","haskell","language-development","markup-language","parser","ssg","static-site-generator"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ceticamarco.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-01-06T15:31:43.000Z","updated_at":"2025-04-30T19:46:23.000Z","dependencies_parsed_at":"2025-05-07T20:01:49.081Z","dependency_job_id":null,"html_url":"https://github.com/ceticamarco/rhino","commit_stats":null,"previous_names":["ceticamarco/rhino"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceticamarco%2Frhino","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceticamarco%2Frhino/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceticamarco%2Frhino/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ceticamarco%2Frhino/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ceticamarco","download_url":"https://codeload.github.com/ceticamarco/rhino/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252949271,"owners_count":21830151,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["functional-programming","haskell","language-development","markup-language","parser","ssg","static-site-generator"],"created_at":"2025-01-25T05:13:32.545Z","updated_at":"2025-05-07T20:04:40.062Z","avatar_url":"https://github.com/ceticamarco.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003ch1\u003eRhino 🦏\u003c/h1\u003e\n    \n\u003ch6\u003e\u003ci\u003eSimple markup language for building static websites\u003c/i\u003e\u003c/h6\u003e\n\n[![](https://github.com/ceticamarco/rhino/actions/workflows/build.yml/badge.svg)](https://github.com/ceticamarco/rhino/actions/workflows/build.yml)\n[![](https://github.com/ceticamarco/rhino/actions/workflows/tests.yml/badge.svg)](https://github.com/ceticamarco/rhino/actions/workflows/tests.yml)\n[![](https://github.com/ceticamarco/rhino/actions/workflows/linter.yml/badge.svg)](https://github.com/ceticamarco/rhino/actions/workflows/linter.yml)\n\n\u003c/div\u003e\n\n**Rhino** is a simple markup language for publishing static websites such as blogs, personal portfolio, landing pages or web documents.\nIts syntax is somehow similar to Markdown's, making it very easy to learn and to use. To convert Rhino documents to HTML, you can use\nthe Rhino compiler, which translates your content into a functional webpage starting from a preexisting\ntemplate file. This markup language was primarily built to publish [my blog](http://marcocetica.com) due to the fact that I was too tired to manually write HTML when I was just \ntrying to write an article, but I've also successfully used it for building other static projects as well.\n\n## Syntax Overview\nAs mentioned earlier, Rhino's syntax is quite easy to gasp and to remember. For instance, to define a new section with a formatted text, you can\nwrite:\n\n```text\n%#Installation%\nBe sure %*carefully% read the following statement %_before% installing the program %Ifoo-bar%:\n\n%CTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND%\n```\n\nwhich will be compiled to:\n```html\n\u003ch2 class=\"post-subtitle\"\u003eInstallation\u003c/h2\u003e\n\u003cdiv class=\"sp\"\u003e\u003c/div\u003e\nBe sure \u003cb\u003ecarefully\u003c/b\u003e read the following statement \u003ci\u003ebefore\u003c/i\u003e installing the program \u003ccode class=\"inline-code\"\u003efoo-bar\u003c/code\u003e:\n\n\u003cblockquote\u003e\n\u003cdiv class=\"cursor\"\u003e\u003e\u003c/div\u003e\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND\n\u003c/blockquote\u003e\n```\n\nIn this short snippet, we have defined a new header called _\"Installation\"_(denoted by the `#` token), an italic and a bold \nformatting(denoted by the `_` and the `*` tokens, respectively) and a blockquote using the `C` token. \n\nAs you see, every element of the Rhino language must be wrapped around a `%` token which denotes the beginning and the end of the formatting. \n\n## Rhino Markup Language\n- **bold formatting**\n```text\n%*\u003cBOLD TEXT\u003e%\n```\n\n- **italic formatting**\n```text\n%_\u003cITALIC TEXT\u003e%\n```\n\n- **link**\n```text\n%[\u003cLINK TEXT\u003e](\u003cURL\u003e)%\n```\n\n- **picture**\n```text\n%![\u003cALT TEXT\u003e](\u003cURL\u003e)%\n```\n\n- **heading**\n```text\n%#\u003cHEAD TEXT\u003e%\n```\n\n- **inline code snippet**\n```text\n%I\u003cINLINE CODE\u003e%\n```\n\n- **link to referement**\n```text\n%\u003e\u003cREF_NUMBER\u003e%\n```\n\n- **inline math expression**\n```text\n%m\u003cMATH_EXPRESSION\u003e%\n```\n\n- **citation**\n```text\n%C\u003cCITATION\u003e%\n```\n\n- **referement**\n```text\n%\u003c\u003cREF_NUMBER\u003e\u003cREF_TEXT\u003e%\n```\n\n- **code block**\n```text\n%B\u003cLANG_NAME\u003e\n\u003cCODE_SNIPPET\u003e\nB%\n```\n\n- **math expression block**\n```text\n%M\n\u003cMATH_EXPR\u003e\nM%\n```\n\n- **Special characters**\n```\n%p% -\u003e %\n%$% -\u003e $\n```\n\n- **Ordered list**\n```text\n%O\u003cITEM\u003e%\n%O\u003cITEM\u003e%\n%O\u003cITEM\u003e%\n```\n\n\u003e [!TIP]\n\u003e Lists can be nested\n\n- **Unordered list**\n```text\n%U\u003cITEM\u003e%\n%U\u003cITEM\u003e%\n%U\u003cITEM\u003e%\n```\n\n- **Tables**\n```text\n%T\nHA$B$C$D%\nRFirst$Second$Third$Fourth%\nRI$II$III$IV%\n%\n```\nwhere `H` stands for a _new header_ and `R` stands for a _new row_.\n\n\n- **Div**\n```text\n%d\u003cDIV_ID\u003e$\u003cDIV_CLASS\u003e$\u003cSTYLE\u003e\n    \u003cNESTED_CONTENT\u003e\n%\n```\n\n\u003e [!WARNING]\n\u003e `\u003cDIV_ID\u003e`, `\u003cDIV_CLASS\u003e` and `\u003cSTYLE\u003e` are optional and can be omitted.\n\u003e The parser expects **two** `$` token, though.\n\n## Template file\nThe Rhino compiler requires an additional HTML document called _template file_, which serves as a skeleton of the output webpage. \nThis file defines the structure and the appearance of the final webpage and it's used as a base during the compilation process. \nThe template file can be freely structured and stylized but it must includes the following properties:\n\n- `%%TIMESTAMP%%`: Template engine timestamp;  \n- `%%DESCRIPTION%%`:`\u003cmeta\u003e` _description_ tag;  \n- `%%TAGS%%`: `\u003cmeta\u003e` _tags_ tag;  \n- `%%HEAD_TITLE%%`: Page title;  \n- `%%DATE%%`: Post date;  \n- `%%CONTENT%%`: The actual content of the page.\n\nThere is no required order for listing these properties inside your template file, you can move them wherever you want  according to your needs.\nBelow, there's a sample template file you can use as a skeleton to create your own:\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n%%TIMESTAMP%%\n    \u003chead\u003e\n        \u003c!-- Meta attributes --\u003e\n        \u003cmeta charset=\"utf-8\"\u003e\n        \u003cmeta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" /\u003e\n        \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0\" /\u003e\n        \u003cmeta name=\"description\" content=\"%%DESCRIPTION%%\" /\u003e\n        \u003cmeta name=\"keywords\" content=\"%%TAGS%%\" /\u003e\n        \u003c!-- CSS --\u003e\n        \u003clink rel=\"stylesheet\" href=\"/static/style.css\" /\u003e\n        \u003c!-- Title --\u003e\n        \u003ctitle\u003e%%HEAD_TITLE%% :: My Website\u003c/title\u003e\n    \u003c/head\u003e\n    \n    \u003cbody\u003e\n        \u003ch1\u003e%%TITLE%%\u003c/h1\u003e\n        \u003cdiv\u003e%%DATE%%\u003c/div\u003e\n        \u003cdiv\u003e\n            %%CONTENT%%\n        \u003c/div\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n\n## Rhino files\nRhino files are the entrypoint of the compilation process. The compiler converts these files into static HTML pages, using the template file\nas a foundation. To specify the page _metadata_(such as the title, date, tags, etc.) you need to define a dedicated section\nof the source document called _\"header\"_. \n\nThe header is a special section of a Rhino document that must includes the following entries:\n\n```text\n#+HEAD_TITLE: Head section title\n#+TITLE: Body title\n#+DESCRIPTION: Meta description tag\n#+DATE: 1970-01-01\n#+TAGS: foo, bar, biz\n\n```\n\nThe first five lines of any Rhino file are reserved for these fields. If you would like to omit one or more\nfields(e.g., if the page does not require a date), you can simply leave the field empty, that is:\n\n```text\n#+HEAD_TITLE: Head section title\n#+TITLE: Body title\n#+DESCRIPTION: Meta description tag\n#+DATE: \n#+TAGS: foo, bar, biz\n```\n\n\u003e [!CAUTION]\n\u003e The header section **must always be explicitly defined(in this order)**, regardless \n\u003e of whether you plan to show it on the resulting page\n\u003e or not. The Rhino compiler does not provide any default or fallback values for missing header fields.\n\n## Compiler\nIn this section we will see how to build and how to use the Rhino compiler, which is used to translates Rhino source files\ninto static HTML documents.\n\n### Installation\nThe Rhino compiler is written in Haskell. To build it you will need a recent version of the _Glasgow Haskell Compiler_(GHC) and\na recent version of _Cabal_, refer to [this page](https://www.haskell.org/ghcup/) to learn more. \n\nAfter that, you will be able to build the Rhino compiler by issuing the following command within the root of this repository:\n```sh\n$\u003e cabal build\nResolving dependencies...\nBuild profile: -w ghc-9.6.7 -O1\nIn order, the following will be built (use -v for more details):\n - rhino-0.1.0.4 (lib:rhino-lib) (first run)\n - rhino-0.1.0.4 (exe:rhino) (first run)\nConfiguring library 'rhino-lib' for rhino-0.1.0.4...\nPreprocessing library 'rhino-lib' for rhino-0.1.0.4...\nBuilding library 'rhino-lib' for rhino-0.1.0.4...\n[1 of 5] Compiling Paths_rhino      ( Paths_rhino.o, Paths_rhino.dyn_o )\n[2 of 5] Compiling Types            ( src/Types.hs, Types.o, Types.dyn_o )\n[3 of 5] Compiling Emitter          ( src/Emitter.hs, Emitter.o, Emitter.dyn_o )\n[4 of 5] Compiling Parser           ( src/Parser.hs, Parser.o, Parser.dyn_o )\n[5 of 5] Compiling Engine           ( src/Engine.hs, Engine.o, Engine.dyn_o )\nConfiguring executable 'rhino' for rhino-0.1.0.4...\nPreprocessing executable 'rhino' for rhino-0.1.0.4...\nBuilding executable 'rhino' for rhino-0.1.0.4...\n[1 of 1] Compiling Main             ( app/Main.hs, Main.o )\n[2 of 2] Linking rhino\n```\n\nYou will find a statically linked binary executable inside the `dist-newstyle` directory. \nTo copy it to the root of the repository, exec the following command:\n```sh\n$\u003e cp \"$(cabal exec --offline sh -- -c 'command -v rhino')\" .\n```\n\n### Usage\nThe Rhino compiler can be used directly from the command line:\n```text\nrhino v0.1.0.4 by Marco Cetica (c) 2025\n\nUsage: rhino (-s|--src SRC_DIR) (-o|--output OUT_DIR) (-t|--template TEMPLATE) \n             [-v|--verbose]\n\n  rhino - markup language for building static websites\n\nAvailable options:\n  -s,--src SRC_DIR         Specify source directory\n  -o,--output OUT_DIR      Specify output directory\n  -t,--template TEMPLATE   Specify template file\n  -v,--verbose             Enable verbose mode\n  -h,--help                Show this help text\n```\n\nBasic usage involves specifying three components: \n1. The source directory(containing one or more Rhino files);  \n2. The output directory(where compiled Rhino files will be saved);  \n3. An HTML template.\n\nThat is:\n\n```sh\n$\u003e ./rhino -s src/ -o html/ -t template.html -v\nPublishing src/syntax_test...\n```\n\nThis will create a new directory inside `html` called `syntax_test` containing a file called `index.html`(i.e., the compiled Rhino file). The Rhino compiler generates \na new directory **for each Rhino file** in the source directory, using the filename as the output directory. For example, consider  a source directory\ncalled `articles` with the following content inside:\n\n```sh\n$\u003e tree articles\narticles\n├── foo\n├── bar\n├── biz\n```\n\nthe compiler - when invoked with `./rhino -s articles -o website/posts -t template.html -v` - will generate \nthe following directories inside `website/posts/`:\n```sh\n$\u003e tree website/posts\nposts\n├── foo\n│   └──index.html\n├── bar\n│   └── index.html\n├── biz\n│   └── index.html\n```\n\nAs you can see, each directory contains an unique `index.html` file. This allows users to access each page using only the\npage name(i.e., `http://website.com/foo`) instead of the full URI(i.e., `http://example.com/foo/foo_page.html`).\n\nThe Rhino compiler can also generate an _index page_. To do this, you need to create a source directory containing a Rhino file\ncalled **index**(without an extension). For example, to generate an index page for the previously mentioned `posts` directory, \nyou can create a new source directory containing a single `index` file, that is:\n\n```sh\n$\u003e mkdir -p posts\n$\u003e touch posts/index # Edit file as needed\n$\u003e ./rhino -s posts -o website/posts -t template.html -v\nPublishing website/posts/index...\n```\n\nThis will generate a new file called `index.html` inside `website/posts` **WITHOUT** creating a new directory. That is:\n```sh\n$\u003e tree website/posts\nposts\n├── foo\n│   └──index.html\n├── bar\n│   └── index.html\n├── biz\n│   └── index.html\n├── index.html\n```\n\n## Error reporting\nThe Rhino compiler can also detect syntax errors, such as missing closing tokens or misplaced characters, providing the line and the column number\nof the error along with suggested fixes. Consider the following Rhino file:\n\n```text\n#+HEAD_TITLE: Contact me\n#+TITLE: Contact Me\n#+DESCRIPTION: Get in touch with me\n#+DATE: 1970-01-01\n#+TAGS: email, phone, instant-messaging\n\n\nYou can send me an email at the %[following address](mailto:foo@example.com)\n\nI will try to reply as soon as possible!\n```\n\nIn this example, the link does not include the enclosing character `%`. If we try to compile it, the compiler will yield the following message:\n```text\nPublishing src/contact...\nError processing file 'src/contact' @ 8:77:\n  |\n8 | You can send me an email at the %[following address](mailto:foo@example.com)\n  |                                                                             ^\nunexpected newline\nexpecting '%'\n```\n\n## Custom emitter\nBy default, Rhino emits HTML tags that are compatible with the CSS classes of my blog. To adapt them to your use cases, you need to modify the\nsource file `app/Emitter.hs`. For instance, to update the class of the _code_ element from `inline-code` to `myCustomClass`, edit the `headGenerator`\nmethod as follows:\n```haskell\nicodeGenerator :: Text -\u003e Text\nicodeGenerator text = \"\u003ccode class=\\\"myCustomClass\\\"\u003e\" \u003c\u003e text \u003c\u003e \"\u003c/code\u003e\"\n```\n\n\u003e [!WARNING]\n\u003e Modifying an existing emitter will cause a unit test to fail. \n\u003e Make sure to update the tests accordingly.\n\n## A complete example\nLet's now see a complete example:\n```text\n#+HEAD_TITLE: Head section title\n#+TITLE: Body title\n#+DESCRIPTION: Meta description tag\n#+DATE: 1970-01-01\n#+TAGS: foo, bar, biz\n\n%#Welcome%\n\n%dwelcomeBanner$centered\n%![welcome image](/static/welcome.jpg)%\n\nWelcome to my website! To get in touch with me, you can:\n\n%UWrite me an %[email](mailto:john@example.com)%%\n%USend me a handwritten letter%\n%\n\nTODO list:\n\n%OHouse\n%OCleaning%\n%OCooking%\n%OReading%\n%\n%OWork\n%OBrainstorming%\n%ORefactoring%\n%OTraining%\n%\n\n%*Lorem ipsum% dolor sit amet, consectetur adipiscing elit. Cras ornare urna et eros dictum maximus.\nNunc sit amet eros ac mauris placerat luctus. Integer eget nulla lacus. Nulla finibus non ante eget volutpat.\nMaecenas vestibulum mi vitae lectus ultrices vehicula.\nVestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;\n\n%#Print on the console%\nIn Python, you can use %Iprint(\"Hello World\");%, while in Java%\u003e1%, you can say:\n\n%Bjava\npublic static void main(String[] args) {\n    System.out.println(\"Hello World\");\n}\nB%\n\n\n%#Lie algebra%\n%CA %*Lie algebra% is a vector space %mg% over a %_field% %mF% together with an operation called %*Lie bracket%%\n\n%#Fermat's Last Theorem%\n%M\na^n + b^n = c^n\nM%\n\n\n%T\nHA$B$C$D%\nRFirst$Second$Third$Fourth%\nRI$II$III$IV%\n%\n\n\n%#Footnotes%\n%\u003c1Define this function inside the %Imain% class%\n```\n\nwhich produces the following HTML page:\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\t\u003c!--\n\tPowered by Rhino Template Engine(v0.1.0.5)\n\tDeveloped by Marco Cetica\n\tTimestamp: 2025-04-17T09:02:14--\u003e\n    \u003chead\u003e\n        \u003c!-- Meta attributes --\u003e\n        \u003cmeta charset=\"utf-8\"\u003e\n        \u003cmeta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" /\u003e\n        \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0\" /\u003e\n        \u003cmeta name=\"description\" content=\"Meta description tag\" /\u003e\n        \u003cmeta name=\"keywords\" content=\"foo, bar, biz\" /\u003e\n        \u003c!-- CSS --\u003e\n        \u003clink rel=\"stylesheet\" href=\"/static/style.css\" /\u003e\n        \u003c!-- Title --\u003e\n        \u003ctitle\u003eHead section title :: My Website\u003c/title\u003e\n    \u003c/head\u003e\n    \n    \u003cbody\u003e\n        \u003ch1\u003eBody title\u003c/h1\u003e\n        \u003cdiv\u003e1970-01-01\u003c/div\u003e\n        \u003cdiv\u003e\n            \n\u003ch2 id=\"Welcome\" class=\"post-subtitle\"\u003eWelcome \u003ca class=\"head-tag\" href=\"#Welcome\"\u003e§\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"sp\"\u003e\u003c/div\u003e\n\n\u003cdiv id=\"welcomeBanner\" class=\"centered\"\u003e\n\u003cimg class=\"post-img\" alt=\"welcome image\" src=\"/static/welcome.jpg\" width=\"800\" height=\"600\"\u003e\n\nWelcome to my website! To get in touch with me, you can:\n\n\u003cul\u003e\n\u003cli\u003eWrite me an \u003ca href=\"mailto:john@example.com\"\u003eemail\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSend me a handwritten letter\u003c/li\u003e\n\u003c/ul\u003e\u003c/div\u003e\n\nTODO list:\n\n\u003col\u003e\n\u003cli\u003eHouse\n\u003col\u003e\n\u003cli\u003eCleaning\u003c/li\u003e\n\u003cli\u003eCooking\u003c/li\u003e\n\u003cli\u003eReading\u003c/li\u003e\n\u003c/ol\u003e\u003c/li\u003e\n\u003cli\u003eWork\n\u003col\u003e\n\u003cli\u003eBrainstorming\u003c/li\u003e\n\u003cli\u003eRefactoring\u003c/li\u003e\n\u003cli\u003eTraining\u003c/li\u003e\n\u003c/ol\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cb\u003eLorem ipsum\u003c/b\u003e dolor sit amet, consectetur adipiscing elit. Cras ornare urna et eros dictum maximus.\nNunc sit amet eros ac mauris placerat luctus. Integer eget nulla lacus. Nulla finibus non ante eget volutpat.\nMaecenas vestibulum mi vitae lectus ultrices vehicula.\nVestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;\n\n\u003ch2 id=\"Print_on_the_console\" class=\"post-subtitle\"\u003ePrint on the console \u003ca class=\"head-tag\" href=\"#Print_on_the_console\"\u003e§\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"sp\"\u003e\u003c/div\u003e\nIn Python, you can use \u003ccode class=\"inline-code\"\u003eprint(\"Hello World\");\u003c/code\u003e, while in Java\u003csup\u003e[\u003ca id=\"ref-1\" href=\"#foot-1\"\u003e1\u003c/a\u003e]\u003c/sup\u003e, you can say:\n\n\u003cpre\u003e\n\u003ccode class=\"language-java\"\u003e\npublic static void main(String[] args) {\n    System.out.println(\"Hello World\");\n}\n\u003c/code\u003e\u003c/pre\u003e\n\n\n\u003ch2 id=\"Lie_algebra\" class=\"post-subtitle\"\u003eLie algebra \u003ca class=\"head-tag\" href=\"#Lie_algebra\"\u003e§\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"sp\"\u003e\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cdiv class=\"cursor\"\u003e\u003e\u003c/div\u003e\nA \u003cb\u003eLie algebra\u003c/b\u003e is a vector space \\(g\\) over a \u003ci\u003efield\u003c/i\u003e \\(F\\) together with an operation called \u003cb\u003eLie bracket\u003c/b\u003e\n\u003c/blockquote\u003e\n\n\u003ch2 id=\"Fermat's_Last_Theorem\" class=\"post-subtitle\"\u003eFermat's Last Theorem \u003ca class=\"head-tag\" href=\"#Fermat's_Last_Theorem\"\u003e§\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"sp\"\u003e\u003c/div\u003e\n$$\na^n + b^n = c^n\n$$\n\n\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eA\u003c/th\u003e\n\u003cth\u003eB\u003c/th\u003e\n\u003cth\u003eC\u003c/th\u003e\n\u003cth\u003eD\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eFirst\u003c/td\u003e\n\u003ctd\u003eSecond\u003c/td\u003e\n\u003ctd\u003eThird\u003c/td\u003e\n\u003ctd\u003eFourth\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eI\u003c/td\u003e\n\u003ctd\u003eII\u003c/td\u003e\n\u003ctd\u003eIII\u003c/td\u003e\n\u003ctd\u003eIV\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n\n\u003ch2 id=\"Footnotes\" class=\"post-subtitle\"\u003eFootnotes \u003ca class=\"head-tag\" href=\"#Footnotes\"\u003e§\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"sp\"\u003e\u003c/div\u003e\n\u003cp id=\"foot-1\"\u003e[1]: Define this function inside the \u003ccode class=\"inline-code\"\u003emain\u003c/code\u003e class \u003ca href=\"#ref-1\"\u003e\u0026#8617;\u003c/a\u003e\u003c/p\u003e\n\n        \u003c/div\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n```\n\n## License\nThis software is released under the GPLv3 license. You can find a copy of the license with this repository or by visiting the [following page](https://choosealicense.com/licenses/gpl-3.0/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fceticamarco%2Frhino","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fceticamarco%2Frhino","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fceticamarco%2Frhino/lists"}