1
0
Эх сурвалжийг харах

Moves wiki to mdBook (#103)

* testing new wiki

* run wiki

* maybe now

* maybe fixes missing links

* summary fix

* linkfix

* weee

* external links

* link fix

* more path fixes

* wiki tweaks

* contribution guide

* images

* wiki tweaks

* sick of this CRLF

* back to .gitignore
Taislin 7 сар өмнө
parent
commit
ec592b2518
64 өөрчлөгдсөн 2875 нэмэгдсэн , 5345 устгасан
  1. 56 0
      .github/workflows/wiki.yml
  2. 12 0
      .gitignore
  3. 1 0
      .prettierignore
  4. 0 3873
      Civ14-Wiki/MDwiki.js
  5. 0 7
      Civ14-Wiki/README.md
  6. 0 3
      Civ14-Wiki/config.json
  7. 0 8
      Civ14-Wiki/extlib/css/bootstrap-3.0.0.min.css
  8. 0 51
      Civ14-Wiki/extlib/css/colorbox.css
  9. 0 6
      Civ14-Wiki/extlib/css/prism.1.4.1.default.min.css
  10. 0 5
      Civ14-Wiki/extlib/js/bootstrap-3.0.0.min.js
  11. 0 1
      Civ14-Wiki/extlib/js/jquery-1.8.3.min.js
  12. 0 942
      Civ14-Wiki/extlib/js/jquery.colorbox.js
  13. 0 0
      Civ14-Wiki/extlib/js/jquery.colorbox.min.js
  14. 0 1
      Civ14-Wiki/extlib/js/prism.1.4.1.min.js
  15. BIN
      Civ14-Wiki/favicon.ico
  16. 0 3
      Civ14-Wiki/gamemodes/aotd.md
  17. 0 54
      Civ14-Wiki/guides/guide_to_farming.md
  18. 0 178
      Civ14-Wiki/guides/starter_guide.md
  19. 0 137
      Civ14-Wiki/index.html
  20. 1 1
      README.md
  21. 1 1
      Resources/ConfigPresets/Civ/production.toml
  22. 0 50
      Resources/Maps/civ/nomads_classic.yml
  23. 362 0
      Wiki/LICENSE
  24. 5 0
      Wiki/README.md
  25. 45 0
      Wiki/book.toml
  26. BIN
      Wiki/mdbook-admonish.exe
  27. BIN
      Wiki/mdbook-embedify.exe
  28. BIN
      Wiki/mdbook-emojicodes.exe
  29. BIN
      Wiki/mdbook-linkcheck.exe
  30. BIN
      Wiki/mdbook-template.exe
  31. BIN
      Wiki/mdbook.exe
  32. 100 0
      Wiki/scripts/nav-additions.js
  33. 7 0
      Wiki/scss/main.scss
  34. 345 0
      Wiki/scss/mdbook-admonish.css
  35. 89 0
      Wiki/scss/nav-style.css
  36. 81 0
      Wiki/scss/ss14.css
  37. 3 0
      Wiki/src/404.md
  38. 18 19
      Wiki/src/SUMMARY.md
  39. 32 0
      Wiki/src/contributing.md
  40. 5 0
      Wiki/src/gamemodes/aotd.md
  41. 4 2
      Wiki/src/gamemodes/nomads.md
  42. 0 0
      Wiki/src/gamemodes/tdm.md
  43. 0 0
      Wiki/src/guides/guide_to_combat.md
  44. 0 0
      Wiki/src/guides/guide_to_construction.md
  45. 0 0
      Wiki/src/guides/guide_to_crafting.md
  46. 65 0
      Wiki/src/guides/guide_to_farming.md
  47. 0 0
      Wiki/src/guides/guide_to_medical.md
  48. 0 0
      Wiki/src/guides/guide_to_metallurgy.md
  49. 3 1
      Wiki/src/guides/playing.md
  50. 201 0
      Wiki/src/guides/starter_guide.md
  51. 0 0
      Wiki/src/images/arrival.png
  52. 0 0
      Wiki/src/images/boulder.png
  53. 0 0
      Wiki/src/images/flint_axe.png
  54. BIN
      Wiki/src/images/meta-edit-file.png
  55. BIN
      Wiki/src/images/meta-edit-page-button.png
  56. BIN
      Wiki/src/images/meta-forking.png
  57. 6 2
      Wiki/src/index.md
  58. 0 0
      Wiki/src/rules/rules.md
  59. 544 0
      Wiki/theme/compiled/ss14.css
  60. 9 0
      Wiki/theme/compiled/ss14.css.map
  61. BIN
      Wiki/theme/favicon.png
  62. 430 0
      Wiki/theme/highlight.js
  63. 329 0
      Wiki/theme/index.hbs
  64. 121 0
      Wiki/theme/tomorrow-night.css

+ 56 - 0
.github/workflows/wiki.yml

@@ -0,0 +1,56 @@
+name: Build & Deploy mdBook Site
+
+on:
+  push:
+    branches: [master]
+  # Allows you to run this workflow manually from the Actions tab
+  workflow_dispatch:
+
+# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+permissions:
+  contents: read
+  pages: write
+  id-token: write
+
+# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
+# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
+concurrency:
+  group: "pages"
+  cancel-in-progress: false
+
+jobs:
+  # Build job
+  build:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v3
+      - name: Install Rust
+        run: |
+          curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -y | sh
+          rustup update
+      - name: Install mdbook & plugins
+        uses: taiki-e/install-action@v2.18.6
+        with:
+          tool: mdbook@0.4.36,mdbook-admonish@1.14.0,mdbook-linkcheck@0.7.7,mdbook-template@1.1.0,mdbook-emojicodes@0.3.0,mdbook-embedify@0.2.11
+      - name: Setup Pages
+        id: pages
+        uses: actions/configure-pages@v3
+      - name: Build with mdBook
+        run: cd Wiki && mdbook build
+      - name: Upload artifact
+        uses: actions/upload-pages-artifact@v3
+        with:
+          path: ./Wiki/book/html
+
+  # Deployment job
+  deploy:
+    environment:
+      name: github-pages
+      url: ${{ steps.deployment.outputs.page_url }}
+    runs-on: ubuntu-latest
+    needs: build
+    if: github.ref == 'refs/heads/master'
+    steps:
+      - name: Deploy to GitHub Pages
+        id: deployment
+        uses: actions/deploy-pages@v4

+ 12 - 0
.gitignore

@@ -310,3 +310,15 @@ Civ14.code-workspace
 _extras/
 server_config.toml
 Resources/Maps/civ/nomads_classic.yml
+
+# Wiki stuff
+Wiki/book
+Wiki/.idea/
+
+# editor files
+Wiki/.*~
+Wiki/*.swp
+
+# VSCodium files
+Wiki/.vscode/
+*.code-workspace

+ 1 - 0
.prettierignore

@@ -0,0 +1 @@
+SUMMARY.md

+ 0 - 3873
Civ14-Wiki/MDwiki.js

@@ -1,3873 +0,0 @@
-(function () {
-    /**
-     * Block-Level Grammar
-     */
-
-    var block = {
-        newline: /^\n+/,
-        code: /^( {4}[^\n]+\n*)+/,
-        fences: noop,
-        hr: /^( *[-*_]){3,} *(?:\n+|$)/,
-        heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
-        nptable: noop,
-        lheading: /^([^\n]+)\n *(=|-){3,} *\n*/,
-        blockquote: /^( *>[^\n]+(\n[^\n]+)*\n*)+/,
-        list: /^( *)(bull) [\s\S]+?(?:hr|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
-        html: /^ *(?:comment|closed|closing) *(?:\n{2,}|\s*$)/,
-        def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,
-        table: noop,
-        paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
-        text: /^[^\n]+/,
-    };
-
-    block.bullet = /(?:[*+-]|\d+\.)/;
-    block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
-    block.item = replace(block.item, "gm")(/bull/g, block.bullet)();
-
-    block.list = replace(block.list)(/bull/g, block.bullet)("hr", /\n+(?=(?: *[-*_]){3,} *(?:\n+|$))/)();
-
-    block._tag =
-        "(?!(?:" +
-        "a|em|strong|small|s|cite|q|dfn|abbr|data|time|code" +
-        "|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo" +
-        "|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|@)\\b";
-
-    block.html = replace(block.html)("comment", /<!--[\s\S]*?-->/)("closed", /<(tag)[\s\S]+?<\/\1>/)(
-        "closing",
-        /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/
-    )(/tag/g, block._tag)();
-
-    block.paragraph = replace(block.paragraph)("hr", block.hr)("heading", block.heading)("lheading", block.lheading)(
-        "blockquote",
-        block.blockquote
-    )("tag", "<" + block._tag)("def", block.def)();
-
-    /**
-     * Normal Block Grammar
-     */
-
-    block.normal = merge({}, block);
-
-    /**
-     * GFM Block Grammar
-     */
-
-    block.gfm = merge({}, block.normal, {
-        fences: /^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,
-        paragraph: /^/,
-    });
-
-    block.gfm.paragraph = replace(block.paragraph)(
-        "(?!",
-        "(?!" + block.gfm.fences.source.replace("\\1", "\\2") + "|"
-    )();
-
-    /**
-     * GFM + Tables Block Grammar
-     */
-
-    block.tables = merge({}, block.gfm, {
-        nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
-        table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/,
-    });
-
-    /**
-     * Block Lexer
-     */
-
-    function Lexer(options) {
-        this.tokens = [];
-        this.tokens.links = {};
-        this.options = options || marked.defaults;
-        this.rules = block.normal;
-
-        if (this.options.gfm) {
-            if (this.options.tables) {
-                this.rules = block.tables;
-            } else {
-                this.rules = block.gfm;
-            }
-        }
-    }
-
-    /**
-     * Expose Block Rules
-     */
-
-    Lexer.rules = block;
-
-    /**
-     * Static Lex Method
-     */
-
-    Lexer.lex = function (src, options) {
-        var lexer = new Lexer(options);
-        return lexer.lex(src);
-    };
-
-    /**
-     * Preprocessing
-     */
-
-    Lexer.prototype.lex = function (src) {
-        src = src
-            .replace(/\r\n|\r/g, "\n")
-            .replace(/\t/g, "    ")
-            .replace(/\u00a0/g, " ")
-            .replace(/\u2424/g, "\n");
-
-        return this.token(src, true);
-    };
-
-    /**
-     * Lexing
-     */
-
-    Lexer.prototype.token = function (src, top) {
-        var src = src.replace(/^ +$/gm, ""),
-            next,
-            loose,
-            cap,
-            bull,
-            b,
-            item,
-            space,
-            i,
-            l;
-
-        while (src) {
-            // newline
-            if ((cap = this.rules.newline.exec(src))) {
-                src = src.substring(cap[0].length);
-                if (cap[0].length > 1) {
-                    this.tokens.push({
-                        type: "space",
-                    });
-                }
-            }
-
-            // code
-            if ((cap = this.rules.code.exec(src))) {
-                src = src.substring(cap[0].length);
-                cap = cap[0].replace(/^ {4}/gm, "");
-                this.tokens.push({
-                    type: "code",
-                    text: !this.options.pedantic ? cap.replace(/\n+$/, "") : cap,
-                });
-                continue;
-            }
-
-            // fences (gfm)
-            if ((cap = this.rules.fences.exec(src))) {
-                src = src.substring(cap[0].length);
-                this.tokens.push({
-                    type: "code",
-                    lang: cap[2],
-                    text: cap[3],
-                });
-                continue;
-            }
-
-            // heading
-            if ((cap = this.rules.heading.exec(src))) {
-                src = src.substring(cap[0].length);
-                this.tokens.push({
-                    type: "heading",
-                    depth: cap[1].length,
-                    text: cap[2],
-                });
-                continue;
-            }
-
-            // table no leading pipe (gfm)
-            if (top && (cap = this.rules.nptable.exec(src))) {
-                src = src.substring(cap[0].length);
-
-                item = {
-                    type: "table",
-                    header: cap[1].replace(/^ *| *\| *$/g, "").split(/ *\| */),
-                    align: cap[2].replace(/^ *|\| *$/g, "").split(/ *\| */),
-                    cells: cap[3].replace(/\n$/, "").split("\n"),
-                };
-
-                for (i = 0; i < item.align.length; i++) {
-                    if (/^ *-+: *$/.test(item.align[i])) {
-                        item.align[i] = "right";
-                    } else if (/^ *:-+: *$/.test(item.align[i])) {
-                        item.align[i] = "center";
-                    } else if (/^ *:-+ *$/.test(item.align[i])) {
-                        item.align[i] = "left";
-                    } else {
-                        item.align[i] = null;
-                    }
-                }
-
-                for (i = 0; i < item.cells.length; i++) {
-                    item.cells[i] = item.cells[i].split(/ *\| */);
-                }
-
-                this.tokens.push(item);
-
-                continue;
-            }
-
-            // lheading
-            if ((cap = this.rules.lheading.exec(src))) {
-                src = src.substring(cap[0].length);
-                this.tokens.push({
-                    type: "heading",
-                    depth: cap[2] === "=" ? 1 : 2,
-                    text: cap[1],
-                });
-                continue;
-            }
-
-            // hr
-            if ((cap = this.rules.hr.exec(src))) {
-                src = src.substring(cap[0].length);
-                this.tokens.push({
-                    type: "hr",
-                });
-                continue;
-            }
-
-            // blockquote
-            if ((cap = this.rules.blockquote.exec(src))) {
-                src = src.substring(cap[0].length);
-
-                this.tokens.push({
-                    type: "blockquote_start",
-                });
-
-                cap = cap[0].replace(/^ *> ?/gm, "");
-
-                // Pass `top` to keep the current
-                // "toplevel" state. This is exactly
-                // how markdown.pl works.
-                this.token(cap, top);
-
-                this.tokens.push({
-                    type: "blockquote_end",
-                });
-
-                continue;
-            }
-
-            // list
-            if ((cap = this.rules.list.exec(src))) {
-                src = src.substring(cap[0].length);
-                bull = cap[2];
-
-                this.tokens.push({
-                    type: "list_start",
-                    ordered: bull.length > 1,
-                });
-
-                // Get each top-level item.
-                cap = cap[0].match(this.rules.item);
-
-                next = false;
-                l = cap.length;
-                i = 0;
-
-                for (; i < l; i++) {
-                    item = cap[i];
-
-                    // Remove the list item's bullet
-                    // so it is seen as the next token.
-                    space = item.length;
-                    item = item.replace(/^ *([*+-]|\d+\.) +/, "");
-
-                    // Outdent whatever the
-                    // list item contains. Hacky.
-                    if (~item.indexOf("\n ")) {
-                        space -= item.length;
-                        item = !this.options.pedantic
-                            ? item.replace(new RegExp("^ {1," + space + "}", "gm"), "")
-                            : item.replace(/^ {1,4}/gm, "");
-                    }
-
-                    // Determine whether the next list item belongs here.
-                    // Backpedal if it does not belong in this list.
-                    if (this.options.smartLists && i !== l - 1) {
-                        b = block.bullet.exec(cap[i + 1])[0];
-                        if (bull !== b && !(bull.length > 1 && b.length > 1)) {
-                            src = cap.slice(i + 1).join("\n") + src;
-                            i = l - 1;
-                        }
-                    }
-
-                    // Determine whether item is loose or not.
-                    // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
-                    // for discount behavior.
-                    loose = next || /\n\n(?!\s*$)/.test(item);
-                    if (i !== l - 1) {
-                        next = item[item.length - 1] === "\n";
-                        if (!loose) loose = next;
-                    }
-
-                    this.tokens.push({
-                        type: loose ? "loose_item_start" : "list_item_start",
-                    });
-
-                    // Recurse.
-                    this.token(item, false);
-
-                    this.tokens.push({
-                        type: "list_item_end",
-                    });
-                }
-
-                this.tokens.push({
-                    type: "list_end",
-                });
-
-                continue;
-            }
-
-            // html
-            if ((cap = this.rules.html.exec(src))) {
-                src = src.substring(cap[0].length);
-                this.tokens.push({
-                    type: this.options.sanitize ? "paragraph" : "html",
-                    pre: cap[1] === "pre" || cap[1] === "script",
-                    text: cap[0],
-                });
-                continue;
-            }
-
-            // def
-            if (top && (cap = this.rules.def.exec(src))) {
-                src = src.substring(cap[0].length);
-                this.tokens.links[cap[1].toLowerCase()] = {
-                    href: cap[2],
-                    title: cap[3],
-                };
-                continue;
-            }
-
-            // table (gfm)
-            if (top && (cap = this.rules.table.exec(src))) {
-                src = src.substring(cap[0].length);
-
-                item = {
-                    type: "table",
-                    header: cap[1].replace(/^ *| *\| *$/g, "").split(/ *\| */),
-                    align: cap[2].replace(/^ *|\| *$/g, "").split(/ *\| */),
-                    cells: cap[3].replace(/(?: *\| *)?\n$/, "").split("\n"),
-                };
-
-                for (i = 0; i < item.align.length; i++) {
-                    if (/^ *-+: *$/.test(item.align[i])) {
-                        item.align[i] = "right";
-                    } else if (/^ *:-+: *$/.test(item.align[i])) {
-                        item.align[i] = "center";
-                    } else if (/^ *:-+ *$/.test(item.align[i])) {
-                        item.align[i] = "left";
-                    } else {
-                        item.align[i] = null;
-                    }
-                }
-
-                for (i = 0; i < item.cells.length; i++) {
-                    item.cells[i] = item.cells[i].replace(/^ *\| *| *\| *$/g, "").split(/ *\| */);
-                }
-
-                this.tokens.push(item);
-
-                continue;
-            }
-
-            // top-level paragraph
-            if (top && (cap = this.rules.paragraph.exec(src))) {
-                src = src.substring(cap[0].length);
-                this.tokens.push({
-                    type: "paragraph",
-                    text: cap[1][cap[1].length - 1] === "\n" ? cap[1].slice(0, -1) : cap[1],
-                });
-                continue;
-            }
-
-            // text
-            if ((cap = this.rules.text.exec(src))) {
-                // Top-level should never reach here.
-                src = src.substring(cap[0].length);
-                this.tokens.push({
-                    type: "text",
-                    text: cap[0],
-                });
-                continue;
-            }
-
-            if (src) {
-                throw new Error("Infinite loop on byte: " + src.charCodeAt(0));
-            }
-        }
-
-        return this.tokens;
-    };
-
-    /**
-     * Inline-Level Grammar
-     */
-
-    var inline = {
-        escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
-        autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
-        url: noop,
-        tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
-        link: /^!?\[(inside)\]\(href\)/,
-        reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
-        nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
-        strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
-        em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
-        code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,
-        br: /^ {2,}\n(?!\s*$)/,
-        del: noop,
-        text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/,
-    };
-
-    inline._inside = /(?:\[[^\]]*\]|[^\]]|\](?=[^\[]*\]))*/;
-    inline._href = /\s*<?(.*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
-
-    inline.link = replace(inline.link)("inside", inline._inside)("href", inline._href)();
-
-    inline.reflink = replace(inline.reflink)("inside", inline._inside)();
-
-    /**
-     * Normal Inline Grammar
-     */
-
-    inline.normal = merge({}, inline);
-
-    /**
-     * Pedantic Inline Grammar
-     */
-
-    inline.pedantic = merge({}, inline.normal, {
-        strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
-        em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
-    });
-
-    /**
-     * GFM Inline Grammar
-     */
-
-    inline.gfm = merge({}, inline.normal, {
-        escape: replace(inline.escape)("])", "~|])")(),
-        url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,
-        del: /^~~(?=\S)([\s\S]*?\S)~~/,
-        text: replace(inline.text)("]|", "~]|")("|", "|https?://|")(),
-    });
-
-    /**
-     * GFM + Line Breaks Inline Grammar
-     */
-
-    inline.breaks = merge({}, inline.gfm, {
-        br: replace(inline.br)("{2,}", "*")(),
-        text: replace(inline.gfm.text)("{2,}", "*")(),
-    });
-
-    /**
-     * Inline Lexer & Compiler
-     */
-
-    function InlineLexer(links, options) {
-        this.options = options || marked.defaults;
-        this.links = links;
-        this.rules = inline.normal;
-
-        if (!this.links) {
-            throw new Error("Tokens array requires a `links` property.");
-        }
-
-        if (this.options.gfm) {
-            if (this.options.breaks) {
-                this.rules = inline.breaks;
-            } else {
-                this.rules = inline.gfm;
-            }
-        } else if (this.options.pedantic) {
-            this.rules = inline.pedantic;
-        }
-    }
-
-    /**
-     * Expose Inline Rules
-     */
-
-    InlineLexer.rules = inline;
-
-    /**
-     * Static Lexing/Compiling Method
-     */
-
-    InlineLexer.output = function (src, links, options) {
-        var inline = new InlineLexer(links, options);
-        return inline.output(src);
-    };
-
-    /**
-     * Lexing/Compiling
-     */
-
-    InlineLexer.prototype.output = function (src) {
-        var out = "",
-            link,
-            text,
-            href,
-            cap;
-
-        while (src) {
-            // escape
-            if ((cap = this.rules.escape.exec(src))) {
-                src = src.substring(cap[0].length);
-                out += cap[1];
-                continue;
-            }
-
-            // autolink
-            if ((cap = this.rules.autolink.exec(src))) {
-                src = src.substring(cap[0].length);
-                if (cap[2] === "@") {
-                    text = cap[1][6] === ":" ? this.mangle(cap[1].substring(7)) : this.mangle(cap[1]);
-                    href = this.mangle("mailto:") + text;
-                } else {
-                    text = escape(cap[1]);
-                    href = text;
-                }
-                out += '<a href="' + href + '">' + text + "</a>";
-                continue;
-            }
-
-            // url (gfm)
-            if ((cap = this.rules.url.exec(src))) {
-                src = src.substring(cap[0].length);
-                text = escape(cap[1]);
-                href = text;
-                out += '<a href="' + href + '">' + text + "</a>";
-                continue;
-            }
-
-            // tag
-            if ((cap = this.rules.tag.exec(src))) {
-                src = src.substring(cap[0].length);
-                out += this.options.sanitize ? escape(cap[0]) : cap[0];
-                continue;
-            }
-
-            // link
-            if ((cap = this.rules.link.exec(src))) {
-                src = src.substring(cap[0].length);
-                out += this.outputLink(cap, {
-                    href: cap[2],
-                    title: cap[3],
-                });
-                continue;
-            }
-
-            // reflink, nolink
-            if ((cap = this.rules.reflink.exec(src)) || (cap = this.rules.nolink.exec(src))) {
-                src = src.substring(cap[0].length);
-                link = (cap[2] || cap[1]).replace(/\s+/g, " ");
-                link = this.links[link.toLowerCase()];
-                if (!link || !link.href) {
-                    out += cap[0][0];
-                    src = cap[0].substring(1) + src;
-                    continue;
-                }
-                out += this.outputLink(cap, link);
-                continue;
-            }
-
-            // strong
-            if ((cap = this.rules.strong.exec(src))) {
-                src = src.substring(cap[0].length);
-                out += "<strong>" + this.output(cap[2] || cap[1]) + "</strong>";
-                continue;
-            }
-
-            // em
-            if ((cap = this.rules.em.exec(src))) {
-                src = src.substring(cap[0].length);
-                out += "<em>" + this.output(cap[2] || cap[1]) + "</em>";
-                continue;
-            }
-
-            // code
-            if ((cap = this.rules.code.exec(src))) {
-                src = src.substring(cap[0].length);
-                out += "<code>" + escape(cap[2], true) + "</code>";
-                continue;
-            }
-
-            // br
-            if ((cap = this.rules.br.exec(src))) {
-                src = src.substring(cap[0].length);
-                out += "<br>";
-                continue;
-            }
-
-            // del (gfm)
-            if ((cap = this.rules.del.exec(src))) {
-                src = src.substring(cap[0].length);
-                out += "<del>" + this.output(cap[1]) + "</del>";
-                continue;
-            }
-
-            // text
-            if ((cap = this.rules.text.exec(src))) {
-                src = src.substring(cap[0].length);
-                out += escape(cap[0]);
-                continue;
-            }
-
-            if (src) {
-                throw new Error("Infinite loop on byte: " + src.charCodeAt(0));
-            }
-        }
-
-        return out;
-    };
-
-    /**
-     * Compile Link
-     */
-
-    InlineLexer.prototype.outputLink = function (cap, link) {
-        if (cap[0][0] !== "!") {
-            return (
-                '<a href="' +
-                escape(link.href) +
-                '"' +
-                (link.title ? ' title="' + escape(link.title) + '"' : "") +
-                ">" +
-                this.output(cap[1]) +
-                "</a>"
-            );
-        } else {
-            return (
-                '<img src="' +
-                escape(link.href) +
-                '" alt="' +
-                escape(cap[1]) +
-                '"' +
-                (link.title ? ' title="' + escape(link.title) + '"' : "") +
-                ">"
-            );
-        }
-    };
-
-    /**
-     * Smartypants Transformations
-     */
-
-    InlineLexer.prototype.smartypants = function (text) {
-        if (!this.options.smartypants) return text;
-        return text
-            .replace(/--/g, "—")
-            .replace(/'([^']*)'/g, "‘$1’")
-            .replace(/"([^"]*)"/g, "“$1”")
-            .replace(/\.{3}/g, "…");
-    };
-
-    /**
-     * Mangle Links
-     */
-
-    InlineLexer.prototype.mangle = function (text) {
-        var out = "",
-            l = text.length,
-            i = 0,
-            ch;
-
-        for (; i < l; i++) {
-            ch = text.charCodeAt(i);
-            if (Math.random() > 0.5) {
-                ch = "x" + ch.toString(16);
-            }
-            out += "&#" + ch + ";";
-        }
-
-        return out;
-    };
-
-    /**
-     * Parsing & Compiling
-     */
-
-    function Parser(options) {
-        this.tokens = [];
-        this.token = null;
-        this.options = options || marked.defaults;
-    }
-
-    /**
-     * Static Parse Method
-     */
-
-    Parser.parse = function (src, options) {
-        var parser = new Parser(options);
-        return parser.parse(src);
-    };
-
-    /**
-     * Parse Loop
-     */
-
-    Parser.prototype.parse = function (src) {
-        this.inline = new InlineLexer(src.links, this.options);
-        this.tokens = src.reverse();
-
-        var out = "";
-        while (this.next()) {
-            out += this.tok();
-        }
-
-        return out;
-    };
-
-    /**
-     * Next Token
-     */
-
-    Parser.prototype.next = function () {
-        return (this.token = this.tokens.pop());
-    };
-
-    /**
-     * Preview Next Token
-     */
-
-    Parser.prototype.peek = function () {
-        return this.tokens[this.tokens.length - 1] || 0;
-    };
-
-    /**
-     * Parse Text Tokens
-     */
-
-    Parser.prototype.parseText = function () {
-        var body = this.token.text;
-
-        while (this.peek().type === "text") {
-            body += "\n" + this.next().text;
-        }
-
-        return this.inline.output(body);
-    };
-
-    /**
-     * Parse Current Token
-     */
-
-    Parser.prototype.tok = function () {
-        switch (this.token.type) {
-            case "space": {
-                return "";
-            }
-            case "hr": {
-                return "<hr>\n";
-            }
-            case "heading": {
-                return (
-                    "<h" +
-                    this.token.depth +
-                    ">" +
-                    this.inline.output(this.token.text) +
-                    "</h" +
-                    this.token.depth +
-                    ">\n"
-                );
-            }
-            case "code": {
-                if (this.options.highlight) {
-                    var code = this.options.highlight(this.token.text, this.token.lang);
-                    if (code != null && code !== this.token.text) {
-                        this.token.escaped = true;
-                        this.token.text = code;
-                    }
-                }
-
-                if (!this.token.escaped) {
-                    this.token.text = escape(this.token.text, true);
-                }
-
-                return (
-                    "<pre><code" +
-                    (this.token.lang ? ' class="' + this.options.langPrefix + this.token.lang + '"' : "") +
-                    ">" +
-                    this.token.text +
-                    "</code></pre>\n"
-                );
-            }
-            case "table": {
-                var body = "",
-                    heading,
-                    i,
-                    row,
-                    cell,
-                    j;
-
-                // header
-                body += "<thead>\n<tr>\n";
-                for (i = 0; i < this.token.header.length; i++) {
-                    heading = this.inline.output(this.token.header[i]);
-                    body += this.token.align[i]
-                        ? '<th align="' + this.token.align[i] + '">' + heading + "</th>\n"
-                        : "<th>" + heading + "</th>\n";
-                }
-                body += "</tr>\n</thead>\n";
-
-                // body
-                body += "<tbody>\n";
-                for (i = 0; i < this.token.cells.length; i++) {
-                    row = this.token.cells[i];
-                    body += "<tr>\n";
-                    for (j = 0; j < row.length; j++) {
-                        cell = this.inline.output(row[j]);
-                        body += this.token.align[j]
-                            ? '<td align="' + this.token.align[j] + '">' + cell + "</td>\n"
-                            : "<td>" + cell + "</td>\n";
-                    }
-                    body += "</tr>\n";
-                }
-                body += "</tbody>\n";
-
-                return "<table>\n" + body + "</table>\n";
-            }
-            case "blockquote_start": {
-                var body = "";
-
-                while (this.next().type !== "blockquote_end") {
-                    body += this.tok();
-                }
-
-                return "<blockquote>\n" + body + "</blockquote>\n";
-            }
-            case "list_start": {
-                var type = this.token.ordered ? "ol" : "ul",
-                    body = "";
-
-                while (this.next().type !== "list_end") {
-                    body += this.tok();
-                }
-
-                return "<" + type + ">\n" + body + "</" + type + ">\n";
-            }
-            case "list_item_start": {
-                var body = "";
-
-                while (this.next().type !== "list_item_end") {
-                    body += this.token.type === "text" ? this.parseText() : this.tok();
-                }
-
-                return "<li>" + body + "</li>\n";
-            }
-            case "loose_item_start": {
-                var body = "";
-
-                while (this.next().type !== "list_item_end") {
-                    body += this.tok();
-                }
-
-                return "<li>" + body + "</li>\n";
-            }
-            case "html": {
-                return !this.token.pre && !this.options.pedantic
-                    ? this.inline.output(this.token.text)
-                    : this.token.text;
-            }
-            case "paragraph": {
-                return "<p>" + this.inline.output(this.token.text) + "</p>\n";
-            }
-            case "text": {
-                return "<p>" + this.parseText() + "</p>\n";
-            }
-        }
-    };
-
-    /**
-     * Helpers
-     */
-
-    function escape(html, encode) {
-        return html
-            .replace(!encode ? /&(?!#?\w+;)/g : /&/g, "&amp;")
-            .replace(/</g, "&lt;")
-            .replace(/>/g, "&gt;")
-            .replace(/"/g, "&quot;")
-            .replace(/'/g, "&#39;");
-    }
-
-    function replace(regex, opt) {
-        regex = regex.source;
-        opt = opt || "";
-        return function self(name, val) {
-            if (!name) return new RegExp(regex, opt);
-            val = val.source || val;
-            val = val.replace(/(^|[^\[])\^/g, "$1");
-            regex = regex.replace(name, val);
-            return self;
-        };
-    }
-
-    function noop() {}
-    noop.exec = noop;
-
-    function merge(obj) {
-        var i = 1,
-            target,
-            key;
-
-        for (; i < arguments.length; i++) {
-            target = arguments[i];
-            for (key in target) {
-                if (Object.prototype.hasOwnProperty.call(target, key)) {
-                    obj[key] = target[key];
-                }
-            }
-        }
-
-        return obj;
-    }
-
-    /**
-     * Marked
-     */
-
-    function marked(src, opt, callback) {
-        if (callback || typeof opt === "function") {
-            if (!callback) {
-                callback = opt;
-                opt = null;
-            }
-
-            if (opt) opt = merge({}, marked.defaults, opt);
-
-            var tokens = Lexer.lex(tokens, opt),
-                highlight = opt.highlight,
-                pending = 0,
-                l = tokens.length,
-                i = 0;
-
-            if (!highlight || highlight.length < 3) {
-                return callback(null, Parser.parse(tokens, opt));
-            }
-
-            var done = function () {
-                delete opt.highlight;
-                var out = Parser.parse(tokens, opt);
-                opt.highlight = highlight;
-                return callback(null, out);
-            };
-
-            for (; i < l; i++) {
-                (function (token) {
-                    if (token.type !== "code") return;
-                    pending++;
-                    return highlight(token.text, token.lang, function (err, code) {
-                        if (code == null || code === token.text) {
-                            return --pending || done();
-                        }
-                        token.text = code;
-                        token.escaped = true;
-                        --pending || done();
-                    });
-                })(tokens[i]);
-            }
-
-            return;
-        }
-        try {
-            if (opt) opt = merge({}, marked.defaults, opt);
-            return Parser.parse(Lexer.lex(src, opt), opt);
-        } catch (e) {
-            e.message += "\nPlease report this to https://github.com/chjj/marked.";
-            if ((opt || marked.defaults).silent) {
-                return "<p>An error occured:</p><pre>" + escape(e.message + "", true) + "</pre>";
-            }
-            throw e;
-        }
-    }
-
-    /**
-     * Options
-     */
-
-    marked.options = marked.setOptions = function (opt) {
-        merge(marked.defaults, opt);
-        return marked;
-    };
-
-    marked.defaults = {
-        gfm: true,
-        tables: true,
-        breaks: false,
-        pedantic: false,
-        sanitize: false,
-        smartLists: false,
-        silent: false,
-        highlight: null,
-        langPrefix: "lang-",
-    };
-
-    /**
-     * Expose
-     */
-
-    marked.Parser = Parser;
-    marked.parser = Parser.parse;
-
-    marked.Lexer = Lexer;
-    marked.lexer = Lexer.lex;
-
-    marked.InlineLexer = InlineLexer;
-    marked.inlineLexer = InlineLexer.output;
-
-    marked.parse = marked;
-
-    if (typeof exports === "object") {
-        module.exports = marked;
-    } else if (typeof define === "function" && define.amd) {
-        define(function () {
-            return marked;
-        });
-    } else {
-        this.marked = marked;
-    }
-}).call(
-    (function () {
-        return this || (typeof window !== "undefined" ? window : global);
-    })()
-);
-
-(function ($) {
-    "use strict";
-
-    // hide the whole page so we dont see the DOM flickering
-    // will be shown upon page load complete or error
-    $("html").addClass("md-hidden-load");
-
-    // register our $.md object
-    $.md = function (method) {
-        if ($.md.publicMethods[method]) {
-            return $.md.publicMethods[method].apply(this, Array.prototype.slice.call(arguments, 1));
-        } else {
-            $.error("Method " + method + " does not exist on jquery.md");
-        }
-    };
-    // default config
-    $.md.config = {
-        title: null,
-        useSideMenu: true,
-        lineBreaks: "gfm",
-        additionalFooterText: "",
-        anchorCharacter: "&para;",
-        tocAnchor: "[ &uarr; ]",
-    };
-
-    $.md.gimmicks = [];
-    $.md.stages = [];
-
-    // the location of the main markdown file we display
-    $.md.mainHref = "";
-
-    // the in-page anchor that is specified after the !
-    $.md.inPageAnchor = "";
-
-    $.md.loglevel = {
-        TRACE: 10,
-        DEBUG: 20,
-        INFO: 30,
-        WARN: 40,
-        ERROR: 50,
-        FATAL: 60,
-    };
-    // $.md.logThreshold = $.md.loglevel.DEBUG;
-    $.md.logThreshold = $.md.loglevel.WARN;
-})(jQuery);
-
-(function ($) {
-    "use strict";
-    $.md.getLogger = function () {
-        var loglevel = $.md.loglevel;
-
-        var log = function (logtarget) {
-            var self = this;
-            var level = loglevel[logtarget];
-            return function (msg) {
-                if ($.md.logThreshold <= level) {
-                    console.log("[" + logtarget + "] " + msg);
-                }
-            };
-        };
-
-        var logger = {};
-        logger.trace = log("TRACE");
-        logger.debug = log("DEBUG");
-        logger.info = log("INFO");
-        logger.warn = log("WARN");
-        logger.error = log("ERROR");
-        logger.fatal = log("FATAL");
-
-        return logger;
-    };
-})(jQuery);
-
-(function ($) {
-    "use strict";
-    var log = $.md.getLogger();
-
-    $.Stage = function (name) {
-        var self = $.extend($.Deferred(), {});
-        self.name = name;
-        self.events = [];
-        self.started = false;
-
-        self.reset = function () {
-            self.complete = $.Deferred();
-            self.outstanding = [];
-        };
-
-        self.reset();
-
-        self.subscribe = function (fn) {
-            if (self.started) {
-                $.error("Subscribing to stage which already started!");
-            }
-            self.events.push(fn);
-        };
-        self.unsubscribe = function (fn) {
-            self.events.remove(fn);
-        };
-
-        self.executeSubscribedFn = function (fn) {
-            var d = $.Deferred();
-            self.outstanding.push(d);
-
-            // display an error if our done() callback is not called
-            $.md.util.wait(2500).done(function () {
-                if (d.state() !== "resolved") {
-                    log.fatal(
-                        "Timeout reached for done callback in stage: " +
-                            self.name +
-                            ". Did you forget a done() call in a .subscribe() ?"
-                    );
-                    log.fatal("stage " + name + " failed running subscribed function: " + fn);
-                }
-            });
-
-            var done = function () {
-                d.resolve();
-            };
-            fn(done);
-        };
-
-        self.run = function () {
-            self.started = true;
-            $(self.events).each(function (i, fn) {
-                self.executeSubscribedFn(fn);
-            });
-
-            // if no events are in our queue, we resolve immediately
-            if (self.outstanding.length === 0) {
-                self.resolve();
-            }
-
-            // we resolve when all our registered events have completed
-            $.when
-                .apply($, self.outstanding)
-                .done(function () {
-                    self.resolve();
-                })
-                .fail(function () {
-                    self.resolve();
-                });
-        };
-
-        self.done(function () {
-            log.debug("stage " + self.name + " completed successfully.");
-        });
-        self.fail(function () {
-            log.debug("stage " + self.name + " completed with errors!");
-        });
-        return self;
-    };
-})(jQuery);
-
-(function ($) {
-    "use strict";
-
-    var log = $.md.getLogger();
-
-    function init() {
-        $.md.stages = [
-            $.Stage("init"),
-
-            // loads config, initial markdown and navigation
-            $.Stage("load"),
-
-            // will transform the markdown to html
-            $.Stage("transform"),
-
-            // HTML transformation finished
-            $.Stage("ready"),
-
-            // after we have a polished html skeleton
-            $.Stage("skel_ready"),
-
-            // will bootstrapify the skeleton
-            $.Stage("bootstrap"),
-
-            // before we run any gimmicks
-            $.Stage("pregimmick"),
-
-            // after we have bootstrapified the skeleton
-            $.Stage("gimmick"),
-
-            // postprocess
-            $.Stage("postgimmick"),
-
-            $.Stage("all_ready"),
-
-            // used for integration tests, not intended to use in MDwiki itself
-            $.Stage("final_tests"),
-        ];
-
-        $.md.stage = function (name) {
-            var m = $.grep($.md.stages, function (e, i) {
-                return e.name === name;
-            });
-            if (m.length === 0) {
-                $.error("A stage by name " + name + "  does not exist");
-            } else {
-                return m[0];
-            }
-        };
-    }
-    init();
-
-    function resetStages() {
-        var old_stages = $.md.stages;
-        $.md.stages = [];
-        $(old_stages).each(function (i, e) {
-            $.md.stages.push($.Stage(e.name));
-        });
-    }
-
-    var publicMethods = {};
-    $.md.publicMethods = $.extend({}, $.md.publicMethods, publicMethods);
-
-    function transformMarkdown(markdown) {
-        var options = {
-            gfm: true,
-            tables: true,
-            breaks: true,
-        };
-        if ($.md.config.lineBreaks === "original") options.breaks = false;
-        else if ($.md.config.lineBreaks === "gfm") options.breaks = true;
-
-        marked.setOptions(options);
-
-        // get sample markdown
-        var uglyHtml = marked(markdown);
-        return uglyHtml;
-    }
-
-    function registerFetchMarkdown() {
-        var md = "";
-
-        $.md.stage("init").subscribe(function (done) {
-            var ajaxReq = {
-                url: $.md.mainHref,
-                dataType: "text",
-            };
-
-            // Request the md page
-            $.ajax(ajaxReq)
-                .done(function (data) {
-                    md = data;
-                    done();
-                })
-
-                // Failed to find the md page we were looking for
-                .fail(function () {
-                    // Warn that this page wasn't found
-                    var log = $.md.getLogger();
-                    log.warn("Could not get " + $.md.mainHref);
-
-                    // Attempt to gracefully recover by displaying a user defined 404 page
-                    ajaxReq.url = "404.md";
-                    $.ajax(ajaxReq)
-                        .done(function (data) {
-                            md = data;
-                            done();
-                        })
-
-                        // The user has not defined a 404.md.
-                        .fail(function (data) {
-                            log.fatal("Could not get a user defined 404.md");
-
-                            // Our last attempt to provide a good user expierence by proving a hard coded
-                            // 'page not found' text.
-                            md = "# Page Not Found";
-
-                            done();
-                        });
-                });
-        });
-
-        // find baseUrl
-        $.md.stage("transform").subscribe(function (done) {
-            var len = $.md.mainHref.lastIndexOf("/");
-            var baseUrl = $.md.mainHref.substring(0, len + 1);
-            $.md.baseUrl = baseUrl;
-            done();
-        });
-
-        $.md.stage("transform").subscribe(function (done) {
-            var uglyHtml = transformMarkdown(md);
-            $("#md-content").html(uglyHtml);
-            md = "";
-            var dfd = $.Deferred();
-            loadExternalIncludes(dfd);
-            dfd.always(function () {
-                done();
-            });
-        });
-    }
-
-    // load [include](/foo/bar.md) external links
-    function loadExternalIncludes(parent_dfd) {
-        function findExternalIncludes() {
-            return $("a").filter(function () {
-                var href = $(this).attr("href");
-                var text = $(this).toptext();
-                var isMarkdown = $.md.util.hasMarkdownFileExtension(href);
-                var isInclude = text === "include";
-                var isPreview = text.startsWith("preview:");
-                return (isInclude || isPreview) && isMarkdown;
-            });
-        }
-
-        function selectPreviewElements($jqcol, num_elements) {
-            function isTextNode(node) {
-                return node.nodeType === 3;
-            }
-            var count = 0;
-            var elements = [];
-            $jqcol.each(function (i, e) {
-                if (count < num_elements) {
-                    elements.push(e);
-                    if (!isTextNode(e)) count++;
-                }
-            });
-            return $(elements);
-        }
-
-        var external_links = findExternalIncludes();
-        // continue execution when all external resources are fully loaded
-        var latch = $.md.util.countDownLatch(external_links.length);
-        latch.always(function () {
-            parent_dfd.resolve();
-        });
-
-        external_links.each(function (i, e) {
-            var $el = $(e);
-            var href = $el.attr("href");
-            var text = $el.toptext();
-
-            $.ajax({
-                url: href,
-                dataType: "text",
-            })
-                .done(function (data) {
-                    var $html = $(transformMarkdown(data));
-                    if (text.startsWith("preview:")) {
-                        // only insert the selected number of paragraphs; default 3
-                        var num_preview_elements = parseInt(text.substring(8), 10) || 3;
-                        var $preview = selectPreviewElements($html, num_preview_elements);
-                        $preview.last().append('<a href="' + href + '"> ...read more &#10140;</a>');
-                        $preview.insertBefore($el.parent("p").eq(0));
-                        $el.remove();
-                    } else {
-                        $html.insertAfter($el.parents("p"));
-                        $el.remove();
-                    }
-                })
-                .always(function () {
-                    latch.countDown();
-                });
-        });
-    }
-
-    function isSpecialLink(href) {
-        if (!href) return false;
-
-        if (href.lastIndexOf("data:") >= 0) return true;
-
-        if (href.startsWith("mailto:")) return true;
-
-        if (href.startsWith("file:")) return true;
-
-        if (href.startsWith("ftp:")) return true;
-
-        // TODO capture more special links: every non-http link with : like
-        // torrent:// etc.
-    }
-
-    // modify internal links so we load them through our engine
-    function processPageLinks(domElement, baseUrl) {
-        var html = $(domElement);
-        if (baseUrl === undefined) {
-            baseUrl = "";
-        }
-        // HACK against marked: empty links will have empy href attribute
-        // we remove the href attribute from the a tag
-        html.find("a")
-            .not("#md-menu a")
-            .filter(function () {
-                var $this = $(this);
-                var attr = $this.attr("href");
-                if (!attr || attr.length === 0) $this.removeAttr("href");
-            });
-
-        html.find("a, img").each(function (i, e) {
-            var link = $(e);
-            // link must be jquery collection
-            var isImage = false;
-            var hrefAttribute = "href";
-
-            if (!link.attr(hrefAttribute)) {
-                isImage = true;
-                hrefAttribute = "src";
-            }
-            var href = link.attr(hrefAttribute);
-
-            if (href && href.lastIndexOf("#!") >= 0) return;
-
-            if (isSpecialLink(href)) return;
-
-            if (!isImage && href.startsWith("#") && !href.startsWith("#!")) {
-                // in-page link
-                link.click(function (ev) {
-                    ev.preventDefault();
-                    $.md.scrollToInPageAnchor(href);
-                });
-            }
-
-            if (!$.md.util.isRelativeUrl(href)) return;
-
-            if (isImage && !$.md.util.isRelativePath(href)) return;
-
-            if (!isImage && $.md.util.isGimmickLink(link)) return;
-
-            function build_link(url) {
-                if ($.md.util.hasMarkdownFileExtension(url)) return "#!" + url;
-                else return url;
-            }
-
-            var newHref = baseUrl + href;
-            if (isImage) link.attr(hrefAttribute, newHref);
-            else if ($.md.util.isRelativePath(href)) link.attr(hrefAttribute, build_link(newHref));
-            else link.attr(hrefAttribute, build_link(href));
-        });
-    }
-
-    var navMD = "";
-    $.md.NavigationDfd = $.Deferred();
-    var ajaxReq = {
-        url: "navigation.md",
-        dataType: "text",
-    };
-    $.ajax(ajaxReq)
-        .done(function (data) {
-            navMD = data;
-            $.md.NavigationDfd.resolve();
-        })
-        .fail(function () {
-            $.md.NavigationDfd.reject();
-        });
-
-    function registerBuildNavigation() {
-        $.md.stage("init").subscribe(function (done) {
-            $.md.NavigationDfd.done(function () {
-                done();
-            }).fail(function () {
-                done();
-            });
-        });
-
-        $.md.stage("transform").subscribe(function (done) {
-            if (navMD === "") {
-                var log = $.md.getLogger();
-                log.info("no navgiation.md found, not using a navbar");
-                done();
-                return;
-            }
-
-            var navHtml = marked(navMD);
-            // TODO why are <script> tags from navHtml APPENDED to the jqcol?
-            var $h = $("<div>" + navHtml + "</div>");
-
-            // insert <scripts> from navigation.md into the DOM
-            $h.each(function (i, e) {
-                if (e.tagName === "SCRIPT") {
-                    $("script").first().before(e);
-                }
-            });
-
-            // TODO .html() is evil!!!
-            var $navContent = $h.eq(0);
-            $navContent.find("p").each(function (i, e) {
-                var $el = $(e);
-                $el.replaceWith($el.html());
-            });
-            $("#md-menu").append($navContent.html());
-            done();
-        });
-
-        $.md.stage("bootstrap").subscribe(function (done) {
-            processPageLinks($("#md-menu"));
-            done();
-        });
-
-        $.md.stage("postgimmick").subscribe(function (done) {
-            var num_links = $("#md-menu a").length;
-            var has_header = $("#md-menu .navbar-brand").eq(0).toptext().trim().length > 0;
-            if (!has_header && num_links <= 1) $("#md-menu").hide();
-
-            done();
-        });
-    }
-
-    $.md.ConfigDfd = $.Deferred();
-    $.ajax({ url: "config.json", dataType: "text" })
-        .done(function (data) {
-            try {
-                var data_json = JSON.parse(data);
-                $.md.config = $.extend($.md.config, data_json);
-                log.info("Found a valid config.json file, using configuration");
-            } catch (err) {
-                log.error("config.json was not JSON parsable: " + err);
-            }
-            $.md.ConfigDfd.resolve();
-        })
-        .fail(function (err, textStatus) {
-            log.error("unable to retrieve config.json: " + textStatus);
-            $.md.ConfigDfd.reject();
-        });
-    function registerFetchConfig() {
-        $.md.stage("init").subscribe(function (done) {
-            // TODO 404 won't get cached, requesting it every reload is not good
-            // maybe use cookies? or disable re-loading of the page
-            //$.ajax('config.json').done(function(data){
-            $.md.ConfigDfd.done(function () {
-                done();
-            }).fail(function () {
-                var log = $.md.getLogger();
-                log.info("No config.json found, using default settings");
-                done();
-            });
-        });
-    }
-
-    function registerClearContent() {
-        $.md.stage("init").subscribe(function (done) {
-            $("#md-all").empty();
-            var skel =
-                '<div id="md-body"><div id="md-title"></div><div id="md-menu">' +
-                '</div><div id="md-content"></div></div>';
-            $("#md-all").prepend($(skel));
-            done();
-        });
-    }
-    function loadContent(href) {
-        if (href.startsWith("/")) {
-            // prevent cross-domain inclusions to prevent possible XSS
-            href = "/./" + href;
-        } else {
-            href = "./" + href;
-        }
-        $.md.mainHref = href;
-
-        registerFetchMarkdown();
-        registerClearContent();
-
-        // find out which link gimmicks we need
-        $.md.stage("ready").subscribe(function (done) {
-            $.md.initializeGimmicks();
-            $.md.registerLinkGimmicks();
-            done();
-        });
-
-        // wire up the load method of the modules
-        $.each($.md.gimmicks, function (i, module) {
-            if (module.load === undefined) {
-                return;
-            }
-            $.md.stage("load").subscribe(function (done) {
-                module.load();
-                done();
-            });
-        });
-
-        $.md.stage("ready").subscribe(function (done) {
-            $.md("createBasicSkeleton");
-            done();
-        });
-
-        $.md.stage("bootstrap").subscribe(function (done) {
-            $.mdbootstrap("bootstrapify");
-            processPageLinks($("#md-content"), $.md.baseUrl);
-            done();
-        });
-        runStages();
-    }
-
-    function runStages() {
-        // wire the stages up
-        $.md.stage("init").done(function () {
-            $.md.stage("load").run();
-        });
-        $.md.stage("load").done(function () {
-            $.md.stage("transform").run();
-        });
-        $.md.stage("transform").done(function () {
-            $.md.stage("ready").run();
-        });
-        $.md.stage("ready").done(function () {
-            $.md.stage("skel_ready").run();
-        });
-        $.md.stage("skel_ready").done(function () {
-            $.md.stage("bootstrap").run();
-        });
-        $.md.stage("bootstrap").done(function () {
-            $.md.stage("pregimmick").run();
-        });
-        $.md.stage("pregimmick").done(function () {
-            $.md.stage("gimmick").run();
-        });
-        $.md.stage("gimmick").done(function () {
-            $.md.stage("postgimmick").run();
-        });
-        $.md.stage("postgimmick").done(function () {
-            $.md.stage("all_ready").run();
-        });
-        $.md.stage("all_ready").done(function () {
-            $("html").removeClass("md-hidden-load");
-
-            // phantomjs hook when we are done
-            if (typeof window.callPhantom === "function") {
-                window.callPhantom({});
-            }
-
-            $.md.stage("final_tests").run();
-        });
-        $.md.stage("final_tests").done(function () {
-            // reset the stages for next iteration
-            resetStages();
-
-            // required by dalekjs so we can wait the element to appear
-            $("body").append('<span id="start-tests"></span>');
-            $("#start-tests").hide();
-        });
-
-        // trigger the whole process by runing the init stage
-        $.md.stage("init").run();
-        return;
-    }
-
-    function extractHashData() {
-        // first char is the # or #!
-        var href;
-        if (window.location.hash.startsWith("#!")) {
-            href = window.location.hash.substring(2);
-        } else {
-            href = window.location.hash.substring(1);
-        }
-        href = decodeURIComponent(href);
-
-        // extract possible in-page anchor
-        var ex_pos = href.indexOf("#");
-        if (ex_pos !== -1) {
-            $.md.inPageAnchor = href.substring(ex_pos + 1);
-            $.md.mainHref = href.substring(0, ex_pos);
-        } else {
-            $.md.mainHref = href;
-        }
-    }
-
-    function appendDefaultFilenameToHash() {
-        var newHashString = "";
-        var currentHashString = window.location.hash || "";
-        if (currentHashString === "" || currentHashString === "#" || currentHashString === "#!") {
-            newHashString = "#!index.md";
-        } else if (currentHashString.startsWith("#!") && currentHashString.endsWith("/")) {
-            newHashString = currentHashString + "index.md";
-        }
-        if (newHashString) window.location.hash = newHashString;
-    }
-
-    $(document).ready(function () {
-        // stage init stuff
-        registerFetchConfig();
-        registerBuildNavigation();
-        extractHashData();
-
-        appendDefaultFilenameToHash();
-
-        $(window).bind("hashchange", function () {
-            window.location.reload(false);
-        });
-
-        loadContent($.md.mainHref);
-    });
-})(jQuery);
-
-(function ($) {
-    var publicMethods = {
-        isRelativeUrl: function (url) {
-            if (url === undefined) {
-                return false;
-            }
-            // if there is :// in it, its considered absolute
-            // else its relative
-            if (url.indexOf("://") === -1) {
-                return true;
-            } else {
-                return false;
-            }
-        },
-        isRelativePath: function (path) {
-            if (path === undefined) return false;
-            if (path.startsWith("/")) return false;
-            return true;
-        },
-        isGimmickLink: function (domAnchor) {
-            if (domAnchor.toptext().indexOf("gimmick:") !== -1) {
-                return true;
-            } else {
-                return false;
-            }
-        },
-        hasMarkdownFileExtension: function (str) {
-            var markdownExtensions = [".md", ".markdown", ".mdown"];
-            var result = false;
-            var value = str.toLowerCase().split("#")[0];
-            $(markdownExtensions).each(function (i, ext) {
-                if (value.toLowerCase().endsWith(ext)) {
-                    result = true;
-                }
-            });
-            return result;
-        },
-        wait: function (time) {
-            return $.Deferred(function (dfd) {
-                setTimeout(dfd.resolve, time);
-            });
-        },
-    };
-    $.md.util = $.extend({}, $.md.util, publicMethods);
-
-    if (typeof String.prototype.startsWith !== "function") {
-        String.prototype.startsWith = function (str) {
-            return this.slice(0, str.length) === str;
-        };
-    }
-    if (typeof String.prototype.endsWith !== "function") {
-        String.prototype.endsWith = function (str) {
-            return this.slice(this.length - str.length, this.length) === str;
-        };
-    }
-
-    $.fn.extend({
-        toptext: function () {
-            return this.clone().children().remove().end().text();
-        },
-    });
-
-    // adds a :icontains selector to jQuery that is case insensitive
-    $.expr[":"].icontains = $.expr.createPseudo(function (arg) {
-        return function (elem) {
-            return $(elem).toptext().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
-        };
-    });
-
-    $.md.util.getInpageAnchorText = function (text) {
-        var subhash = text.replace(/ /g, "_");
-        // TODO remove more unwanted characters like ?/,- etc.
-        return subhash;
-    };
-    $.md.util.getInpageAnchorHref = function (text, href) {
-        href = href || $.md.mainHref;
-        var subhash = $.md.util.getInpageAnchorText(text);
-        return "#!" + href + "#" + subhash;
-    };
-
-    $.md.util.repeatUntil = function (interval, predicate, maxRepeats) {
-        maxRepeats = maxRepeats || 10;
-        var dfd = $.Deferred();
-        function recursive_repeat(interval, predicate, maxRepeats) {
-            if (maxRepeats === 0) {
-                dfd.reject();
-                return;
-            }
-            if (predicate()) {
-                dfd.resolve();
-                return;
-            } else {
-                $.md.util.wait(interval).always(function () {
-                    recursive_repeat(interval, predicate, maxRepeats - 1);
-                });
-            }
-        }
-        recursive_repeat(interval, predicate, maxRepeats);
-        return dfd;
-    };
-
-    // a count-down latch as in Java7.
-    $.md.util.countDownLatch = function (capacity, min) {
-        min = min || 0;
-        var dfd = $.Deferred();
-        if (capacity <= min) dfd.resolve();
-        dfd.capacity = capacity;
-        dfd.countDown = function () {
-            dfd.capacity--;
-            if (dfd.capacity <= min) dfd.resolve();
-        };
-        return dfd;
-    };
-})(jQuery);
-
-(function ($) {
-    "use strict";
-
-    // PUBLIC API
-    $.md.registerGimmick = function (module) {
-        $.md.gimmicks.push(module);
-        return;
-    };
-
-    // registers a script for a gimmick, that is later dynamically loaded
-    // by the core.
-    // src may be an URL or direct javascript sourcecode. When options.callback
-    // is provided, the done() function is passed to the function and needs to
-    // be called.
-    $.md.registerScript = function (module, src, options) {
-        var scriptinfo = new ScriptInfo({
-            module: module,
-            src: src,
-            options: options,
-        });
-        registeredScripts.push(scriptinfo);
-    };
-
-    // same as registerScript but for css. Note that we do not provide a
-    // callback when the load finishes
-    $.md.registerCss = function (module, url, options) {
-        var license = options.license,
-            stage = options.stage || "skel_ready",
-            callback = options.callback;
-
-        checkLicense(license, module);
-        var tag = '<link rel="stylesheet" href="' + url + '" type="text/css"></link>';
-        $.md.stage(stage).subscribe(function (done) {
-            $("head").append(tag);
-            if (callback !== undefined) {
-                callback(done);
-            } else {
-                done();
-            }
-        });
-    };
-
-    // turns hostname/path links into http://hostname/path links
-    // we need to do this because if accessed by file:///, we need a different
-    // transport scheme for external resources (like http://)
-    $.md.prepareLink = function (link, options) {
-        options = options || {};
-        var ownProtocol = window.location.protocol;
-
-        if (options.forceSSL) return "https://" + link;
-        if (options.forceHTTP) return "http://" + link;
-
-        if (ownProtocol === "file:") {
-            return "http://" + link;
-        }
-        // default: use the same as origin resource
-        return "//" + link;
-    };
-
-    // associate a link trigger for a gimmick. i.e. [gimmick:foo]() then
-    // foo is the trigger and will invoke the corresponding gimmick
-    $.md.linkGimmick = function (module, trigger, callback, stage) {
-        if (stage === undefined) {
-            stage = "gimmick";
-        }
-        var linktrigger = new LinkTrigger({
-            trigger: trigger,
-            module: module,
-            stage: stage,
-            callback: callback,
-        });
-        linkTriggers.push(linktrigger);
-    };
-
-    $.md.triggerIsActive = function (trigger) {
-        if (activeLinkTriggers.indexOf(trigger) === -1) {
-            return false;
-        } else {
-            return true;
-        }
-    };
-
-    var initialized = false;
-    // TODO combine main.js and modules.js closure
-    $.md.initializeGimmicks = function () {
-        findActiveLinkTrigger();
-        runGimmicksOnce();
-        loadRequiredScripts();
-    };
-
-    // END PUBLIC API
-
-    var log = $.md.getLogger();
-
-    // triggers that we actually found on the page
-    // array of string
-    var activeLinkTriggers = [];
-
-    // array of ScriptInfo
-    var registeredScripts = [];
-    function ScriptInfo(initial) {
-        this.module = undefined;
-        this.options = {};
-
-        // can ba an URL or javascript sourcecode
-        this.src = "";
-
-        $.extend(this, initial);
-    }
-
-    // array of linkTriggers
-    var linkTriggers = [];
-    function LinkTrigger(initial) {
-        this.trigger = undefined;
-        this.module = undefined;
-        this.callback = undefined;
-
-        $.extend(this, initial);
-    }
-
-    // jQuery does some magic when inserting inline scripts, so better
-    // use vanilla JS. See:
-    // http://stackoverflow.com/questions/610995/jquery-cant-append-script-element
-    function insertInlineScript(src) {
-        // scripts always need to go directly into the DOM
-        var script = document.createElement("script");
-        script.type = "text/javascript";
-        script.text = src;
-        document.body.appendChild(script);
-    }
-
-    // since we are GPL, we have to be cautious what other scripts we load
-    // as delivering to the browser is considered delivering a derived work
-    var licenses = [
-        "MIT",
-        "BSD",
-        "GPL",
-        "GPL2",
-        "GPL3",
-        "LGPL",
-        "LGPL2",
-        "APACHE2",
-        "PUBLICDOMAIN",
-        "EXCEPTION",
-        "OTHER",
-    ];
-    function checkLicense(license, module) {
-        if ($.inArray(license, licenses) === -1) {
-            var availLicenses = JSON.stringify(licenses);
-            log.warn("license " + license + " is not known.");
-            log.warn("Known licenses:" + availLicenses);
-        } else if (license === "OTHER") {
-            log.warn(
-                "WARNING: Module " +
-                    module.name +
-                    " uses a script" +
-                    " with unknown license. This may be a GPL license violation if" +
-                    " this website is publically available!"
-            );
-        }
-    }
-
-    // will actually schedule the script load into the DOM.
-    function loadScript(scriptinfo) {
-        var module = scriptinfo.module,
-            src = scriptinfo.src,
-            options = scriptinfo.options;
-
-        var license = options.license || "OTHER",
-            loadstage = options.loadstage || "skel_ready",
-            finishstage = options.finishstage || "pregimmick",
-            callback = options.callback;
-
-        var loadDone = $.Deferred();
-
-        checkLicense(license, module);
-        // start script loading
-        log.debug("subscribing " + module.name + " to start: " + loadstage + " end in: " + finishstage);
-        $.md.stage(loadstage).subscribe(function (done) {
-            if (src.startsWith("//") || src.startsWith("http")) {
-                $.getScript(src, function () {
-                    if (callback !== undefined) {
-                        callback(done);
-                    } else {
-                        log.debug("module" + module.name + " script load done: " + src);
-                        done();
-                    }
-                    loadDone.resolve();
-                });
-            } else {
-                // inline script that we directly insert
-                insertInlineScript(src);
-                log.debug("module" + module.name + " script inject done");
-                loadDone.resolve();
-                done();
-            }
-        });
-        // if loading is not yet finished in stage finishstage, wait
-        // for the loading to complete
-        $.md.stage(finishstage).subscribe(function (done) {
-            loadDone.done(function () {
-                done();
-            });
-        });
-    }
-
-    // finds out that kind of trigger words are acutally used on a given page
-    // this is most likely a very small subset of all available gimmicks
-    function findActiveLinkTrigger() {
-        var $gimmicks = $("a:icontains(gimmick:)");
-        $gimmicks.each(function (i, e) {
-            var parts = getGimmickLinkParts($(e));
-            if (activeLinkTriggers.indexOf(parts.trigger) === -1) {
-                activeLinkTriggers.push(parts.trigger);
-            }
-        });
-        log.debug("Scanning for required gimmick links: " + JSON.stringify(activeLinkTriggers));
-    }
-
-    function loadRequiredScripts() {
-        // find each module responsible for the link trigger
-        $.each(activeLinkTriggers, function (i, trigger) {
-            var module = findModuleByTrigger(trigger);
-            if (module === undefined) {
-                log.error('Gimmick link: "' + trigger + '" found but no suitable gimmick loaded');
-                return;
-            }
-            var scriptinfo = registeredScripts.filter(function (info) {
-                return info.module.name === module.name;
-            })[0];
-            // register to load the script
-            if (scriptinfo !== undefined) {
-                loadScript(scriptinfo);
-            }
-        });
-    }
-
-    function findModuleByTrigger(trigger) {
-        var ret;
-        $.each(linkTriggers, function (i, e) {
-            if (e.trigger === trigger) {
-                ret = e.module;
-            }
-        });
-        return ret;
-    }
-
-    function getGimmickLinkParts($link) {
-        var link_text = $.trim($link.toptext());
-        // returns linkTrigger, options, linkText
-        if (link_text.match(/gimmick:/i) === null) {
-            return null;
-        }
-        var href = $.trim($link.attr("href"));
-        var r = new RegExp(/gimmick:\s*([^(\s]*)\s*(\(\s*{?(.*)\s*}?\s*\))*/i);
-        var matches = r.exec(link_text);
-        if (matches === null || matches[1] === undefined) {
-            $.error("Error matching a gimmick: " + link_text);
-            return null;
-        }
-        var trigger = matches[1].toLowerCase();
-        var args = null;
-        // getting the parameters
-        if (matches[2] !== undefined) {
-            // remove whitespaces
-            var params = $.trim(matches[3].toString());
-            // remove the closing } if present
-            if (params.charAt(params.length - 1) === "}") {
-                params = params.substring(0, params.length - 1);
-            }
-            // add surrounding braces and paranthese
-            params = "({" + params + "})";
-            // replace any single quotes by double quotes
-            params = params.replace(/'/g, '"');
-            // finally, try if the json object is valid
-            try {
-                /*jshint -W061 */
-                args = eval(params);
-            } catch (err) {
-                log.error("error parsing argument of gimmick: " + link_text + "giving error: " + err);
-            }
-        }
-        return { trigger: trigger, options: args, href: href };
-    }
-
-    function runGimmicksOnce() {
-        // runs the once: callback for each gimmick within the init stage
-        $.each($.md.gimmicks, function (i, module) {
-            if (module.once === undefined) {
-                return;
-            }
-            module.once();
-        });
-    }
-
-    // activate all gimmicks on a page, that are contain the text gimmick:
-    // TODO make private / merge closures
-    $.md.registerLinkGimmicks = function () {
-        var $gimmick_links = $("a:icontains(gimmick:)");
-        $gimmick_links.each(function (i, e) {
-            var $link = $(e);
-            var gimmick_arguments = getGimmickLinkParts($link);
-
-            $.each(linkTriggers, function (i, linktrigger) {
-                if (gimmick_arguments.trigger === linktrigger.trigger) {
-                    subscribeLinkTrigger($link, gimmick_arguments, linktrigger);
-                }
-            });
-        });
-    };
-
-    function subscribeLinkTrigger($link, args, linktrigger) {
-        log.debug("Subscribing gimmick " + linktrigger.module.name + " to stage: " + linktrigger.stage);
-
-        $.md.stage(linktrigger.stage).subscribe(function (done) {
-            args.options = args.options || {};
-
-            // it is possible that broken modules or any other transformation removed the $link
-            // from the dom in the meantime
-            if (!jQuery.contains(document.documentElement, $link[0])) {
-                log.error("LINK IS NOT IN THE DOM ANYMORE: ");
-                console.log($link);
-            }
-
-            log.debug("Running gimmick " + linktrigger.module.name);
-            linktrigger.callback($link, args.options, args.href, done);
-
-            // if the gimmick didn't call done, we trigger it here
-            done();
-        });
-    }
-})(jQuery);
-
-(function ($) {
-    var publicMethods = {
-        createBasicSkeleton: function () {
-            setPageTitle();
-            wrapParagraphText();
-            linkImagesToSelf();
-            groupImages();
-            removeBreaks();
-            addInpageAnchors();
-
-            $.md.stage("all_ready").subscribe(function (done) {
-                if ($.md.inPageAnchor !== "") {
-                    $.md.util.wait(500).then(function () {
-                        $.md.scrollToInPageAnchor($.md.inPageAnchor);
-                    });
-                }
-                done();
-            });
-            return;
-        },
-    };
-    $.md.publicMethods = $.extend({}, $.md.publicMethods, publicMethods);
-
-    // set the page title to the browser document title, optionally picking
-    // the first h1 element as title if no title is given
-    function setPageTitle() {
-        var $pageTitle;
-        if ($.md.config.title) $("title").text($.md.config.title);
-
-        $pageTitle = $("#md-content h1").eq(0);
-        if ($.trim($pageTitle.toptext()).length > 0) {
-            $("#md-title").prepend($pageTitle);
-            var title = $pageTitle.toptext();
-            // document.title = title;
-        } else {
-            $("#md-title").remove();
-        }
-    }
-    function wrapParagraphText() {
-        // TODO is this true for marked.js?
-
-        // markdown gives us sometime paragraph that contain child tags (like img),
-        // but the containing text is not wrapped. Make sure to wrap the text in the
-        // paragraph into a <div>
-
-        // this also moves ANY child tags to the front of the paragraph!
-        $("#md-content p").each(function () {
-            var $p = $(this);
-            // nothing to do for paragraphs without text
-            if ($.trim($p.text()).length === 0) {
-                // make sure no whitespace are in the p and then exit
-                //$p.text ('');
-                return;
-            }
-            // children elements of the p
-            var children = $p.contents().filter(function () {
-                var $child = $(this);
-                // we extract images and hyperlinks with images out of the paragraph
-                if (this.tagName === "A" && $child.find("img").length > 0) {
-                    return true;
-                }
-                if (this.tagName === "IMG") {
-                    return true;
-                }
-                // else
-                return false;
-            });
-            var floatClass = getFloatClass($p);
-            $p.wrapInner('<div class="md-text" />');
-
-            // if there are no children, we are done
-            if (children.length === 0) {
-                return;
-            }
-            // move the children out of the wrapped div into the original p
-            children.prependTo($p);
-
-            // at this point, we now have a paragraph that holds text AND images
-            // we mark that paragraph to be a floating environment
-            // TODO determine floatenv left/right
-            $p.addClass("md-floatenv").addClass(floatClass);
-        });
-    }
-    function removeBreaks() {
-        // since we use non-markdown-standard line wrapping, we get lots of
-        // <br> elements we don't want.
-
-        // remove a leading <br> from floatclasses, that happen to
-        // get insertet after an image
-        $(".md-floatenv")
-            .find(".md-text")
-            .each(function () {
-                var $first = $(this).find("*").eq(0);
-                if ($first.is("br")) {
-                    $first.remove();
-                }
-            });
-
-        // remove any breaks from image groups
-        $(".md-image-group").find("br").remove();
-    }
-    function getFloatClass(par) {
-        var $p = $(par);
-        var floatClass = "";
-
-        // reduce content of the paragraph to images
-        var nonTextContents = $p.contents().filter(function () {
-            if (this.tagName === "IMG" || this.tagName === "IFRAME") {
-                return true;
-            } else if (this.tagName === "A") {
-                return $(this).find("img").length > 0;
-            } else {
-                return $.trim($(this).text()).length > 0;
-            }
-        });
-        // check the first element - if its an image or a link with image, we go left
-        var elem = nonTextContents[0];
-        if (elem !== undefined && elem !== null) {
-            if (elem.tagName === "IMG" || elem.tagName === "IFRAME") {
-                floatClass = "md-float-left";
-            } else if (elem.tagName === "A" && $(elem).find("img").length > 0) {
-                floatClass = "md-float-left";
-            } else {
-                floatClass = "md-float-right";
-            }
-        }
-        return floatClass;
-    }
-    // images are put in the same image group as long as there is
-    // not separating paragraph between them
-    function groupImages() {
-        var par = $("p img").parents("p");
-        // add an .md-image-group class to the p
-        par.addClass("md-image-group");
-    }
-
-    // takes a standard <img> tag and adds a hyperlink to the image source
-    // needed since we scale down images via css and want them to be accessible
-    // in original format
-    function linkImagesToSelf() {
-        function selectNonLinkedImages() {
-            // only select images that do not have a non-empty parent link
-            $images = $("img").filter(function (index) {
-                var $parent_link = $(this).parents("a").eq(0);
-                if ($parent_link.length === 0) return true;
-                var attr = $parent_link.attr("href");
-                return attr && attr.length === 0;
-            });
-            return $images;
-        }
-        var $images = selectNonLinkedImages();
-        return $images.each(function () {
-            var $this = $(this);
-            var img_src = $this.attr("src");
-            var img_title = $this.attr("title");
-            if (img_title === undefined) {
-                img_title = "";
-            }
-            // wrap the <img> tag in an anchor and copy the title of the image
-            $this.wrap('<a class="md-image-selfref" href="' + img_src + '" title="' + img_title + '"/> ');
-        });
-    }
-
-    function addInpageAnchors() {
-        // adds a pilcrow (paragraph) character to heading with a link for the
-        // inpage anchor
-        function addPilcrow($heading, href) {
-            var c = $.md.config.anchorCharacter;
-            var $pilcrow = $('<span class="anchor-highlight"><a>' + c + "</a></span>");
-            $pilcrow.find("a").attr("href", href);
-            $pilcrow.hide();
-
-            var mouse_entered = false;
-            $heading.mouseenter(function () {
-                mouse_entered = true;
-                $.md.util.wait(300).then(function () {
-                    if (!mouse_entered) return;
-                    $pilcrow.fadeIn(200);
-                });
-            });
-            $heading.mouseleave(function () {
-                mouse_entered = false;
-                $pilcrow.fadeOut(200);
-            });
-            $pilcrow.appendTo($heading);
-        }
-
-        // adds a link to the navigation at the top of the page
-        function addJumpLinkToTOC($heading) {
-            if ($.md.config.useSideMenu === false) return;
-            if ($heading.prop("tagName") !== "H2") return;
-
-            var c = $.md.config.tocAnchor;
-            if (c === "") return;
-
-            var $jumpLink = $('<a class="visible-xs visible-sm jumplink" href="#md-page-menu">' + c + "</a>");
-            $jumpLink.click(function (ev) {
-                ev.preventDefault();
-
-                $("body").scrollTop($("#md-page-menu").position().top);
-            });
-
-            if ($heading.parents("#md-menu").length === 0) {
-                $jumpLink.insertAfter($heading);
-            }
-        }
-
-        // adds a page inline anchor to each h1,h2,h3,h4,h5,h6 element
-        // which can be accessed by the headings text
-        $("h1,h2,h3,h4,h5,h6")
-            .not("#md-title h1")
-            .each(function () {
-                var $heading = $(this);
-                $heading.addClass("md-inpage-anchor");
-                var text = $heading.clone().children(".anchor-highlight").remove().end().text();
-                var href = $.md.util.getInpageAnchorHref(text);
-                addPilcrow($heading, href);
-
-                //add jumplink to table of contents
-                addJumpLinkToTOC($heading);
-            });
-    }
-
-    $.md.scrollToInPageAnchor = function (anchortext) {
-        if (anchortext.startsWith("#")) anchortext = anchortext.substring(1, anchortext.length);
-        // we match case insensitive
-        var doBreak = false;
-        $(".md-inpage-anchor").each(function () {
-            if (doBreak) {
-                return;
-            }
-            var $this = $(this);
-            // don't use the text of any subnode
-            var text = $this.toptext();
-            var match = $.md.util.getInpageAnchorText(text);
-            if (anchortext === match) {
-                this.scrollIntoView(true);
-                var navbar_offset = $(".navbar-collapse").height() + 5;
-                window.scrollBy(0, -navbar_offset + 5);
-                doBreak = true;
-            }
-        });
-    };
-})(jQuery);
-
-(function ($) {
-    "use strict";
-    // call the gimmick
-    $.mdbootstrap = function (method) {
-        if ($.mdbootstrap.publicMethods[method]) {
-            return $.mdbootstrap.publicMethods[method].apply(this, Array.prototype.slice.call(arguments, 1));
-        } else {
-            $.error("Method " + method + " does not exist on jquery.mdbootstrap");
-        }
-    };
-    // simple wrapper around $().bind
-    $.mdbootstrap.events = [];
-    $.mdbootstrap.bind = function (ev, func) {
-        $(document).bind(ev, func);
-        $.mdbootstrap.events.push(ev);
-    };
-    $.mdbootstrap.trigger = function (ev) {
-        $(document).trigger(ev);
-    };
-
-    var navStyle = "";
-
-    // PUBLIC API functions that are exposed
-    var publicMethods = {
-        bootstrapify: function () {
-            createPageSkeleton();
-            buildMenu();
-            changeHeading();
-            replaceImageParagraphs();
-
-            $("table").addClass("table").addClass("table-bordered");
-            //pullRightBumper ();
-
-            // remove the margin for headings h1 and h2 that are the first
-            // on page
-            //if (navStyle == "sub" || (navStyle == "top" && $('#md-title').text ().trim ().length === 0))
-            //    $(".md-first-heading").css ("margin-top", "0");
-
-            // external content should run after gimmicks were run
-            $.md.stage("pregimmick").subscribe(function (done) {
-                if ($.md.config.useSideMenu !== false) {
-                    createPageContentMenu();
-                }
-                addAdditionalFooterText();
-                done();
-            });
-            $.md.stage("postgimmick").subscribe(function (done) {
-                adjustExternalContent();
-                highlightActiveLink();
-
-                done();
-            });
-        },
-    };
-    // register the public API functions
-    $.mdbootstrap.publicMethods = $.extend({}, $.mdbootstrap.publicMethods, publicMethods);
-
-    // PRIVATE FUNCTIONS:
-
-    function buildTopNav() {
-        // replace with the navbar skeleton
-        if ($("#md-menu").length <= 0) {
-            return;
-        }
-        navStyle = "top";
-        var $menuContent = $("#md-menu").children();
-
-        // $('#md-menu').addClass ('navbar navbar-default navbar-fixed-top');
-        // var menusrc = '';
-        // menusrc += '<div id="md-menu-inner" class="container">';
-        // menusrc += '<ul id="md-menu-ul" class="nav navbar-nav">';
-        // menusrc += '</ul></div>';
-
-        var navbar = "";
-        navbar += '<div id="md-main-navbar" class="navbar navbar-default navbar-fixed-top" role="navigation">';
-        navbar += '<div class="navbar-header">';
-        navbar +=
-            '<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">';
-        navbar += '<span class="sr-only">Toggle navigation</span>';
-        navbar += '<span class="icon-bar"></span>';
-        navbar += '<span class="icon-bar"></span>';
-        navbar += '<span class="icon-bar"></span>';
-        navbar += "</button>";
-        navbar += '<a class="navbar-brand" href="#"></a>';
-        navbar += "</div>";
-
-        navbar += '<div class="collapse navbar-collapse navbar-ex1-collapse">';
-        navbar += '<ul class="nav navbar-nav" />';
-        navbar += '<ul class="nav navbar-nav navbar-right" />';
-        navbar += "</div>";
-        navbar += "</div>";
-        var $navbar = $(navbar);
-
-        $navbar.appendTo("#md-menu");
-        // .eq(0) becase we dont want navbar-right to be appended to
-        $("#md-menu ul.nav").eq(0).append($menuContent);
-
-        // the menu should be the first element in the body
-        $("#md-menu").prependTo("#md-all");
-
-        var brand_text = $("#md-menu h1").toptext();
-        $("#md-menu h1").remove();
-        $("a.navbar-brand").text(brand_text);
-
-        // initial offset
-        $("#md-body").css("margin-top", "70px");
-        $.md.stage("pregimmick").subscribe(function (done) {
-            check_offset_to_navbar();
-            done();
-        });
-    }
-    // the navbar has different height depending on theme, number of navbar entries,
-    // and window/device width. Therefore recalculate on start and upon window resize
-    function set_offset_to_navbar() {
-        var height = $("#md-main-navbar").height() + 10;
-        $("#md-body").css("margin-top", height + "px");
-    }
-    function check_offset_to_navbar() {
-        // HACK this is VERY UGLY. When an external theme is used, we don't know when the
-        // css style will be finished loading - and we can only correctly calculate
-        // the height AFTER it has completely loaded.
-        var navbar_height = 0;
-
-        var dfd1 = $.md.util.repeatUntil(
-            40,
-            function () {
-                navbar_height = $("#md-main-navbar").height();
-                return navbar_height > 35 && navbar_height < 481;
-            },
-            25
-        );
-
-        dfd1.done(function () {
-            navbar_height = $("#md-main-navbar").height();
-            set_offset_to_navbar();
-            // now bootstrap changes this maybe after a while, again watch for changes
-            var dfd2 = $.md.util.repeatUntil(
-                20,
-                function () {
-                    return navbar_height !== $("#md-main-navbar").height();
-                },
-                25
-            );
-            dfd2.done(function () {
-                // it changed, so we need to change it again
-                set_offset_to_navbar();
-            });
-            // and finally, for real slow computers, make sure it is changed if changin very late
-            $.md.util.wait(2000).done(function () {
-                set_offset_to_navbar();
-            });
-        });
-    }
-    function buildSubNav() {
-        // replace with the navbar skeleton
-        /* BROKEN CODE
-        if ($('#md-menu').length <= 0) {
-            return;
-        }
-        navStyle = 'sub';
-        var $menuContent = $('#md-menu').html ();
-
-        var menusrc = '';
-        menusrc += '<div id="md-menu-inner" class="subnav">';
-        menusrc += '<ul id="md-menu-ul" class="nav nav-pills">';
-        menusrc += $menuContent;
-        menusrc += '</ul></div>';
-        $('#md-menu').empty();
-        $('#md-menu').wrapInner($(menusrc));
-        $('#md-menu').addClass ('col-md-12');
-
-        $('#md-menu-container').insertAfter ($('#md-title-container'));
-        */
-    }
-
-    function buildMenu() {
-        if ($("#md-menu a").length === 0) {
-            return;
-        }
-        var h = $("#md-menu");
-
-        // make toplevel <a> a dropdown
-        h.find('> a[href=""]')
-            .attr("data-toggle", "dropdown")
-            .addClass("dropdown-toggle")
-            .attr("href", "")
-            .append('<b class="caret"/>');
-        h.find("ul").addClass("dropdown-menu");
-        h.find("ul li").addClass("dropdown");
-
-        // replace hr with dividers
-        $("#md-menu hr").each(function (i, e) {
-            var hr = $(e);
-            var prev = hr.prev();
-            var next = hr.next();
-            if (prev.is("ul") && prev.length >= 0) {
-                prev.append($('<li class="divider"/>'));
-                hr.remove();
-                if (next.is("ul")) {
-                    next.find("li").appendTo(prev);
-                    next.remove();
-                }
-                // next ul should now be empty
-            }
-            return;
-        });
-
-        // remove empty uls
-        $("#md-menu ul").each(function (i, e) {
-            var ul = $(e);
-            if (ul.find("li").length === 0) {
-                ul.remove();
-            }
-        });
-
-        $("#md-menu hr").replaceWith($('<li class="divider-vertical"/>'));
-
-        // wrap the toplevel links in <li>
-        $("#md-menu > a").wrap("<li />");
-        $("#md-menu ul").each(function (i, e) {
-            var ul = $(e);
-            ul.appendTo(ul.prev());
-            ul.parent("li").addClass("dropdown");
-        });
-
-        // submenu headers
-        $("#md-menu li.dropdown")
-            .find("h1, h2, h3")
-            .each(function (i, e) {
-                var $e = $(e);
-                var text = $e.toptext();
-                var header = $('<li class="dropdown-header" />');
-                header.text(text);
-                $e.replaceWith(header);
-            });
-
-        // call the user specifed menu function
-        buildTopNav();
-    }
-    function isVisibleInViewport(e) {
-        var el = $(e);
-        var top = $(window).scrollTop();
-        var bottom = top + $(window).height();
-
-        var eltop = el.offset().top;
-        var elbottom = eltop + el.height();
-
-        return elbottom <= bottom && eltop >= top;
-    }
-
-    function createPageContentMenu() {
-        // assemble the menu
-        var $headings = $("#md-content").find("h2").clone();
-        // we dont want the text of any child nodes
-        $headings.children().remove();
-
-        if ($headings.length <= 1) {
-            return;
-        }
-
-        $("#md-content").removeClass("col-md-12");
-        $("#md-content").addClass("col-md-9");
-        $("#md-content-row").prepend('<div class="col-md-3" id="md-left-column"/>');
-
-        var recalc_width = function () {
-            // if the page menu is affixed, it is not a child of the
-            // <md-left-column> anymore and therefore does not inherit
-            // its width. On every resize, change the class accordingly
-            var width_left_column = $("#md-left-column").css("width");
-            $("#md-page-menu").css("width", width_left_column);
-        };
-
-        $(window).scroll(function () {
-            recalc_width($("#md-page-menu"));
-            var $first;
-            $("*.md-inpage-anchor").each(function (i, e) {
-                if ($first === undefined) {
-                    var h = $(e);
-                    if (isVisibleInViewport(h)) {
-                        $first = h;
-                    }
-                }
-            });
-            // highlight in the right menu
-            $("#md-page-menu a").each(function (i, e) {
-                var $a = $(e);
-                if ($first && $a.toptext() === $first.toptext()) {
-                    $("#md-page-menu a.active").removeClass("active");
-                    //$a.parent('a').addClass('active');
-                    $a.addClass("active");
-                }
-            });
-        });
-
-        var affixDiv = $('<div id="md-page-menu" />');
-
-        //var top_spacing = $('#md-menu').height() + 15;
-        var top_spacing = 70;
-        affixDiv.affix({
-            //offset: affix.position() - 50,
-            offset: 130,
-        });
-        affixDiv.css("top", top_spacing);
-        //affix.css('top','-250px');
-
-        var $pannel = $('<div class="panel panel-default"><ul class="list-group"/></div>');
-        var $ul = $pannel.find("ul");
-        affixDiv.append($pannel);
-
-        $headings.each(function (i, e) {
-            var $heading = $(e);
-            var $li = $('<li class="list-group-item" />');
-            var $a = $("<a />");
-            $a.attr("href", $.md.util.getInpageAnchorHref($heading.toptext()));
-            $a.click(function (ev) {
-                ev.preventDefault();
-
-                var $this = $(this);
-                var anchortext = $.md.util.getInpageAnchorText($this.toptext());
-                $.md.scrollToInPageAnchor(anchortext);
-            });
-            $a.text($heading.toptext());
-            $li.append($a);
-            $ul.append($li);
-        });
-
-        $(window).resize(function () {
-            recalc_width($("#md-page-menu"));
-            check_offset_to_navbar();
-        });
-        $.md.stage("postgimmick").subscribe(function (done) {
-            // recalc_width();
-            done();
-        });
-
-        //menu.css('width','100%');
-        $("#md-left-column").append(affixDiv);
-    }
-
-    function createPageSkeleton() {
-        $("#md-title").wrap('<div class="container" id="md-title-container"/>');
-        $("#md-title").wrap('<div class="row" id="md-title-row"/>');
-
-        $("#md-menu").wrap('<div class="container" id="md-menu-container"/>');
-        $("#md-menu").wrap('<div class="row" id="md-menu-row"/>');
-
-        $("#md-content").wrap('<div class="container" id="md-content-container"/>');
-        $("#md-content").wrap('<div class="row" id="md-content-row"/>');
-
-        $("#md-body").wrap('<div class="container" id="md-body-container"/>');
-        $("#md-body").wrap('<div class="row" id="md-body-row"/>');
-
-        $("#md-title").addClass("col-md-12");
-        $("#md-content").addClass("col-md-12");
-    }
-    function pullRightBumper() {
-        /*     $("span.bumper").each (function () {
-			$this = $(this);
-			$this.prev().addClass ("pull-right");
-		});
-		$('span.bumper').addClass ('pull-right');
-*/
-    }
-
-    function changeHeading() {
-        // HEADING
-        var jumbo = $('<div class="page-header" />');
-        $("#md-title").wrapInner(jumbo);
-    }
-
-    function highlightActiveLink() {
-        // when no menu is used, return
-        if ($("#md-menu").find("li").length === 0) {
-            return;
-        }
-        var filename = window.location.hash;
-
-        if (filename.length === 0) {
-            filename = "#!index.md";
-        }
-        var selector = 'li:has(a[href="' + filename + '"])';
-        $("#md-menu").find(selector).addClass("active");
-    }
-
-    // replace all <p> around images with a <div class="thumbnail" >
-    function replaceImageParagraphs() {
-        // only select those paragraphs that have images in them
-        var $pars = $("p img").parents("p");
-        $pars.each(function () {
-            var $p = $(this);
-            var $images = $(this)
-                .find("img")
-                .filter(function () {
-                    // only select those images that have no parent anchor
-                    return $(this).parents("a").length === 0;
-                })
-                // add those anchors including images
-                .add($(this).find("img"))
-                .addClass("img-responsive")
-                .addClass("img-thumbnail");
-
-            // create a new url group at the fron of the paragraph
-            //$p.prepend($('<ul class="thumbnails" />'));
-            // move the images to the newly created ul
-            //$p.find('ul').eq(0).append($images);
-
-            // wrap each image with a <li> that limits their space
-            // the number of images in a paragraphs determines thei width / span
-
-            // if the image is a link, wrap around the link to avoid
-            function wrapImage($imgages, wrapElement) {
-                return $images.each(function (i, img) {
-                    var $img = $(img);
-                    var $parent_img = $img.parent("a");
-                    if ($parent_img.length > 0) $parent_img.wrap(wrapElement);
-                    else $img.wrap(wrapElement);
-                });
-            }
-
-            if ($p.hasClass("md-floatenv")) {
-                if ($images.length === 1) {
-                    wrapImage($images, '<div class="col-sm-8" />');
-                } else if ($images.length === 2) {
-                    wrapImage($images, '<div class="col-sm-4" />');
-                } else {
-                    wrapImage($images, '<div class="col-sm-2" />');
-                }
-            } else {
-                // non-float => images are on their own single paragraph, make em larger
-                // but remember, our image resizing will make them only as large as they are
-                // but do no upscaling
-                // TODO replace by calculation
-
-                if ($images.length === 1) {
-                    wrapImage($images, '<div class="col-sm-12" />');
-                } else if ($images.length === 2) {
-                    wrapImage($images, '<div class="col-sm-6" />');
-                } else if ($images.length === 3) {
-                    wrapImage($images, '<div class="col-sm-4" />');
-                } else if ($images.length === 4) {
-                    wrapImage($images, '<div class="col-sm-3" />');
-                } else {
-                    wrapImage($images, '<div class="col-sm-2" />');
-                }
-            }
-            $p.addClass("row");
-            // finally, every img gets its own wrapping thumbnail div
-            //$images.wrap('<div class="thumbnail" />');
-        });
-
-        // apply float to the ul thumbnails
-        //$('.md-floatenv.md-float-left ul').addClass ('pull-left');
-        //$('.md-floatenv.md-float-right ul').addClass ('pull-right');
-    }
-
-    function adjustExternalContent() {
-        // external content are usually iframes or divs that are integrated
-        // by gimmicks
-        // example: youtube iframes, google maps div canvas
-        // all external content are in the md-external class
-
-        $("iframe.md-external").not(".md-external-nowidth").attr("width", "450").css("width", "450px");
-
-        $("iframe.md-external").not(".md-external-noheight").attr("height", "280").css("height", "280px");
-
-        // make it appear like an image thumbnal
-        //$('.md-external').addClass('img-thumbnail');
-
-        //.wrap($("<ul class='thumbnails' />")).wrap($("<li class='col-md-6' />"));
-        $("div.md-external").not(".md-external-noheight").css("height", "280px");
-        $("div.md-external").not(".md-external-nowidth").css("width", "450px");
-
-        // // make it appear like an image thumbnal
-        // $("div.md-external").addClass("thumbnail").wrap($("<ul class='thumbnails' />")).wrap($("<li class='col-md-10' />"));
-
-        // $("div.md-external-large").css('width', "700px")
-    }
-
-    // note: the footer is part of the GPLv3 legal information
-    // and may not be removed or hidden to comply with licensing conditions.
-    function addFooter() {
-        var navbar = "";
-        navbar += '<hr><div class="scontainer">';
-        navbar += '<div class="pull-right md-copyright-footer"> ';
-        navbar += '<span id="md-footer-additional"></span>';
-        navbar += 'Website generated with <a href="http://www.mdwiki.info">MDwiki</a> ';
-        navbar += "&copy; Timo D&ouml;rr and contributors. ";
-        navbar += "</div>";
-        navbar += "</div>";
-        var $navbar = $(navbar);
-        $navbar.css("position", "relative");
-        $navbar.css("margin-top", "1em");
-        $("#md-all").append($navbar);
-    }
-
-    function addAdditionalFooterText() {
-        var text = $.md.config.additionalFooterText;
-        if (text) {
-            $(".md-copyright-footer #md-footer-additional").html(text);
-        }
-    }
-})(jQuery);
-
-(function ($) {
-    $.gimmicks = $.fn.gimmicks = function (method) {
-        if (method === undefined) {
-            return;
-        }
-        // call the gimmick
-        if ($.fn.gimmicks.methods[method]) {
-            return $.fn.gimmicks.methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
-        } else {
-            $.error("Gimmick " + method + " does not exist on jQuery.gimmicks");
-        }
-    };
-
-    // TODO underscores _ in Markdown links are not allowed! bug in our MD imlemenation
-})(jQuery);
-
-(function ($) {
-    //'use strict';
-    var alertsGimmick = {
-        name: "alerts",
-        // TODO
-        //version: $.md.version,
-        load: function () {
-            $.md.stage("bootstrap").subscribe(function (done) {
-                createAlerts();
-                done();
-            });
-        },
-    };
-    $.md.registerGimmick(alertsGimmick);
-
-    // takes a standard <img> tag and adds a hyperlink to the image source
-    // needed since we scale down images via css and want them to be accessible
-    // in original format
-    function createAlerts() {
-        var matches = $(select_paragraphs());
-        matches.each(function () {
-            var $p = $(this.p);
-            var type = this.alertType;
-            $p.addClass("alert");
-
-            if (type === "note") {
-                $p.addClass("alert-info");
-            } else if (type === "hint") {
-                $p.addClass("alert-success");
-            } else if (type === "warning") {
-                $p.addClass("alert-warning");
-            }
-        });
-    }
-
-    // picks out the paragraphs that start with a trigger word
-    function select_paragraphs() {
-        var note = ["note", "beachte"];
-        var warning = ["achtung", "attention", "warnung", "warning", "atención", "guarda", "advertimiento"];
-        var hint = ["hint", "tipp", "tip", "hinweis"];
-        var exp = note.concat(warning);
-        exp = exp.concat(hint);
-        var matches = [];
-
-        $("p").filter(function () {
-            var $par = $(this);
-            // check against each expression
-            $(exp).each(function (i, trigger) {
-                var txt = $par.text().toLowerCase();
-                // we match only paragrachps in which the 'trigger' expression
-                // is follow by a ! or :
-                var re = new RegExp(trigger + "(:|!)+.*", "i");
-                var alertType = "none";
-                if (txt.match(re) !== null) {
-                    if ($.inArray(trigger, note) >= 0) {
-                        alertType = "note";
-                    } else if ($.inArray(trigger, warning) >= 0) {
-                        alertType = "warning";
-                    } else if ($.inArray(trigger, hint) >= 0) {
-                        alertType = "hint";
-                    }
-                    matches.push({
-                        p: $par,
-                        alertType: alertType,
-                    });
-                }
-            });
-        });
-        return matches;
-    }
-})(jQuery);
-
-(function ($) {
-    // makes trouble, find out why
-    //'use strict';
-    var colorboxGimmick = {
-        name: "colorbox",
-        load: function () {
-            $.md.stage("gimmick").subscribe(function (done) {
-                $.gimmicks("colorbox");
-                done();
-            });
-        },
-    };
-    $.md.registerGimmick(colorboxGimmick);
-
-    var methods = {
-        // takes a standard <img> tag and adds a hyperlink to the image source
-        // needed since we scale down images via css and want them to be accessible
-        // in original format
-        colorbox: function () {
-            var $image_groups;
-            if (!(this instanceof jQuery)) {
-                // select the image groups of the page
-                $image_groups = $(".md-image-group");
-            } else {
-                $image_groups = $(this);
-            }
-            // operate on md-image-group, which holds one
-            // or more images that are to be colorbox'ed
-            var counter = 0;
-            return $image_groups.each(function () {
-                var $this = $(this);
-
-                // each group requires a unique name
-                var gal_group = "gallery-group-" + counter++;
-
-                // create a hyperlink around the image
-                $this
-                    .find("a.md-image-selfref img")
-                    // filter out images that already are a hyperlink
-                    // (so won't be part of the gallery)
-
-                    // apply colorbox on their parent anchors
-                    .parents("a")
-                    .colorbox({
-                        rel: gal_group,
-                        opacity: 0.75,
-                        slideshow: true,
-                        maxWidth: "95%",
-                        maxHeight: "95%",
-                        scalePhotos: true,
-                        photo: true,
-                        slideshowAuto: false,
-                    });
-            });
-        },
-    };
-    $.gimmicks.methods = $.extend({}, $.fn.gimmicks.methods, methods);
-})(jQuery);
-
-(function ($) {
-    "use strict";
-
-    var themeChooserGimmick = {
-        name: "Themes",
-        version: $.md.version,
-        once: function () {
-            $.md.linkGimmick(this, "carousel", carousel);
-        },
-    };
-    $.md.registerGimmick(themeChooserGimmick);
-
-    function carousel($link, opt, href) {
-        var $c = $('<div id="myCarousel" class="carousel slide"></div>');
-        var $d = $('<div class="carousel-inner"/>');
-        $c.append('<ol class="carousel-indicators" />');
-
-        var imageUrls = [];
-        var i = 0;
-        $.each(href.split(","), function (i, e) {
-            imageUrls.push($.trim(e));
-            $c.find("ol").append('<li data-target="#myCarousel" data-slide-to="' + i + '" class="active" /');
-            var div;
-            if (i === 0) {
-                div = '<div class="active item"/>';
-            } else {
-                div = '<div class="item"/>';
-            }
-            $d.append($(div).append('<img src="' + e + '"/>'));
-        });
-        $c.append($d);
-        $c.append('<a class="carousel-control left" href="#myCarousel" data-slide="prev">&lsaquo;</a>');
-        $c.append('<a class="carousel-control right" href="#myCarousel" data-slide="next">&rsaquo;</a>');
-        $link.replaceWith($c);
-    }
-})(jQuery);
-
-(function ($) {
-    "use strict";
-    var gistGimmick = {
-        name: "gist",
-        once: function () {
-            $.md.linkGimmick(this, "gist", gist);
-        },
-    };
-    $.md.registerGimmick(gistGimmick);
-
-    function gist($links, opt, href) {
-        $().lazygist("init");
-        return $links.each(function (i, link) {
-            var default_options = {
-                scheme: "https",
-                path: "gist.github.com/",
-            };
-            var options = $.extend(default_options, opt);
-            var $link = $(link);
-            var gistDiv = $('<div class="gist_here" data-id="' + href + '" />');
-            $link.replaceWith(gistDiv);
-            gistDiv.lazygist({
-                // we dont want a specific file so modify the url template
-                url_template: "{scheme}://{path}{id}.js"
-                    .replace(/\{scheme\}/g, options.scheme)
-                    .replace(/\{path\}/g, options.path),
-            });
-        });
-    }
-})(jQuery);
-
-/**
- * Lazygist v0.2pre
- *
- * a jQuery plugin that will lazy load your gists.
- *
- * since jQuery 1.7.2
- * https://github.com/tammo/jquery-lazy-gist
- *
- * Copyright, Tammo Pape
- * http://tammopape.de
- *
- * Licensed under the MIT license.
- */
-
-(function ($, window, document, undefined) {
-    "use strict";
-
-    //
-    // note:
-    // this plugin is not stateful
-    // and will not communicate with own instances at different elements
-    //
-
-    var pluginName = "lazygist",
-        version = "0.2pre",
-        defaults = {
-            // adding the ?file parameter to choose a file
-            url_template: "https://gist.github.com/{id}.js?file={file}",
-
-            // if these are strings, the attributes will be read from the element
-            id: "data-id",
-            file: "data-file",
-        },
-        options,
-        // will be replaced
-        /*jshint -W060 */
-        originwrite = document.write,
-        // stylesheet urls found in document.write calls
-        // they are cached to write them once to the document,
-        // not three times for three gists
-        stylesheets = [],
-        // cache gist-ids to know which are already appended to the dom
-        ids_dom = [],
-        // remember gist-ids if their javascript is already loaded
-        ids_ajax = [],
-        methods = {
-            /**
-             * Standard init function
-             * No magic here
-             */
-            init: function (options_input) {
-                // default options are default
-                options = $.extend({}, defaults, options_input);
-
-                // can be reset
-                /*jshint -W061 */
-                document.write = _write;
-
-                $.each(options, function (index, value) {
-                    if (typeof value !== "string") {
-                        throw new TypeError(value + " (" + typeof value + ") is not a string");
-                    }
-                });
-
-                return this.lazygist("load");
-            },
-
-            /**
-             * Load the gists
-             */
-            load: function () {
-                // (1) iterate over gist anchors
-                // (2) append the gist-html through the new document.write func (see _write)
-
-                // (1)
-                return this.filter("[" + options.id + "]").each(function () {
-                    var id = $(this).attr(options.id),
-                        file = $(this).attr(options.file),
-                        src;
-
-                    if (id !== undefined) {
-                        if ($.inArray(id, ids_ajax) !== -1) {
-                            // just do nothin, if gist is already ajaxed
-                            return;
-                        }
-
-                        ids_ajax.push(id);
-
-                        src = options.url_template.replace(/\{id\}/g, id).replace(/\{file\}/g, file);
-
-                        // (2) this will trigger our _write function
-                        $.getScript(src, function () {});
-                    }
-                });
-            },
-
-            /**
-             * Just reset the write function
-             */
-            reset_write: function () {
-                document.write = originwrite;
-
-                return this;
-            },
-        };
-
-    /**
-     * private special document.write function
-     *
-     * Filters the css file from github.com to add it to the head - once -
-     *
-     * It has a fallback to keep flexibility with other scripts as high as possible
-     * (create a ticket if it messes things up!)
-     *
-     * Keep in mind, that a call to this function happens after
-     * an ajax call by jQuery. One *cannot* know which gist-anchor
-     * to use. You can only read the id from the content.
-     */
-    function _write(content) {
-        var expression, // for regexp results
-            href, // from the url
-            id; // from the content
-
-        if (content.indexOf('rel="stylesheet"') !== -1) {
-            href = $(content).attr("href");
-
-            // check if stylesheet is already inserted
-            if ($.inArray(href, stylesheets) === -1) {
-                $("head").append(content);
-                stylesheets.push(href);
-            }
-        } else if (content.indexOf('id="gist') !== -1) {
-            // This is the newer gist URL style, ignoring the hostname for GitHub EE instances
-            expression = /https?:\/\/gist.*?\/.*\/(.*)#/.exec(content);
-            if (expression !== null) {
-                id = expression[1];
-            } else {
-                // This will catch older versions of GitHub EE
-                expression = /gist\/.+?\/([a-f0-9]+)\/raw/g.exec(content);
-                if (expression !== null) {
-                    id = expression[1];
-                }
-            }
-            if (id !== undefined) {
-                // test if id is already loaded
-                if ($.inArray(id, ids_dom) !== -1) {
-                    // just do nothin, if gist is already attached to the dom
-                    return;
-                }
-
-                ids_dom.push(id);
-
-                $(".gist_here[data-id=" + id + "]").append(content);
-            }
-        } else {
-            // this is a fallback for interoperability
-            originwrite.apply(document, arguments);
-        }
-    }
-
-    // method invocation - from jQuery.com
-    $.fn[pluginName] = function (method) {
-        if (methods[method]) {
-            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
-        } else if (typeof method === "object" || !method) {
-            return methods.init.apply(this, arguments);
-        } else {
-            $.error("Method " + method + " does not exist on jQuery.lazygist");
-        }
-    };
-
-    // expose version for your interest
-    $.fn[pluginName].version = version;
-})(jQuery, window, document);
-
-(function ($) {
-    "use strict";
-    var iframeGimmick = {
-        name: "iframe",
-        version: $.md.version,
-        once: function () {
-            $.md.linkGimmick(this, "iframe", create_iframe);
-        },
-    };
-    $.md.registerGimmick(iframeGimmick);
-
-    function create_iframe($links, opt, text) {
-        return $links.each(function (i, link) {
-            var $link = $(link);
-            var href = $link.attr("href");
-            var $iframe = $('<iframe class="col-md-12" style="border: 0px solid red; height: 650px;"></iframe>');
-            $iframe.attr("src", href);
-            $link.replaceWith($iframe);
-
-            if (opt.width) $iframe.css("width", opt.width);
-            if (opt.height) $iframe.css("height", opt.height);
-            else {
-                var updateSizeFn = function () {
-                    var offset = $iframe.offset();
-                    var winHeight = $(window).height();
-                    var newHeight = winHeight - offset.top - 5;
-                    $iframe.height(newHeight);
-                };
-
-                $iframe.load(function (done) {
-                    updateSizeFn();
-                });
-
-                $(window).resize(function () {
-                    updateSizeFn();
-                });
-            }
-        });
-    }
-})(jQuery);
-
-(function ($) {
-    var mathGimmick = {
-        name: "math",
-        once: function () {
-            $.md.linkGimmick(this, "math", load_mathjax);
-        },
-    };
-    $.md.registerGimmick(mathGimmick);
-
-    function load_mathjax($links, opt, ref) {
-        $links.remove();
-        var script = document.createElement("script");
-        script.type = "text/javascript";
-        script.src = $.md.prepareLink("cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML", {
-            forceSSL: true,
-        });
-        document.getElementsByTagName("head")[0].appendChild(script);
-    }
-})(jQuery);
-
-(function ($) {
-    var prismGimmick = {
-        name: "prism",
-        load: function () {
-            $.md.stage("gimmick").subscribe(function (done) {
-                prism_highlight();
-                done();
-            });
-        },
-    };
-    var supportedLangs = [
-        "abap",
-        "actionscript",
-        "apacheconf",
-        "apl",
-        "applescript",
-        "asciidoc",
-        "aspnet",
-        "autohotkey",
-        "autoit",
-        "bash",
-        "basic",
-        "batch",
-        "bison",
-        "brainfuck",
-        "c",
-        "clike",
-        "coffeescript",
-        "core",
-        "cpp",
-        "crystal",
-        "csharp",
-        "css",
-        "css",
-        "d",
-        "dart",
-        "diff",
-        "docker",
-        "eiffel",
-        "elixir",
-        "erlang",
-        "fortran",
-        "fsharp",
-        "gherkin",
-        "git",
-        "glsl",
-        "go",
-        "groovy",
-        "haml",
-        "handlebars",
-        "haskell",
-        "haxe",
-        "http",
-        "icon",
-        "inform7",
-        "ini",
-        "j",
-        "jade",
-        "java",
-        "javascript",
-        "json",
-        "jsx",
-        "julia",
-        "keyman",
-        "kotlin",
-        "latex",
-        "less",
-        "lolcode",
-        "lua",
-        "makefile",
-        "markdown",
-        "markup",
-        "matlab",
-        "mel",
-        "mizar",
-        "monkey",
-        "nasm",
-        "nginx",
-        "nim",
-        "nix",
-        "nsis",
-        "objectivec",
-        "ocaml",
-        "oz",
-        "parigp",
-        "parser",
-        "pascal",
-        "perl",
-        "php",
-        "powershell",
-        "processing",
-        "prolog",
-        "puppet",
-        "pure",
-        "python",
-        "q",
-        "qore",
-        "r",
-        "rest",
-        "rip",
-        "roboconf",
-        "ruby",
-        "rust",
-        "sas",
-        "sass",
-        "scala",
-        "scheme",
-        "scss",
-        "smalltalk",
-        "smarty",
-        "sql",
-        "stylus",
-        "svg",
-        "swift",
-        "tcl",
-        "textile",
-        "twig",
-        "typescript",
-        "verilog",
-        "vhdl",
-        "vim",
-        "wiki",
-        "xml",
-        "yaml",
-    ];
-    $.md.registerGimmick(prismGimmick);
-
-    function prism_highlight() {
-        // marked adds lang-ruby, lang-csharp etc to the <code> block like in GFM
-        var $codeblocks = $("pre code[class^=lang-]");
-        $codeblocks.each(function () {
-            var $this = $(this);
-            var classes = $this.attr("class");
-            var lang = classes.substring(5);
-            if (supportedLangs.indexOf(lang) < 0) {
-                return;
-            }
-            $this.removeClass(classes);
-            $this.addClass("language-" + lang);
-        });
-        Prism.highlightAll();
-    }
-})(jQuery);
-
-(function ($) {
-    "use strict";
-
-    var themes = [
-        { name: "bootstrap", url: "netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" },
-        { name: "cyborg", url: "netdna.bootstrapcdn.com/bootswatch/3.0.0/cyborg/bootstrap.min.css" },
-        { name: "slate", url: "netdna.bootstrapcdn.com/bootswatch/3.0.0/slate/bootstrap.min.css" },
-        { name: "darkly", url: "cdn.jsdelivr.net/npm/bootswatch@3.2.0/darkly/bootstrap.min.css" },
-    ];
-    var useChooser = false;
-    var themeChooserGimmick = {
-        name: "Themes",
-        version: $.md.version,
-        once: function () {
-            $.md.linkGimmick(this, "themechooser", themechooser, "skel_ready");
-            $.md.linkGimmick(this, "theme", apply_theme);
-        },
-    };
-    $.md.registerGimmick(themeChooserGimmick);
-
-    var log = $.md.getLogger();
-
-    var set_theme = function (theme) {
-        theme.inverse = theme.inverse || false;
-
-        if (theme.url === undefined) {
-            if (!theme.name) {
-                log.error("Theme name must be given!");
-                return;
-            }
-            var saved_theme = themes.filter(function (t) {
-                return t.name === theme.name;
-            })[0];
-            if (!saved_theme) {
-                log.error("Theme " + name + " not found, removing link");
-                return;
-            }
-            theme = $.extend(theme, saved_theme);
-        }
-
-        $('link[rel=stylesheet][href*="netdna.bootstrapcdn.com"]').remove();
-
-        // slim instance has no bootstrap hardcoded in
-        var has_default_bootstrap_css = $("style[id*=bootstrap]").length > 0;
-
-        if (theme.name !== "bootstrap" || !has_default_bootstrap_css) {
-            // in devel & fat version the style is inlined, remove it
-            $("style[id*=bootstrap]").remove();
-
-            $('<link rel="stylesheet" type="text/css">').attr("href", $.md.prepareLink(theme.url)).appendTo("head");
-        }
-
-        if (theme.inverse === true) {
-            $("#md-main-navbar").removeClass("navbar-default");
-            $("#md-main-navbar").addClass("navbar-inverse");
-        } else {
-            $("#md-main-navbar").addClass("navbar-default");
-            $("#md-main-navbar").removeClass("navbar-inverse");
-        }
-    };
-
-    var apply_theme = function ($links, opt, text) {
-        opt.name = opt.name || text;
-        $links.each(function (i, link) {
-            $.md.stage("postgimmick").subscribe(function (done) {
-                var $link = $(link);
-
-                // only set a theme if no theme from the chooser is selected,
-                // or if the chooser isn't enabled
-                if (window.localStorage.theme === undefined || !useChooser) {
-                    set_theme(opt);
-                }
-
-                done();
-            });
-        });
-        $links.remove();
-    };
-
-    var themechooser = function ($links, opt, text) {
-        useChooser = true;
-        $.md.stage("bootstrap").subscribe(function (done) {
-            restore_theme(opt);
-            done();
-        });
-
-        return $links.each(function (i, e) {
-            var $this = $(e);
-            var $chooser = $('<a href=""></a><ul></ul>');
-            $chooser.eq(0).text(text);
-
-            $.each(themes, function (i, theme) {
-                var $li = $("<li></li>");
-                $chooser.eq(1).append($li);
-                var $a = $("<a/>")
-                    .text(theme.name)
-                    .attr("href", "")
-                    .click(function (ev) {
-                        ev.preventDefault();
-                        window.localStorage.theme = theme.name;
-                        window.location.reload();
-                    })
-                    .appendTo($li);
-            });
-
-            $chooser.eq(1).append('<li class="divider" />');
-            var $li = $("<li/>");
-            var $a_use_default = $("<a>Use default</a>");
-            $a_use_default.click(function (ev) {
-                ev.preventDefault();
-                window.localStorage.removeItem("theme");
-                window.location.reload();
-            });
-            $li.append($a_use_default);
-            $chooser.eq(1).append($li);
-            $this.replaceWith($chooser);
-        });
-    };
-
-    var restore_theme = function (opt) {
-        if (window.localStorage.theme) {
-            opt = $.extend({ name: window.localStorage.theme }, opt);
-            set_theme(opt);
-        }
-    };
-})(jQuery);
-
-(function ($) {
-    //'use strict';
-    var youtubeGimmick = {
-        name: "youtube",
-        load: function () {
-            $.md.stage("gimmick").subscribe(function (done) {
-                youtubeLinkToIframe();
-                done();
-            });
-        },
-    };
-    $.md.registerGimmick(youtubeGimmick);
-
-    function youtubeLinkToIframe() {
-        var $youtube_links = $("a[href*=youtube\\.com]:empty, a[href*=youtu\\.be]:empty");
-
-        $youtube_links.each(function () {
-            var $this = $(this);
-            var href = $this.attr("href");
-            if (href !== undefined) {
-                // extract the v parameter from youtube
-                var exp = /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*/;
-                var m = href.match(exp);
-
-                if (m && m[1].length === 11) {
-                    // insert the iframe
-                    var short_handle = m[1];
-                    var frame = $('<iframe class="md-external" frameborder="0" allowfullscreen></iframe>');
-                    frame.attr("src", "http://youtube.com/embed/" + short_handle);
-                    // remove the a tag
-                    $this.replaceWith(frame);
-                }
-            }
-        });
-    }
-})(jQuery);
-
-(function ($) {
-    "use strict";
-
-    var scripturl = "//cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js";
-
-    var chartGimmick = {
-        name: "chart",
-        version: $.md.version,
-        once: function () {
-            $.md.linkGimmick(this, "chart", chart);
-
-            // load the chart js
-            $.md.registerScript(this, scripturl, {
-                license: "MIT",
-                loadstage: "skel_ready",
-                finishstage: "gimmick",
-            });
-        },
-    };
-    $.md.registerGimmick(chartGimmick);
-
-    var log = $.md.getLogger();
-
-    function chart($links, opt, text) {
-        return $links.each(function (i, link) {
-            // Get the options for this gimmick
-            //      labelColumn: This is a string the indicates the column that will be used to
-            //                   label the data points
-            //      dataColumns: This is a array of strings that indicate each column to be plotted
-            //      canvasId:    This is a ID for the given chart. Defaults to a random number
-            //                   between 1-1000.
-            //      chartOptions: This is an object that is passed to chartjs to configure its
-            //                    options.
-            //      chartType:   This string is the type of chart we want to render. Bar, Line,
-            //                   or Radar. Defaults to Line.
-            var default_options = {
-                chartType: "Line",
-                canvasId: "chartGimmick" + Math.floor(Math.random() * 1000 + 1),
-                chartOptions: {
-                    responsive: false,
-                },
-            };
-            var options = $.extend({}, default_options, opt);
-
-            var $link = $(link);
-
-            var table = $link.parents().find("table").last();
-            if (table.length === 0) {
-                log.error("Chart Gimmick: No tables found on the page.");
-                $link.remove();
-                return;
-            }
-
-            // Replace the Gimmick with the canvas that chartJS needs
-            var myHtml = $('<canvas id="' + options.canvasId + '"></canvas>');
-            myHtml.width(options.width || "450px");
-            myHtml.height(options.height || "250px");
-            $link.replaceWith(myHtml);
-
-            // This is the object that is given to the chart frame work for rendering. It will be
-            // built up by processing the html table that is found on the table.
-            var chartConfig = {
-                datasets: [],
-                labels: [],
-            };
-
-            var chartAvailableToRender = true;
-
-            // These variables hold the indices of the columns in the table we care about. They will
-            // be populated as we process the table based on the options that are given in the
-            // gimmick
-            var labelColumnIndex = -1;
-            var dataColumnIndices = [];
-
-            // Get the index of the columns that we care about for charting
-            table.find("th").each(function (index) {
-                // This is the column that labels each data point
-                if (this.textContent === options.labelColumn) {
-                    labelColumnIndex = index;
-                }
-
-                // Check if this is a data column
-                else {
-                    for (var i = 0; i < options.dataColumns.length; i++) {
-                        if (this.textContent === options.dataColumns[i]) {
-                            dataColumnIndices.push(index);
-                        }
-                    }
-                }
-            });
-
-            // Get the data
-            table.find("tr").each(function (rowIndex) {
-                $(this)
-                    .find("td")
-                    .each(function (colIndex) {
-                        if (colIndex === labelColumnIndex) {
-                            chartConfig.labels.push(this.textContent);
-                        } else {
-                            for (var i = 0; i < dataColumnIndices.length; i++) {
-                                if (colIndex === dataColumnIndices[i]) {
-                                    if (chartConfig.datasets[i] === undefined) {
-                                        chartConfig.datasets[i] = {};
-                                        chartConfig.datasets[i].data = [];
-                                    }
-
-                                    chartConfig.datasets[i].data.push(this.textContent);
-                                }
-                            }
-                        }
-                    });
-            });
-
-            // No Chart data found
-            if (chartConfig.datasets[i] === undefined) {
-                chartAvailableToRender = false;
-                log.error(
-                    "Chart Gimmick: No data was found for the chart. Make sure that there " +
-                        "is a tables on the page. Check that your " +
-                        "column headers match the chart configuration."
-                );
-            }
-
-            if (chartAvailableToRender) {
-                var canvas = document.getElementById(options.canvasId);
-                var ctx = canvas.getContext("2d");
-                $.md.stage("postgimmick").subscribe(function (done) {
-                    setTimeout(function () {
-                        new Chart(ctx)[options.chartType](chartConfig, options.chartOptions);
-                    });
-                    done();
-                });
-            }
-        });
-    }
-})(jQuery);
-
-(function ($) {
-    "use strict";
-    function yuml($link, opt, text) {
-        var default_options = {
-            type: "class" /* { class, activity, usecase } */,
-            style: "plain" /* { plain, scruffy } */,
-            direction: "LR" /* LR, TB, RL */,
-            scale: "100",
-        };
-        var options = $.extend({}, default_options, opt);
-
-        return $link.each(function (i, e) {
-            var $this = $(e);
-            var url = "http://yuml.me/diagram/";
-            var data = $this.attr("href");
-            var title = $this.attr("title");
-
-            title = title ? title : "";
-
-            /* `FOOBAR´ => (FOOBAR) */
-            data = data.replace(new RegExp("`", "g"), "(").replace(new RegExp("´", "g"), ")");
-
-            url +=
-                options.style +
-                ";dir:" +
-                options.direction +
-                ";scale:" +
-                options.scale +
-                "/" +
-                options.type +
-                "/" +
-                data;
-
-            var $img = $('<img src="' + url + '" title="' + title + '" alt="' + title + '">');
-
-            $this.replaceWith($img);
-        });
-    }
-    var yumlGimmick = {
-        name: "yuml",
-        version: $.md.version,
-        once: function () {
-            $.md.linkGimmick(this, "yuml", yuml);
-            $.md.registerScript(this, "", {
-                license: "LGPL",
-                loadstage: "postgimmick",
-                finishstage: "all_ready",
-            });
-        },
-    };
-    $.md.registerGimmick(yumlGimmick);
-})(jQuery);

+ 0 - 7
Civ14-Wiki/README.md

@@ -1,7 +0,0 @@
-# MDwiki
-
-100% static single file CMS/Wiki done purely with client-side Javascript and HTML5.
-
-## See <http://www.mdwiki.info> for more info and documentation
-
-Add articles as markdown files in the this folder or any of its subfolders.

+ 0 - 3
Civ14-Wiki/config.json

@@ -1,3 +0,0 @@
-{
-    "useSideNav": "true"
-}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 8
Civ14-Wiki/extlib/css/bootstrap-3.0.0.min.css


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 51
Civ14-Wiki/extlib/css/colorbox.css


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 6
Civ14-Wiki/extlib/css/prism.1.4.1.default.min.css


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 5
Civ14-Wiki/extlib/js/bootstrap-3.0.0.min.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 1
Civ14-Wiki/extlib/js/jquery-1.8.3.min.js


+ 0 - 942
Civ14-Wiki/extlib/js/jquery.colorbox.js

@@ -1,942 +0,0 @@
-// ColorBox v1.3.20.1 - jQuery lightbox plugin
-// (c) 2011 Jack Moore - jacklmoore.com
-// License: http://www.opensource.org/licenses/mit-license.php
-(function ($, document, window) {
-	var
-	// Default settings object.
-	// See http://jacklmoore.com/colorbox for details.
-	defaults = {
-		transition: "elastic",
-		speed: 300,
-		width: false,
-		initialWidth: "600",
-		innerWidth: false,
-		maxWidth: false,
-		height: false,
-		initialHeight: "450",
-		innerHeight: false,
-		maxHeight: false,
-		scalePhotos: true,
-		scrolling: true,
-		inline: false,
-		html: false,
-		iframe: false,
-		fastIframe: true,
-		photo: false,
-		href: false,
-		title: false,
-		rel: false,
-		opacity: 0.9,
-		preloading: true,
-
-		current: "image {current} of {total}",
-		previous: "previous",
-		next: "next",
-		close: "close",
-		xhrError: "This content failed to load.",
-		imgError: "This image failed to load.",
-
-		open: false,
-		returnFocus: true,
-		reposition: true,
-		loop: true,
-		slideshow: false,
-		slideshowAuto: true,
-		slideshowSpeed: 2500,
-		slideshowStart: "start slideshow",
-		slideshowStop: "stop slideshow",
-		onOpen: false,
-		onLoad: false,
-		onComplete: false,
-		onCleanup: false,
-		onClosed: false,
-		overlayClose: true,
-		escKey: true,
-		arrowKey: true,
-		top: false,
-		bottom: false,
-		left: false,
-		right: false,
-		fixed: false,
-		data: undefined
-	},
-	
-	// Abstracting the HTML and event identifiers for easy rebranding
-	colorbox = 'colorbox',
-	prefix = 'cbox',
-	boxElement = prefix + 'Element',
-	
-	// Events
-	event_open = prefix + '_open',
-	event_load = prefix + '_load',
-	event_complete = prefix + '_complete',
-	event_cleanup = prefix + '_cleanup',
-	event_closed = prefix + '_closed',
-	event_purge = prefix + '_purge',
-	
-	// Special Handling for IE
-	isIE = !$.support.opacity && !$.support.style, // IE7 & IE8
-	isIE6 = isIE && !window.XMLHttpRequest, // IE6
-	event_ie6 = prefix + '_IE6',
-
-	// Cached jQuery Object Variables
-	$overlay,
-	$box,
-	$wrap,
-	$content,
-	$topBorder,
-	$leftBorder,
-	$rightBorder,
-	$bottomBorder,
-	$related,
-	$window,
-	$loaded,
-	$loadingBay,
-	$loadingOverlay,
-	$title,
-	$current,
-	$slideshow,
-	$next,
-	$prev,
-	$close,
-	$groupControls,
-	
-	// Variables for cached values or use across multiple functions
-	settings,
-	interfaceHeight,
-	interfaceWidth,
-	loadedHeight,
-	loadedWidth,
-	element,
-	index,
-	photo,
-	open,
-	active,
-	closing,
-	loadingTimer,
-	publicMethod,
-	div = "div",
-	init;
-
-	// ****************
-	// HELPER FUNCTIONS
-	// ****************
-	
-	// Convience function for creating new jQuery objects
-	function $tag(tag, id, css) {
-		var element = document.createElement(tag);
-
-		if (id) {
-			element.id = prefix + id;
-		}
-
-		if (css) {
-			element.style.cssText = css;
-		}
-
-		return $(element);
-	}
-
-	// Determine the next and previous members in a group.
-	function getIndex(increment) {
-		var
-		max = $related.length,
-		newIndex = (index + increment) % max;
-		
-		return (newIndex < 0) ? max + newIndex : newIndex;
-	}
-
-	// Convert '%' and 'px' values to integers
-	function setSize(size, dimension) {
-		return Math.round((/%/.test(size) ? ((dimension === 'x' ? winWidth() : winHeight()) / 100) : 1) * parseInt(size, 10));
-	}
-	
-	// Checks an href to see if it is a photo.
-	// There is a force photo option (photo: true) for hrefs that cannot be matched by this regex.
-	function isImage(url) {
-		return settings.photo || /\.(gif|png|jp(e|g|eg)|bmp|ico)((#|\?).*)?$/i.test(url);
-	}
-	
-	function winWidth() {
-		// $(window).width() is incorrect for some mobile browsers, but
-		// window.innerWidth is unsupported in IE8 and lower.
-		return window.innerWidth || $window.width();
-	}
-
-	function winHeight() {
-		return window.innerHeight || $window.height();
-	}
-
-	// Assigns function results to their respective properties
-	function makeSettings() {
-		var i,
-			data = $.data(element, colorbox);
-		
-		if (data == null) {
-			settings = $.extend({}, defaults);
-			if (console && console.log) {
-				console.log('Error: cboxElement missing settings object');
-			}
-		} else {
-			settings = $.extend({}, data);
-		}
-		
-		for (i in settings) {
-			if ($.isFunction(settings[i]) && i.slice(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time.
-				settings[i] = settings[i].call(element);
-			}
-		}
-		
-		settings.rel = settings.rel || element.rel || $(element).data('rel') || 'nofollow';
-		settings.href = settings.href || $(element).attr('href');
-		settings.title = settings.title || element.title;
-		
-		if (typeof settings.href === "string") {
-			settings.href = $.trim(settings.href);
-		}
-	}
-
-	function trigger(event, callback) {
-		$.event.trigger(event);
-		if (callback) {
-			callback.call(element);
-		}
-	}
-
-	// Slideshow functionality
-	function slideshow() {
-		var
-		timeOut,
-		className = prefix + "Slideshow_",
-		click = "click." + prefix,
-		start,
-		stop,
-		clear;
-		
-		if (settings.slideshow && $related[1]) {
-			start = function () {
-				$slideshow
-					.text(settings.slideshowStop)
-					.unbind(click)
-					.bind(event_complete, function () {
-						if (settings.loop || $related[index + 1]) {
-							timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);
-						}
-					})
-					.bind(event_load, function () {
-						clearTimeout(timeOut);
-					})
-					.one(click + ' ' + event_cleanup, stop);
-				$box.removeClass(className + "off").addClass(className + "on");
-				timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);
-			};
-			
-			stop = function () {
-				clearTimeout(timeOut);
-				$slideshow
-					.text(settings.slideshowStart)
-					.unbind([event_complete, event_load, event_cleanup, click].join(' '))
-					.one(click, function () {
-						publicMethod.next();
-						start();
-					});
-				$box.removeClass(className + "on").addClass(className + "off");
-			};
-			
-			if (settings.slideshowAuto) {
-				start();
-			} else {
-				stop();
-			}
-		} else {
-			$box.removeClass(className + "off " + className + "on");
-		}
-	}
-
-	function launch(target) {
-		if (!closing) {
-			
-			element = target;
-			
-			makeSettings();
-			
-			$related = $(element);
-			
-			index = 0;
-			
-			if (settings.rel !== 'nofollow') {
-				$related = $('.' + boxElement).filter(function () {
-					var data = $.data(this, colorbox),
-						relRelated;
-
-					if (data) {
-						relRelated =  $(this).data('rel') || data.rel || this.rel;
-					}
-					
-					return (relRelated === settings.rel);
-				});
-				index = $related.index(element);
-				
-				// Check direct calls to ColorBox.
-				if (index === -1) {
-					$related = $related.add(element);
-					index = $related.length - 1;
-				}
-			}
-			
-			if (!open) {
-				open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys.
-				
-				$box.show();
-				
-				if (settings.returnFocus) {
-					$(element).blur().one(event_closed, function () {
-						$(this).focus();
-					});
-				}
-				
-				// +settings.opacity avoids a problem in IE when using non-zero-prefixed-string-values, like '.5'
-				$overlay.css({"opacity": +settings.opacity, "cursor": settings.overlayClose ? "pointer" : "auto"}).show();
-				
-				// Opens inital empty ColorBox prior to content being loaded.
-				settings.w = setSize(settings.initialWidth, 'x');
-				settings.h = setSize(settings.initialHeight, 'y');
-				publicMethod.position();
-				
-				if (isIE6) {
-					$window.bind('resize.' + event_ie6 + ' scroll.' + event_ie6, function () {
-						$overlay.css({width: winWidth(), height: winHeight(), top: $window.scrollTop(), left: $window.scrollLeft()});
-					}).trigger('resize.' + event_ie6);
-				}
-				
-				trigger(event_open, settings.onOpen);
-				
-				$groupControls.add($title).hide();
-				
-				$close.html(settings.close).show();
-			}
-			
-			publicMethod.load(true);
-		}
-	}
-
-	// ColorBox's markup needs to be added to the DOM prior to being called
-	// so that the browser will go ahead and load the CSS background images.
-	function appendHTML() {
-		if (!$box && document.body) {
-			init = false;
-
-			$window = $(window);
-			$box = $tag(div).attr({id: colorbox, 'class': isIE ? prefix + (isIE6 ? 'IE6' : 'IE') : ''}).hide();
-			$overlay = $tag(div, "Overlay", isIE6 ? 'position:absolute' : '').hide();
-			$loadingOverlay = $tag(div, "LoadingOverlay").add($tag(div, "LoadingGraphic"));
-			$wrap = $tag(div, "Wrapper");
-			$content = $tag(div, "Content").append(
-				$loaded = $tag(div, "LoadedContent", 'width:0; height:0; overflow:hidden'),
-				$title = $tag(div, "Title"),
-				$current = $tag(div, "Current"),
-				$next = $tag(div, "Next"),
-				$prev = $tag(div, "Previous"),
-				$slideshow = $tag(div, "Slideshow").bind(event_open, slideshow),
-				$close = $tag(div, "Close")
-			);
-			
-			$wrap.append( // The 3x3 Grid that makes up ColorBox
-				$tag(div).append(
-					$tag(div, "TopLeft"),
-					$topBorder = $tag(div, "TopCenter"),
-					$tag(div, "TopRight")
-				),
-				$tag(div, false, 'clear:left').append(
-					$leftBorder = $tag(div, "MiddleLeft"),
-					$content,
-					$rightBorder = $tag(div, "MiddleRight")
-				),
-				$tag(div, false, 'clear:left').append(
-					$tag(div, "BottomLeft"),
-					$bottomBorder = $tag(div, "BottomCenter"),
-					$tag(div, "BottomRight")
-				)
-			).find('div div').css({'float': 'left'});
-			
-			$loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none');
-			
-			$groupControls = $next.add($prev).add($current).add($slideshow);
-
-			$(document.body).append($overlay, $box.append($wrap, $loadingBay));
-		}
-	}
-
-	// Add ColorBox's event bindings
-	function addBindings() {
-		if ($box) {
-			if (!init) {
-				init = true;
-
-				// Cache values needed for size calculations
-				interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();//Subtraction needed for IE6
-				interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();
-				loadedHeight = $loaded.outerHeight(true);
-				loadedWidth = $loaded.outerWidth(true);
-				
-				// Setting padding to remove the need to do size conversions during the animation step.
-				$box.css({"padding-bottom": interfaceHeight, "padding-right": interfaceWidth});
-
-				// Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly.
-				$next.click(function () {
-					publicMethod.next();
-				});
-				$prev.click(function () {
-					publicMethod.prev();
-				});
-				$close.click(function () {
-					publicMethod.close();
-				});
-				$overlay.click(function () {
-					if (settings.overlayClose) {
-						publicMethod.close();
-					}
-				});
-				
-				// Key Bindings
-				$(document).bind('keydown.' + prefix, function (e) {
-					var key = e.keyCode;
-					if (open && settings.escKey && key === 27) {
-						e.preventDefault();
-						publicMethod.close();
-					}
-					if (open && settings.arrowKey && $related[1]) {
-						if (key === 37) {
-							e.preventDefault();
-							$prev.click();
-						} else if (key === 39) {
-							e.preventDefault();
-							$next.click();
-						}
-					}
-				});
-
-				$('.' + boxElement, document).live('click', function (e) {
-					// ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt.
-					// See: http://jacklmoore.com/notes/click-events/
-					if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey)) {
-						e.preventDefault();
-						launch(this);
-					}
-				});
-			}
-			return true;
-		}
-		return false;
-	}
-
-	// Don't do anything if ColorBox already exists.
-	if ($.colorbox) {
-		return;
-	}
-
-	// Append the HTML when the DOM loads
-	$(appendHTML);
-
-
-	// ****************
-	// PUBLIC FUNCTIONS
-	// Usage format: $.fn.colorbox.close();
-	// Usage from within an iframe: parent.$.fn.colorbox.close();
-	// ****************
-	
-	publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) {
-		var $this = this;
-		
-		options = options || {};
-		
-		appendHTML();
-
-		if (addBindings()) {
-			if (!$this[0]) {
-				if ($this.selector) { // if a selector was given and it didn't match any elements, go ahead and exit.
-					return $this;
-				}
-				// if no selector was given (ie. $.colorbox()), create a temporary element to work with
-				$this = $('<a/>');
-				options.open = true; // assume an immediate open
-			}
-			
-			if (callback) {
-				options.onComplete = callback;
-			}
-			
-			$this.each(function () {
-				$.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options));
-			}).addClass(boxElement);
-			
-			if (($.isFunction(options.open) && options.open.call($this)) || options.open) {
-				launch($this[0]);
-			}
-		}
-		
-		return $this;
-	};
-
-	publicMethod.position = function (speed, loadedCallback) {
-		var
-		css,
-		top = 0,
-		left = 0,
-		offset = $box.offset(),
-		scrollTop,
-		scrollLeft;
-		
-		$window.unbind('resize.' + prefix);
-
-		// remove the modal so that it doesn't influence the document width/height
-		$box.css({top: -9e4, left: -9e4});
-
-		scrollTop = $window.scrollTop();
-		scrollLeft = $window.scrollLeft();
-
-		if (settings.fixed && !isIE6) {
-			offset.top -= scrollTop;
-			offset.left -= scrollLeft;
-			$box.css({position: 'fixed'});
-		} else {
-			top = scrollTop;
-			left = scrollLeft;
-			$box.css({position: 'absolute'});
-		}
-
-		// keeps the top and left positions within the browser's viewport.
-		if (settings.right !== false) {
-			left += Math.max(winWidth() - settings.w - loadedWidth - interfaceWidth - setSize(settings.right, 'x'), 0);
-		} else if (settings.left !== false) {
-			left += setSize(settings.left, 'x');
-		} else {
-			left += Math.round(Math.max(winWidth() - settings.w - loadedWidth - interfaceWidth, 0) / 2);
-		}
-		
-		if (settings.bottom !== false) {
-			top += Math.max(winHeight() - settings.h - loadedHeight - interfaceHeight - setSize(settings.bottom, 'y'), 0);
-		} else if (settings.top !== false) {
-			top += setSize(settings.top, 'y');
-		} else {
-			top += Math.round(Math.max(winHeight() - settings.h - loadedHeight - interfaceHeight, 0) / 2);
-		}
-
-		$box.css({top: offset.top, left: offset.left});
-
-		// setting the speed to 0 to reduce the delay between same-sized content.
-		speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed || 0;
-		
-		// this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly,
-		// but it has to be shrank down around the size of div#colorbox when it's done.  If not,
-		// it can invoke an obscure IE bug when using iframes.
-		$wrap[0].style.width = $wrap[0].style.height = "9999px";
-		
-		function modalDimensions(that) {
-			$topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = that.style.width;
-			$content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = that.style.height;
-		}
-
-		css = {width: settings.w + loadedWidth, height: settings.h + loadedHeight, top: top, left: left};
-		if(speed===0){ // temporary workaround to side-step jQuery-UI 1.8 bug (http://bugs.jquery.com/ticket/12273)
-			$box.css(css);
-		}
-		$box.dequeue().animate(css, {
-			duration: speed,
-			complete: function () {
-				modalDimensions(this);
-				
-				active = false;
-				
-				// shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.
-				$wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px";
-				$wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px";
-				
-				if (settings.reposition) {
-					setTimeout(function () {  // small delay before binding onresize due to an IE8 bug.
-						$window.bind('resize.' + prefix, publicMethod.position);
-					}, 1);
-				}
-
-				if (loadedCallback) {
-					loadedCallback();
-				}
-			},
-			step: function () {
-				modalDimensions(this);
-			}
-		});
-	};
-
-	publicMethod.resize = function (options) {
-		if (open) {
-			options = options || {};
-			
-			if (options.width) {
-				settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth;
-			}
-			if (options.innerWidth) {
-				settings.w = setSize(options.innerWidth, 'x');
-			}
-			$loaded.css({width: settings.w});
-			
-			if (options.height) {
-				settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight;
-			}
-			if (options.innerHeight) {
-				settings.h = setSize(options.innerHeight, 'y');
-			}
-			if (!options.innerHeight && !options.height) {
-				$loaded.css({height: "auto"});
-				settings.h = $loaded.height();
-			}
-			$loaded.css({height: settings.h});
-			
-			publicMethod.position(settings.transition === "none" ? 0 : settings.speed);
-		}
-	};
-
-	publicMethod.prep = function (object) {
-		if (!open) {
-			return;
-		}
-		
-		var callback, speed = settings.transition === "none" ? 0 : settings.speed;
-		
-		$loaded.remove();
-		$loaded = $tag(div, 'LoadedContent').append(object);
-		
-		function getWidth() {
-			settings.w = settings.w || $loaded.width();
-			settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w;
-			return settings.w;
-		}
-		function getHeight() {
-			settings.h = settings.h || $loaded.height();
-			settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h;
-			return settings.h;
-		}
-		
-		$loaded.hide()
-		.appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations.
-		.css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'})
-		.css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.
-		.prependTo($content);
-		
-		$loadingBay.hide();
-		
-		// floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width.
-		//$(photo).css({'float': 'none', marginLeft: 'auto', marginRight: 'auto'});
-		
-		$(photo).css({'float': 'none'});
-		
-		// Hides SELECT elements in IE6 because they would otherwise sit on top of the overlay.
-		if (isIE6) {
-			$('select').not($box.find('select')).filter(function () {
-				return this.style.visibility !== 'hidden';
-			}).css({'visibility': 'hidden'}).one(event_cleanup, function () {
-				this.style.visibility = 'inherit';
-			});
-		}
-		
-		callback = function () {
-			var preload,
-				i,
-				total = $related.length,
-				iframe,
-				frameBorder = 'frameBorder',
-				allowTransparency = 'allowTransparency',
-				complete,
-				src,
-				img,
-				data;
-			
-			if (!open) {
-				return;
-			}
-			
-			function removeFilter() {
-				if (isIE) {
-					$box[0].style.removeAttribute('filter');
-				}
-			}
-			
-			complete = function () {
-				clearTimeout(loadingTimer);
-				// Detaching forces Andriod stock browser to redraw the area underneat the loading overlay.  Hiding alone isn't enough.
-				$loadingOverlay.detach().hide();
-				trigger(event_complete, settings.onComplete);
-			};
-			
-			if (isIE) {
-				//This fadeIn helps the bicubic resampling to kick-in.
-				if (photo) {
-					$loaded.fadeIn(100);
-				}
-			}
-			
-			$title.html(settings.title).add($loaded).show();
-			
-			if (total > 1) { // handle grouping
-				if (typeof settings.current === "string") {
-					$current.html(settings.current.replace('{current}', index + 1).replace('{total}', total)).show();
-				}
-				
-				$next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(settings.next);
-				$prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous);
-				
-				if (settings.slideshow) {
-					$slideshow.show();
-				}
-				
-				// Preloads images within a rel group
-				if (settings.preloading) {
-					preload = [
-						getIndex(-1),
-						getIndex(1)
-					];
-					while (i = $related[preload.pop()]) {
-						data = $.data(i, colorbox);
-						
-						if (data && data.href) {
-							src = data.href;
-							if ($.isFunction(src)) {
-								src = src.call(i);
-							}
-						} else {
-							src = i.href;
-						}
-
-						if (isImage(src)) {
-							img = new Image();
-							img.src = src;
-						}
-					}
-				}
-			} else {
-				$groupControls.hide();
-			}
-			
-			if (settings.iframe) {
-				iframe = $tag('iframe')[0];
-				
-				if (frameBorder in iframe) {
-					iframe[frameBorder] = 0;
-				}
-				if (allowTransparency in iframe) {
-					iframe[allowTransparency] = "true";
-				}
-				// give the iframe a unique name to prevent caching
-				iframe.name = prefix + (+new Date());
-				if (settings.fastIframe) {
-					complete();
-				} else {
-					$(iframe).one('load', complete);
-				}
-				iframe.src = settings.href;
-				if (!settings.scrolling) {
-					iframe.scrolling = "no";
-				}
-				$(iframe).addClass(prefix + 'Iframe').appendTo($loaded).one(event_purge, function () {
-					iframe.src = "//about:blank";
-				});
-			} else {
-				complete();
-			}
-			
-			if (settings.transition === 'fade') {
-				$box.fadeTo(speed, 1, removeFilter);
-			} else {
-				removeFilter();
-			}
-		};
-		
-		if (settings.transition === 'fade') {
-			$box.fadeTo(speed, 0, function () {
-				publicMethod.position(0, callback);
-			});
-		} else {
-			publicMethod.position(speed, callback);
-		}
-	};
-
-	publicMethod.load = function (launched) {
-		var href, setResize, prep = publicMethod.prep;
-		
-		active = true;
-		
-		photo = false;
-		
-		element = $related[index];
-		
-		if (!launched) {
-			makeSettings();
-		}
-		
-		trigger(event_purge);
-		
-		trigger(event_load, settings.onLoad);
-		
-		settings.h = settings.height ?
-				setSize(settings.height, 'y') - loadedHeight - interfaceHeight :
-				settings.innerHeight && setSize(settings.innerHeight, 'y');
-		
-		settings.w = settings.width ?
-				setSize(settings.width, 'x') - loadedWidth - interfaceWidth :
-				settings.innerWidth && setSize(settings.innerWidth, 'x');
-		
-		// Sets the minimum dimensions for use in image scaling
-		settings.mw = settings.w;
-		settings.mh = settings.h;
-		
-		// Re-evaluate the minimum width and height based on maxWidth and maxHeight values.
-		// If the width or height exceed the maxWidth or maxHeight, use the maximum values instead.
-		if (settings.maxWidth) {
-			settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth;
-			settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw;
-		}
-		if (settings.maxHeight) {
-			settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight;
-			settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh;
-		}
-		
-		href = settings.href;
-		
-		loadingTimer = setTimeout(function () {
-			$loadingOverlay.show().appendTo($content);
-		}, 100);
-		
-		if (settings.inline) {
-			// Inserts an empty placeholder where inline content is being pulled from.
-			// An event is bound to put inline content back when ColorBox closes or loads new content.
-			$tag(div).hide().insertBefore($(href)[0]).one(event_purge, function () {
-				$(this).replaceWith($loaded.children());
-			});
-			prep($(href));
-		} else if (settings.iframe) {
-			// IFrame element won't be added to the DOM until it is ready to be displayed,
-			// to avoid problems with DOM-ready JS that might be trying to run in that iframe.
-			prep(" ");
-		} else if (settings.html) {
-			prep(settings.html);
-		} else if (isImage(href)) {
-			$(photo = new Image())
-			.addClass(prefix + 'Photo')
-			.error(function () {
-				settings.title = false;
-				prep($tag(div, 'Error').html(settings.imgError));
-			})
-			.load(function () {
-				var percent;
-				photo.onload = null; //stops animated gifs from firing the onload repeatedly.
-				
-				if (settings.scalePhotos) {
-					setResize = function () {
-						photo.height -= photo.height * percent;
-						photo.width -= photo.width * percent;
-					};
-					if (settings.mw && photo.width > settings.mw) {
-						percent = (photo.width - settings.mw) / photo.width;
-						setResize();
-					}
-					if (settings.mh && photo.height > settings.mh) {
-						percent = (photo.height - settings.mh) / photo.height;
-						setResize();
-					}
-				}
-				
-				if (settings.h) {
-					photo.style.marginTop = Math.max(settings.h - photo.height, 0) / 2 + 'px';
-				}
-				
-				if ($related[1] && (settings.loop || $related[index + 1])) {
-					photo.style.cursor = 'pointer';
-					photo.onclick = function () {
-						publicMethod.next();
-					};
-				}
-				
-				if (isIE) {
-					photo.style.msInterpolationMode = 'bicubic';
-				}
-				
-				setTimeout(function () { // A pause because Chrome will sometimes report a 0 by 0 size otherwise.
-					prep(photo);
-				}, 1);
-			});
-			
-			setTimeout(function () { // A pause because Opera 10.6+ will sometimes not run the onload function otherwise.
-				photo.src = href;
-			}, 1);
-		} else if (href) {
-			$loadingBay.load(href, settings.data, function (data, status, xhr) {
-				prep(status === 'error' ? $tag(div, 'Error').html(settings.xhrError) : $(this).contents());
-			});
-		}
-	};
-		
-	// Navigates to the next page/image in a set.
-	publicMethod.next = function () {
-		if (!active && $related[1] && (settings.loop || $related[index + 1])) {
-			index = getIndex(1);
-			publicMethod.load();
-		}
-	};
-	
-	publicMethod.prev = function () {
-		if (!active && $related[1] && (settings.loop || index)) {
-			index = getIndex(-1);
-			publicMethod.load();
-		}
-	};
-
-	// Note: to use this within an iframe use the following format: parent.$.fn.colorbox.close();
-	publicMethod.close = function () {
-		if (open && !closing) {
-			
-			closing = true;
-			
-			open = false;
-			
-			trigger(event_cleanup, settings.onCleanup);
-			
-			$window.unbind('.' + prefix + ' .' + event_ie6);
-			
-			$overlay.fadeTo(200, 0);
-			
-			$box.stop().fadeTo(300, 0, function () {
-			
-				$box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide();
-				
-				trigger(event_purge);
-				
-				$loaded.remove();
-				
-				setTimeout(function () {
-					closing = false;
-					trigger(event_closed, settings.onClosed);
-				}, 1);
-			});
-		}
-	};
-
-	// Removes changes ColorBox made to the document, but does not remove the plugin
-	// from jQuery.
-	publicMethod.remove = function () {
-		$([]).add($box).add($overlay).remove();
-		$box = null;
-		$('.' + boxElement)
-			.removeData(colorbox)
-			.removeClass(boxElement)
-			.die();
-	};
-
-	// A method for fetching the current element ColorBox is referencing.
-	// returns a jQuery object.
-	publicMethod.element = function () {
-		return $(element);
-	};
-
-	publicMethod.settings = defaults;
-
-}(jQuery, document, this));

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
Civ14-Wiki/extlib/js/jquery.colorbox.min.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 1
Civ14-Wiki/extlib/js/prism.1.4.1.min.js


BIN
Civ14-Wiki/favicon.ico


+ 0 - 3
Civ14-Wiki/gamemodes/aotd.md

@@ -1,3 +0,0 @@
-# The Art of the Deal (AOTD)
-
-**Warning: This gamemode has not been implemented yet! You can check the Civ13 guide [here](https://civ13.github.io/civ13-wiki/The_Art_of_the_Deal).**

+ 0 - 54
Civ14-Wiki/guides/guide_to_farming.md

@@ -1,54 +0,0 @@
-# Guide to Farming
-
-**WARNING: This guide was originally written for Civ13, and as such might not fully reflect the actual gameplay of Civ14.**
-
-Being a grower of crops is an important role. You farm both food and cash crops. Growing food is vital for a nation to increase in wealth and power.
-
-## Tools
-
-To farm, you will require some basic tools.
-
-|                                                                                       |        |                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
-| ------------------------------------------------------------------------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| ![knife](./../../Resources/Textures/Objects/Weapons/Melee/kitchen_knife.rsi/icon.png) | Knife  | Used for harvesting crops. Can be made out of lots of different materials, such as bone and stone.                                                                                                                                                                                                                                                                                                                                                         |
-| ![plough](./../../Resources/Textures/Civ14/Objects/items.rsi/plough.png)              | Plough | A plough is made out of wood and used to plough fields for farming! Used once on the grass and once on the dirt underneath the grass. You can also plough snowy dirt and flooded plains dirt (found along the jungle rivers). In case of snowy grass, you will have to shovel the snow first. Lastly, there are places where you cannot plough: infertile soil, permafrost etc. You can also make an iron plough out of iron ingots to plough land faster. |
-| ![seeds](./../../Resources/Textures/Civ14/Objects/Farming/seeds.rsi/seeds_old.png)    | Seeds  | Some sort of seeds to plant and grow. You may find seeds simply lying on the ground, but you can also collect them in the wilderness by using any type of knife on bushes and small bushes.                                                                                                                                                                                                                                                                |
-| ![hoe](./../../Resources/Textures/Objects/Tools/Hydroponics/hoe.rsi/icon.png)         | Hoe    | Helps remove those nasty weeds. Essential to prevent premature plant death.                                                                                                                                                                                                                                                                                                                                                                                |
-
-Just plough a plot of land by yourself with the **plough** tool. Add water and nutrient. Then wait for the plant to grow, keeping an eye on water and nutrient levels.
-
-## Watering
-
-Plants need water, some more, others less. Weather conditions and
-climate also affect the crops in this regard. Each crop has a maximum water level when planted.
-
-Normally, the water level decreases at the rate of approximately 15 per minute (depends on the plant), and when it reaches zero, the plants wither away.
-
-There are a few ways to provide the crops with water:
-
--   Plough land within two tiles of fresh water, which is any water, except for the saltwater. The plants will have all the water they need without any extra labor.
-
--   Water the plants manually. Bring the fresh water in buckets and barrels and splash it on the ploughed field (the ground, not the plant).
-
--   Pray for the eternal rain. Rain will water the fields (at the rate of 20 per minute), but may create other inconveniences.
-
-## Soil Nutrition
-
-The soil, as in real life, has its level of nutrition. The plants that you plant in the soil will consume its nutrition little by little, until it reaches zero. This varies by plant, but is approximately 15-20 units per minute.
-
-A freshly ploughed tile will have a nutrition value of 0.
-
-**To examine the soil, stand close to it and examine it.**
-
-## Fertilizing
-
-Many kinds of animals leave manure on the ground, which could be used to fertilize a field. This is one way to restore nutrition to your soil.
-
-Fertilizer: 50 nutrition points.
-
-The **compost bin** (10 wood) also turns food scraps, plant matter (seeds, some plants) and some other unpleasant things into fertilizer. Just place it in the bin and wait for a while. Fertilizer could also be used to refuel ovens etc.
-
-## Severe weather
-
-Be aware that blizzards will freeze the plants and kill them. A
-heatwave, as noted in the Watering section, will cause the crops to consume more water than usual. Sandstorms will also destroy the plants.

+ 0 - 178
Civ14-Wiki/guides/starter_guide.md

@@ -1,178 +0,0 @@
-# Starter Guide
-
-**Note:** This guide primarily focuses on survival in the sandbox [Nomads](nomads.md) game mode.
-
-## Spawning in
-
--   You begin with only age-appropriate clothing and a torch in your pocket. If it's dark, drag the torch to your hand slot and press **Z** to activate it.
-
-    -   ![arrival](./../img/arrival.png)
-
--   If it's **winter season** or **Ice Age** map, you also spawn with a **fur coat**. Losing this will mean cold and miserable **death** in the icy outdoors.
-
--   Your **hunger** and **thirst** levels will start at approximately 50%. You'll receive alerts on the right side of the screen (below your health and stamina indicators) when you're hungry or thirsty. Pay close attention to these alerts.
-
--   Your first priority is to gather flint to craft a flint axe.
-
-    -   Locate a large rock or boulder and right-click on it. You should see an option to search for flint.
-        ![boulder](./../img/boulder.png)
-    -   Click the rock repeatedly with the flint to sharpen it (you will get a message when it is sharpened).
-    -   Now go to a tree and right click on it. There should be an option to remove a branch from the tree, if there are any suitable ones available. This will pull a branch from the tree and place it on the ground.
-    -   Click the branch with an empty hand to clear the leaves.
-    -   Use the sharpened flint on the stick to sharpen the stick. Then, click the sharpened stick with the flint again to craft a flint axe, which serves as both a tool and a weapon.
-        ![flint axe crafting menu](./../img/flint_axe.png)
-
-## Crafting Basics
-
-### Crafting Menu
-
-**Tip:** Press **G** to open the crafting menu.
-
-You will need some basic things to survive. At the very start you will most likely be using **wood, leather, bone, stone, and straw** to make them.
-
--   Hit a tree with your flint hatchet until it breaks. You will then find some **wood** on the floor.
-
--   Hunt and butcher some animals to get **leather** and **bone**.
-
--   Use your knife on a grass tile to gather some **straw**.
-
--   Use your pickaxe on a rock tile to gather **stone** (see below).
-
-### Mining 101
-
-Ores are valuable crafting materials which you mine out of the rock.
-
--   You'll need **wood** and **bone** for this. Go gather them (bones are obtained by butchering animals - click the carcass with something sharp, like a flint axe or a knife),
--   Make a **bone pickaxe**.
--   Find a **rock** tile.
--   Right click on it while holding the **pickaxe** on your active hand.
-
-## Food and Water
-
-To survive, you will need to keep yourself nourished and warm. Pay attention to the alerts on the right side of the screen, they will tell you when you need to eat and drink.
-
-**Warning: Letting either hunger or thirst reach 0% will cause your body to start shutting down, leading to inevitable death!**
-
-### Hunger
-
-The easiest way to get food early on is by killing animals and eating the meat after cooking it. Also, you can eat bird eggs, even uncooked!
-
--   Find an animal, preferably one that doesn't have fangs, claws, tusks, or poison. and kill it with any means (even bare fists work). Remember to press the **harm intent** button to enter combat mode!
-    <img src="./../../Resources/Textures/Interface/Actions/harm.png" style="width:64px;height:64px;image-rendering: pixelated;"> <img src="./../../Resources/Textures/Interface/Actions/harmOff.png" style="width:64px;height:64px;image-rendering: pixelated;">
-
-**Tip:** For now, stay away from bears, alligators, wolves, snakes, and mammoths. They will fight back and very probably kill you. Wait until you have proper equipment or a hunting party with you.
-
--   Use your knife (flint axe works too) on the dead animal with **Harm intent** to butcher it.
--   **Raw meat** causes **food poisoning**! You'll want to **cook** it first, but if you're starving, food poisoning is the least of your worries.
--   To cook meat, place it on a **campfire** and click the campfire. The campfire is made with **wood logs**.
-
-Farming is another good source of food (although not an immediate one) that does not involve getting maimed by wild animals. Check the [guide to farming](guide_to_farming.md).
-
-### Thirst
-
-The easiest way to quench your thirst early on is by drinking water or milk.
-
-#### Water
-
-You can get water from **puddles**, any **water tiles (except saltwater - do not drink nor boil it!)**, or **wells**.
-
--   To drink, you need to make a **mug** from **wood** or **drinking glass** from **glass**.
--   **Wells** have disease-free freshwater (**however, if there are some... excrements within 4 tiles of a well, the water becomes contaminated and unsafe to drink!)**. You can build them over a **puddle** by using with **stone**... if your faction has the research levels required.
-
-#### Milk
-
--   Find a **cow**, **sheep ewe**, or **goat ewe**.
--   Make a **bucket** from **wood**.
--   Use the **bucket** on **Help intent** on the animal of choice to gather milk.
--   Pour the milk into the **mug** or **glass** and drink.
--   You don't have to boil milk.
-
-Milk is regenerated in the animals over time, so keep them alive, and
-you'll never go thirsty.
-
-## Temperature
-
-**Tip:** Keep an eye out for the temperature alert! If it is flashing blue with a white snowflake, you are freezing! If it is red and there is sun instead, you are melting from the heat!
-
-Winter seasons can bring an icy chill that can seriously hurt and slow you down, or even kill you. Blizzards are especially deadly, and just wearing a fur coat will not cut it, so make sure you have a shelter ready before it is too late.
-
-Southern climates could be merciless in their own way, so be careful that you do not overheat to the point of a heat stroke. Resting in a roofed shelter from time to time and wearing appropriate clothing (for instance, "traditional" desert clothes) can save you from fainting and shrivelling in a sweltering heat.
-
-### Fur Clothing
-
-<img src="./../../Resources/Textures/Civ14/Clothing/exported/suits/prehistoric_fur2.rsi/icon.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="./../../Resources/Textures/Civ14/Clothing/exported/suits/fur_jacket1.rsi/icon.png" style="width:64px;height:64px;image-rendering: pixelated;">
-Fur clothing can keep you warm in the winter, but it will not save you if you are caught in a blizzard. You can make fur clothing by skinning large furry animals like **bears** and **wolves**. <sub>Yes, you can finally skin furries with no repercussions.</sub>
-
--   Kill one of the following animals: **bear, wolf, bison, monkey, fox, sheep**.
--   Bucher the animal by using the **knife** on **Harm Intent**.
--   Collect enough pelts and craft **fur coat, boots, headcover and gloves** (you might need to hunt several animals for the whole set).
-
-    -   <img src="./../../Resources/Textures/Objects/Materials/materials.rsi/sheet-brownbearpelt.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="./../../Resources/Textures/Objects/Materials/materials.rsi/sheet-wolfpelt.png" style="width:64px;height:64px;image-rendering: pixelated;">
-
-## Shelter
-
-Shelter can save you from even the toughest of conditions.
-
-Any roofed area is considered a shelter.
-
--   **Caves**: There's a reason that stone-age men were called cavemen. Look for entrances in rocks. If it has a roof, it will be darker inside. That means it will keep snow, cold, blazing sun and rain out. The easiest way of surviving inclement weather. <sub>Make sure that no bears live in the cave, though...</sub>
--   **Building a Roof**: Target your inner Bob the Builder and build your own roof.
-
-    -   Build **walls** to prop the ceiling up. Craft floor tiles and place them to automatically build a roof overhead.
-
-    -   You can also build walls with **dirt** or **snow** by using the **shovel** directly on the ground.
-
-## Fire
-
-<img src="./../../Resources/Textures/Civ14/Objects/kitchen.rsi/fireplace_on.png" style="width:64px;height:64px;image-rendering: pixelated;">Crackling fires will keep you warm even without a coat. Both campfires and braziers are refueled by adding **wood**, **coal** and **charcoal**. The brazier could also be refueled with **paper- and cloth-based items**.
-
--   A **campfire** warms you when you are right next to it, or within 2 tile.
--   A **brazier** (made with **stone**) provides more heat and warms you within 3 tiles.
-
-## Dangerous animals
-
-**Warning: The world is teeming with wildlife. Most of them are pretty tame and easy prey, but steer clear of the big game unless you're a skilled hunter, otherwise you'll become minced meat yourself!**
-
-You want to avoid these, unless you're robust or need some pelts:
-
--   ![brown bear](./../../Resources/Textures/Civ14/Mobs/animal_64.rsi/brownbear.png)Bears (can provide fur)
--   ![white wolf](./../../Resources/Textures/Civ14/Mobs/animal.rsi/whitewolf.png)![grey wolf](./../../Resources/Textures/Civ14/Mobs/animal.rsi/greywolf.png)Wolves (can provide fur)
--   ![mammoth](./../../Resources/Textures/Civ14/Mobs/animal_128.rsi/mammoth.png)Mammoths
--   ![sabertooth](./../../Resources/Textures/Civ14/Mobs/animal_big.rsi/sabertoothcat_brown.png)![liom](./../../Resources/Textures/Civ14/Mobs/animal_big.rsi/lion.png)Panthers, Jaguars, Lions, and other big cats
--   ![alligator](./../../Resources/Textures/Civ14/Mobs/animal_big.rsi/alligator.png)Alligators
-
-![cave den](./../../Resources/Textures/Civ14/Objects/animal_spawner.rsi/cave_den2.png)
-![cave den](./../../Resources/Textures/Civ14/Objects/animal_spawner.rsi/cave_den-foliage.png)
-Also keep an eye for animal dens. Dangerous animals will spawn here!
-
-## Night time
-
-You'll need a light source to see in the night and in dark indoor areas. The basic source of light is the **torch**.
-
--   Gather some **wood**. Craft a **torch** and press **Z** to light it. Torches will last for **5 minutes** and then burn out.
-
--   For a static source of light, you can make a **campfire**, which will also help you cook some food.
-
--   You can also make lanterns with **iron**. Lanterns require fuel - any form of liquid fuel will do, like olive oil, fat, or petroleum.
-
--   For a more **permanent** light source, you can build **braziers** from **stone**. You can fuel it with any organic matter like wood or clothing - simply use items on the brazier.
-
-## Medicine
-
-In the Stone age, most of the medicine you will find is restricted to bandages and medicinal herbs.
-
-![leather bandage](./../../Resources/Textures/Civ14/Objects/surgery.rsi/leatherbandage.png)![cloth bandage](./../../Resources/Textures/Civ14/Objects/surgery.rsi/bint.png) You can craft bandages from **cloth** or **leather**. They will help you stop bleeding.
-
-You can find medicinal herbs growing wild around the map. If you harvest them, you will also get some seeds so you can plant them yourself - see the [guide to farming](guide_to_farming.md).
-
-<img src="./../../Resources/Textures/Civ14/Objects/Farming/elderflower.rsi/harvest.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="./../../Resources/Textures/Civ14/Objects/Farming/elderflower.rsi/produce.png" style="width:64px;height:64px;image-rendering: pixelated;"> **Elderflower** has a long history in European folk medicine for treating colds and sinus issues. It reduces asphyxiation by clearing airways and boosting oxygen intake.
-
-<img src="./../../Resources/Textures/Civ14/Objects/Farming/yarrow.rsi/harvest.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="./../../Resources/Textures/Civ14/Objects/Farming/yarrow.rsi/produce.png" style="width:64px;height:64px;image-rendering: pixelated;"> **Yarrow** has been used since ancient times as a hemostatic (blood-clotting) agent. It’s known for its astringent properties that help staunch bleeding.
-
-<img src="./../../Resources/Textures/Objects/Specific/Hydroponics/spacemans_trumpet.rsi/harvest.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="./../../Resources/Textures/Objects/Specific/Hydroponics/spacemans_trumpet.rsi/produce.png" style="width:64px;height:64px;image-rendering: pixelated;"> **Comfrey** has been used historically to heal bruises, sprains, and fractures due to its anti-inflammatory and tissue-repair properties. Heals brute damage.
-
-<img src="./../../Resources/Textures/Objects/Specific/Hydroponics/galaxythistle.rsi/harvest.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="./../../Resources/Textures/Objects/Specific/Hydroponics/galaxythistle.rsi/produce.png" style="width:64px;height:64px;image-rendering: pixelated;"> **Milk Thistle** has long been used as a liver tonic, with silymarin compounds believed to detoxify and protect against poisons.
-
-<img src="./../../Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/harvest.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="./../../Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/produce.png" style="width:64px;height:64px;image-rendering: pixelated;"> **Poppy** is the source of opium and morphine, known for sedative and pain-relieving effects, but it can also stabilize shock in small doses by calming the nervous system. Historically, it’s been used for pain and trauma management.
-
-<img src="./../../Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/harvest.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="./../../Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/produce.png" style="width:64px;height:64px;image-rendering: pixelated;"> **Aloe vera**’s gel is a well-documented remedy for burns, soothing inflammation and promoting skin healing.

+ 0 - 137
Civ14-Wiki/index.html

@@ -1,137 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-   This is MDwiki v0.7.0
-   (C) 2013 by Timo Dörr and contributors. This software is licensed
-   under the terms of the GNU GPLv3 with additional terms applied.
-   See https://github.com/Dynalon/mdwiki/blob/master/LICENSE.txt for more detail.
-   See http://github.com/Dynalon/mdwiki for a copy of the source code.
--->
-
-<head>
-    <title>Civilization 14 Wiki</title>
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <meta name="fragment" content="!">
-    <link rel="shortcut icon" type="image/x-icon" href="./../Resources/Textures/Logo/icon/icon-64x64.png" />
-    <meta charset="UTF-8">
-    <style type="text/css">
-        /* hide the main content while we assemble everything */
-        .md-hidden-load {
-            display: none;
-        }
-
-        .anchor-highlight {
-            font-size: 0.7em;
-            margin-left: 0.25em;
-        }
-
-        /* for pageContentMenu */
-        #md-page-menu {
-            position: static;
-        }
-
-        #md-page-menu a.active {
-            /* background-color: rgba(0, 0, 0, 0.01); */
-            font-weight: bold;
-            padding-left: 6px;
-
-        }
-
-        @media (min-width: 992px) {
-            #md-page-menu.affix {
-                position: fixed;
-            }
-        }
-
-        @media (min-width: 768px) {
-
-            .md-float-left .col-sm-8,
-            .md-float-right .col-sm-8 {
-                max-width: 66.67%;
-            }
-
-            .md-float-left .col-sm-4,
-            .md-float-right .col-sm-4 {
-                max-width: 33.33%;
-            }
-
-            .md-float-left .col-sm-2,
-            .md-float-right .col-sm-2 {
-                max-width: 16.67%;
-            }
-
-        }
-
-        @media (max-width: 992px) {
-            a.forkmeongithub {
-                display: none;
-            }
-        }
-
-        @media (max-width: 768px) {
-
-            /* don't use floating for smaller screens */
-            .md-float-left .col-sm-8,
-            .md-float-left .col-sm-4,
-            .md-float-left .col-sm-2 {
-                width: 100%;
-                max-width: !important;
-                min-width: 100%;
-            }
-
-            .md-float-right .col-sm-8,
-            .md-float-right .col-sm-4,
-            .md-float-right .col-sm-2 {
-                width: 100%;
-                max-width: !important;
-                min-width: 100%;
-            }
-        }
-
-        .md-floatenv .md-text {
-            /* md-text is not of md-col-* but needs the spacing */
-            margin-left: 15px;
-            margin-right: 15px;
-        }
-
-        /* float images */
-        .md-float-left .col-sm-8,
-        .md-float-left .col-sm-4,
-        .md-float-left .col-sm-2 {
-            width: auto;
-        }
-
-        .md-float-right .col-sm-8,
-        .md-float-right .col-sm-4,
-        .md-float-right .col-sm-2 {
-            float: right !important;
-            width: auto;
-        }
-
-        #md-all .md-copyright-footer {
-            background-color: !important;
-            font-size: smaller;
-            padding: 1em;
-        }
-    </style>
-    <link rel="stylesheet" href="extlib/css/bootstrap-3.0.0.min.css">
-    <link rel="stylesheet" href="extlib/css/prism.1.4.1.default.min.css">
-    <script src="extlib/js/jquery-1.8.3.min.js"></script>
-    <script src="extlib/js/bootstrap-3.0.0.min.js"></script>
-    <script src="extlib/js/prism.1.4.1.min.js"></script>
-    <link rel="stylesheet" href="extlib/css/colorbox.css">
-    <script src="extlib/js/jquery.colorbox.min.js"></script>
-    <script src="MDwiki.js"></script>
-</head>
-
-<body>
-    <noscript>
-        This website requires Javascript to be enabled. Please turn on Javascript
-        and reload the page.
-    </noscript>
-
-    <div id="md-all">
-    </div>
-</body>
-
-</html>

+ 1 - 1
README.md

@@ -6,7 +6,7 @@ Civilization 14 is a port of [Civilization 13](https://github.com/Civ13/civ13) f
 
 ## Links
 
-[Civ14 Website](https://civ13.com/) | [Civ14 Discord](https://discord.gg/hBEtg4x) | [Civ14 Wiki](https://civ13.github.io/Civ14/Civ14-Wiki) | [SS14 Steam](https://store.steampowered.com/app/1255460/Space_Station_14/) | [SS14 Standalone Download](https://spacestation14.io/about/nightlies/)
+[Civ14 Website](https://civ13.com/) | [Civ14 Discord](https://discord.gg/hBEtg4x) | [Civ14 Wiki](https://civ13.github.io/Civ14) | [SS14 Steam](https://store.steampowered.com/app/1255460/Space_Station_14/) | [SS14 Standalone Download](https://spacestation14.io/about/nightlies/)
 
 ## Documentation/Wiki
 

+ 1 - 1
Resources/ConfigPresets/Civ/production.toml

@@ -71,7 +71,7 @@ pg_password = ""
 discord = "https://discord.gg/hBEtg4x"
 website = "https://civ13.com"
 github = "https://github.com/Civ13/Civ14"
-wiki = "https://civ13.github.io/Civ14/Civ14-Wiki"
+wiki = "https://civ13.github.io/Civ14"
 
 [server]
 lobby_right_panel_width = 300

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 50
Resources/Maps/civ/nomads_classic.yml


+ 362 - 0
Wiki/LICENSE

@@ -0,0 +1,362 @@
+Mozilla Public License, version 2.0
+
+1. Definitions
+
+1.1. "Contributor"
+
+     means each individual or legal entity that creates, contributes to the
+     creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+
+     means the combination of the Contributions of others (if any) used by a
+     Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+
+     means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+
+     means Source Code Form to which the initial Contributor has attached the
+     notice in Exhibit A, the Executable Form of such Source Code Form, and
+     Modifications of such Source Code Form, in each case including portions
+     thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+     means
+
+     a. that the initial Contributor has attached the notice described in
+        Exhibit B to the Covered Software; or
+
+     b. that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the terms of
+        a Secondary License.
+
+1.6. "Executable Form"
+
+     means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+
+     means a work that combines Covered Software with other material, in a
+     separate file or files, that is not Covered Software.
+
+1.8. "License"
+
+     means this document.
+
+1.9. "Licensable"
+
+     means having the right to grant, to the maximum extent possible, whether
+     at the time of the initial grant or subsequently, any and all of the
+     rights conveyed by this License.
+
+1.10. "Modifications"
+
+     means any of the following:
+
+     a. any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered Software; or
+
+     b. any new file in Source Code Form that contains any Covered Software.
+
+1.11. "Patent Claims" of a Contributor
+
+      means any patent claim(s), including without limitation, method,
+      process, and apparatus claims, in any patent Licensable by such
+      Contributor that would be infringed, but for the grant of the License,
+      by the making, using, selling, offering for sale, having made, import,
+      or transfer of either its Contributions or its Contributor Version.
+
+1.12. "Secondary License"
+
+      means either the GNU General Public License, Version 2.0, the GNU Lesser
+      General Public License, Version 2.1, the GNU Affero General Public
+      License, Version 3.0, or any later versions of those licenses.
+
+1.13. "Source Code Form"
+
+      means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+
+      means an individual or a legal entity exercising rights under this
+      License. For legal entities, "You" includes any entity that controls, is
+      controlled by, or is under common control with You. For purposes of this
+      definition, "control" means (a) the power, direct or indirect, to cause
+      the direction or management of such entity, whether by contract or
+      otherwise, or (b) ownership of more than fifty percent (50%) of the
+      outstanding shares or beneficial ownership of such entity.
+
+
+2. License Grants and Conditions
+
+2.1. Grants
+
+     Each Contributor hereby grants You a world-wide, royalty-free,
+     non-exclusive license:
+
+     a. under intellectual property rights (other than patent or trademark)
+        Licensable by such Contributor to use, reproduce, make available,
+        modify, display, perform, distribute, and otherwise exploit its
+        Contributions, either on an unmodified basis, with Modifications, or
+        as part of a Larger Work; and
+
+     b. under Patent Claims of such Contributor to make, use, sell, offer for
+        sale, have made, import, and otherwise transfer either its
+        Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+     The licenses granted in Section 2.1 with respect to any Contribution
+     become effective for each Contribution on the date the Contributor first
+     distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+     The licenses granted in this Section 2 are the only rights granted under
+     this License. No additional rights or licenses will be implied from the
+     distribution or licensing of Covered Software under this License.
+     Notwithstanding Section 2.1(b) above, no patent license is granted by a
+     Contributor:
+
+     a. for any code that a Contributor has removed from Covered Software; or
+
+     b. for infringements caused by: (i) Your and any other third party's
+        modifications of Covered Software, or (ii) the combination of its
+        Contributions with other software (except as part of its Contributor
+        Version); or
+
+     c. under Patent Claims infringed by Covered Software in the absence of
+        its Contributions.
+
+     This License does not grant any rights in the trademarks, service marks,
+     or logos of any Contributor (except as may be necessary to comply with
+     the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+     No Contributor makes additional grants as a result of Your choice to
+     distribute the Covered Software under a subsequent version of this
+     License (see Section 10.2) or under the terms of a Secondary License (if
+     permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+     Each Contributor represents that the Contributor believes its
+     Contributions are its original creation(s) or it has sufficient rights to
+     grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+     This License is not intended to limit any rights You have under
+     applicable copyright doctrines of fair use, fair dealing, or other
+     equivalents.
+
+2.7. Conditions
+
+     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
+     Section 2.1.
+
+
+3. Responsibilities
+
+3.1. Distribution of Source Form
+
+     All distribution of Covered Software in Source Code Form, including any
+     Modifications that You create or to which You contribute, must be under
+     the terms of this License. You must inform recipients that the Source
+     Code Form of the Covered Software is governed by the terms of this
+     License, and how they can obtain a copy of this License. You may not
+     attempt to alter or restrict the recipients' rights in the Source Code
+     Form.
+
+3.2. Distribution of Executable Form
+
+     If You distribute Covered Software in Executable Form then:
+
+     a. such Covered Software must also be made available in Source Code Form,
+        as described in Section 3.1, and You must inform recipients of the
+        Executable Form how they can obtain a copy of such Source Code Form by
+        reasonable means in a timely manner, at a charge no more than the cost
+        of distribution to the recipient; and
+
+     b. You may distribute such Executable Form under the terms of this
+        License, or sublicense it under different terms, provided that the
+        license for the Executable Form does not attempt to limit or alter the
+        recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+     You may create and distribute a Larger Work under terms of Your choice,
+     provided that You also comply with the requirements of this License for
+     the Covered Software. If the Larger Work is a combination of Covered
+     Software with a work governed by one or more Secondary Licenses, and the
+     Covered Software is not Incompatible With Secondary Licenses, this
+     License permits You to additionally distribute such Covered Software
+     under the terms of such Secondary License(s), so that the recipient of
+     the Larger Work may, at their option, further distribute the Covered
+     Software under the terms of either this License or such Secondary
+     License(s).
+
+3.4. Notices
+
+     You may not remove or alter the substance of any license notices
+     (including copyright notices, patent notices, disclaimers of warranty, or
+     limitations of liability) contained within the Source Code Form of the
+     Covered Software, except that You may alter any license notices to the
+     extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+     You may choose to offer, and to charge a fee for, warranty, support,
+     indemnity or liability obligations to one or more recipients of Covered
+     Software. However, You may do so only on Your own behalf, and not on
+     behalf of any Contributor. You must make it absolutely clear that any
+     such warranty, support, indemnity, or liability obligation is offered by
+     You alone, and You hereby agree to indemnify every Contributor for any
+     liability incurred by such Contributor as a result of warranty, support,
+     indemnity or liability terms You offer. You may include additional
+     disclaimers of warranty and limitations of liability specific to any
+     jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+
+   If it is impossible for You to comply with any of the terms of this License
+   with respect to some or all of the Covered Software due to statute,
+   judicial order, or regulation then You must: (a) comply with the terms of
+   this License to the maximum extent possible; and (b) describe the
+   limitations and the code they affect. Such description must be placed in a
+   text file included with all distributions of the Covered Software under
+   this License. Except to the extent prohibited by statute or regulation,
+   such description must be sufficiently detailed for a recipient of ordinary
+   skill to be able to understand it.
+
+5. Termination
+
+5.1. The rights granted under this License will terminate automatically if You
+     fail to comply with any of its terms. However, if You become compliant,
+     then the rights granted under this License from a particular Contributor
+     are reinstated (a) provisionally, unless and until such Contributor
+     explicitly and finally terminates Your grants, and (b) on an ongoing
+     basis, if such Contributor fails to notify You of the non-compliance by
+     some reasonable means prior to 60 days after You have come back into
+     compliance. Moreover, Your grants from a particular Contributor are
+     reinstated on an ongoing basis if such Contributor notifies You of the
+     non-compliance by some reasonable means, this is the first time You have
+     received notice of non-compliance with this License from such
+     Contributor, and You become compliant prior to 30 days after Your receipt
+     of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+     infringement claim (excluding declaratory judgment actions,
+     counter-claims, and cross-claims) alleging that a Contributor Version
+     directly or indirectly infringes any patent, then the rights granted to
+     You by any and all Contributors for the Covered Software under Section
+     2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
+     license agreements (excluding distributors and resellers) which have been
+     validly granted by You or Your distributors under this License prior to
+     termination shall survive termination.
+
+6. Disclaimer of Warranty
+
+   Covered Software is provided under this License on an "as is" basis,
+   without warranty of any kind, either expressed, implied, or statutory,
+   including, without limitation, warranties that the Covered Software is free
+   of defects, merchantable, fit for a particular purpose or non-infringing.
+   The entire risk as to the quality and performance of the Covered Software
+   is with You. Should any Covered Software prove defective in any respect,
+   You (not any Contributor) assume the cost of any necessary servicing,
+   repair, or correction. This disclaimer of warranty constitutes an essential
+   part of this License. No use of  any Covered Software is authorized under
+   this License except under this disclaimer.
+
+7. Limitation of Liability
+
+   Under no circumstances and under no legal theory, whether tort (including
+   negligence), contract, or otherwise, shall any Contributor, or anyone who
+   distributes Covered Software as permitted above, be liable to You for any
+   direct, indirect, special, incidental, or consequential damages of any
+   character including, without limitation, damages for lost profits, loss of
+   goodwill, work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses, even if such party shall have been
+   informed of the possibility of such damages. This limitation of liability
+   shall not apply to liability for death or personal injury resulting from
+   such party's negligence to the extent applicable law prohibits such
+   limitation. Some jurisdictions do not allow the exclusion or limitation of
+   incidental or consequential damages, so this exclusion and limitation may
+   not apply to You.
+
+8. Litigation
+
+   Any litigation relating to this License may be brought only in the courts
+   of a jurisdiction where the defendant maintains its principal place of
+   business and such litigation shall be governed by laws of that
+   jurisdiction, without reference to its conflict-of-law provisions. Nothing
+   in this Section shall prevent a party's ability to bring cross-claims or
+   counter-claims.
+
+9. Miscellaneous
+
+   This License represents the complete agreement concerning the subject
+   matter hereof. If any provision of this License is held to be
+   unenforceable, such provision shall be reformed only to the extent
+   necessary to make it enforceable. Any law or regulation which provides that
+   the language of a contract shall be construed against the drafter shall not
+   be used to construe this License against a Contributor.
+
+
+10. Versions of the License
+
+10.1. New Versions
+
+      Mozilla Foundation is the license steward. Except as provided in Section
+      10.3, no one other than the license steward has the right to modify or
+      publish new versions of this License. Each version will be given a
+      distinguishing version number.
+
+10.2. Effect of New Versions
+
+      You may distribute the Covered Software under the terms of the version
+      of the License under which You originally received the Covered Software,
+      or under the terms of any subsequent version published by the license
+      steward.
+
+10.3. Modified Versions
+
+      If you create software not governed by this License, and you want to
+      create a new license for such software, you may create and use a
+      modified version of this License if you rename the license and remove
+      any references to the name of the license steward (except to note that
+      such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+      Licenses If You choose to distribute Source Code Form that is
+      Incompatible With Secondary Licenses under the terms of this version of
+      the License, the notice described in Exhibit B of this License must be
+      attached.
+
+Exhibit A - Source Code Form License Notice
+
+      This Source Code Form is subject to the
+      terms of the Mozilla Public License, v.
+      2.0. If a copy of the MPL was not
+      distributed with this file, You can
+      obtain one at
+      http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular file,
+then You may include the notice in a location (such as a LICENSE file in a
+relevant directory) where a recipient would be likely to look for such a
+notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+
+      This Source Code Form is "Incompatible
+      With Secondary Licenses", as defined by
+      the Mozilla Public License, v. 2.0.

+ 5 - 0
Wiki/README.md

@@ -0,0 +1,5 @@
+# Civ14 Wiki
+
+This is based on [SS14's wiki](https://docs.spacestation14.com/), using [mdBook](https://rust-lang.github.io/mdBook/). The licence is the same, [Mozilla Public License, version 2.0](LICENSE).
+
+It automatically builds on pushing to the master branch of [https://github.com/civ13/civ14](https://github.com/civ13/civ14).

+ 45 - 0
Wiki/book.toml

@@ -0,0 +1,45 @@
+[book]
+authors = ["Civilization 13 Team"]
+language = "en"
+multilingual = false
+src = "src"
+title = "Civilization 14 Wiki"
+description = "Guides and information regarding Civ14, a historic strategy game based on SS14."
+
+[preprocessor.admonish]
+assets_version = "3.0.1" # do not edit: managed by `mdbook-admonish install`
+command = "mdbook-admonish"
+
+[preprocessor.emojicodes]
+
+[preprocessor.template]
+before = ["admonish","emojicodes"] # templates can include these so we run this first
+
+[preprocessor.embedify]
+
+[output.html]
+additional-js = ['scripts/nav-additions.js']
+additional-css = ['theme/compiled/ss14.css']
+default-theme = "navy"
+preferred-dark-theme = "navy"
+
+git-repository-url = "https://github.com/civ13/civ14"
+edit-url-template = "https://github.com/civ13/civ14/blob/master/Wiki/{path}"
+
+mathjax-support = true
+smart-punctuation = true
+no-section-label = true
+
+[output.html.print]
+enable = false
+
+[output.html.fold]
+enable = true
+level = 1
+
+[output.html.playground]
+runnable = false # sorry we arent rustpilled :(
+
+[output.linkcheck]
+traverse-parent-directories = true
+warning-policy = "ignore" # false-positives like hell with absolute links & latex, so.. cant do

BIN
Wiki/mdbook-admonish.exe


BIN
Wiki/mdbook-embedify.exe


BIN
Wiki/mdbook-emojicodes.exe


BIN
Wiki/mdbook-linkcheck.exe


BIN
Wiki/mdbook-template.exe


BIN
Wiki/mdbook.exe


+ 100 - 0
Wiki/scripts/nav-additions.js

@@ -0,0 +1,100 @@
+// Un-active everything when you click it
+Array.prototype.forEach.call(document.getElementsByClassName("pagetoc")[0].children, function(el) {
+    el.addEventHandler("click", function() {
+        Array.prototype.forEach.call(document.getElementsByClassName("pagetoc")[0].children, function(el) {
+            el.classList.remove("active");
+        });
+        el.classList.add("active");
+    });
+});
+
+var updateFunction = function() {
+
+    var id;
+    var elements = document.getElementsByClassName("header");
+    Array.prototype.forEach.call(elements, function(el) {
+        if (window.pageYOffset >= el.offsetTop) {
+            id = el;
+        }
+    });
+
+    Array.prototype.forEach.call(document.getElementsByClassName("pagetoc")[0].children, function(el) {
+        el.classList.remove("active");
+    });
+
+    if (id == undefined)
+        return;
+
+    Array.prototype.forEach.call(document.getElementsByClassName("pagetoc")[0].children, function(el) {
+        if (id.href.localeCompare(el.href) == 0) {
+            el.classList.add("active");
+        }
+    });
+};
+
+window.addEventListener('load', function() {
+
+    /* Scroll the page index on the left to the current active page */
+    var active = document.querySelector(".chapter li a.active");
+    active.scrollIntoView({ behavior: "instant", block: "center", inline: "nearest" });
+
+    /* Populate subpage footer */
+
+    /* Get next sibling of active list element
+       then check if it has a nested ol
+       if so, this implies our current active element has nested subpages */
+    var nextListEl = active.parentElement.nextElementSibling;
+    var footer = document.getElementById("subpage-footer");
+    footer.style.display = "none";
+    if (nextListEl != null)
+    {
+        console.log(nextListEl);
+        var list = nextListEl.querySelector(".section")
+        if (list != null)
+        {
+            footer.style.display = "block";
+            footer.appendChild(list.cloneNode(true));
+        }
+    }
+
+    /* Populate pagetoc sidebar */
+
+    var pagetoc = document.getElementsByClassName("pagetoc")[0];
+    var elements = document.getElementsByClassName("header");
+    // don't show pagetoc sidebar with less than 2 headers
+    if (elements.length < 2)
+        return;
+
+    Array.prototype.forEach.call(elements, function(el) {
+        var link = document.createElement("a");
+
+        // Indent shows hierarchy
+        var indent = "";
+        switch (el.parentElement.tagName) {
+            case "H2":
+                indent = "20px";
+                break;
+            case "H3":
+                indent = "40px";
+                break;
+            case "H4":
+                indent = "60px";
+                break;
+            case "H5":
+                indent = "80px";
+            default:
+                break;
+        }
+
+        link.appendChild(document.createTextNode(el.text));
+        link.style.paddingLeft = indent;
+        link.href = el.href;
+        pagetoc.appendChild(link);
+    });
+    updateFunction.call();
+});
+
+
+
+// Handle active elements on scroll
+window.addEventListener("scroll", updateFunction);

+ 7 - 0
Wiki/scss/main.scss

@@ -0,0 +1,7 @@
+// Build with
+// sass ./scss/main.scss ./theme/compiled/ss14.css
+// Get sass with "npm install -g sass"
+
+@use "ss14";
+@use "mdbook-admonish";
+@use "nav-style";

+ 345 - 0
Wiki/scss/mdbook-admonish.css

@@ -0,0 +1,345 @@
+@charset "UTF-8";
+:root {
+  --md-admonition-icon--admonish-note: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z'/></svg>");
+  --md-admonition-icon--admonish-abstract: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M17 9H7V7h10m0 6H7v-2h10m-3 6H7v-2h7M12 3a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z'/></svg>");
+  --md-admonition-icon--admonish-info: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2z'/></svg>");
+  --md-admonition-icon--admonish-tip: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M17.66 11.2c-.23-.3-.51-.56-.77-.82-.67-.6-1.43-1.03-2.07-1.66C13.33 7.26 13 4.85 13.95 3c-.95.23-1.78.75-2.49 1.32-2.59 2.08-3.61 5.75-2.39 8.9.04.1.08.2.08.33 0 .22-.15.42-.35.5-.23.1-.47.04-.66-.12a.58.58 0 0 1-.14-.17c-1.13-1.43-1.31-3.48-.55-5.12C5.78 10 4.87 12.3 5 14.47c.06.5.12 1 .29 1.5.14.6.41 1.2.71 1.73 1.08 1.73 2.95 2.97 4.96 3.22 2.14.27 4.43-.12 6.07-1.6 1.83-1.66 2.47-4.32 1.53-6.6l-.13-.26c-.21-.46-.77-1.26-.77-1.26m-3.16 6.3c-.28.24-.74.5-1.1.6-1.12.4-2.24-.16-2.9-.82 1.19-.28 1.9-1.16 2.11-2.05.17-.8-.15-1.46-.28-2.23-.12-.74-.1-1.37.17-2.06.19.38.39.76.63 1.06.77 1 1.98 1.44 2.24 2.8.04.14.06.28.06.43.03.82-.33 1.72-.93 2.27z'/></svg>");
+  --md-admonition-icon--admonish-success: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='m9 20.42-6.21-6.21 2.83-2.83L9 14.77l9.88-9.89 2.83 2.83L9 20.42z'/></svg>");
+  --md-admonition-icon--admonish-question: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='m15.07 11.25-.9.92C13.45 12.89 13 13.5 13 15h-2v-.5c0-1.11.45-2.11 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41a2 2 0 0 0-2-2 2 2 0 0 0-2 2H8a4 4 0 0 1 4-4 4 4 0 0 1 4 4 3.2 3.2 0 0 1-.93 2.25M13 19h-2v-2h2M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10c0-5.53-4.5-10-10-10z'/></svg>");
+  --md-admonition-icon--admonish-warning: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M13 14h-2V9h2m0 9h-2v-2h2M1 21h22L12 2 1 21z'/></svg>");
+  --md-admonition-icon--admonish-failure: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20 6.91 17.09 4 12 9.09 6.91 4 4 6.91 9.09 12 4 17.09 6.91 20 12 14.91 17.09 20 20 17.09 14.91 12 20 6.91z'/></svg>");
+  --md-admonition-icon--admonish-danger: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M11 15H6l7-14v8h5l-7 14v-8z'/></svg>");
+  --md-admonition-icon--admonish-bug: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a5.985 5.985 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6.002 6.002 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8z'/></svg>");
+  --md-admonition-icon--admonish-example: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M7 13v-2h14v2H7m0 6v-2h14v2H7M7 7V5h14v2H7M3 8V5H2V4h2v4H3m-1 9v-1h3v4H2v-1h2v-.5H3v-1h1V17H2m2.25-7a.75.75 0 0 1 .75.75c0 .2-.08.39-.21.52L3.12 13H5v1H2v-.92L4 11H2v-1h2.25z'/></svg>");
+  --md-admonition-icon--admonish-quote: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M14 17h3l2-4V7h-6v6h3M6 17h3l2-4V7H5v6h3l-2 4z'/></svg>");
+  --md-details-icon: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42Z'/></svg>");
+}
+
+:is(.admonition) {
+  display: flow-root;
+  margin: 1.5625em 0;
+  padding: 0 1.2rem;
+  color: var(--fg);
+  page-break-inside: avoid;
+  background-color: var(--bg);
+  border: 0 solid black;
+  border-inline-start-width: 0.4rem;
+  border-radius: 0.2rem;
+  box-shadow: 0 0.2rem 1rem rgba(0, 0, 0, 0.05), 0 0 0.1rem rgba(0, 0, 0, 0.1);
+}
+@media print {
+  :is(.admonition) {
+    box-shadow: none;
+  }
+}
+:is(.admonition) > * {
+  box-sizing: border-box;
+}
+:is(.admonition) :is(.admonition) {
+  margin-top: 1em;
+  margin-bottom: 1em;
+}
+:is(.admonition) > .tabbed-set:only-child {
+  margin-top: 0;
+}
+html :is(.admonition) > :last-child {
+  margin-bottom: 1.2rem;
+}
+
+a.admonition-anchor-link {
+  display: none;
+  position: absolute;
+  left: -1.2rem;
+  padding-right: 1rem;
+}
+a.admonition-anchor-link:link, a.admonition-anchor-link:visited {
+  color: var(--fg);
+}
+a.admonition-anchor-link:link:hover, a.admonition-anchor-link:visited:hover {
+  text-decoration: none;
+}
+a.admonition-anchor-link::before {
+  content: "§";
+}
+
+:is(.admonition-title, summary.admonition-title) {
+  position: relative;
+  min-height: 4rem;
+  margin-block: 0;
+  margin-inline: -1.6rem -1.2rem;
+  padding-block: 0.8rem;
+  padding-inline: 4.4rem 1.2rem;
+  font-weight: 700;
+  background-color: rgba(68, 138, 255, 0.1);
+  print-color-adjust: exact;
+  -webkit-print-color-adjust: exact;
+  display: flex;
+}
+:is(.admonition-title, summary.admonition-title) p {
+  margin: 0;
+}
+html :is(.admonition-title, summary.admonition-title):last-child {
+  margin-bottom: 0;
+}
+:is(.admonition-title, summary.admonition-title)::before {
+  position: absolute;
+  top: 0.625em;
+  inset-inline-start: 1.6rem;
+  width: 2rem;
+  height: 2rem;
+  background-color: #448aff;
+  print-color-adjust: exact;
+  -webkit-print-color-adjust: exact;
+  mask-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>');
+  -webkit-mask-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>');
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-size: contain;
+  content: "";
+}
+:is(.admonition-title, summary.admonition-title):hover a.admonition-anchor-link {
+  display: initial;
+}
+
+details.admonition > summary.admonition-title::after {
+  position: absolute;
+  top: 0.625em;
+  inset-inline-end: 1.6rem;
+  height: 2rem;
+  width: 2rem;
+  background-color: currentcolor;
+  mask-image: var(--md-details-icon);
+  -webkit-mask-image: var(--md-details-icon);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-size: contain;
+  content: "";
+  transform: rotate(0deg);
+  transition: transform 0.25s;
+}
+details[open].admonition > summary.admonition-title::after {
+  transform: rotate(90deg);
+}
+
+:is(.admonition):is(.admonish-note) {
+  border-color: #448aff;
+}
+
+:is(.admonish-note) > :is(.admonition-title, summary.admonition-title) {
+  background-color: rgba(68, 138, 255, 0.1);
+}
+:is(.admonish-note) > :is(.admonition-title, summary.admonition-title)::before {
+  background-color: #448aff;
+  mask-image: var(--md-admonition-icon--admonish-note);
+  -webkit-mask-image: var(--md-admonition-icon--admonish-note);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-abstract, .admonish-summary, .admonish-tldr) {
+  border-color: #00b0ff;
+}
+
+:is(.admonish-abstract, .admonish-summary, .admonish-tldr) > :is(.admonition-title, summary.admonition-title) {
+  background-color: rgba(0, 176, 255, 0.1);
+}
+:is(.admonish-abstract, .admonish-summary, .admonish-tldr) > :is(.admonition-title, summary.admonition-title)::before {
+  background-color: #00b0ff;
+  mask-image: var(--md-admonition-icon--admonish-abstract);
+  -webkit-mask-image: var(--md-admonition-icon--admonish-abstract);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-info, .admonish-todo) {
+  border-color: #00b8d4;
+}
+
+:is(.admonish-info, .admonish-todo) > :is(.admonition-title, summary.admonition-title) {
+  background-color: rgba(0, 184, 212, 0.1);
+}
+:is(.admonish-info, .admonish-todo) > :is(.admonition-title, summary.admonition-title)::before {
+  background-color: #00b8d4;
+  mask-image: var(--md-admonition-icon--admonish-info);
+  -webkit-mask-image: var(--md-admonition-icon--admonish-info);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-tip, .admonish-hint, .admonish-important) {
+  border-color: #00bfa5;
+}
+
+:is(.admonish-tip, .admonish-hint, .admonish-important) > :is(.admonition-title, summary.admonition-title) {
+  background-color: rgba(0, 191, 165, 0.1);
+}
+:is(.admonish-tip, .admonish-hint, .admonish-important) > :is(.admonition-title, summary.admonition-title)::before {
+  background-color: #00bfa5;
+  mask-image: var(--md-admonition-icon--admonish-tip);
+  -webkit-mask-image: var(--md-admonition-icon--admonish-tip);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-success, .admonish-check, .admonish-done) {
+  border-color: #00c853;
+}
+
+:is(.admonish-success, .admonish-check, .admonish-done) > :is(.admonition-title, summary.admonition-title) {
+  background-color: rgba(0, 200, 83, 0.1);
+}
+:is(.admonish-success, .admonish-check, .admonish-done) > :is(.admonition-title, summary.admonition-title)::before {
+  background-color: #00c853;
+  mask-image: var(--md-admonition-icon--admonish-success);
+  -webkit-mask-image: var(--md-admonition-icon--admonish-success);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-question, .admonish-help, .admonish-faq) {
+  border-color: #64dd17;
+}
+
+:is(.admonish-question, .admonish-help, .admonish-faq) > :is(.admonition-title, summary.admonition-title) {
+  background-color: rgba(100, 221, 23, 0.1);
+}
+:is(.admonish-question, .admonish-help, .admonish-faq) > :is(.admonition-title, summary.admonition-title)::before {
+  background-color: #64dd17;
+  mask-image: var(--md-admonition-icon--admonish-question);
+  -webkit-mask-image: var(--md-admonition-icon--admonish-question);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-warning, .admonish-caution, .admonish-attention) {
+  border-color: #ff9100;
+}
+
+:is(.admonish-warning, .admonish-caution, .admonish-attention) > :is(.admonition-title, summary.admonition-title) {
+  background-color: rgba(255, 145, 0, 0.1);
+}
+:is(.admonish-warning, .admonish-caution, .admonish-attention) > :is(.admonition-title, summary.admonition-title)::before {
+  background-color: #ff9100;
+  mask-image: var(--md-admonition-icon--admonish-warning);
+  -webkit-mask-image: var(--md-admonition-icon--admonish-warning);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-failure, .admonish-fail, .admonish-missing) {
+  border-color: #ff5252;
+}
+
+:is(.admonish-failure, .admonish-fail, .admonish-missing) > :is(.admonition-title, summary.admonition-title) {
+  background-color: rgba(255, 82, 82, 0.1);
+}
+:is(.admonish-failure, .admonish-fail, .admonish-missing) > :is(.admonition-title, summary.admonition-title)::before {
+  background-color: #ff5252;
+  mask-image: var(--md-admonition-icon--admonish-failure);
+  -webkit-mask-image: var(--md-admonition-icon--admonish-failure);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-danger, .admonish-error) {
+  border-color: #ff1744;
+}
+
+:is(.admonish-danger, .admonish-error) > :is(.admonition-title, summary.admonition-title) {
+  background-color: rgba(255, 23, 68, 0.1);
+}
+:is(.admonish-danger, .admonish-error) > :is(.admonition-title, summary.admonition-title)::before {
+  background-color: #ff1744;
+  mask-image: var(--md-admonition-icon--admonish-danger);
+  -webkit-mask-image: var(--md-admonition-icon--admonish-danger);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-bug) {
+  border-color: #f50057;
+}
+
+:is(.admonish-bug) > :is(.admonition-title, summary.admonition-title) {
+  background-color: rgba(245, 0, 87, 0.1);
+}
+:is(.admonish-bug) > :is(.admonition-title, summary.admonition-title)::before {
+  background-color: #f50057;
+  mask-image: var(--md-admonition-icon--admonish-bug);
+  -webkit-mask-image: var(--md-admonition-icon--admonish-bug);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-example) {
+  border-color: #7c4dff;
+}
+
+:is(.admonish-example) > :is(.admonition-title, summary.admonition-title) {
+  background-color: rgba(124, 77, 255, 0.1);
+}
+:is(.admonish-example) > :is(.admonition-title, summary.admonition-title)::before {
+  background-color: #7c4dff;
+  mask-image: var(--md-admonition-icon--admonish-example);
+  -webkit-mask-image: var(--md-admonition-icon--admonish-example);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-quote, .admonish-cite) {
+  border-color: #9e9e9e;
+}
+
+:is(.admonish-quote, .admonish-cite) > :is(.admonition-title, summary.admonition-title) {
+  background-color: rgba(158, 158, 158, 0.1);
+}
+:is(.admonish-quote, .admonish-cite) > :is(.admonition-title, summary.admonition-title)::before {
+  background-color: #9e9e9e;
+  mask-image: var(--md-admonition-icon--admonish-quote);
+  -webkit-mask-image: var(--md-admonition-icon--admonish-quote);
+  mask-repeat: no-repeat;
+  -webkit-mask-repeat: no-repeat;
+  mask-size: contain;
+  -webkit-mask-repeat: no-repeat;
+}
+
+.navy :is(.admonition) {
+  background-color: var(--sidebar-bg);
+}
+
+.ayu :is(.admonition),
+.coal :is(.admonition) {
+  background-color: var(--theme-hover);
+}
+
+.rust :is(.admonition) {
+  background-color: var(--sidebar-bg);
+  color: var(--sidebar-fg);
+}
+.rust .admonition-anchor-link:link, .rust .admonition-anchor-link:visited {
+  color: var(--sidebar-fg);
+}

+ 89 - 0
Wiki/scss/nav-style.css

@@ -0,0 +1,89 @@
+/* Styling for the subpage footer & sidebar toc */
+
+@media only screen and (max-width:1365px) {
+    .sidetoc {
+        display: none;
+    }
+}
+
+@media only screen and (min-width:1366px) {
+    main {
+        position: relative;
+    }
+    .sidetoc {
+        margin-left: auto;
+        margin-right: auto;
+        left: calc(100% + (var(--content-max-width))/4 - 140px);
+        position: absolute;
+    }
+    .pagetoc {
+        position: fixed;
+        width: 300px;
+        height: calc(100vh - var(--menu-bar-height) - 0.67em * 4);
+        overflow: auto;
+    }
+    .pagetoc a {
+        border-left: 1px solid var(--sidebar-bg);
+        color: var(--fg) !important;
+        display: block;
+        padding-bottom: 5px;
+        padding-top: 5px;
+        padding-left: 10px;
+        text-align: left;
+        text-decoration: none;
+    }
+    .pagetoc a:hover,
+    .pagetoc a.active {
+        background: var(--sidebar-bg);
+        color: var(--sidebar-fg) !important;
+    }
+    .pagetoc .active {
+        background: var(--sidebar-bg);
+        color: var(--sidebar-fg);
+    }
+}
+
+@media only screen and (min-width: 1366px) {
+    #subpage-footer {
+        margin-left: 200px;
+    }
+} 
+
+#subpage-footer {
+    max-width: 400px;
+    margin-top: 100px;
+    color: var(--fg) !important;
+    display: block;
+}
+
+#subpage-footer > p {
+    line-height: 1.0em;
+}
+
+#subpage-footer > ol {
+    list-style: none outside none;
+    padding-left: 20px;
+    line-height: 1.6em;
+    border-top: 1px solid var(--sidebar-spacer);
+    padding-top: 10px;
+}
+
+#subpage-footer ol > li.chapter-item {
+    display: flex;
+}
+
+#subpage-footer a.toggle {
+    display: block;
+    margin-left: auto;
+    padding-left: 20px;
+    opacity: 0.68;
+}
+
+@media print {
+    .sidetoc {
+        display: none;
+    }
+    #subpage-footer {
+        display: none;
+    }
+}

+ 81 - 0
Wiki/scss/ss14.css

@@ -0,0 +1,81 @@
+/* Custom styles for SS14 docs
+
+
+/* allow wider content since no navvybar buttons */
+:root {
+    --content-max-width: 850px;
+    --sidebar-active: #e23229;
+}
+
+/* title text on top of every page */
+.menu-title {
+    color: #e23229;
+}
+
+@media only screen and (min-width: 1366px) {
+    .content>main {
+        /* navbar button was basically a margin left but dont have that no more so */
+        margin-left: 200px;
+    }
+} 
+
+/*   Mostly stolen from the Rhai book (rhai.rs) theme */
+.part-title {
+    font-size: 150%;
+    font-variant-caps: small-caps;
+}
+
+/* lets get a little more compact */
+.chapter li.chapter-item {
+    margin-top: 0.45em;
+}
+
+.chapter>.chapter-item {
+    padding-left: 10px;
+}
+
+.chapter>.chapter-item:first-child {
+    font-weight: bold;
+    font-size: 200%;
+    font-variant-caps: small-caps;
+    padding-left: 0px;
+}
+
+/* bigger buttons for discoverability */ 
+.right-buttons > a > i {
+    font-size: 200%;
+}
+
+.left-buttons > button > i {
+    font-size: 200%;
+}
+
+td>ol,
+td>ul {
+    margin: 0;
+    padding: 0;
+    padding-left: inherit;
+}
+
+main h2, h3 {
+    margin-top: 1.25em;
+    border-bottom: 1px solid var(--sidebar-spacer);
+    padding-bottom: 5px;
+}
+
+main h1 {
+    border-bottom: 3px solid var(--sidebar-spacer);
+    padding-bottom: 7px;
+}
+
+main>section,
+main>pre,
+main h1,
+main h2,
+main h3 {
+    clear: both;
+}
+
+.navy code {
+    background: #0f0f12 !important;
+}

+ 3 - 0
Wiki/src/404.md

@@ -0,0 +1,3 @@
+# 404 - Page not found
+
+We couldn't find the page you're looking for, sorry... (try the search above or file an issue!)

+ 18 - 19
Civ14-Wiki/navigation.md → Wiki/src/SUMMARY.md

@@ -1,16 +1,20 @@
-# Civ14 Wiki
+Civilization 14 Wiki
+=====================
+-   [Main Page](index.md)
 
-[Rules](rules/rules.md)
-[How to Play](guides/playing.md)
+Meta
+====
 
-[Gamemodes]()
+----------------------
 
--   [Nomads](gamemodes/nomads.md)
--   [TDM](gamemodes/tdm.md)
--   [Art of the Deal](gamemodes/aotd.md)
+-   [Rules](rules/rules.md)
+-   [How to Play](guides/playing.md)
+-   [Editing the Wiki](contributing.md)
 
-[Guides]()
+Guides
+======
 
+----------------------
 -   [Starter Guide](guides/starter_guide.md)
 -   [Farming](guides/guide_to_farming.md)
 -   [Construction](guides/guide_to_construction.md)
@@ -19,15 +23,10 @@
 -   [Medical](guides/guide_to_medical.md)
 -   [Combat](guides/guide_to_combat.md)
 
-[Links]()
-
--   [Discord](https://discord.gg/hBEtg4x)
--   [Github](https://github.com/civ13/civ14)
-
-<!-- set a default theme -->
+Gamemodes
+=========
 
-[gimmick:theme (inverse: false)](cyborg)
-
-<!-- show a theme chooser in the menu bar -->
-
-[gimmick:ThemeChooser](Theme)
+----------------------
+-   [Nomads](gamemodes/nomads.md)
+-   [TDM](gamemodes/tdm.md)
+-   [Art of the Deal](gamemodes/aotd.md)

+ 32 - 0
Wiki/src/contributing.md

@@ -0,0 +1,32 @@
+# Contributing to the Wiki
+
+This wiki is hosted and deployed on GitHub from the main [Civ14 repository](https://github.com/Civ13/Civ14). To contribute, you will need to do it through there. Check below for guidance according to your skill level:
+
+## I am barely sentient
+
+1. Access the Civ14 repository [here](https://github.com/Civ13/Civ14). Create a GitHub account if you haven't already. Then, press the Fork button on the top right. this will create a copy of the game files on your account.
+
+    ![fork button](images/meta-forking.png)
+
+2. Go to your repositories, open `Civ14`, and open the `Wiki` folder. You will see a bunch of .md files. Edit them through GitHub. Use [markdown](https://www.markdownguide.org/).
+
+    ![edit page](images/meta-edit-file.png)
+
+3. When done, create a pull request on your repository to the Civ14 repository. You will figure this out.
+
+```admonish note
+If this still sounds too complicated, you are probably not qualified enough to write a wiki article anyway.
+```
+
+## I understand GitHub
+
+1. Fork the Civ14 repository. Go on GitHub desktop and clone your fork into your computer.
+2. Open the `Wiki/` folder and edit the markdown files. Create new ones if needed. Do not forget to add them to the SUMMARY.md file under the right section!
+3. You can run the included `mdbook.exe` in the command line to preview the changes locally. Run it as `./mdbook.exe build`, then open `book/index.html` to view. You can run `./mdbook.exe watch` to enable it to automatically update while you make changes.
+4. Commit and pull request to the main repository.
+
+## Best Practices
+
+-   You can add your screenshots to the `images` folder and reference them on the md files. You can also directly use sprites from the game by using GitHub links like `https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/<someimage.png>`.
+
+-   Avoid using HTML where possible.

+ 5 - 0
Wiki/src/gamemodes/aotd.md

@@ -0,0 +1,5 @@
+# The Art of the Deal (AOTD)
+
+```admonish note
+This gamemode has not been implemented yet! You can check the Civ13 guide [here](https://civ13.github.io/civ13-wiki/The_Art_of_the_Deal).
+```

+ 4 - 2
Civ14-Wiki/gamemodes/nomads.md → Wiki/src/gamemodes/nomads.md

@@ -1,6 +1,8 @@
 # Nomads
 
-**Tip: If this is your first time playing, you should probably check the [starter guide](starter_guide.md) as well.**
+```adminish tip
+If this is your first time playing, you should probably check the [starter guide](./../guides/starter_guide.md) as well.
+```
 
 ## What is the Nomads mode?
 
@@ -52,7 +54,7 @@ Each map has either a single biome or several different ones.
 
 There are seasons of the year, effects of which are different in every biome. Some biomes have four seasons, while others have only two.
 
-On large maps with multiple biomes each biome has its own list of plants that could be grown there. Many plants also grow only in certain seasons. See the **[Guide to Farming](guide_to_farming.md)**.
+On large maps with multiple biomes each biome has its own list of plants that could be grown there. Many plants also grow only in certain seasons. See the **[Guide to Farming](./../guides/guide_to_farming.md)**.
 
 To determine the biome you are in, read the descriptions below and look at your surroundings. Looking at the map of **[Pangea](https://civ13.github.io/civ13-wiki/assets/images/map_pangea.png)** that has almost every biome may also help. From top to bottom: Tundra, Taiga (roughly the southern half of the snowed area, before the northern mountains), Temperate, Semi-Arid, Desert, Savanna, Jungle. The only biome missing is Sea.
 

+ 0 - 0
Civ14-Wiki/gamemodes/tdm.md → Wiki/src/gamemodes/tdm.md


+ 0 - 0
Civ14-Wiki/guides/guide_to_combat.md → Wiki/src/guides/guide_to_combat.md


+ 0 - 0
Civ14-Wiki/guides/guide_to_construction.md → Wiki/src/guides/guide_to_construction.md


+ 0 - 0
Civ14-Wiki/guides/guide_to_crafting.md → Wiki/src/guides/guide_to_crafting.md


+ 65 - 0
Wiki/src/guides/guide_to_farming.md

@@ -0,0 +1,65 @@
+# Guide to Farming
+
+```admonish warning
+This guide was originally written for Civ13, and as such might not fully reflect the actual gameplay of Civ14.
+```
+
+Being a grower of crops is an important role. You farm both food and cash crops. Growing food is vital for a nation to increase in wealth and power.
+
+## Tools
+
+To farm, you will require some basic tools.
+
+![knife](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Objects/Weapons/Melee/kitchen_knife.rsi/icon.png)
+**Knife**
+Used for harvesting crops. Can be made out of lots of different materials, such as bone and stone.
+
+![plough](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Objects/items.rsi/plough.png)
+**Plough**
+A plough is made out of wood and used to plough fields for farming! Used once on the grass and once on the dirt underneath the grass. You can also plough snowy dirt and flooded plains dirt (found along the jungle rivers). In case of snowy grass, you will have to shovel the snow first. Lastly, there are places where you cannot plough: infertile soil, permafrost etc. You can also make an iron plough out of iron ingots to plough land faster.
+
+![seeds](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Objects/Farming/seeds.rsi/seeds_old.png)
+**Seeds**
+Some sort of seeds to plant and grow. You may find seeds simply lying on the ground, but you can also collect them in the wilderness by using any type of knife on bushes and small bushes.
+
+![hoe](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Objects/Tools/Hydroponics/hoe.rsi/icon.png)
+**Hoe**
+Helps remove those nasty weeds. Essential to prevent premature plant death.
+
+Just plough a plot of land by yourself with the **plough** tool. Add water and nutrient. Then wait for the plant to grow, keeping an eye on water and nutrient levels.
+
+## Watering
+
+Plants need water, some more, others less. Weather conditions and
+climate also affect the crops in this regard. Each crop has a maximum water level when planted.
+
+Normally, the water level decreases at the rate of approximately 15 per minute (depends on the plant), and when it reaches zero, the plants wither away.
+
+There are a few ways to provide the crops with water:
+
+-   Plough land within two tiles of fresh water, which is any water, except for the saltwater. The plants will have all the water they need without any extra labor.
+
+-   Water the plants manually. Bring the fresh water in buckets and barrels and splash it on the ploughed field (the ground, not the plant).
+
+-   Pray for the eternal rain. Rain will water the fields (at the rate of 20 per minute), but may create other inconveniences.
+
+## Soil Nutrition
+
+The soil, as in real life, has its level of nutrition. The plants that you plant in the soil will consume its nutrition little by little, until it reaches zero. This varies by plant, but is approximately 15-20 units per minute.
+
+A freshly ploughed tile will have a nutrition value of 0.
+
+**To examine the soil, stand close to it and examine it.**
+
+## Fertilizing
+
+Many kinds of animals leave manure on the ground, which could be used to fertilize a field. This is one way to restore nutrition to your soil.
+
+Fertilizer: 50 nutrition points.
+
+The **compost bin** (10 wood) also turns food scraps, plant matter (seeds, some plants) and some other unpleasant things into fertilizer. Just place it in the bin and wait for a while. Fertilizer could also be used to refuel ovens etc.
+
+## Severe weather
+
+Be aware that blizzards will freeze the plants and kill them. A
+heatwave, as noted in the Watering section, will cause the crops to consume more water than usual. Sandstorms will also destroy the plants.

+ 0 - 0
Civ14-Wiki/guides/guide_to_medical.md → Wiki/src/guides/guide_to_medical.md


+ 0 - 0
Civ14-Wiki/guides/guide_to_metallurgy.md → Wiki/src/guides/guide_to_metallurgy.md


+ 3 - 1
Civ14-Wiki/guides/playing.md → Wiki/src/guides/playing.md

@@ -1,6 +1,8 @@
 # How to play
 
-**Note:** This article is about how to download and join the game. If you are looking for instructions on how to play once inside the game, check [the starter guide instead](starter_guide.md).
+```admonish note
+This article is about how to download and join the game. If you are looking for instructions on how to play once inside the game, check [the starter guide instead](starter_guide.md).
+```
 
 ## Downloading
 

+ 201 - 0
Wiki/src/guides/starter_guide.md

@@ -0,0 +1,201 @@
+# Starter Guide
+
+```admonish note
+This guide primarily focuses on survival in the sandbox [Nomads](./../gamemodes/nomads.md) game mode.
+```
+
+```admonish tip
+You can also open this guide ingame. Press 0 on the numpad, or press the icon on the top-left of the screen.
+```
+
+## Spawning in
+
+-   You begin with only age-appropriate clothing and a torch in your pocket. If it's dark, drag the torch to your hand slot and press **Z** to activate it.
+
+    -   ![arrival](./../images/arrival.png)
+
+-   If it's **winter season** or **Ice Age** map, you also spawn with a **fur coat**. Losing this will mean cold and miserable **death** in the icy outdoors.
+
+-   Your **hunger** and **thirst** levels will start at approximately 50%. You'll receive alerts on the right side of the screen (below your health and stamina indicators) when you're hungry or thirsty. Pay close attention to these alerts.
+
+-   Your first priority is to gather flint to craft a flint axe.
+
+    -   Locate a large rock or boulder and right-click on it. You should see an option to search for flint.
+        ![boulder](./../images/boulder.png)
+    -   Click the rock repeatedly with the flint to sharpen it (you will get a message when it is sharpened).
+    -   Now go to a tree and right click on it. There should be an option to remove a branch from the tree, if there are any suitable ones available. This will pull a branch from the tree and place it on the ground.
+    -   Click the branch with an empty hand to clear the leaves.
+    -   Use the sharpened flint on the stick to sharpen the stick. Then, click the sharpened stick with the flint again to craft a flint axe, which serves as both a tool and a weapon.
+        ![flint axe crafting menu](./../images/flint_axe.png)
+
+## Crafting Basics
+
+### Crafting Menu
+
+```admonish tip
+Press **G** to open the crafting menu.
+```
+
+You will need some basic things to survive. At the very start you will most likely be using **wood, leather, bone, stone, and straw** to make them.
+
+-   Hit a tree with your flint hatchet until it breaks. You will then find some **wood** on the floor.
+
+-   Hunt and butcher some animals to get **leather** and **bone**.
+
+-   Use your knife on a grass tile to gather some **straw**.
+
+-   Use your pickaxe on a rock tile to gather **stone** (see below).
+
+### Mining 101
+
+Ores are valuable crafting materials which you mine out of the rock.
+
+-   You'll need **wood** and **bone** for this. Go gather them (bones are obtained by butchering animals - click the carcass with something sharp, like a flint axe or a knife),
+-   Make a **bone pickaxe**.
+-   Find a **rock** tile.
+-   Right click on it while holding the **pickaxe** on your active hand.
+
+## Food and Water
+
+To survive, you will need to keep yourself nourished and warm. Pay attention to the alerts on the right side of the screen, they will tell you when you need to eat and drink.
+
+```admonish warning
+Letting either hunger or thirst reach 0% will cause your body to start shutting down, leading to inevitable death!
+```
+
+### Hunger
+
+The easiest way to get food early on is by killing animals and eating the meat after cooking it. Also, you can eat bird eggs, even uncooked!
+
+-   Find an animal, preferably one that doesn't have fangs, claws, tusks, or poison. and kill it with any means (even bare fists work). Remember to press the **harm intent** button to enter combat mode!
+    <img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Interface/Actions/harm.png" style="width:64px;height:64px;image-rendering: pixelated;"> <img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Interface/Actions/harmOff.png" style="width:64px;height:64px;image-rendering: pixelated;">
+
+```admonish danger
+For now, stay away from bears, alligators, wolves, snakes, and mammoths. They will fight back and very probably kill you. Wait until you have proper equipment or a hunting party with you.
+```
+
+-   Use your knife (flint axe works too) on the dead animal with **Harm intent** to butcher it.
+-   **Raw meat** causes **food poisoning**! You'll want to **cook** it first, but if you're starving, food poisoning is the least of your worries.
+-   To cook meat, place it on a **campfire** and click the campfire. The campfire is made with **wood logs**.
+
+Farming is another good source of food (although not an immediate one) that does not involve getting maimed by wild animals. Check the [guide to farming](guide_to_farming.md).
+
+### Thirst
+
+The easiest way to quench your thirst early on is by drinking water or milk.
+
+#### Water
+
+You can get water from **puddles**, any **water tiles (except saltwater - do not drink nor boil it!)**, or **wells**.
+
+-   To drink, you need to make a **mug** from **wood** or **drinking glass** from **glass**.
+-   **Wells** have disease-free freshwater (**however, if there are some... excrements within 4 tiles of a well, the water becomes contaminated and unsafe to drink!)**. You can build them over a **puddle** by using with **stone**... if your faction has the research levels required.
+
+#### Milk
+
+-   Find a **cow**, **sheep ewe**, or **goat ewe**.
+-   Make a **bucket** from **wood**.
+-   Use the **bucket** on **Help intent** on the animal of choice to gather milk.
+-   Pour the milk into the **mug** or **glass** and drink.
+-   You don't have to boil milk.
+
+Milk is regenerated in the animals over time, so keep them alive, and
+you'll never go thirsty.
+
+## Temperature
+
+```admonish tip
+Keep an eye out for the temperature alert! If it is flashing blue with a white snowflake, you are freezing! If it is red and there is sun instead, you are melting from the heat!
+```
+
+Winter seasons can bring an icy chill that can seriously hurt and slow you down, or even kill you. Blizzards are especially deadly, and just wearing a fur coat will not cut it, so make sure you have a shelter ready before it is too late.
+
+Southern climates could be merciless in their own way, so be careful that you do not overheat to the point of a heat stroke. Resting in a roofed shelter from time to time and wearing appropriate clothing (for instance, "traditional" desert clothes) can save you from fainting and shrivelling in a sweltering heat.
+
+### Fur Clothing
+
+<img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Clothing/exported/suits/prehistoric_fur2.rsi/icon.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Clothing/exported/suits/fur_jacket1.rsi/icon.png" style="width:64px;height:64px;image-rendering: pixelated;">
+Fur clothing can keep you warm in the winter, but it will not save you if you are caught in a blizzard. You can make fur clothing by skinning large furry animals like **bears** and **wolves**. <sub>Yes, you can finally skin furries with no repercussions.</sub>
+
+-   Kill one of the following animals: **bear, wolf, bison, monkey, fox, sheep**.
+-   Bucher the animal by using the **knife** on **Harm Intent**.
+-   Collect enough pelts and craft **fur coat, boots, headcover and gloves** (you might need to hunt several animals for the whole set).
+
+    -   <img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Objects/Materials/materials.rsi/sheet-brownbearpelt.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Objects/Materials/materials.rsi/sheet-wolfpelt.png" style="width:64px;height:64px;image-rendering: pixelated;">
+
+## Shelter
+
+Shelter can save you from even the toughest of conditions.
+
+Any roofed area is considered a shelter.
+
+-   **Caves**: There's a reason that stone-age men were called cavemen. Look for entrances in rocks. If it has a roof, it will be darker inside. That means it will keep snow, cold, blazing sun and rain out. The easiest way of surviving inclement weather. <sub>Make sure that no bears live in the cave, though...</sub>
+-   **Building a Roof**: Target your inner Bob the Builder and build your own roof.
+
+-   Build **walls** to prop the ceiling up. Craft floor tiles and place them to automatically build a roof overhead.
+
+-   You can also build walls with **dirt** or **snow** by using the **shovel** directly on the ground.
+
+## Fire
+
+<img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Objects/kitchen.rsi/fireplace_on.png" style="width:64px;height:64px;image-rendering: pixelated;">
+
+Crackling fires will keep you warm even without a coat. Both campfires and braziers are refueled by adding **wood**, **coal** and **charcoal**. The brazier could also be refueled with **paper- and cloth-based items**.
+
+-   A **campfire** warms you when you are right next to it, or within 2 tile.
+-   A **brazier** (made with **stone**) provides more heat and warms you within 3 tiles.
+
+## Dangerous animals
+
+```admonish danger
+The world is teeming with wildlife. Most of them are pretty tame and easy prey, but steer clear of the big game unless you're a skilled hunter, otherwise you'll become minced meat yourself!
+```
+
+You want to avoid these, unless you're robust or need some pelts:
+
+-   ![brown bear](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Mobs/animal_64.rsi/brownbear.png)Bears (can provide fur)
+-   ![white wolf](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Mobs/animal.rsi/whitewolf.png)![grey wolf](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Mobs/animal.rsi/greywolf.png)Wolves (can provide fur)
+-   ![mammoth](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Mobs/animal_128.rsi/mammoth.png)Mammoths
+-   ![sabertooth](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Mobs/animal_big.rsi/sabertoothcat_brown.png)![liom](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Mobs/animal_big.rsi/lion.png)Panthers, Jaguars, Lions, and other big cats
+-   ![alligator](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Mobs/animal_big.rsi/alligator.png)Alligators
+
+![cave den](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Objects/animal_spawner.rsi/cave_den2.png)
+![cave den](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Objects/animal_spawner.rsi/cave_den-foliage.png)
+
+Also keep an eye for animal dens. Dangerous animals will spawn here!
+
+## Night time
+
+You'll need a light source to see in the night and in dark indoor areas. The basic source of light is the **torch**.
+
+-   Gather some **wood**. Craft a **torch** and press **Z** to light it. Torches will last for **5 minutes** and then burn out.
+
+-   For a static source of light, you can make a **campfire**, which will also help you cook some food.
+
+-   You can also make lanterns with **iron**. Lanterns require fuel - any form of liquid fuel will do, like olive oil, fat, or petroleum.
+
+-   For a more **permanent** light source, you can build **braziers** from **stone**. You can fuel it with any organic matter like wood or clothing - simply use items on the brazier.
+
+## Medicine
+
+In the Stone age, most of the medicine you will find is restricted to bandages and medicinal herbs.
+
+![leather bandage](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Objects/surgery.rsi/leatherbandage.png)![cloth bandage](https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Objects/surgery.rsi/bint.png) You can craft bandages from **cloth** or **leather**. They will help you stop bleeding.
+
+```admonish tip
+You should carry bandages with you at all times. Theres nothing worse than bleeding to death when trying to return to your house after a successfull hunt.
+```
+
+You can find medicinal herbs growing wild around the map. If you harvest them, you will also get some seeds so you can plant them yourself - see the [guide to farming](guide_to_farming.md).
+
+<img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Objects/Farming/elderflower.rsi/harvest.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Objects/Farming/elderflower.rsi/produce.png" style="width:64px;height:64px;image-rendering: pixelated;"> **Elderflower** has a long history in European folk medicine for treating colds and sinus issues. It reduces asphyxiation by clearing airways and boosting oxygen intake.
+
+<img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Objects/Farming/yarrow.rsi/harvest.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Civ14/Objects/Farming/yarrow.rsi/produce.png" style="width:64px;height:64px;image-rendering: pixelated;"> **Yarrow** has been used since ancient times as a hemostatic (blood-clotting) agent. It’s known for its astringent properties that help staunch bleeding.
+
+<img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Objects/Specific/Hydroponics/spacemans_trumpet.rsi/harvest.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Objects/Specific/Hydroponics/spacemans_trumpet.rsi/produce.png" style="width:64px;height:64px;image-rendering: pixelated;"> **Comfrey** has been used historically to heal bruises, sprains, and fractures due to its anti-inflammatory and tissue-repair properties. Heals brute damage.
+
+<img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Objects/Specific/Hydroponics/galaxythistle.rsi/harvest.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Objects/Specific/Hydroponics/galaxythistle.rsi/produce.png" style="width:64px;height:64px;image-rendering: pixelated;"> **Milk Thistle** has long been used as a liver tonic, with silymarin compounds believed to detoxify and protect against poisons.
+
+<img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/harvest.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Objects/Specific/Hydroponics/poppy.rsi/produce.png" style="width:64px;height:64px;image-rendering: pixelated;"> **Poppy** is the source of opium and morphine, known for sedative and pain-relieving effects, but it can also stabilize shock in small doses by calming the nervous system. Historically, it’s been used for pain and trauma management.
+
+<img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/harvest.png" style="width:64px;height:64px;image-rendering: pixelated;"><img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Objects/Specific/Hydroponics/aloe.rsi/produce.png" style="width:64px;height:64px;image-rendering: pixelated;"> **Aloe vera**’s gel is a well-documented remedy for burns, soothing inflammation and promoting skin healing.

+ 0 - 0
Civ14-Wiki/img/arrival.png → Wiki/src/images/arrival.png


+ 0 - 0
Civ14-Wiki/img/boulder.png → Wiki/src/images/boulder.png


+ 0 - 0
Civ14-Wiki/img/flint_axe.png → Wiki/src/images/flint_axe.png


BIN
Wiki/src/images/meta-edit-file.png


BIN
Wiki/src/images/meta-edit-page-button.png


BIN
Wiki/src/images/meta-forking.png


+ 6 - 2
Civ14-Wiki/index.md → Wiki/src/index.md

@@ -1,6 +1,6 @@
 # Civilization 14
 
-<img src="./../Resources/Textures/Logo/splash.png" height="400">
+<img src="https://raw.githubusercontent.com/Civ13/Civ14/refs/heads/master/Resources/Textures/Logo/splash.png" height="400">
 
 Welcome!
 
@@ -8,7 +8,11 @@ Civilization 14 (Civ14 for short) is a port of [Civilization 13](https://github.
 
 ## What is this?
 
-Civ14 is an immersive, player-driven strategy game, where history unfolds through the hands of its community. Set across vast timelines, from the dawn of civilization to the modern era, players take on roles as leaders, builders, warriors, or everyday citizens, shaping the course of their chosen society. Whether forging empires through diplomacy and trade, waging war to expand territory, or simply surviving in a dynamic, ever-evolving world, Civ14 offers a sandbox experience defined by cooperation, conflict, and creativity. With a passionate player base and a framework that rewards both individual ambition and collective storytelling, Civ13 transforms SS14 into a living tapestry of human history.
+Civ14 is an immersive, player-driven strategy game, where history unfolds through the hands of its community.
+
+Set across vast timelines, from the dawn of civilization to the modern era, players take on roles as leaders, builders, warriors, or everyday citizens, shaping the course of their chosen society. Whether forging empires through diplomacy and trade, waging war to expand territory, or simply surviving in a dynamic, ever-evolving world, Civ14 offers a sandbox experience defined by cooperation, conflict, and creativity.
+
+With a passionate player base and a framework that rewards both individual ambition and collective storytelling, Civ13 transforms SS14 into a living tapestry of human history.
 
 ## Features
 

+ 0 - 0
Civ14-Wiki/rules/rules.md → Wiki/src/rules/rules.md


+ 544 - 0
Wiki/theme/compiled/ss14.css

@@ -0,0 +1,544 @@
+@charset "UTF-8";
+/* Custom styles for SS14 docs
+
+
+/* allow wider content since no navvybar buttons */
+:root {
+    --content-max-width: 850px;
+    --sidebar-active: #e23229;
+}
+
+/* title text on top of every page */
+.menu-title {
+    color: #e23229;
+}
+
+@media only screen and (min-width: 1366px) {
+    .content > main {
+        /* navbar button was basically a margin left but dont have that no more so */
+        margin-left: 80px;
+    }
+}
+/*   Mostly stolen from the Rhai book (rhai.rs) theme */
+.part-title {
+    font-size: 150%;
+    font-variant-caps: small-caps;
+}
+
+/* lets get a little more compact */
+.chapter li.chapter-item {
+    margin-top: 0.45em;
+}
+
+.chapter > .chapter-item {
+    padding-left: 10px;
+}
+
+.chapter > .chapter-item:first-child {
+    font-weight: bold;
+    font-size: 200%;
+    font-variant-caps: small-caps;
+    padding-left: 0px;
+}
+
+/* bigger buttons for discoverability */
+.right-buttons > a > i {
+    font-size: 200%;
+}
+
+.left-buttons > button > i {
+    font-size: 200%;
+}
+
+td > ol,
+td > ul {
+    margin: 0;
+    padding: 0;
+    padding-left: inherit;
+}
+
+main h2,
+h3 {
+    margin-top: 1.25em;
+    border-bottom: 1px solid var(--sidebar-spacer);
+    padding-bottom: 5px;
+}
+
+main h1 {
+    border-bottom: 3px solid var(--sidebar-spacer);
+    padding-bottom: 7px;
+}
+
+main > section,
+main > pre,
+main h1,
+main h2,
+main h3 {
+    clear: both;
+}
+
+.navy code {
+    background: #0f0f12 !important;
+}
+
+:root {
+    --md-admonition-icon--admonish-note: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z'/></svg>");
+    --md-admonition-icon--admonish-abstract: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M17 9H7V7h10m0 6H7v-2h10m-3 6H7v-2h7M12 3a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z'/></svg>");
+    --md-admonition-icon--admonish-info: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2z'/></svg>");
+    --md-admonition-icon--admonish-tip: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M17.66 11.2c-.23-.3-.51-.56-.77-.82-.67-.6-1.43-1.03-2.07-1.66C13.33 7.26 13 4.85 13.95 3c-.95.23-1.78.75-2.49 1.32-2.59 2.08-3.61 5.75-2.39 8.9.04.1.08.2.08.33 0 .22-.15.42-.35.5-.23.1-.47.04-.66-.12a.58.58 0 0 1-.14-.17c-1.13-1.43-1.31-3.48-.55-5.12C5.78 10 4.87 12.3 5 14.47c.06.5.12 1 .29 1.5.14.6.41 1.2.71 1.73 1.08 1.73 2.95 2.97 4.96 3.22 2.14.27 4.43-.12 6.07-1.6 1.83-1.66 2.47-4.32 1.53-6.6l-.13-.26c-.21-.46-.77-1.26-.77-1.26m-3.16 6.3c-.28.24-.74.5-1.1.6-1.12.4-2.24-.16-2.9-.82 1.19-.28 1.9-1.16 2.11-2.05.17-.8-.15-1.46-.28-2.23-.12-.74-.1-1.37.17-2.06.19.38.39.76.63 1.06.77 1 1.98 1.44 2.24 2.8.04.14.06.28.06.43.03.82-.33 1.72-.93 2.27z'/></svg>");
+    --md-admonition-icon--admonish-success: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='m9 20.42-6.21-6.21 2.83-2.83L9 14.77l9.88-9.89 2.83 2.83L9 20.42z'/></svg>");
+    --md-admonition-icon--admonish-question: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='m15.07 11.25-.9.92C13.45 12.89 13 13.5 13 15h-2v-.5c0-1.11.45-2.11 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41a2 2 0 0 0-2-2 2 2 0 0 0-2 2H8a4 4 0 0 1 4-4 4 4 0 0 1 4 4 3.2 3.2 0 0 1-.93 2.25M13 19h-2v-2h2M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10c0-5.53-4.5-10-10-10z'/></svg>");
+    --md-admonition-icon--admonish-warning: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M13 14h-2V9h2m0 9h-2v-2h2M1 21h22L12 2 1 21z'/></svg>");
+    --md-admonition-icon--admonish-failure: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20 6.91 17.09 4 12 9.09 6.91 4 4 6.91 9.09 12 4 17.09 6.91 20 12 14.91 17.09 20 20 17.09 14.91 12 20 6.91z'/></svg>");
+    --md-admonition-icon--admonish-danger: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M11 15H6l7-14v8h5l-7 14v-8z'/></svg>");
+    --md-admonition-icon--admonish-bug: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a5.985 5.985 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6.002 6.002 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8z'/></svg>");
+    --md-admonition-icon--admonish-example: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M7 13v-2h14v2H7m0 6v-2h14v2H7M7 7V5h14v2H7M3 8V5H2V4h2v4H3m-1 9v-1h3v4H2v-1h2v-.5H3v-1h1V17H2m2.25-7a.75.75 0 0 1 .75.75c0 .2-.08.39-.21.52L3.12 13H5v1H2v-.92L4 11H2v-1h2.25z'/></svg>");
+    --md-admonition-icon--admonish-quote: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M14 17h3l2-4V7h-6v6h3M6 17h3l2-4V7H5v6h3l-2 4z'/></svg>");
+    --md-details-icon: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42Z'/></svg>");
+}
+
+:is(.admonition) {
+    display: flow-root;
+    margin: 1.5625em 0;
+    padding: 0 1.2rem;
+    color: var(--fg);
+    page-break-inside: avoid;
+    background-color: var(--bg);
+    border: 0 solid black;
+    border-inline-start-width: 0.4rem;
+    border-radius: 0.2rem;
+    box-shadow: 0 0.2rem 1rem rgba(0, 0, 0, 0.05), 0 0 0.1rem rgba(0, 0, 0, 0.1);
+}
+
+@media print {
+    :is(.admonition) {
+        box-shadow: none;
+    }
+}
+:is(.admonition) > * {
+    box-sizing: border-box;
+}
+
+:is(.admonition) :is(.admonition) {
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+:is(.admonition) > .tabbed-set:only-child {
+    margin-top: 0;
+}
+
+html :is(.admonition) > :last-child {
+    margin-bottom: 1.2rem;
+}
+
+a.admonition-anchor-link {
+    display: none;
+    position: absolute;
+    left: -1.2rem;
+    padding-right: 1rem;
+}
+
+a.admonition-anchor-link:link,
+a.admonition-anchor-link:visited {
+    color: var(--fg);
+}
+
+a.admonition-anchor-link:link:hover,
+a.admonition-anchor-link:visited:hover {
+    text-decoration: none;
+}
+
+a.admonition-anchor-link::before {
+    content: "§";
+}
+
+:is(.admonition-title, summary.admonition-title) {
+    position: relative;
+    min-height: 4rem;
+    margin-block: 0;
+    margin-inline: -1.6rem -1.2rem;
+    padding-block: 0.8rem;
+    padding-inline: 4.4rem 1.2rem;
+    font-weight: 700;
+    background-color: rgba(68, 138, 255, 0.1);
+    print-color-adjust: exact;
+    -webkit-print-color-adjust: exact;
+    display: flex;
+}
+
+:is(.admonition-title, summary.admonition-title) p {
+    margin: 0;
+}
+
+html :is(.admonition-title, summary.admonition-title):last-child {
+    margin-bottom: 0;
+}
+
+:is(.admonition-title, summary.admonition-title)::before {
+    position: absolute;
+    top: 0.625em;
+    inset-inline-start: 1.6rem;
+    width: 2rem;
+    height: 2rem;
+    background-color: #448aff;
+    print-color-adjust: exact;
+    -webkit-print-color-adjust: exact;
+    mask-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>');
+    -webkit-mask-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>');
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-size: contain;
+    content: "";
+}
+
+:is(.admonition-title, summary.admonition-title):hover a.admonition-anchor-link {
+    display: initial;
+}
+
+details.admonition > summary.admonition-title::after {
+    position: absolute;
+    top: 0.625em;
+    inset-inline-end: 1.6rem;
+    height: 2rem;
+    width: 2rem;
+    background-color: currentcolor;
+    mask-image: var(--md-details-icon);
+    -webkit-mask-image: var(--md-details-icon);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-size: contain;
+    content: "";
+    transform: rotate(0deg);
+    transition: transform 0.25s;
+}
+
+details[open].admonition > summary.admonition-title::after {
+    transform: rotate(90deg);
+}
+
+:is(.admonition):is(.admonish-note) {
+    border-color: #448aff;
+}
+
+:is(.admonish-note) > :is(.admonition-title, summary.admonition-title) {
+    background-color: rgba(68, 138, 255, 0.1);
+}
+
+:is(.admonish-note) > :is(.admonition-title, summary.admonition-title)::before {
+    background-color: #448aff;
+    mask-image: var(--md-admonition-icon--admonish-note);
+    -webkit-mask-image: var(--md-admonition-icon--admonish-note);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-abstract, .admonish-summary, .admonish-tldr) {
+    border-color: #00b0ff;
+}
+
+:is(.admonish-abstract, .admonish-summary, .admonish-tldr) > :is(.admonition-title, summary.admonition-title) {
+    background-color: rgba(0, 176, 255, 0.1);
+}
+
+:is(.admonish-abstract, .admonish-summary, .admonish-tldr) > :is(.admonition-title, summary.admonition-title)::before {
+    background-color: #00b0ff;
+    mask-image: var(--md-admonition-icon--admonish-abstract);
+    -webkit-mask-image: var(--md-admonition-icon--admonish-abstract);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-info, .admonish-todo) {
+    border-color: #00b8d4;
+}
+
+:is(.admonish-info, .admonish-todo) > :is(.admonition-title, summary.admonition-title) {
+    background-color: rgba(0, 184, 212, 0.1);
+}
+
+:is(.admonish-info, .admonish-todo) > :is(.admonition-title, summary.admonition-title)::before {
+    background-color: #00b8d4;
+    mask-image: var(--md-admonition-icon--admonish-info);
+    -webkit-mask-image: var(--md-admonition-icon--admonish-info);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-tip, .admonish-hint, .admonish-important) {
+    border-color: #00bfa5;
+}
+
+:is(.admonish-tip, .admonish-hint, .admonish-important) > :is(.admonition-title, summary.admonition-title) {
+    background-color: rgba(0, 191, 165, 0.1);
+}
+
+:is(.admonish-tip, .admonish-hint, .admonish-important) > :is(.admonition-title, summary.admonition-title)::before {
+    background-color: #00bfa5;
+    mask-image: var(--md-admonition-icon--admonish-tip);
+    -webkit-mask-image: var(--md-admonition-icon--admonish-tip);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-success, .admonish-check, .admonish-done) {
+    border-color: #00c853;
+}
+
+:is(.admonish-success, .admonish-check, .admonish-done) > :is(.admonition-title, summary.admonition-title) {
+    background-color: rgba(0, 200, 83, 0.1);
+}
+
+:is(.admonish-success, .admonish-check, .admonish-done) > :is(.admonition-title, summary.admonition-title)::before {
+    background-color: #00c853;
+    mask-image: var(--md-admonition-icon--admonish-success);
+    -webkit-mask-image: var(--md-admonition-icon--admonish-success);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-question, .admonish-help, .admonish-faq) {
+    border-color: #64dd17;
+}
+
+:is(.admonish-question, .admonish-help, .admonish-faq) > :is(.admonition-title, summary.admonition-title) {
+    background-color: rgba(100, 221, 23, 0.1);
+}
+
+:is(.admonish-question, .admonish-help, .admonish-faq) > :is(.admonition-title, summary.admonition-title)::before {
+    background-color: #64dd17;
+    mask-image: var(--md-admonition-icon--admonish-question);
+    -webkit-mask-image: var(--md-admonition-icon--admonish-question);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-warning, .admonish-caution, .admonish-attention) {
+    border-color: #ff9100;
+}
+
+:is(.admonish-warning, .admonish-caution, .admonish-attention) > :is(.admonition-title, summary.admonition-title) {
+    background-color: rgba(255, 145, 0, 0.1);
+}
+
+:is(.admonish-warning, .admonish-caution, .admonish-attention)
+    > :is(.admonition-title, summary.admonition-title)::before {
+    background-color: #ff9100;
+    mask-image: var(--md-admonition-icon--admonish-warning);
+    -webkit-mask-image: var(--md-admonition-icon--admonish-warning);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-failure, .admonish-fail, .admonish-missing) {
+    border-color: #ff5252;
+}
+
+:is(.admonish-failure, .admonish-fail, .admonish-missing) > :is(.admonition-title, summary.admonition-title) {
+    background-color: rgba(255, 82, 82, 0.1);
+}
+
+:is(.admonish-failure, .admonish-fail, .admonish-missing) > :is(.admonition-title, summary.admonition-title)::before {
+    background-color: #ff5252;
+    mask-image: var(--md-admonition-icon--admonish-failure);
+    -webkit-mask-image: var(--md-admonition-icon--admonish-failure);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-danger, .admonish-error) {
+    border-color: #ff1744;
+}
+
+:is(.admonish-danger, .admonish-error) > :is(.admonition-title, summary.admonition-title) {
+    background-color: rgba(255, 23, 68, 0.1);
+}
+
+:is(.admonish-danger, .admonish-error) > :is(.admonition-title, summary.admonition-title)::before {
+    background-color: #ff1744;
+    mask-image: var(--md-admonition-icon--admonish-danger);
+    -webkit-mask-image: var(--md-admonition-icon--admonish-danger);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-bug) {
+    border-color: #f50057;
+}
+
+:is(.admonish-bug) > :is(.admonition-title, summary.admonition-title) {
+    background-color: rgba(245, 0, 87, 0.1);
+}
+
+:is(.admonish-bug) > :is(.admonition-title, summary.admonition-title)::before {
+    background-color: #f50057;
+    mask-image: var(--md-admonition-icon--admonish-bug);
+    -webkit-mask-image: var(--md-admonition-icon--admonish-bug);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-example) {
+    border-color: #7c4dff;
+}
+
+:is(.admonish-example) > :is(.admonition-title, summary.admonition-title) {
+    background-color: rgba(124, 77, 255, 0.1);
+}
+
+:is(.admonish-example) > :is(.admonition-title, summary.admonition-title)::before {
+    background-color: #7c4dff;
+    mask-image: var(--md-admonition-icon--admonish-example);
+    -webkit-mask-image: var(--md-admonition-icon--admonish-example);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-repeat: no-repeat;
+}
+
+:is(.admonition):is(.admonish-quote, .admonish-cite) {
+    border-color: #9e9e9e;
+}
+
+:is(.admonish-quote, .admonish-cite) > :is(.admonition-title, summary.admonition-title) {
+    background-color: rgba(158, 158, 158, 0.1);
+}
+
+:is(.admonish-quote, .admonish-cite) > :is(.admonition-title, summary.admonition-title)::before {
+    background-color: #9e9e9e;
+    mask-image: var(--md-admonition-icon--admonish-quote);
+    -webkit-mask-image: var(--md-admonition-icon--admonish-quote);
+    mask-repeat: no-repeat;
+    -webkit-mask-repeat: no-repeat;
+    mask-size: contain;
+    -webkit-mask-repeat: no-repeat;
+}
+
+.navy :is(.admonition) {
+    background-color: var(--sidebar-bg);
+}
+
+.ayu :is(.admonition),
+.coal :is(.admonition) {
+    background-color: var(--theme-hover);
+}
+
+.rust :is(.admonition) {
+    background-color: var(--sidebar-bg);
+    color: var(--sidebar-fg);
+}
+
+.rust .admonition-anchor-link:link,
+.rust .admonition-anchor-link:visited {
+    color: var(--sidebar-fg);
+}
+
+/* Styling for the subpage footer & sidebar toc */
+@media only screen and (max-width: 1365px) {
+    .sidetoc {
+        display: none;
+    }
+}
+@media only screen and (min-width: 1366px) {
+    main {
+        position: relative;
+    }
+    .sidetoc {
+        margin-left: auto;
+        margin-right: auto;
+        left: calc(100% + (var(--content-max-width)) / 4 - 140px);
+        position: absolute;
+    }
+    .pagetoc {
+        position: fixed;
+        width: 300px;
+        height: calc(100vh - var(--menu-bar-height) - 2.68em);
+        overflow: auto;
+    }
+    .pagetoc a {
+        border-left: 1px solid var(--sidebar-bg);
+        color: var(--fg) !important;
+        display: block;
+        padding-bottom: 5px;
+        padding-top: 5px;
+        padding-left: 10px;
+        text-align: left;
+        text-decoration: none;
+    }
+    .pagetoc a:hover,
+    .pagetoc a.active {
+        background: var(--sidebar-bg);
+        color: var(--sidebar-fg) !important;
+    }
+    .pagetoc .active {
+        background: var(--sidebar-bg);
+        color: var(--sidebar-fg);
+    }
+}
+@media only screen and (min-width: 1366px) {
+    #subpage-footer {
+        margin-left: 200px;
+    }
+}
+#subpage-footer {
+    max-width: 400px;
+    margin-top: 100px;
+    color: var(--fg) !important;
+    display: block;
+}
+
+#subpage-footer > p {
+    line-height: 1em;
+}
+
+#subpage-footer > ol {
+    list-style: none outside none;
+    padding-left: 20px;
+    line-height: 1.6em;
+    border-top: 1px solid var(--sidebar-spacer);
+    padding-top: 10px;
+}
+
+#subpage-footer ol > li.chapter-item {
+    display: flex;
+}
+
+#subpage-footer a.toggle {
+    display: block;
+    margin-left: auto;
+    padding-left: 20px;
+    opacity: 0.68;
+}
+
+@media print {
+    .sidetoc {
+        display: none;
+    }
+    #subpage-footer {
+        display: none;
+    }
+}
+
+/*# sourceMappingURL=ss14.css.map */

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 9 - 0
Wiki/theme/compiled/ss14.css.map


BIN
Wiki/theme/favicon.png


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 430 - 0
Wiki/theme/highlight.js


+ 329 - 0
Wiki/theme/index.hbs

@@ -0,0 +1,329 @@
+<!DOCTYPE HTML>
+<html lang="{{ language }}" class="{{ default_theme }}" dir="{{ text_direction }}">
+    <head>
+        <!-- Book generated using mdBook -->
+        <meta charset="UTF-8">
+        <title>{{ title }}</title>
+        {{#if is_print }}
+        <meta name="robots" content="noindex">
+        {{/if}}
+        {{#if base_url}}
+        <base href="{{ base_url }}">
+        {{/if}}
+
+
+        <!-- Custom HTML head -->
+        {{> head}}
+
+        <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+        <meta name="description" content="{{ description }}"/>
+        <meta name="viewport" content="width=device-width, initial-scale=1"/>
+        <meta name="theme-color" content="#e23229">
+        <meta property="og:title" content="{{ title }}"/>
+        <meta property="og:description" content="{{ description }}"/>
+        <meta property="og:type" content="website"/>
+        <meta property="og:image" content="https://docs.spacestation14.com/favicon.png">
+
+        {{#if favicon_svg}}
+        <link rel="icon" href="{{ path_to_root }}favicon.svg">
+        {{/if}}
+        {{#if favicon_png}}
+        <link rel="shortcut icon" href="{{ path_to_root }}favicon.png">
+        {{/if}}
+        <link rel="stylesheet" href="{{ path_to_root }}css/variables.css">
+        <link rel="stylesheet" href="{{ path_to_root }}css/general.css">
+        <link rel="stylesheet" href="{{ path_to_root }}css/chrome.css">
+        {{#if print_enable}}
+        <link rel="stylesheet" href="{{ path_to_root }}css/print.css" media="print">
+        {{/if}}
+
+        <!-- Fonts -->
+        <link rel="stylesheet" href="{{ path_to_root }}FontAwesome/css/font-awesome.css">
+        {{#if copy_fonts}}
+        <link rel="stylesheet" href="{{ path_to_root }}fonts/fonts.css">
+        {{/if}}
+
+        <!-- Highlight.js Stylesheets -->
+        <link rel="stylesheet" href="{{ path_to_root }}highlight.css">
+        <link rel="stylesheet" href="{{ path_to_root }}tomorrow-night.css">
+        <link rel="stylesheet" href="{{ path_to_root }}ayu-highlight.css">
+
+        <!-- Custom theme stylesheets -->
+        {{#each additional_css}}
+        <link rel="stylesheet" href="{{ ../path_to_root }}{{ this }}">
+        {{/each}}
+
+        {{#if mathjax_support}}
+        <!-- MathJax -->
+        <script async type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
+        {{/if}}
+    </head>
+    <body class="sidebar-visible no-js">
+        <!-- Provide site root to javascript -->
+        <script type="text/javascript">
+            var path_to_root = "{{ path_to_root }}";
+            var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}";
+        </script>
+
+        <!-- Work around some values being stored in localStorage wrapped in quotes -->
+        <script type="text/javascript">
+            try {
+                var theme = localStorage.getItem('mdbook-theme');
+                var sidebar = localStorage.getItem('mdbook-sidebar');
+
+                if (theme.startsWith('"') && theme.endsWith('"')) {
+                    localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
+                }
+
+                if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
+                    localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
+                }
+            } catch (e) { }
+        </script>
+
+        <input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
+
+        <!-- Hide / unhide sidebar before it is displayed -->
+        <script type="text/javascript">
+            var body = document.querySelector('body');
+            var sidebar = 'hidden';
+            var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+            if (document.body.clientWidth >= 1080) {
+                try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
+                sidebar = sidebar || 'visible';
+            }
+            sidebar_toggle.checked = sidebar === 'visible';
+            body.classList.remove('sidebar-visible');
+            body.classList.add("sidebar-" + sidebar);
+        </script>
+
+        <nav id="sidebar" class="sidebar" aria-label="Table of contents">
+            <div class="sidebar-scrollbox">
+                {{#toc}}{{/toc}}
+            </div>
+            <div id="sidebar-resize-handle" class="sidebar-resize-handle">
+                <div class="sidebar-resize-indicator"></div>
+            </div>
+        </nav>
+
+        <div id="page-wrapper" class="page-wrapper">
+
+            <div class="page">
+                {{> header}}
+                <div id="menu-bar-hover-placeholder"></div>
+                <div id="menu-bar" class="menu-bar sticky bordered">
+                    <div class="left-buttons">
+                        <label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
+                            <i class="fa fa-bars"></i>
+                        </label>
+                        <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
+                            <i class="fa fa-paint-brush"></i>
+                        </button>
+                        <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
+                            <li role="none"><button role="menuitem" class="theme" id="light">{{ theme_option "Light" }}</button></li>
+                            <li role="none"><button role="menuitem" class="theme" id="rust">{{ theme_option "Rust" }}</button></li>
+                            <li role="none"><button role="menuitem" class="theme" id="coal">{{ theme_option "Coal" }}</button></li>
+                            <li role="none"><button role="menuitem" class="theme" id="navy">{{ theme_option "Navy" }}</button></li>
+                            <li role="none"><button role="menuitem" class="theme" id="ayu">{{ theme_option "Ayu" }}</button></li>
+                        </ul>
+                        {{#if search_enabled}}
+                        <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
+                            <i class="fa fa-search"></i>
+                        </button>
+                        {{/if}}
+                    </div>
+
+                    <h1 class="menu-title">{{ book_title }}</h1>
+
+                    <div class="right-buttons">
+                        {{#if print_enable}}
+                        <a href="{{ path_to_root }}print.html" title="Print this book" aria-label="Print this book">
+                            <i id="print-button" class="fa fa-print"></i>
+                        </a>
+                        {{/if}}
+                        {{#if git_repository_url}}
+                        <a href="{{git_repository_url}}" title="Git repository" aria-label="Git repository">
+                            <i id="git-repository-button" class="fa {{git_repository_icon}}"></i>
+                        </a>
+                        {{/if}}
+                        {{#if git_repository_edit_url}}
+                        <a href="{{git_repository_edit_url}}" title="View & edit page on GitHub" aria-label="View & edit page on GitHub">
+                            <i id="git-edit-button" class="fa fa-edit"></i>
+                        </a>
+                        {{/if}}
+
+                    </div>
+                </div>
+
+                {{#if search_enabled}}
+                <div id="search-wrapper" class="hidden">
+                    <form id="searchbar-outer" class="searchbar-outer">
+                        <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
+                    </form>
+                    <div id="searchresults-outer" class="searchresults-outer hidden">
+                        <div id="searchresults-header" class="searchresults-header"></div>
+                        <ul id="searchresults">
+                        </ul>
+                    </div>
+                </div>
+                {{/if}}
+
+                <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
+                <script type="text/javascript">
+                    document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
+                    document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
+                    Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
+                        link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
+                    });
+                </script>
+
+                <div id="content" class="content">
+                    <main>
+                        <!-- Page table of contents -->
+                        <div class="sidetoc"><nav class="pagetoc"></nav></div>
+
+                        {{{ content }}}
+                    </main>
+
+                   <!-- <nav class="nav-wrapper" aria-label="Page navigation">
+                        Mobile navigation buttons
+                        {{#previous}}
+                            <a rel="prev" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+                                <i class="fa fa-angle-left"></i>
+                            </a>
+                        {{/previous}}
+
+                        {{#next}}
+                            <a rel="next prefetch" href="{{ path_to_root }}{{link}}" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+                                <i class="fa fa-angle-right"></i>
+                            </a>
+                        {{/next}}
+
+                        <div style="clear: both"></div>
+                    </nav> -->
+
+                    <footer id="subpage-footer">
+                        <p>Subpages</p>
+                    </footer>
+                </div>
+            </div>
+
+            <!--<nav class="nav-wide-wrapper" aria-label="Page navigation">
+                {{#previous}}
+                    <a rel="prev" href="{{ path_to_root }}{{link}}" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+                        <i class="fa fa-angle-left"></i>
+                    </a>
+                {{/previous}}
+
+                {{#next}}
+                    <a rel="next prefetch" href="{{ path_to_root }}{{link}}" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+                        <i class="fa fa-angle-right"></i>
+                    </a>
+                {{/next}}
+            </nav>-->
+
+        </div>
+
+        {{#if livereload}}
+        <!-- Livereload script (if served using the cli tool) -->
+        <script type="text/javascript">
+            var socket = new WebSocket("{{{livereload}}}");
+            socket.onmessage = function (event) {
+                if (event.data === "reload") {
+                    socket.close();
+                    location.reload();
+                }
+            };
+
+            window.onbeforeunload = function() {
+                socket.close();
+            }
+        </script>
+        {{/if}}
+
+        {{#if google_analytics}}
+        <!-- Google Analytics Tag -->
+        <script type="text/javascript">
+            var localAddrs = ["localhost", "127.0.0.1", ""];
+
+            // make sure we don't activate google analytics if the developer is
+            // inspecting the book locally...
+            if (localAddrs.indexOf(document.location.hostname) === -1) {
+                (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+                (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+                m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+                })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+                ga('create', '{{google_analytics}}', 'auto');
+                ga('send', 'pageview');
+            }
+        </script>
+        {{/if}}
+
+        {{#if playground_line_numbers}}
+        <script type="text/javascript">
+            window.playground_line_numbers = true;
+        </script>
+        {{/if}}
+
+        {{#if playground_copyable}}
+        <script type="text/javascript">
+            window.playground_copyable = true;
+        </script>
+        {{/if}}
+
+        {{#if playground_js}}
+        <script src="{{ path_to_root }}ace.js" type="text/javascript" charset="utf-8"></script>
+        <script src="{{ path_to_root }}editor.js" type="text/javascript" charset="utf-8"></script>
+        <script src="{{ path_to_root }}mode-rust.js" type="text/javascript" charset="utf-8"></script>
+        <script src="{{ path_to_root }}theme-dawn.js" type="text/javascript" charset="utf-8"></script>
+        <script src="{{ path_to_root }}theme-tomorrow_night.js" type="text/javascript" charset="utf-8"></script>
+        {{/if}}
+
+        {{#if search_js}}
+        <script src="{{ path_to_root }}elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
+        <script src="{{ path_to_root }}mark.min.js" type="text/javascript" charset="utf-8"></script>
+        <script src="{{ path_to_root }}searcher.js" type="text/javascript" charset="utf-8"></script>
+        {{/if}}
+
+        <script src="{{ path_to_root }}clipboard.min.js" type="text/javascript" charset="utf-8"></script>
+        <script src="{{ path_to_root }}highlight.js" type="text/javascript" charset="utf-8"></script>
+        <script src="{{ path_to_root }}book.js" type="text/javascript" charset="utf-8"></script>
+
+        <!-- Custom JS scripts -->
+        {{#each additional_js}}
+        <script type="text/javascript" src="{{ ../path_to_root }}{{this}}"></script>
+        {{/each}}
+
+        {{#if is_print}}
+        {{#if mathjax_support}}
+        <script type="text/javascript">
+        window.addEventListener('load', function() {
+            MathJax.Hub.Register.StartupHook('End', function() {
+                window.setTimeout(window.print, 100);
+            });
+        });
+        </script>
+        {{else}}
+        <script type="text/javascript">
+        window.addEventListener('load', function() {
+            window.setTimeout(window.print, 100);
+        });
+        </script>
+        {{/if}}
+        {{/if}}
+
+        <!-- Set the theme before any content is loaded, prevents flash -->
+        <script type="text/javascript">
+            var theme;
+            try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
+            if (theme === null || theme === undefined) { theme = default_theme; }
+            var html = document.querySelector('html');
+            html.classList.remove('{{ default_theme }}')
+            html.classList.add(theme);
+            var body = document.querySelector('body');
+            body.classList.remove('no-js')
+            body.classList.add('js');
+        </script>
+    </body>
+</html>

+ 121 - 0
Wiki/theme/tomorrow-night.css

@@ -0,0 +1,121 @@
+/* this is done to override the hljs theme only for navy & coal 
+   this isnt actually tomorrow-night
+   */
+
+/*!
+  Theme: GitHub Dark Dimmed
+  Description: Dark dimmed theme as seen on github.com
+  Author: github.com
+  Maintainer: @Hirse
+  Updated: 2021-05-15
+
+  Colors taken from GitHub's CSS
+*/
+
+.hljs {
+  color: #adbac7;
+  background: #22272e;
+  display: block;
+  overflow-x: auto;
+}
+
+.hljs-doctag,
+.hljs-keyword,
+.hljs-meta .hljs-keyword,
+.hljs-template-tag,
+.hljs-template-variable,
+.hljs-type,
+.hljs-variable.language_ {
+  /* prettylights-syntax-keyword */
+  color: #f47067;
+}
+
+.hljs-title,
+.hljs-title.class_,
+.hljs-title.class_.inherited__,
+.hljs-title.function_ {
+  /* prettylights-syntax-entity */
+  color: #dcbdfb;
+}
+
+.hljs-attr,
+.hljs-attribute,
+.hljs-literal,
+.hljs-meta,
+.hljs-number,
+.hljs-operator,
+.hljs-variable,
+.hljs-selector-attr,
+.hljs-selector-class,
+.hljs-selector-id {
+  /* prettylights-syntax-constant */
+  color: #6cb6ff;
+}
+
+.hljs-regexp,
+.hljs-string,
+.hljs-meta .hljs-string {
+  /* prettylights-syntax-string */
+  color: #96d0ff;
+}
+
+.hljs-built_in,
+.hljs-symbol {
+  /* prettylights-syntax-variable */
+  color: #f69d50;
+}
+
+.hljs-comment,
+.hljs-code,
+.hljs-formula {
+  /* prettylights-syntax-comment */
+  color: #768390;
+}
+
+.hljs-name,
+.hljs-quote,
+.hljs-selector-tag,
+.hljs-selector-pseudo {
+  /* prettylights-syntax-entity-tag */
+  color: #8ddb8c;
+}
+
+.hljs-subst {
+  /* prettylights-syntax-storage-modifier-import */
+  color: #adbac7;
+}
+
+.hljs-section {
+  /* prettylights-syntax-markup-heading */
+  color: #316dca;
+  font-weight: bold;
+}
+
+.hljs-bullet {
+  /* prettylights-syntax-markup-list */
+  color: #eac55f;
+}
+
+.hljs-emphasis {
+  /* prettylights-syntax-markup-italic */
+  color: #adbac7;
+  font-style: italic;
+}
+
+.hljs-strong {
+  /* prettylights-syntax-markup-bold */
+  color: #adbac7;
+  font-weight: bold;
+}
+
+.hljs-addition {
+  /* prettylights-syntax-markup-inserted */
+  color: #b4f1b4;
+  background-color: #1b4721;
+}
+
+.hljs-deletion {
+  /* prettylights-syntax-markup-deleted */
+  color: #ffd8d3;
+  background-color: #78191b;
+}

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно