[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*.{js,json}]\ncharset = utf-8\nindent_style = space\nindent_size = 2\nend_of_line = lf\ninsert_final_newline = true\n\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\n\non:\n  push:\n    branches: [master, next]\n  pull_request:\n    branches: [master, next]\n\nenv:\n  NODE_VERSION: \"22\"\n\njobs:\n  lint:\n    name: Check linting problems\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Use Node.js ${{ env.NODE_VERSION }}\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ env.NODE_VERSION }}\n\n      - name: Install local dependencies\n        run: npm ci\n\n      - name: Run linter\n        run: npm run lint\n\n  unit-testing:\n    name: Run unit testing\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [20.x, 22.x, 24.x]\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Use Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n\n      - name: Install global dependencies\n        run: npm install -g pm2\n\n      - name: Install local dependencies\n        run: npm ci\n\n      - name: Run tests\n        run: npm test\n\n      - name: Update coverage report\n        uses: coverallsapp/github-action@master\n        if: matrix.node-version == env.NODE_VERSION\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/prepublish.yml",
    "content": "name: Prepare publication\n\non:\n  push:\n    branches: [master]\n\nenv:\n  NODE_VERSION: \"22\"\n\njobs:\n  deploy-demo:\n    if: github.repository_owner == 'zestedesavoir'\n    name: Deploy the live demo\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Use Node.js ${{ env.NODE_VERSION }}\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ env.NODE_VERSION }}\n\n      - name: Install local dependencies\n        run: npm ci\n\n      - name: Build the demo\n        run: npm run build-demo\n\n      - name: GitHub Push\n        uses: JamesIves/github-pages-deploy-action@v4\n        with:\n          branch: gh-pages\n          folder: ./packages/zmarkdown/public\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n          single-commit: true\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n/node_modules\n/packages/*/node_modules\n/packages/*/coverage\n/packages/*/.nyc_output\n/.nyc_output/*\n/coverage/*\nnpm-debug.log\nlerna-debug.log\n.idea\n.tern-port\n.vscode\n.nx\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, caste, color, religion, or sexual\nidentity and orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the overall\n  community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or advances of\n  any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email address,\n  without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official email address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\n[INSERT CONTACT METHOD].\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series of\nactions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or permanent\nban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within the\ncommunity.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.1, available at\n[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].\n\nCommunity Impact Guidelines were inspired by\n[Mozilla's code of conduct enforcement ladder][Mozilla CoC].\n\nFor answers to common questions about this code of conduct, see the FAQ at\n[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at\n[https://www.contributor-covenant.org/translations][translations].\n\n[homepage]: https://www.contributor-covenant.org\n[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html\n[Mozilla CoC]: https://github.com/mozilla/diversity\n[FAQ]: https://www.contributor-covenant.org/faq\n[translations]: https://www.contributor-covenant.org/translations\n\n"
  },
  {
    "path": "LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# ZMarkdown\n\n  [![Build Status][build-badge]][build-status]\n  [![Coverage Status][coverage-badge]][coverage-status]\n\nThis repository contains all the plugins for ZMarkdown, the Markdown engine powering [Zeste de Savoir][zds].\n\nIt is a collection of packages extending the [**remark** processor][processor] and its [**MDAST**][mdast] syntax tree, [**rehype**][rehype] (for HTML processing) and [**textr**][textr] (text transformation framework).\nIt also provides [**MDAST**][mdast] to LaTeX compilation via [**rebber**][rebber] (and its [plugins][rebber-plugins]).\n\nCurrently, all the plugins provided only work for remark versions **lesser than** 13.0.0 (i.e. previous to [**micromark**][micromark]). While we intend to switch to the new system, no due date has been planned, and it requires a significant amount of work, so please be patient, or, even better, help us making the switch!\n\n## Install\n\n### Prerequisites\n\n* node >= 18\n* npm >= 9\n\n### Installation\n\n1. `git clone git@github.com:zestedesavoir/zmarkdown.git`\n1. `npm install`\n\nThis project uses [Jest][jest] for testing. It is recommended to use the locally installed version using `npx`, and run Jest in watch mode when developing `npx jest --watch --notify` (`--notify` sends desktop notifications when tests run).\n\n### Useful commands\n\n* `npm run test` : tests all packages.\n* `npm run clean` : clears local dependencies, reinstalls the project and runs all tests.\n* `npm run lint` : runs [eslint][eslint] to check the syntax of the full codebase.\n* `npm run build` : builds packages using [babel][babel].\n* `npm run build -- --scope=<package>` : same as above, but builds only `<package>`.\n\n## Packages\n\n* [**mdast-util-split-by-heading**][mdast-util-split-by-heading]\n\n  A MDAST tool to split a markdown tree into list of subtrees representing the chapters. It relies on heading depth.\n\n* [**rebber**][rebber]\n\n  transformation of MDAST into `latex` code. This code must be included inside a custom latex to be compiled.\n  Have a look at `https://github.com/zestedesavoir/latex-template/blob/master/zmdocument.cls` to get a working example.\n\n* [**remark-abbr**][remark-abbr]\n\n  This plugin parses `*[ABBR]: abbr definition` and then replace all ABBR instance in text with a new MDAST node so that `rehype` can parse it into `abbr` html tag.\n\n* [**rehype-footnotes-title**][rehype-footnotes-title]\n\n  This plugin adds a `title` attribute to the footnote links, mainly for accessibility purpose.\n\n* [**rehype-html-blocks**][rehype-html-blocks]\n\n  This plugin wraps (multi-line) raw HTML in `p`.\n\n* [**remark-align**][remark-align]\n\n  This plugin parses custom Markdown syntax to center- or right-align elements.\n\n* [**remark-captions**][remark-captions]\n\n  Allow to add caption to such element as image, table or blockquote.\n\n* [**remark-comments**][remark-comments]\n\n  This plugin parses custom Markdown syntax for Markdown source comments.\n\n* [**remark-custom-blocks**][remark-custom-blocks]\n\n  This plugin parses custom Markdown syntax to create new custom blocks.\n\n* [**remark-emoticons**][remark-emoticons]\n\n  This plugins replaces ASCII emoticons with associated image. Compatible with [rehype][rehype]\n\n* [**remark-escape-escaped**][remark-escape-escaped]\n\n  This plugin escapes HTML entities from Markdown input.\n\n* [**remark-grid-tables**][remark-grid-tables]\n\n  This plugin parses custom Markdown syntax to describe tables.\n\n* [**remark-heading-shift**][remark-heading-shift]\n\n  Allows to shift heading to custimize the way you will integrate the generated tree inside your application.\n\n* [**remark-heading-trailing-spaces**][remark-heading-trailing-spaces]\n\n  This plugin removes trailing spaces from Markdown headers.\n\n* [**remark-iframes**][remark-iframes]\n\n  Allows to add `iframe` inclusion through `!(url)` code.\n\n* [**remark-kbd**][remark-kbd]\n\n  This plugin parses custom Markdown syntax to handle keyboard keys.\n\n* [**remark-numbered-footnotes**][remark-numbered-footnotes]\n\n  This plugin changes how [mdast][mdast] footnotes are displayed by using sequential numbers as footnote references instead of user-specified strings.\n\n* [**remark-sub-super**][remark-sub-super]\n\n  This plugin parses custom Markdown syntax to handle subscript and superscript.\n\n* [**typographic-colon**][typographic-colon]\n\n  Micro module to fix a common typographic issue that is hard to fix with most keyboard layouts.\n\n* [**typographic-permille**][typographic-permille]\n\n  Micro module to replace `%o` with `‰` and optionally replace the preceding space.\n\n* [**zmarkdown**][zmarkdown]\n\n  Fully integrated package to be used in [zeste de savoir website](https://zestedesavoir.com)\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://travis-ci.com/zestedesavoir/zmarkdown.svg?branch=master\n[build-status]: https://travis-ci.com/zestedesavoir/zmarkdown\n[coverage-badge]: https://coveralls.io/repos/github/zestedesavoir/zmarkdown/badge.svg?branch=master\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown?branch=master\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/LICENSE-MIT\n\n[processor]: https://github.com/remarkjs/remark/blob/master/packages/remark\n[mdast]: https://github.com/wooorm/mdast\n[micromark]: https://github.com/micromark/micromark\n[pyzmd]: https://github.com/zestedesavoir/Python-ZMarkdown\n[zds]: https://zestedesavoir.com\n[rehype]: https://github.com/rehypejs/rehype\n[textr]: https://github.com/A/textr\n[jest]: https://facebook.github.io/jest/\n[eslint]: https://github.com/eslint/eslint\n[babel]: https://github.com/babel/babel\n\n[mdast-util-split-by-heading]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/mdast-util-split-by-heading#mdast-util-split-by-heading--\n[rebber]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/rebber#rebber--\n[rebber-plugins]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/rebber-plugins#rebber-plugins--\n[remark-abbr]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-abbr#remark-abbr--\n[rehype-footnotes-title]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/rehype-footnotes-title#rehype-footnotes-title--\n[rehype-html-blocks]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/rehype-html-blocks#rehype-html-blocks--\n[remark-align]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-align#remark-align--\n[remark-captions]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-captions#remark-captions--\n[remark-comments]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-comments#remark-comments--\n[remark-custom-blocks]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-custom-blocks#remark-custom-blocks--\n[remark-emoticons]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-emoticons#remark-emoticons--\n[remark-escape-escaped]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-escape-escaped#remark-escape-escaped--\n[remark-grid-tables]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-grid-tables#remark-grid-tables--\n[remark-heading-shift]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-heading-shift#remark-heading-shift--\n[remark-heading-trailing-spaces]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-heading-trailing-spaces#remark-heading-trailing-spaces--\n[remark-iframes]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-iframes#remark-iframes--\n[remark-kbd]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-kbd#remark-kbd--\n[remark-numbered-footnotes]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-numbered-footnotes#remark-numbered-footnotes--\n[remark-sub-super]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-sub-super#remark-sub-super--\n[typographic-colon]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/typographic-colon#typographic-colon--\n[typographic-permille]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/typographic-permille#typographic-permille--\n[zmarkdown]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/zmarkdown#zmarkdown--\n"
  },
  {
    "path": "babel.config.js",
    "content": "module.exports = {\n  presets: [\n    [\n      '@babel/preset-env',\n      {\n        targets: {\n          browsers: '> 1%, not dead',\n          node: '16.0'\n        }\n      }\n    ]\n  ],\n  ignore: ['node_modules']\n}\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import globals from 'globals'\n\nimport path from 'path'\nimport { fileURLToPath } from 'url'\nimport { FlatCompat } from '@eslint/eslintrc'\nimport pluginJs from '@eslint/js'\n\n// mimic CommonJS variables -- not needed if using CommonJS\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\nconst compat = new FlatCompat({ baseDirectory: __dirname, recommendedConfig: pluginJs.configs.recommended })\n\nexport default [\n  Object.assign({}, ...compat.extends('standard'), {\n    files: ['packages/**/*.js'],\n    ignores: [\n      'packages/**/__tests__/*.js',\n      'packages/**/dist/**/*.js',\n      'packages/zmarkdown/webpack.config.js',\n      // Should not be ignored, but requires ESM\n      'packages/zmarkdown/client/*.js',\n      'packages/zmarkdown/public/*.js'\n    ],\n    languageOptions: {\n      sourceType: 'commonjs',\n      globals: {\n        ...globals.browser,\n        ...globals.node\n      }\n    }\n  })\n]\n"
  },
  {
    "path": "lerna.json",
    "content": "{\n  \"$schema\": \"node_modules/lerna/schemas/lerna-schema.json\",\n  \"version\": \"independent\"\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"jest\": {\n    \"testPathIgnorePatterns\": [\n      \"/node_modules/\"\n    ],\n    \"collectCoverage\": true,\n    \"collectCoverageFrom\": [\n      \"packages/**/src/*.js\",\n      \"packages/zmarkdown/plugins/*.js\",\n      \"packages/zmarkdown/postprocessors/*.js\",\n      \"packages/zmarkdown/renderers/*.js\",\n      \"packages/zmarkdown/server/utils/*.js\",\n      \"packages/zmarkdown/utils/*.js\",\n      \"packages/zmarkdown/*.js\",\n      \"!**/*.config.js\"\n    ]\n  },\n  \"devDependencies\": {\n    \"@babel/cli\": \"^7.24.1\",\n    \"@babel/core\": \"^7.24.4\",\n    \"@babel/preset-env\": \"^7.24.4\",\n    \"@eslint/eslintrc\": \"^3.0.2\",\n    \"@eslint/js\": \"^9.0.0\",\n    \"axios\": \"^0.21.1\",\n    \"babel-loader\": \"^9.1.3\",\n    \"clone\": \"^2.1.2\",\n    \"core-js\": \"^3.6.5\",\n    \"coveralls\": \"^3.1.0\",\n    \"cross-env\": \"^7.0.2\",\n    \"dedent\": \"^0.7.0\",\n    \"del-cli\": \"^3.0.1\",\n    \"eslint\": \"^8.57.0\",\n    \"eslint-config-standard\": \"^17.1.0\",\n    \"eslint-plugin-import\": \"^2.29.1\",\n    \"eslint-plugin-n\": \"^16.6.2\",\n    \"eslint-plugin-promise\": \"^6.1.1\",\n    \"express\": \"^4.17.1\",\n    \"globals\": \"^15.0.0\",\n    \"html-differ\": \"^1.4.0\",\n    \"jest\": \"^26.4.2\",\n    \"jest-environment-node-debug\": \"^2.0.0\",\n    \"lerna\": \"^8.1.2\",\n    \"mdast-util-to-hast\": \"^9.1.2\",\n    \"rehype-stringify\": \"^8.0.0\",\n    \"remark\": \"^12.0.1\",\n    \"remark-footnotes\": \"^2.0.0\",\n    \"remark-math\": \"^3.0.1\",\n    \"remark-parse\": \"^8.0.3\",\n    \"remark-rehype\": \"^7.0.0\",\n    \"remark-stringify\": \"^8.1.1\",\n    \"sync-request\": \"^6.1.0\",\n    \"textr\": \"^0.3.0\",\n    \"unified\": \"^9.2.0\",\n    \"unist-util-visit\": \"^2.0.3\",\n    \"webpack\": \"^5.88.2\",\n    \"webpack-cli\": \"^5.1.4\"\n  },\n  \"scripts\": {\n    \"pretest\": \"lerna run pretest --scope zmarkdown\",\n    \"test\": \"cross-env DEST=/tmp jest\",\n    \"lint\": \"eslint .\",\n    \"posttest\": \"lerna run posttest --scope zmarkdown\",\n    \"build\": \"lerna run build\",\n    \"d\": \"node --inspect --debug-brk ./node_modules/.bin/jest --runInBand -i\",\n    \"clean\": \"lerna clean --yes && del-cli node_modules && npm install && lerna run prepare && npm run test\",\n    \"build-demo\": \"lerna run release --scope zmarkdown && del-cli ./packages/zmarkdown/public/js && cp -r ./packages/zmarkdown/client/dist ./packages/zmarkdown/public/js\"\n  },\n  \"engines\": {\n    \"node\": \">=18\",\n    \"npm\": \">=9\"\n  },\n  \"private\": true,\n  \"name\": \"zmarkdown-meta\",\n  \"dependencies\": {\n    \"deepmerge\": \"^4.2.2\",\n    \"hast-util-sanitize\": \"^3.0.0\",\n    \"mdast-util-split-by-heading\": \"file:packages/mdast-util-split-by-heading\",\n    \"rebber\": \"file:packages/rebber\",\n    \"rebber-plugins\": \"file:packages/rebber-plugins\",\n    \"rehype-footnotes-title\": \"file:packages/rehype-footnotes-title\",\n    \"rehype-html-blocks\": \"file:packages/rehype-html-blocks\",\n    \"rehype-postfix-footnote-anchors\": \"file:packages/rehype-postfix-footnote-anchors\",\n    \"rehype-sanitize\": \"^4.0.0\",\n    \"remark-abbr\": \"file:packages/remark-abbr\",\n    \"remark-align\": \"file:packages/remark-align\",\n    \"remark-captions\": \"file:packages/remark-captions\",\n    \"remark-comments\": \"file:packages/remark-comments\",\n    \"remark-custom-blocks\": \"file:packages/remark-custom-blocks\",\n    \"remark-disable-tokenizers\": \"file:packages/remark-disable-tokenizers\",\n    \"remark-emoticons\": \"file:packages/remark-emoticons\",\n    \"remark-escape-escaped\": \"file:packages/remark-escape-escaped\",\n    \"remark-fix-guillemets\": \"file:packages/remark-fix-guillemets\",\n    \"remark-grid-tables\": \"file:packages/remark-grid-tables\",\n    \"remark-heading-shift\": \"file:packages/remark-heading-shift\",\n    \"remark-heading-trailing-spaces\": \"file:packages/remark-heading-trailing-spaces\",\n    \"remark-iframes\": \"file:packages/remark-iframes\",\n    \"remark-images-download\": \"file:packages/remark-images-download\",\n    \"remark-kbd\": \"file:packages/remark-kbd\",\n    \"remark-numbered-footnotes\": \"file:packages/remark-numbered-footnotes\",\n    \"remark-ping\": \"file:packages/remark-ping\",\n    \"remark-sub-super\": \"file:packages/remark-sub-super\",\n    \"typographic-colon\": \"file:packages/typographic-colon\",\n    \"typographic-em-dash\": \"file:packages/typographic-em-dash\",\n    \"typographic-exclamation-mark\": \"file:packages/typographic-exclamation-mark\",\n    \"typographic-guillemets\": \"file:packages/typographic-guillemets\",\n    \"typographic-percent\": \"file:packages/typographic-percent\",\n    \"typographic-permille\": \"file:packages/typographic-permille\",\n    \"typographic-question-mark\": \"file:packages/typographic-question-mark\",\n    \"typographic-semicolon\": \"file:packages/typographic-semicolon\",\n    \"zmarkdown\": \"file:packages/zmarkdown\"\n  },\n  \"workspaces\": [\n    \"packages/*\"\n  ]\n}\n"
  },
  {
    "path": "packages/mdast-util-split-by-heading/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/mdast-util-split-by-heading/README.md",
    "content": "# mdast-util-split-by-heading [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\n\n**mdast-util-split-by-heading** splits a markdown AST into several markdown ASTs based on their headings.\n\nIt is useful when you want to split a document with many headings into several documents, for instance one by chapter.\n\n## Installation\n\n[npm][]:\n\n```bash\nnpm install mdast-util-split-by-heading\n```\n\n## Usage\n\n```javascript\nconst unified = require('unified')\nconst parse = require('remark-parse')\nconst split = require('mdast-util-split-by-heading')\n\nvar tree = unified()\n  .use(parse)\n  .parse('# part\\n\\n## chapter \\n\\n Hello world \\n\\n # part *2*')\n\nconsole.log(split(tree))\n```\n\n## API\n\n### `split(node, options = { splitDepth: 1 })`\n\nSplits a MDAST tree into separate trees by [heading depth](https://github.com/syntax-tree/mdast#heading).\n\n#### `options.splitDepth = 1`\n\nAn integer greater or equal to 1 determining the heading depth you want to match when splitting.\n\n## Examples:\n\n```js\nimport dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport split from 'mdast-util-split-by-heading'\n\nconst doSplit = (text, options) => {\n  const { splitDepth = 1 } = options\n  return split(\n    unified().use(reParse).parse(text),\n    { splitDepth: splitDepth }\n  )\n}\n\nconst text = dedent `\n  a global introduction\n\n  # hello\n\n  a paragraph\n\n  > a quote to *ensure this is parsed*\n\n  ## a sub title\n\n  other paragraph\n\n  # conclusion title\n\n  paragraph\n  `\n\ndoSplit(text)\n/*\n{\n  \"introduction\": {\n    \"type\": \"root\",\n    \"children\": [\n      {\n        \"type\": \"paragraph\",\n        \"children\": [\n          {\n            \"type\": \"text\",\n            \"value\": \"a global introduction\",\n            \"position\": {\n              \"start\": {\n                \"line\": 1,\n                \"column\": 1,\n                \"offset\": 0\n              },\n              \"end\": {\n                \"line\": 1,\n                \"column\": 22,\n                \"offset\": 21\n              },\n              \"indent\": []\n            }\n          }\n        ],\n        \"position\": {\n          \"start\": {\n            \"line\": 1,\n            \"column\": 1,\n            \"offset\": 0\n          },\n          \"end\": {\n            \"line\": 1,\n            \"column\": 22,\n            \"offset\": 21\n          },\n          \"indent\": []\n        }\n      }\n    ]\n  },\n  \"trees\": [\n    {\n      \"title\": {\n        \"type\": \"root\",\n        \"children\": {\n          \"type\": \"heading\",\n          \"depth\": 1,\n          \"children\": [\n            {\n              \"type\": \"text\",\n              \"value\": \"hello\",\n              \"position\": {\n                \"start\": {\n                  \"line\": 3,\n                  \"column\": 3,\n                  \"offset\": 25\n                },\n                \"end\": {\n                  \"line\": 3,\n                  \"column\": 8,\n                  \"offset\": 30\n                },\n                \"indent\": []\n              }\n            }\n          ],\n          \"position\": {\n            \"start\": {\n              \"line\": 3,\n              \"column\": 1,\n              \"offset\": 23\n            },\n            \"end\": {\n              \"line\": 3,\n              \"column\": 8,\n              \"offset\": 30\n            },\n            \"indent\": []\n          }\n        }\n      },\n      \"children\": {\n        \"type\": \"root\",\n        \"children\": [\n          {\n            \"type\": \"paragraph\",\n            \"children\": [\n              {\n                \"type\": \"text\",\n                \"value\": \"a paragraph\",\n                \"position\": {\n                  \"start\": {\n                    \"line\": 5,\n                    \"column\": 1,\n                    \"offset\": 32\n                  },\n                  \"end\": {\n                    \"line\": 5,\n                    \"column\": 12,\n                    \"offset\": 43\n                  },\n                  \"indent\": []\n                }\n              }\n            ],\n            \"position\": {\n              \"start\": {\n                \"line\": 5,\n                \"column\": 1,\n                \"offset\": 32\n              },\n              \"end\": {\n                \"line\": 5,\n                \"column\": 12,\n                \"offset\": 43\n              },\n              \"indent\": []\n            }\n          },\n          {\n            \"type\": \"blockquote\",\n            \"children\": [\n              {\n                \"type\": \"paragraph\",\n                \"children\": [\n                  {\n                    \"type\": \"text\",\n                    \"value\": \"a quote to \",\n                    \"position\": {\n                      \"start\": {\n                        \"line\": 7,\n                        \"column\": 3,\n                        \"offset\": 47\n                      },\n                      \"end\": {\n                        \"line\": 7,\n                        \"column\": 14,\n                        \"offset\": 58\n                      },\n                      \"indent\": []\n                    }\n                  },\n                  {\n                    \"type\": \"emphasis\",\n                    \"children\": [\n                      {\n                        \"type\": \"text\",\n                        \"value\": \"ensure this is parsed\",\n                        \"position\": {\n                          \"start\": {\n                            \"line\": 7,\n                            \"column\": 15,\n                            \"offset\": 59\n                          },\n                          \"end\": {\n                            \"line\": 7,\n                            \"column\": 36,\n                            \"offset\": 80\n                          },\n                          \"indent\": []\n                        }\n                      }\n                    ],\n                    \"position\": {\n                      \"start\": {\n                        \"line\": 7,\n                        \"column\": 14,\n                        \"offset\": 58\n                      },\n                      \"end\": {\n                        \"line\": 7,\n                        \"column\": 37,\n                        \"offset\": 81\n                      },\n                      \"indent\": []\n                    }\n                  }\n                ],\n                \"position\": {\n                  \"start\": {\n                    \"line\": 7,\n                    \"column\": 3,\n                    \"offset\": 47\n                  },\n                  \"end\": {\n                    \"line\": 7,\n                    \"column\": 37,\n                    \"offset\": 81\n                  },\n                  \"indent\": []\n                }\n              }\n            ],\n            \"position\": {\n              \"start\": {\n                \"line\": 7,\n                \"column\": 1,\n                \"offset\": 45\n              },\n              \"end\": {\n                \"line\": 7,\n                \"column\": 37,\n                \"offset\": 81\n              },\n              \"indent\": []\n            }\n          },\n          {\n            \"type\": \"heading\",\n            \"depth\": 2,\n            \"children\": [\n              {\n                \"type\": \"text\",\n                \"value\": \"a sub title\",\n                \"position\": {\n                  \"start\": {\n                    \"line\": 9,\n                    \"column\": 4,\n                    \"offset\": 86\n                  },\n                  \"end\": {\n                    \"line\": 9,\n                    \"column\": 15,\n                    \"offset\": 97\n                  },\n                  \"indent\": []\n                }\n              }\n            ],\n            \"position\": {\n              \"start\": {\n                \"line\": 9,\n                \"column\": 1,\n                \"offset\": 83\n              },\n              \"end\": {\n                \"line\": 9,\n                \"column\": 15,\n                \"offset\": 97\n              },\n              \"indent\": []\n            }\n          },\n          {\n            \"type\": \"paragraph\",\n            \"children\": [\n              {\n                \"type\": \"text\",\n                \"value\": \"other paragraph\",\n                \"position\": {\n                  \"start\": {\n                    \"line\": 11,\n                    \"column\": 1,\n                    \"offset\": 99\n                  },\n                  \"end\": {\n                    \"line\": 11,\n                    \"column\": 16,\n                    \"offset\": 114\n                  },\n                  \"indent\": []\n                }\n              }\n            ],\n            \"position\": {\n              \"start\": {\n                \"line\": 11,\n                \"column\": 1,\n                \"offset\": 99\n              },\n              \"end\": {\n                \"line\": 11,\n                \"column\": 16,\n                \"offset\": 114\n              },\n              \"indent\": []\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"title\": {\n        \"type\": \"root\",\n        \"children\": {\n          \"type\": \"heading\",\n          \"depth\": 1,\n          \"children\": [\n            {\n              \"type\": \"text\",\n              \"value\": \"conclusion title\",\n              \"position\": {\n                \"start\": {\n                  \"line\": 13,\n                  \"column\": 3,\n                  \"offset\": 118\n                },\n                \"end\": {\n                  \"line\": 13,\n                  \"column\": 19,\n                  \"offset\": 134\n                },\n                \"indent\": []\n              }\n            }\n          ],\n          \"position\": {\n            \"start\": {\n              \"line\": 13,\n              \"column\": 1,\n              \"offset\": 116\n            },\n            \"end\": {\n              \"line\": 13,\n              \"column\": 19,\n              \"offset\": 134\n            },\n            \"indent\": []\n          }\n        }\n      },\n      \"children\": {\n        \"type\": \"root\",\n        \"children\": [\n          {\n            \"type\": \"paragraph\",\n            \"children\": [\n              {\n                \"type\": \"text\",\n                \"value\": \"paragraph\",\n                \"position\": {\n                  \"start\": {\n                    \"line\": 15,\n                    \"column\": 1,\n                    \"offset\": 136\n                  },\n                  \"end\": {\n                    \"line\": 15,\n                    \"column\": 10,\n                    \"offset\": 145\n                  },\n                  \"indent\": []\n                }\n              }\n            ],\n            \"position\": {\n              \"start\": {\n                \"line\": 15,\n                \"column\": 1,\n                \"offset\": 136\n              },\n              \"end\": {\n                \"line\": 15,\n                \"column\": 10,\n                \"offset\": 145\n              },\n              \"indent\": []\n            }\n          }\n        ]\n      }\n    }\n  ]\n}\n*/\n```\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/rebber/LICENSE-MIT\n\n[rebber-plugins]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/rebber-plugins\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/rebber\n\n[mdast]: https://github.com/syntax-tree/mdast/blob/master/readme.md\n\n[remark]: https://github.com/remarkjs/remark\n"
  },
  {
    "path": "packages/mdast-util-split-by-heading/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport split from '../src'\n\nconst doSplit = (text, {splitDepth = 1,\n  introductionAsProperty = true, conclusionAsProperty = false}) => {\n  return split(unified().use(reParse).parse(text), {\n    splitDepth: splitDepth,\n    conclusionAsProperty: conclusionAsProperty})\n}\n\nconst text = dedent `\n  a global introduction\n\n  # hello\n\n  a paragraph\n\n  > a quote to *ensure this is parsed*\n\n  ## a sub title\n\n  other paragraph\n\n  # conclusion title\n\n  paragraph\n  `\n\ntest('default parameter with canonical text', () => {\n  const result = doSplit(text, {})\n  expect(result.introduction).toMatchObject({\n    type: 'root',\n    children: [\n      {\n        type: 'paragraph',\n        children: [\n          {\n            type: 'text',\n            value: 'a global introduction',\n          },\n        ],\n      },\n    ],\n  })\n  expect(result.trees.length).toBe(2)\n  expect(result.conclusion).toBeFalsy()\n  expect(result.trees[0].children).toMatchObject({\n    type: 'root',\n    children: [\n      {\n        type: 'paragraph',\n        children: [\n          {\n            type: 'text',\n            value: 'a paragraph',\n          },\n        ],\n      },\n      {\n        type: 'blockquote',\n        children: [\n          {\n            type: 'paragraph',\n            children: [\n              {\n                type: 'text',\n                value: 'a quote to ',\n              },\n              {\n                type: 'emphasis',\n                children: [\n                  {\n                    type: 'text',\n                    value: 'ensure this is parsed',\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      },\n      {\n        type: 'heading',\n        depth: 2,\n        children: [\n          {\n            type: 'text',\n            value: 'a sub title',\n          },\n        ],\n      },\n      {\n        type: 'paragraph',\n        children: [\n          {\n            type: 'text',\n            value: 'other paragraph',\n          },\n        ],\n      },\n    ],\n  })\n  expect(result.trees[1].children).toMatchObject({\n    type: 'root',\n    children: [\n      {\n        type: 'paragraph',\n        children: [\n          {\n            type: 'text',\n            value: 'paragraph',\n          },\n        ],\n      },\n    ],\n  })\n})\n\ntest('no heading', () => {\n  const headingStripped = text.replace(/#/g, '')\n  const result = doSplit(headingStripped, {})\n  expect(result.trees).toHaveLength(0)\n  expect(result.introduction.type).toBe('root')\n})\n\ntest('split level 2 titles', () => {\n  const result = doSplit(text, {splitDepth: 2})\n  expect(result.trees.length).toBe(1)\n  expect(result.trees[0].children).toMatchObject({\n    type: 'root',\n    children: [\n      {\n        type: 'paragraph',\n        children: [\n          {\n            type: 'text',\n            value: 'other paragraph',\n          },\n        ],\n      },\n      {\n        type: 'heading',\n        depth: 1,\n        children: [\n          {\n            type: 'text',\n            value: 'conclusion title',\n          },\n        ],\n      },\n      {\n        type: 'paragraph',\n        children: [\n          {\n            type: 'text',\n            value: 'paragraph',\n          },\n        ],\n      },\n    ],\n  })\n})\n"
  },
  {
    "path": "packages/mdast-util-split-by-heading/dist/index.js",
    "content": "\"use strict\";\n\nconst visit = require('unist-util-visit');\nmodule.exports = splitAtDepth;\nfunction splitAtDepth(tree, {\n  splitDepth = 1\n}) {\n  const splitter = new Splitter(splitDepth);\n  visit(tree, null, (node, index, parent) => splitter.visit(node, index, parent));\n  return {\n    introduction: splitter.introduction,\n    trees: splitter.subTrees\n  };\n}\nfunction newRootTree(children = []) {\n  return {\n    type: 'root',\n    children\n  };\n}\nclass Splitter {\n  constructor(depth = 1) {\n    this.lastIndex = -1;\n    this.subTrees = [];\n    this.depth = depth;\n    this.introduction = newRootTree();\n  }\n  visit(node, index, parent) {\n    if (!parent) {\n      // we are at the root\n      return;\n    }\n    if (node.type === 'heading' && node.depth === this.depth) {\n      this.lastIndex = index;\n      const subtree = {\n        title: newRootTree(node),\n        children: newRootTree()\n      };\n      this.subTrees.push(subtree);\n    } else if (parent.type === 'root' && this.lastIndex === -1) {\n      this.introduction.children.push(node);\n    } else if (parent.type === 'root') {\n      this.subTrees[this.subTrees.length - 1].children.children.push(node);\n    }\n  }\n}"
  },
  {
    "path": "packages/mdast-util-split-by-heading/package.json",
    "content": "{\n  \"name\": \"mdast-util-split-by-heading\",\n  \"version\": \"1.1.2\",\n  \"description\": \"Split MDAST into subtrees relying on the header hierarchy.\",\n  \"repository\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/mdast-util-split-by-heading\",\n  \"author\": \"François (artragis) Dambrine  <perso@francoisdambrine.me>\",\n  \"contributors\": [],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"mdast\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"unist-util-visit\": \"^2.0.3\"\n  }\n}\n"
  },
  {
    "path": "packages/mdast-util-split-by-heading/src/index.js",
    "content": "const visit = require('unist-util-visit')\n\nmodule.exports = splitAtDepth\n\nfunction splitAtDepth (tree, { splitDepth = 1 }) {\n  const splitter = new Splitter(splitDepth)\n\n  visit(tree, null, (node, index, parent) => splitter.visit(node, index, parent))\n\n  return {\n    introduction: splitter.introduction,\n    trees: splitter.subTrees\n  }\n}\n\nfunction newRootTree (children = []) {\n  return {\n    type: 'root',\n    children\n  }\n}\n\nclass Splitter {\n  constructor (depth = 1) {\n    this.lastIndex = -1\n    this.subTrees = []\n    this.depth = depth\n    this.introduction = newRootTree()\n  }\n\n  visit (node, index, parent) {\n    if (!parent) {\n      // we are at the root\n      return\n    }\n\n    if (node.type === 'heading' && node.depth === this.depth) {\n      this.lastIndex = index\n      const subtree = {\n        title: newRootTree(node),\n        children: newRootTree()\n      }\n      this.subTrees.push(subtree)\n    } else if (parent.type === 'root' && this.lastIndex === -1) {\n      this.introduction.children.push(node)\n    } else if (parent.type === 'root') {\n      this.subTrees[this.subTrees.length - 1].children.children.push(node)\n    }\n  }\n}\n"
  },
  {
    "path": "packages/rebber/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/rebber/README.md",
    "content": "# rebber [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\n\n**rebber** is a LaTeX stringifier for [remark][]\n\n## remark-rebber version compatibility\n\nStarting from version 8.0.0, `remark` dropped support for footnotes; hence, `rebber` also dropped it's support starting from version 6.0.0.\n\nTherefore, we have the following compatibility table for remark-rebber versions:\n\n| remark  | rebber  |\n| ------- | ------- |\n| < 8.0.0 | < 6.0.0 |\n| > 8.0.0 |   any   |\n\n## Installation\n\n[npm][]:\n\n```bash\nnpm install rebber\n```\n\n## Usage\n\n```javascript\nconst unified = require('unified')\nconst remarkParser = require('remark-parse')\nconst rebber = require('rebber')\n\nconst {contents} = unified()\n  .use(remarkParser)\n  .use(rebber)\n  .processSync('### foo')\n\nconsole.log(contents);\n```\n\nYields:\n\n```latex\n\\section{foo}\n```\n\n## API\n\n### `toLaTeX(node[, options])`\n\nStringify the given [MDAST node][mdast].\n\n\n#### `options.overrides`\n\nOverrides are named that way because they can override any MDAST node type to latex stringifier. Their other use is to use custom latex stringifier for custom MDAST node type.\n\nExamples:\n\n```js\nconst {contents} = unified()\n  .use(remarkParser)\n  .use(remarkFoobarElementsParser) // creates MDAST nodes of type 'foobar'\n  .use(rebber, {\n    overrides: {\n      // override rebber's method to turn MDAST link nodes into latex\n      link: require('./your-own-link-latexifier')\n      // tell rebber what to use to turn MDAST foobar nodes into latex\n      foobar: require('./your-foobar-latexifier')\n    }\n  })\n\n```\n\n#### `options.<mdastNodeType>`\n\n[MDAST nodes][mdast] are stringified to LaTeX using sensible default LaTeX commands. However, you can customize most of the LaTeX command corresponding to MDAST nodes. Here are documented the function signatures of these customizable commands. Note that the keys of the `options` object are named after the corresponding MDAST node type.\n\nFor example, by default, `![](/foo.png)` will get compiled to `\\includegraphics{/foo.png}`.\n\nSetting\n```js\noptions.image = (node) => `[inserted image located at \"${node.url}\"]`\n```\n\nwill stringify our example Markdown to `[inserted image located at \"/foo.png\"]` instead of `\\includegraphics{/foo.png}`.\n\n###### `options.blockquote`\n\n    (text) => ``,\n\n###### `options.break`\n\n    () => ``,\n\n###### `options.code`\n\n    (textCode, lang) => ``,\n\n###### `options.definition`\n\n    (options, identifier, url, title) => ``,\n\n###### `options.footnote`\n\n    (identifier, text, protect) => ``,\n\n###### `options.footnoteDefinition`\n\n    (identifier, text) => ``,\n\n###### `options.footnoteReference`\n\n    (identifier) => ``,\n\n###### `options.headings`\n\n    [\n      (text) => ``, // level 1 heading\n      (text) => ``, // level 2 heading\n      (text) => ``, // level 3 heading\n      (text) => ``, // level 4 heading\n      (text) => ``, // level 5 heading\n      (text) => ``, // level 6 heading\n      (text) => ``, // level 7 heading\n    ],\n\n###### `options.image`\n\n    (node) => ``,\n\n###### `options.link`\n\n    (displayText, url, title) => ``,\n\n###### `options.linkReference`\n\n    (reference, content) => ``,\n\n###### `options.list`\n\n    (content, isOrdered) => ``,\n\n###### `options.listItem`\n\n    (content) => ``,\n\n###### `options.text`\n\n    (text) => ``,\n\n###### `options.thematicBreak`\n\n    () => ``,\n\n###### `options.table`\n\n    (ctx, node) => ``,\n\nTable stringification can be configured with some advanced options:\n\n###### `options.tableEnvName`\n\n    `longtblr`\n\nName of the environment to be used for tables.\nAllows defining custom environments in LaTeX with `\\NewTblrEnviron`.\nTo ensure a flexible rendering, the `longtblr` environment is used by default.\n\n###### `options.headerCounter: (node) => 1`\n\n    (tableRows) => 1\n\nFunction that counts the number of header rows (rows that should be emphasized).\n\n###### `options.headerProperties`\n\n    `font=\\bfseries`\n\nLaTeX properties added to header rows, follows the syntax of the underlying LaTeX package.\n\n###### `options.headerParse`\n\n    (tableRows) => ``\n\nFunction that computes the \"latex header\" part of the table environment, this generates strings such as `|c|c|r|`.\nIt gets an array of all the `tableRow` [mdast] nodes for the table as argument.\nDefault function extracts the number of columns for each row and uses the `X[-1]` handler (\"find the best available width\").\nThe result for a 3 column-table is `|X[-1]|X[-1]|X[-1]|`.\n\n\n## Related\n\n*   [`rebber-plugins`][rebber-plugins]\n    - A collection of rebber plugins able to stringify custom Remark node types.\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/rebber/LICENSE-MIT\n\n[rebber-plugins]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/rebber-plugins\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/rebber\n\n[mdast]: https://github.com/syntax-tree/mdast/blob/master/readme.md\n\n[remark]: https://github.com/remarkjs/remark\n"
  },
  {
    "path": "packages/rebber/__tests__/__snapshots__/mdast.tests.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`rebber: remark specs amps-and-angles-encoding: amps-and-angles-encoding 1`] = `\n\"AT\\\\\\\\&T has an ampersand in their name.\n\n\n\nAT\\\\\\\\&T is another way to write it.\n\n\n\nThis \\\\\\\\& that.\n\n\n\n4 < 5.\n\n\n\n6 > 5.\n\n\n\nHere's a \\\\\\\\hyperref[1]{link} with an ampersand in the URL.\n\n\n\nHere's a link with an amersand in the link text: \\\\\\\\hyperref[2]{AT\\\\\\\\&T}.\n\n\n\nHere's an inline \\\\\\\\externalLink{link}{/script?foo=1\\\\\\\\&bar=2}.\n\n\n\nHere's an inline \\\\\\\\externalLink{link}{/script?foo=1\\\\\\\\&bar=2}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{http://example.com/?foo=1\\\\\\\\&bar=2}{http://example.com/?foo=1\\\\\\\\&bar=2}}\n\n\\\\\\\\footnote{\\\\\\\\label{2}\\\\\\\\externalLink{http://att.com/}{http://att.com/}}\"\n`;\n\nexports[`rebber: remark specs auto-link: auto-link 1`] = `\n\"Link: \\\\\\\\externalLink{http://example.com/}{http://example.com/}.\n\n\n\nLink to an email: \\\\\\\\externalLink{somename@example.com}{mailto:somename@example.com}.\n\n\n\nLink to an email: \\\\\\\\externalLink{somename@example.com}{mailto:somename@example.com}.\n\n\n\nWith an ampersand: \\\\\\\\externalLink{http://example.com/?foo=1\\\\\\\\&bar=2}{http://example.com/?foo=1\\\\\\\\&bar=2}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax In a list?\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{http://example.com/}{http://example.com/}\n\\\\\\\\item\\\\\\\\relax It should.\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{Quotation}\nBlockquoted: \\\\\\\\externalLink{http://example.com/}{http://example.com/}\n\\\\\\\\end{Quotation}\n\n\n\nAuto-links should not occur here: \\\\\\\\texttt{<http://example.com/>}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nor here: <http://example.com/>\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs auto-link-invalid: auto-link-invalid 1`] = `\n\"<http:/\n\n\n\n<https:/\n\n\n\n<mailto:foobarbaz>\n\n\n\n<http:/google\n\n\n\n<foo@\"\n`;\n\nexports[`rebber: remark specs auto-link-lines: auto-link-lines 1`] = `\n\"hello world\n\\\\\\\\externalLink{http://example.com}{http://example.com}\n\n\n\nhello world\n\\\\\\\\externalLink{somename@example.com}{mailto:somename@example.com}\"\n`;\n\nexports[`rebber: remark specs auto-link-output: auto-link-output 1`] = `\n\"Link: \\\\\\\\externalLink{http://example.com/}{http://example.com/}.\n\n\n\nLink to an email: \\\\\\\\externalLink{somename@example.com}{mailto:somename@example.com}.\n\n\n\nLink without protocol, which should not render as an auto-link\nbecause they are easily mistaken for HTML: \\\\\\\\externalLink{google.com}{google.com}.\"\n`;\n\nexports[`rebber: remark specs auto-link-url: auto-link-url 1`] = `\n\"This should be a link: \\\\\\\\externalLink{http://example.com/hello-world}{http://example.com/hello-world}.\n\n\n\nAlso, subdomain should be a part of the link (\\\\\\\\externalLink{http://foo.example.com/(hello[world])}{http://foo.example.com/(hello[world])}).\n\n\n\nSo should this: \\\\\\\\externalLink{foo@bar.com}{mailto:foo@bar.com}.\"\n`;\n\nexports[`rebber: remark specs auto-link-url-invalid: auto-link-url-invalid 1`] = `\n\"http://<example\n\n\n\nhttps:// foo bar baz.\n\n\n\nmailto:.\n\n\n\nhttp://,\n\n\n\nhttps://:\n\n\n\nmailto:;\n\n\n\nhttp://\\\\\"\n\n\n\nhttps://'\n\n\n\nmailto:)\n\n\n\nhttp://]\"\n`;\n\nexports[`rebber: remark specs backslash-escapes: backslash-escapes 1`] = `\n\"These should all get escaped:\n\n\n\nBackslash: \\\\\\\\textbackslash{}\n\n\n\nBacktick: \\`\n\n\n\nAsterisk: *\n\n\n\nUnderscore: \\\\\\\\_\n\n\n\nLeft brace: \\\\\\\\{\n\n\n\nRight brace: \\\\\\\\}\n\n\n\nLeft bracket: [\n\n\n\nRight bracket: ]\n\n\n\nLeft paren: (\n\n\n\nRight paren: )\n\n\n\nGreater-than: >\n\n\n\nHash: \\\\\\\\#\n\n\n\nPeriod: .\n\n\n\nBang: !\n\n\n\nPlus: +\n\n\n\nMinus: -\n\n\n\n\\\\\\\\textbf{GFM:}\n\n\n\nPipe: |\n\n\n\nTilde: \\\\\\\\textasciitilde{}\n\n\n\n\\\\\\\\textbf{Commonmark:}\n\n\n\nQuote: \\\\\\\\textbackslash{}\\\\\"\n\n\n\nDollar: \\\\\\\\textbackslash{}\\\\\\\\$\n\n\n\nPercentage: \\\\\\\\textbackslash{}\\\\\\\\%\n\n\n\nAmpersand: \\\\\\\\textbackslash{}\\\\\\\\&\n\n\n\nSingle quote: \\\\\\\\textbackslash{}'\n\n\n\nComma: \\\\\\\\textbackslash{},\n\n\n\nForward slash: \\\\\\\\textbackslash{}/\n\n\n\nColon: \\\\\\\\textbackslash{}:\n\n\n\nSemicolon: \\\\\\\\textbackslash{};\n\n\n\nLess-than: \\\\\\\\textbackslash{}<\n\n\n\nEquals: \\\\\\\\textbackslash{}=\n\n\n\nQuestion mark: \\\\\\\\textbackslash{}?\n\n\n\nAt-sign: \\\\\\\\textbackslash{}@\n\n\n\nCaret: \\\\\\\\textbackslash{}\\\\\\\\textasciicircum{}\n\n\n\nNew line: \\\\\\\\textbackslash{}\nonly works in paragraphs.\n\n\n\nThese should not, because they occur within a code block:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nBackslash: \\\\\\\\\\\\\\\\\n\nBacktick: \\\\\\\\\\`\n\nAsterisk: \\\\\\\\*\n\nUnderscore: \\\\\\\\_\n\nLeft brace: \\\\\\\\{\n\nRight brace: \\\\\\\\}\n\nLeft bracket: \\\\\\\\[\n\nRight bracket: \\\\\\\\]\n\nLeft paren: \\\\\\\\(\n\nRight paren: \\\\\\\\)\n\nGreater-than: \\\\\\\\>\n\nHash: \\\\\\\\#\n\nPeriod: \\\\\\\\.\n\nBang: \\\\\\\\!\n\nPlus: \\\\\\\\+\n\nMinus: \\\\\\\\-\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\textbf{GFM:}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nPipe: \\\\\\\\|\n\nTilde: \\\\\\\\~\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\textbf{Commonmark:}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nQuote: \\\\\\\\\\\\\"\n\nDollar: \\\\\\\\$\n\nPercentage: \\\\\\\\%\n\nAmpersand: \\\\\\\\&\n\nSingle quote: \\\\\\\\'\n\nComma: \\\\\\\\,\n\nForward slash: \\\\\\\\/\n\nColon: \\\\\\\\:\n\nSemicolon: \\\\\\\\;\n\nLess-than: \\\\\\\\<\n\nEquals: \\\\\\\\=\n\nQuestion mark: \\\\\\\\?\n\nAt-sign: \\\\\\\\@\n\nCaret: \\\\\\\\^\n\nNew line: \\\\\\\\\nonly works in paragraphs.\n\\\\\\\\end{CodeBlock}\n\n\n\nNor should these, which occur in code spans:\n\n\n\nBackslash: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\textbackslash{}}\n\n\n\nBacktick: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\`}\n\n\n\nAsterisk: \\\\\\\\texttt{\\\\\\\\textbackslash{}*}\n\n\n\nUnderscore: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\_}\n\n\n\nLeft brace: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\{}\n\n\n\nRight brace: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\}}\n\n\n\nLeft bracket: \\\\\\\\texttt{\\\\\\\\textbackslash{}[}\n\n\n\nRight bracket: \\\\\\\\texttt{\\\\\\\\textbackslash{}]}\n\n\n\nLeft paren: \\\\\\\\texttt{\\\\\\\\textbackslash{}(}\n\n\n\nRight paren: \\\\\\\\texttt{\\\\\\\\textbackslash{})}\n\n\n\nGreater-than: \\\\\\\\texttt{\\\\\\\\textbackslash{}>}\n\n\n\nHash: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\#}\n\n\n\nPeriod: \\\\\\\\texttt{\\\\\\\\textbackslash{}.}\n\n\n\nBang: \\\\\\\\texttt{\\\\\\\\textbackslash{}!}\n\n\n\nPlus: \\\\\\\\texttt{\\\\\\\\textbackslash{}+}\n\n\n\nMinus: \\\\\\\\texttt{\\\\\\\\textbackslash{}-}\n\n\n\n\\\\\\\\textbf{GFM:}\n\n\n\nPipe: \\\\\\\\texttt{\\\\\\\\textbackslash{}|}\n\n\n\nTilde: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\textasciitilde{}}\n\n\n\n\\\\\\\\textbf{Commonmark:}\n\n\n\nQuote: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\"}\n\n\n\nDollar: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\$}\n\n\n\nPercentage: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\%}\n\n\n\nAmpersand: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\&}\n\n\n\nSingle quote: \\\\\\\\texttt{\\\\\\\\textbackslash{}'}\n\n\n\nComma: \\\\\\\\texttt{\\\\\\\\textbackslash{},}\n\n\n\nForward slash: \\\\\\\\texttt{\\\\\\\\textbackslash{}/}\n\n\n\nColon: \\\\\\\\texttt{\\\\\\\\textbackslash{}:}\n\n\n\nSemicolon: \\\\\\\\texttt{\\\\\\\\textbackslash{};}\n\n\n\nLess-than: \\\\\\\\texttt{\\\\\\\\textbackslash{}<}\n\n\n\nEquals: \\\\\\\\texttt{\\\\\\\\textbackslash{}=}\n\n\n\nQuestion mark: \\\\\\\\texttt{\\\\\\\\textbackslash{}?}\n\n\n\nAt-sign: \\\\\\\\texttt{\\\\\\\\textbackslash{}@}\n\n\n\nCaret: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\textasciicircum{}}\n\n\n\nNew line: \\\\\\\\texttt{\\\\\\\\textbackslash{} } only works in paragraphs.\n\n\n\nThese should get escaped, even though they're matching pairs for\nother Markdown constructs:\n\n\n\n*asterisks*\n\n\n\n\\\\\\\\_underscores\\\\\\\\_\n\n\n\n\\`backticks\\`\n\n\n\nThis is a code span with a literal backslash-backtick sequence: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\`}\n\n\n\nThis is a tag with unescaped backticks <span attr='\\`ticks\\`'>bar</span>.\n\n\n\nThis is a tag with backslashes <span attr='\\\\\\\\\\\\\\\\backslashes\\\\\\\\\\\\\\\\'>bar</span>.\"\n`;\n\nexports[`rebber: remark specs block-elements: block-elements 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Different lists should receive two newline characters\nbetween them.\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax This is another list.\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax The same goes for lists in block quotes.\n\\\\\\\\end{itemize}\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax This is another list.\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax And for lists in lists:\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First sublist.\n\\\\\\\\end{enumerate}\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1.   Second sublist.\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd for lists followed by indented code blocks:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax This is a paragraph in a list\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nAnd this is code();\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs blockquote-indented: blockquote-indented 1`] = `\n\"\\\\\\\\begin{Quotation}\nbar\nbaz\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs blockquote-lazy-code: blockquote-lazy-code 1`] = `\n\"\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{text}\nfoo\nbar\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs blockquote-lazy-fence: blockquote-lazy-fence 1`] = `\n\"\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{text}\naNormalCodeBlockInABlockqoute();\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\n\nA paragraph.\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{text}\nthisIsAlsoSomeCodeInABlockquote();\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\n\nA paragraph.\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{text}\naNonTerminatedCodeBlockInABlockquote();\n\\\\\\\\end{CodeBlock}\n\naNewCodeBlockFollowingTheBlockQuote();\n\n\\\\\\\\begin{CodeBlock}{text}\n\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\n\nA paragraph.\n\n\n\n\\\\\\\\begin{Quotation}\nSomething in a blockquote.\n\n\\\\\\\\begin{CodeBlock}{text}\naNewCodeBlock();\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs blockquote-lazy-list: blockquote-lazy-list 1`] = `\n\"\\\\\\\\begin{Quotation}\nThis is a blockquote.\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax And in normal mode this is an internal list, but in commonmark this is a top level list.\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs blockquote-lazy-rule: blockquote-lazy-rule 1`] = `\n\"\\\\\\\\begin{Quotation}\nThis is a blockquote. Followed by a rule.\n\n\\\\\\\\horizontalLine\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs blockquote-list-item: blockquote-list-item 1`] = `\n\"This fails in markdown.pl and upskirt:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\n\\\\\\\\begin{Quotation}\nworld\n\\\\\\\\end{Quotation}\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs blockquotes: blockquotes 1`] = `\n\"\\\\\\\\begin{Quotation}\nThis is a blockquote.\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nThis is, in commonmark mode, another blockquote.\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs blockquotes-empty-lines: blockquotes-empty-lines 1`] = `\n\"\\\\\\\\begin{Quotation}\nNote there is no space on the following line.\n\nNote there is no space on the preceding line.\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs blockquotes-with-code-blocks: blockquotes-with-code-blocks 1`] = `\n\"\\\\\\\\begin{Quotation}\nExample:\n\n\\\\\\\\begin{CodeBlock}{text}\nsub status {\n    print \\\\\"working\\\\\";\n}\n\\\\\\\\end{CodeBlock}\n\nOr:\n\n\\\\\\\\begin{CodeBlock}{text}\nsub status {\n    return \\\\\"working\\\\\";\n}\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs bom: bom 1`] = `\n\"\\\\\\\\part{Hello from a BOM}\n\n\nBe careful when editing this file!\"\n`;\n\nexports[`rebber: remark specs breaks-hard: breaks-hard 1`] = `\n\"These are not breaks:\n\n\n\nLook at the\npretty line\nbreaks.\n\n\n\nThese are breaks:\n\n\n\nLook at the \\\\\\\\\\\\\\\\\npretty line \\\\\\\\\\\\\\\\\nbreaks.\n\n\n\nIn \\\\\\\\texttt{commonmark: true} mode, an escaped newline character is exposed as a \\\\\\\\texttt{break} node:\n\n\n\nLook at the\\\\\\\\textbackslash{}\npretty line\\\\\\\\textbackslash{}\nbreaks.\"\n`;\n\nexports[`rebber: remark specs case-insensitive-refs: case-insensitive-refs 1`] = `\n\"\\\\\\\\hyperref[hi]{hi}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{hi}\\\\\\\\externalLink{/url}{/url}}\"\n`;\n\nexports[`rebber: remark specs code-block: code-block 1`] = `\n\"Tildes:\n\n\n\n\\\\\\\\begin{CodeBlock}{javascript}\nalert('Hello World!');\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs code-block-escape: code-block-escape 1`] = `\n\"A little flaw:\n\n\n\n\\\\\\\\begin{CodeBlock}{python}\n\n\n\\\\\\\\end{CodeBlock}\n\n\n\nAn ingenuous flaw:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\n\\\\\\\\input{/etc/passwd}\n\\\\\\\\begin{CodeBlock}{text}\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs code-block-indentation: code-block-indentation 1`] = `\n\"Fenced code blocks are normally not exdented, however,\nwhen the initial fence is indented by spaces, the value of\nthe code is exdented by up to that amount of spaces.\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n    This is a code block...\n        \n    ...which is not exdented.\n\\\\\\\\end{CodeBlock}\n\n\n\nBut...\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n  This one...\n      \n  ...is.\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd...\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nSo is this...\n      \n  ...one.\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs code-block-nesting-bug: code-block-nesting-bug 1`] = `\n\"GitHub, thus RedCarpet, has a bug where “nested” fenced code blocks,\neven with shorter fences, can exit their actual “parent” block.\n\n\n\nNote that this bug does not occur on indented code-blocks.\n\n\n\n\\\\\\\\begin{CodeBlock}{foo}\n\\`\\`\\`bar\nbaz\n\\`\\`\\`\n\\\\\\\\end{CodeBlock}\n\n\n\nEven with a different fence marker:\n\n\n\n\\\\\\\\begin{CodeBlock}{foo}\n~~~bar\nbaz\n~~~\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd reversed:\n\n\n\n\\\\\\\\begin{CodeBlock}{foo}\n~~~bar\nbaz\n~~~\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}{foo}\n\\`\\`\\`bar\nbaz\n\\`\\`\\`\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs code-blocks: code-blocks 1`] = `\n\"code block on the first line\n\n\n\nRegular text.\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\ncode block indented by spaces\n\\\\\\\\end{CodeBlock}\n\n\n\nRegular text.\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nthe lines in this block  \nall contain trailing spaces  \n\\\\\\\\end{CodeBlock}\n\n\n\nRegular Text.\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\ncode block on the last line\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs code-spans: code-spans 1`] = `\n\"\\\\\\\\texttt{<test a=\\\\\"} content of attribute \\\\\\\\texttt{\\\\\">}\n\n\n\nFix for backticks within HTML tag: <span attr='\\`ticks\\`'>like this</span>\n\n\n\nHere's how you put \\\\\\\\texttt{\\`backticks\\`} in a code span.\n\n\n\nAdditionally, empty code spans are NOT supported: \\`\\`.\n\n\n\nHere’s an example, \\\\\\\\texttt{foo \\` bar }.\n\n\n\nAnd here, \\\\\\\\texttt{\\`\\`}.\n\n\n\n\\\\\\\\texttt{// this is also inline code}\n\n\n\nSo is this \\\\\\\\texttt{foo bar baz}.\n\n\n\nAnd this \\\\\\\\texttt{foo \\`\\` bar}\n\n\n\nAnd \\\\\\\\texttt{this\\\\\\\\textbackslash{}}but this is text\\`.\"\n`;\n\nexports[`rebber: remark specs def-blocks: def-blocks 1`] = `\n\"\\\\\\\\begin{Quotation}\nhello\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{hello}{hello}}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\nhello\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{2}\\\\\\\\externalLink{hello}{hello}}\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\item\\\\\\\\relax \\\\\\\\footnote{\\\\\\\\label{3}\\\\\\\\externalLink{hello}{hello}}\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\footnote{\\\\\\\\label{4}\\\\\\\\externalLink{hello}{hello}}\n\n\\\\\\\\begin{Quotation}\nfoo\nbar\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1-1}\\\\\\\\externalLink{foo}{foo}}\n\n\\\\\\\\begin{Quotation}\nbar\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs definition-newline: definition-newline 1`] = `\n\"\\\\\\\\hyperref[baz]{baz}: /url (\n)\n\n\n\n[foo]: /url \\\\\"\n\\\\\"\n\n\n\n[bar]: /url '\n'\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{baz}\\\\\\\\externalLink{/url}{/url}}\n\n\\\\\\\\footnote{\\\\\\\\label{baz-1}\\\\\\\\externalLink{/url}{/url}}\n\n\\\\\\\\footnote{\\\\\\\\label{baz-1-1}\\\\\\\\externalLink{/url}{/url}}\n\n\\\\\\\\hyperref[baz]{baz}: /url 'foo\"\n`;\n\nexports[`rebber: remark specs definition-unclosed: definition-unclosed 1`] = `\n\"[foo]:\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{bar}\\\\\\\\externalLink{</url}{</url}}\n\n[foo]:\"\n`;\n\nexports[`rebber: remark specs definition-unclosed-attribute: definition-unclosed-attribute 1`] = `\n\"[baz]: /url (there\n\n\n\n[foo]: /url \\\\\"there\n\n\n\n[bar]: /url 'there\n\n\n\n[baz]: url (\n\n\n\n[foo]: url \\\\\"\n\n\n\n[bar]: /url '\n\n\n\n[baz]: <url>(\n\n\n\n[foo]: <url>\\\\\"\n\n\n\n[bar]: <url>'\"\n`;\n\nexports[`rebber: remark specs deletion: deletion 1`] = `\"hello \\\\\\\\sout{hi} world\"`;\n\nexports[`rebber: remark specs double-link: double-link 1`] = `\n\"<p>Already linked: <a href=\\\\\"http://example.com/\\\\\">http://example.com/</a>.</p>\n\nAlready linked: \\\\\\\\externalLink{http://example.com/}{http://example.com/}.\n\n\n\nAlready linked: <a href=\\\\\"http://example.com/\\\\\">\\\\\\\\textbf{http://example.com/}</a>.\"\n`;\n\nexports[`rebber: remark specs emphasis: emphasis 1`] = `\n\"\\\\\\\\textit{emphasis}.\n\n\n\n\\\\\\\\textbf{strong}.\"\n`;\n\nexports[`rebber: remark specs emphasis-empty: emphasis-empty 1`] = `\n\"Hello ** ** world.\n\n\n\nHello \\\\\\\\_\\\\\\\\_\t\\\\\\\\_\\\\\\\\_ world.\n\n\n\nHello *\t* world.\n\n\n\nHello \\\\\\\\_\t\\\\\\\\_ world.\"\n`;\n\nexports[`rebber: remark specs emphasis-escaped-final-marker: emphasis-escaped-final-marker 1`] = `\n\"*bar*\n\n\n\n**bar**\n\n\n\n\\\\\\\\_bar\\\\\\\\_\n\n\n\n\\\\\\\\_\\\\\\\\_bar\\\\\\\\_\\\\\\\\_\"\n`;\n\nexports[`rebber: remark specs emphasis-internal: emphasis-internal 1`] = `\"These words should\\\\\\\\_not\\\\\\\\_be\\\\\\\\_emphasized.\"`;\n\nexports[`rebber: remark specs empty: empty 1`] = `\"\"`;\n\nexports[`rebber: remark specs entities: entities 1`] = `\n\"Lots of entities are supported in mdast:  , \\\\\\\\&, ©, Æ,\nĎ, ¾, ℋ, ⅆ,\n∲, \\\\\\\\&c.  Even some entities with a missing\nterminal semicolon are parsed correctly (as per the HTML5 spec):\nÿ, á, ©, and \\\\\\\\&.\n\n\n\nHowever, \\\\\\\\&MadeUpEntities; are kept in the document.\n\n\n\nEntities even work in the language flag of fenced code blocks:\n\n\n\n\\\\\\\\begin{CodeBlock}{some—language}\nalert('Hello');\n\\\\\\\\end{CodeBlock}\n\n\n\nOr in \\\\\\\\externalLink{línks}{\\\\\\\\textasciitilde{}/some—file}\n\n\n\nOr in \\\\\\\\includegraphics{~/an–image.png}\n\n\n\nBut, entities are not interpreted in \\\\\\\\texttt{inline c\\\\\\\\&ouml;de}, or in\ncode blocks:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nC&Ouml;DE block.\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs entities-advanced: entities-advanced 1`] = `\n\"\\\\\\\\begin{Quotation}\nHowever, \\\\\\\\&MadeUpEntities; are kept in the document.\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nEntities even work in the language flag of fenced code blocks:\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{some©language}\nalert('Hello');\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nAnd in an auto-link: \\\\\\\\externalLink{http://example©xample.com}{http://example\\\\\\\\&copyxample.com}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nFoo and bar and http://example©xample.com and baz.\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nOr in \\\\\\\\externalLink{l©nks}{\\\\\\\\textasciitilde{}/some\\\\\\\\&copyfile}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nOr in \\\\\\\\externalLink{l©lnks}{\\\\\\\\textasciitilde{}/some\\\\\\\\&copyfile}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nOr in \\\\\\\\includegraphics{~/some&copyfile}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\nOr in \\\\\\\\includegraphics{~/some&copyfile}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nOr in \\\\\\\\includegraphics{undefined}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{http://example\\\\\\\\&copyxample.com}{http://example\\\\\\\\&copyxample.com}}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\footnote{\\\\\\\\label{ 1 }\\\\\\\\externalLink{http://example\\\\\\\\&copyxample.com}{http://example\\\\\\\\&copyxample.com}}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\nBut, entities are not interpreted in \\\\\\\\texttt{inline c\\\\\\\\&oumlde}, or in\ncode blocks:\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{text}\nC&OumlDE block.\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs escaped-angles: escaped-angles 1`] = `\">\"`;\n\nexports[`rebber: remark specs fenced-code: fenced-code 1`] = `\n\"\\\\\\\\begin{CodeBlock}{js}\nvar a = 'hello';\nconsole.log(a + ' world');\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}{bash}\necho \\\\\"hello, \\${WORLD}\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}{longfence}\nQ: What do you call a tall person who sells stolen goods?\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}{ManyTildes}\nA longfence!\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs fenced-code-empty: fenced-code-empty 1`] = `\n\"Normal with language tag:\n\n\n\n\\\\\\\\begin{CodeBlock}{js}\n\n\\\\\\\\end{CodeBlock}\n\n\n\nWith white space:\n\n\n\n\\\\\\\\begin{CodeBlock}{bash}\n\n\\\\\\\\end{CodeBlock}\n\n\n\nWith very long fences:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\n\\\\\\\\end{CodeBlock}\n\n\n\nWith nothing:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs fenced-code-trailing-characters: fenced-code-trailing-characters 1`] = `\n\"\\\\\\\\begin{CodeBlock}{js}\nfoo();\n\\`\\`\\`bash\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs fenced-code-trailing-characters-2: fenced-code-trailing-characters-2 1`] = `\n\"\\\\\\\\begin{CodeBlock}{text}\n\\`\\`\\` aaa\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs fenced-code-white-space-after-flag: fenced-code-white-space-after-flag 1`] = `\n\"\\\\\\\\begin{CodeBlock}{js}\nfoo();\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}{bash}\necho \\\\\"hello, \\${WORLD}\\\\\"\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs hard-wrapped-paragraphs-with-list-like-lines: hard-wrapped-paragraphs-with-list-like-lines 1`] = `\n\"In Markdown 1.0.0 and earlier. Version\n8. This line turns into a list item.\nBecause a hard-wrapped line in the\n123. middle of a paragraph looked like a\nlist item.\n\n\n\nHere's one with a bullet.\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax criminey.\n\\\\\\\\end{itemize}\n\n\nNon-GFM does not create a list for either.\nGFM does not create a list for \\\\\\\\texttt{8.}, but does for \\\\\\\\texttt{*}.\nCommonMark creates a list for both.\nAll versions create lists for the following.\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Here's one with a bullet.\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax criminey.\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\n\n...and the following:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax In Markdown 1.0.0 and earlier. Version\n8. This line turns into a list item.\n\\\\\\\\end{enumerate}\"\n`;\n\nexports[`rebber: remark specs heading: heading 1`] = `\n\"\\\\\\\\part{Heading 1}\n\n\n\\\\\\\\chapter{Heading 2}\n\n\n\\\\\\\\section{Heading 4}\n\n\n\\\\\\\\subsection{Heading 4}\n\n\n\\\\\\\\subsubsection{Heading 5}\n\n\n\\\\\\\\paragraph{Heading 6}\"\n`;\n\nexports[`rebber: remark specs heading-atx-closed-trailing-white-space: heading-atx-closed-trailing-white-space 1`] = `\n\"\\\\\\\\part{Foo}\n\n\n\\\\\\\\chapter{Bar}\"\n`;\n\nexports[`rebber: remark specs heading-atx-empty: heading-atx-empty 1`] = `\n\"\\\\\\\\part{}\n\n\n\\\\\\\\chapter{}\n\n\n\\\\\\\\section{}\n\n\n\\\\\\\\subsection{}\n\n\n\\\\\\\\subsubsection{}\n\n\n\\\\\\\\paragraph{}\"\n`;\n\nexports[`rebber: remark specs heading-in-blockquote: heading-in-blockquote 1`] = `\n\"\\\\\\\\begin{Quotation}\nA blockquote\nwith some more text.\n\\\\\\\\end{Quotation}\n\n\n\nA normal paragraph.\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\chapter{A blockquote followed by a horizontal rule (in CommonMark).}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\chapter{A heading in a blockquote}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs heading-in-paragraph: heading-in-paragraph 1`] = `\n\"Hello\n\n\n\n\\\\\\\\part{World}\"\n`;\n\nexports[`rebber: remark specs heading-not-atx: heading-not-atx 1`] = `\n\"\\\\\\\\#This is not a heading, per CommonMark: \\\\\\\\externalLink{http://spec.commonmark.org/0.17/\\\\\\\\#example-25}{http://spec.commonmark.org/0.17/\\\\\\\\#example-25}\n\n\n\nKramdown (GitHub) neither supports unspaced ATX-headings.\n\n\n\n\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\# h7?\n\n\n\n\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\# h8?\n\n\n\n\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\# h9?\n\n\n\nMore than six \\\\\\\\# characters is not a heading: \\\\\\\\externalLink{http://spec.commonmark.org/0.26/\\\\\\\\#example-33}{http://spec.commonmark.org/0.26/\\\\\\\\#example-33}\"\n`;\n\nexports[`rebber: remark specs heading-setext-with-initial-spacing: heading-setext-with-initial-spacing 1`] = `\n\"\\\\\\\\part{Heading 1}\n\n\n\\\\\\\\chapter{Heading 2}\n\n\nBoth these headings caused positional problems in on commit daa344c and before.\"\n`;\n\nexports[`rebber: remark specs horizontal-rules: horizontal-rules 1`] = `\n\"Dashes:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n---\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n- - -\n\\\\\\\\end{CodeBlock}\n\n\n\nAsterisks:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n***\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n* * *\n\\\\\\\\end{CodeBlock}\n\n\n\nUnderscores:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n___\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n_ _ _\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs horizontal-rules-adjacent: horizontal-rules-adjacent 1`] = `\n\"\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\nThe three asterisks are not a Setext header.\n\n\n\nThis is a paragraph.\n\n\n\n\\\\\\\\horizontalLine\n\n\n\nThis is another paragraph.\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\chapter{But this is a secondary heading.}\n\n\n\\\\\\\\horizontalLine\"\n`;\n\nexports[`rebber: remark specs hr: hr 1`] = `\"\\\\\\\\horizontalLine\"`;\n\nexports[`rebber: remark specs hr-list-break: hr-list-break 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello world\n\\\\\\\\item\\\\\\\\relax how are\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nyou today?\n\n\n\nThe above asterisks do split the list, but the below ones do not.\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello world\n\\\\\\\\item\\\\\\\\relax how are\n\\\\\\\\item\\\\\\\\relax \\\\\\\\horizontalLine\n\nyou today?\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Neither do these\n\\\\\\\\item\\\\\\\\relax how are\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax you today?\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax But these do\n\\\\\\\\item\\\\\\\\relax how are\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nyou today?\"\n`;\n\nexports[`rebber: remark specs html-advanced: html-advanced 1`] = `\n\"Simple block on one line:\n\n\n\n<div>foo</div>\n\nAnd nested without indentation:\n\n\n\n<div>\n<div>\n<div>\nfoo\n</div>\n<div style=\\\\\">\\\\\"/>\n</div>\n<div>bar</div>\n</div>\"\n`;\n\nexports[`rebber: remark specs html-attributes: html-attributes 1`] = `\n\"\\\\\\\\part{Block-level}\n\n\n<article foo=\\\\\"bar 'baz' qux\\\\\" foo='bar \\\\\"baz\\\\\" qux' foo=baz>\n\n<article foo>\n\n<article>\n\n<article :foo:bar:09:=\\\\\"baz\\\\\">\n\n<article foo.bar_09->\n\n<article foo.bar_09-   >\n\n<article foo.bar_09-   />\n\n<div baz\nqux\n\n\\\\\\\\part{Inline}\n\n\n<span foo=\\\\\"bar 'baz' qux\\\\\" foo='bar \\\\\"baz\\\\\" qux' foo=baz>\n\n<span foo>\n\n<span>\n\n<span :foo:bar:09:=\\\\\"baz\\\\\">\n\n<span foo.bar_09->\n\n<span foo.bar_09-   >\n\n<span foo.bar_09-   />\n\n<span this is\ninvalid\"\n`;\n\nexports[`rebber: remark specs html-cdata: html-cdata 1`] = `\n\"<![CDATA[\nfooBarBaz()\n]]>\n\nfoo <![CDATA[bar]]>\"\n`;\n\nexports[`rebber: remark specs html-comments: html-comments 1`] = `\n\"Paragraph one.\n\n\n\n<!-- This is a simple comment -->\n\n<!--\n\tThis is another comment.\n-->\n\nWhat follows is not an HTML comment because it contains\ntwo consecutive dashes:\n\\\\\\\\externalLink{https://html.spec.whatwg.org/multipage/syntax.html\\\\\\\\#comments}{https://html.spec.whatwg.org/multipage/syntax.html\\\\\\\\#comments}.\n\n\n\n<!-- one comment block -- -- with two comments -->\n\nBut this is fine (in commonmark):\n\n\n\n<!-- one comment block - with a dash -->\n\nAnd, this is wrong (in commonmark):\n\n\n\n<!-->-->\n\nThe end.\"\n`;\n\nexports[`rebber: remark specs html-declaration: html-declaration 1`] = `\n\"<!DOCTYPE html>\n\nfoo <!BAR br BAZ>\n\n\n\n<!doctype html>\n\n<!valid >\n\n<!invalid>\"\n`;\n\nexports[`rebber: remark specs html-indented: html-indented 1`] = `\n\"<div>\n  *hello*\n   <div>\n\n <span>\n  *hello*\n   <span>\n\n  <!doctype html>\n\n   <!-- baz -->\n\nalpha <!-- baz -->\"\n`;\n\nexports[`rebber: remark specs html-processing-instruction: html-processing-instruction 1`] = `\n\"<?php\n  echo '>';\n?>\"\n`;\n\nexports[`rebber: remark specs html-simple: html-simple 1`] = `\n\"Here's a simple block:\n\n\n\n<div>\n\tfoo\n</div>\n\nThis should be a code block, though:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<div>\n\tfoo\n</div>\n\\\\\\\\end{CodeBlock}\n\n\n\nAs should this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<div>foo</div>\n\\\\\\\\end{CodeBlock}\n\n\n\nNow, nested:\n\n\n\n<div>\n\t<div>\n\t\t<div>\n\t\t\tfoo\n\t\t</div>\n\t</div>\n</div>\n\nThis should just be an HTML comment:\n\n\n\n<!-- Comment -->\n\nMultiline:\n\n\n\n<!--\nBlah\nBlah\n-->\n\nCode block:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<!-- Comment -->\n\\\\\\\\end{CodeBlock}\n\n\n\nJust plain comment, with trailing spaces on the line:\n\n\n\n<!-- foo -->   \n\nCode:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<hr>\n\\\\\\\\end{CodeBlock}\n\n\n\nHr's:\n\n\n\n<hr>\n\n<hr>\n\n<hr>\n\n<hr>   \n\n<hr>  \n\n<hr> \n\n<hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" />\n\n<hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\"/>\n\n<hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" >\"\n`;\n\nexports[`rebber: remark specs html-tags: html-tags 1`] = `\n\"\\\\\\\\part{Block}\n\n\n<article>\n\n<ARTICLE>\n\n<ArTiClE>\n\n<-article>\n\n\n\n<article foo=\n\n<article foo=\\\\\"bar\n\n<article foo='bar\n\n<article foo=bar \n\n<article foo=bar >\n\n<article/>\n\n<-article/>\n\n\n\n</article>\n\n</ARTICLE>\n\n</aRtIcLe>\n\n</article  >\n\n</-article  >\n\n\n\n</article\n\n</article  \n\n\\\\\\\\part{Inline}\n\n\n<span>\n\n<SPAN>\n\n<SpAn>\n\n<-span>\n\n\n\n<span/>\n\n<-span/>\n\n\n\n</span>\n\n</SPAN>\n\n</SpAn>\n\n</span  >\n\n</-span>\n\n\n\n</span\n\n\n\n</span\n\n\n\n<span foo=\n\n\n\n<span foo=\\\\\"bar\n\n\n\n<span foo='bar\n\n\n\n<span foo=bar\n\n\n\n<span foo=bar >\"\n`;\n\nexports[`rebber: remark specs image-basename-dots: image-basename-dots 1`] = `\n\"\\\\\\\\includegraphics{{x.yz}.png}\n\n\n\n\\\\\\\\includegraphics{/a/{w.x.y.z}.png}\n\n\n\n\\\\\\\\includegraphics{/{w.x.y.z}.png}\n\n\n\n\\\\\\\\includegraphics{/foo.bar/{x.yz}.png}\"\n`;\n\nexports[`rebber: remark specs image-empty-alt: image-empty-alt 1`] = `\"\\\\\\\\includegraphics{/xyz.png}\"`;\n\nexports[`rebber: remark specs image-in-link: image-in-link 1`] = `\n\"\\\\\\\\part{\\\\\\\\externalLink{\\\\\\\\includegraphics{https://img.shields.io/badge/unicorn-approved-ff69b4.svg}}{http://shields.io}}\n\n\n\\\\\\\\externalLink{\\\\\\\\includegraphics{https://img.shields.io/travis/wooorm/mdast.svg?style=flat}}{https://travis-ci.org/wooorm/mdast}\n\n\n\n\\\\\\\\externalLink{\\\\\\\\includegraphics{https://img.shields.io/badge/style-flat--squared-green.svg?style=flat-square}}{http://example.com}\"\n`;\n\nexports[`rebber: remark specs image-path-escape: image-path-escape 1`] = `\"\\\\\\\\includegraphics{a[b]\\\\\\\\ \\\\\\\\input{/etc/passwd\\\\\\\\image{[a](b)}\"`;\n\nexports[`rebber: remark specs image-with-pipe: image-with-pipe 1`] = `\"f|\"`;\n\nexports[`rebber: remark specs images: images 1`] = `\n\"Lorem ipsum dolor sit \\\\\\\\includegraphics{http://amet.com/amet.jpeg}, consectetur adipiscing elit. Praesent dictum purus ullamcorper ligula semper pellentesque.\n\n\n\nNulla \\\\\\\\includegraphics{http://finibus.com/finibus.png} neque et diam rhoncus convallis. Nam dictum sapien nec sem ultrices fermentum. Nulla \\\\\\\\includegraphics{http://facilisi.com/facilisi.gif}. In et feugiat massa.\n\n\n\nDonec sed sodales metus, ut aliquet quam. Suspendisse nec ipsum risus. Interdum et malesuada fames ac ante ipsum primis in \\\\\\\\includegraphics{http://faucibus.com/faucibus.tiff}.\"\n`;\n\nexports[`rebber: remark specs invalid-link-definition: invalid-link-definition 1`] = `\"Something[2-3]\"`;\n\nexports[`rebber: remark specs lazy-blockquotes: lazy-blockquotes 1`] = `\n\"\\\\\\\\begin{Quotation}\nhi there\nbud\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs link-in-link: link-in-link 1`] = `\n\"\\\\\\\\part{\\\\\\\\externalLink{mailto:test@example.com}{http://shields.io}}\n\n\n\\\\\\\\externalLink{https://travis-ci.org/wooorm/mdast}{https://travis-ci.org/wooorm/mdast}\n\n\n\n\\\\\\\\externalLink{[](http://example.com \\\\\"An example\\\\\")}{http://example.com}\"\n`;\n\nexports[`rebber: remark specs link-spaces: link-spaces 1`] = `\n\"[alpha] (bravo\n\n\n\n\\\\\\\\includegraphics{undefined} (delta\n.com)\n\n\n\n[echo]\t(\\\\\\\\externalLink{http://foxtrot.golf}{http://foxtrot.golf})\n\n\n\n\\\\\\\\includegraphics{undefined}   (india.com/juliett)\"\n`;\n\nexports[`rebber: remark specs link-whitespace: link-whitespace 1`] = `\n\"[alpha](\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo} charlie).\n\n\n\n[alpha](\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\tcharlie).\n\n\n\n[alpha](\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\ncharlie).\n\n\n\n\\\\\\\\includegraphics{undefined}(\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo} charlie).\n\n\n\n\\\\\\\\includegraphics{undefined}(\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\tcharlie).\n\n\n\n\\\\\\\\includegraphics{undefined}(\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\ncharlie).\n\n\n\n<\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo} charlie>.\n\n\n\n<\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\tcharlie>.\n\n\n\n<\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\ncharlie>.\n\n\n\n\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo} charlie.\n\n\n\n\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\tcharlie.\n\n\n\n\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\ncharlie.\"\n`;\n\nexports[`rebber: remark specs link-with-spaces: link-with-spaces 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world and some spaces.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world and some spaces.html}\"\n`;\n\nexports[`rebber: remark specs links: links 1`] = `\n\"Lorem ipsum dolor sit \\\\\\\\externalLink{amet}{http://amet.com}, consectetur adipiscing elit. Praesent dictum purus ullamcorper ligula semper pellentesque.\n\n\n\nNulla \\\\\\\\externalLink{finibus}{http://finibus.com} neque et diam rhoncus convallis. Nam dictum sapien nec sem ultrices fermentum. Nulla \\\\\\\\externalLink{facilisi}{http://facilisi.com}. In et feugiat massa.\n\n\n\nDonec sed sodales metus, ut aliquet quam. Suspendisse nec ipsum risus. Interdum et malesuada fames ac ante ipsum primis in \\\\\\\\externalLink{faucibus}{http://faucibus.com}.\"\n`;\n\nexports[`rebber: remark specs links-inline-style: links-inline-style 1`] = `\n\"Just a \\\\\\\\externalLink{URL}{/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{/url/}.\n\n\n\n[URL and title]( /url/has space ).\n\n\n\n[URL and title]( /url/has space/ \\\\\"url has space and title\\\\\").\n\n\n\n.\"\n`;\n\nexports[`rebber: remark specs links-reference-proto: links-reference-proto 1`] = `\n\"A \\\\\\\\hyperref[tostring]{primary}, \\\\\\\\hyperref[constructor]{secondary}, and \\\\\\\\hyperref[__proto__]{tertiary} link.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{tostring}\\\\\\\\externalLink{http://primary.com}{http://primary.com}}\n\n\\\\\\\\footnote{\\\\\\\\label{__proto__}\\\\\\\\externalLink{http://tertiary.com}{http://tertiary.com}}\n\n\\\\\\\\footnote{\\\\\\\\label{constructor}\\\\\\\\externalLink{http://secondary.com}{http://secondary.com}}\"\n`;\n\nexports[`rebber: remark specs links-reference-style: links-reference-style 1`] = `\n\"Foo \\\\\\\\hyperref[1]{bar}.\n\n\n\nFoo \\\\\\\\hyperref[1]{bar}.\n\n\n\nFoo \\\\\\\\hyperref[1]{bar}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{/url/}{/url/}}\n\nWith \\\\\\\\hyperref[b]{embedded [brackets]}.\n\n\n\nIndented \\\\\\\\hyperref[once]{once}.\n\n\n\nIndented \\\\\\\\hyperref[twice]{twice}.\n\n\n\nIndented \\\\\\\\hyperref[thrice]{thrice}.\n\n\n\nIndented [four] times.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{once}\\\\\\\\externalLink{/url}{/url}}\n\n\\\\\\\\footnote{\\\\\\\\label{twice}\\\\\\\\externalLink{/url}{/url}}\n\n\\\\\\\\footnote{\\\\\\\\label{thrice}\\\\\\\\externalLink{/url}{/url}}\n\n\\\\\\\\begin{CodeBlock}{text}\n[four]: /url\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{b}\\\\\\\\externalLink{/url/}{/url/}}\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\hyperref[this]{this} should work\n\n\n\nSo should \\\\\\\\hyperref[this]{this}.\n\n\n\nAnd \\\\\\\\hyperref[this]{this}.\n\n\n\nAnd \\\\\\\\hyperref[this]{this}.\n\n\n\nAnd \\\\\\\\hyperref[this]{this}.\n\n\n\nBut not [that].\n\n\n\nNor [that].\n\n\n\nNor [that].\n\n\n\n[Something in brackets like \\\\\\\\hyperref[this]{this} should work]\n\n\n\n[Same with \\\\\\\\hyperref[this]{this}.]\n\n\n\nIn this case, \\\\\\\\externalLink{this}{/somethingelse/} points to something else.\n\n\n\nBackslashing should suppress [this] and [this].\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{this}\\\\\\\\externalLink{foo}{foo}}\n\n\\\\\\\\horizontalLine\n\n\n\nHere's one where the \\\\\\\\hyperref[link breaks]{link\nbreaks} across lines.\n\n\n\nHere's another where the \\\\\\\\hyperref[link breaks]{link\nbreaks} across lines, but with a line-ending space.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{link breaks}\\\\\\\\externalLink{/url/}{/url/}}\"\n`;\n\nexports[`rebber: remark specs links-shortcut-references: links-shortcut-references 1`] = `\n\"This is the \\\\\\\\hyperref[simple case]{simple case}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{simple case}\\\\\\\\externalLink{/simple}{/simple}}\n\nThis one has a \\\\\\\\hyperref[line break]{line\nbreak}.\n\n\n\nThis one has a \\\\\\\\hyperref[line break]{line\nbreak} with a line-ending space.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{line break}\\\\\\\\externalLink{/foo}{/foo}}\n\n\\\\\\\\hyperref[that]{this} and the \\\\\\\\hyperref[other]{other}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{this}\\\\\\\\externalLink{/this}{/this}}\n\n\\\\\\\\footnote{\\\\\\\\label{that}\\\\\\\\externalLink{/that}{/that}}\n\n\\\\\\\\footnote{\\\\\\\\label{other}\\\\\\\\externalLink{/other}{/other}}\"\n`;\n\nexports[`rebber: remark specs links-text-delimiters: links-text-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\"\n`;\n\nexports[`rebber: remark specs links-text-empty: links-text-empty 1`] = `\n\"\\\\\\\\externalLink{}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\"\n`;\n\nexports[`rebber: remark specs links-text-entity-delimiters: links-text-entity-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\"\n`;\n\nexports[`rebber: remark specs links-text-escaped-delimiters: links-text-escaped-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\"\n`;\n\nexports[`rebber: remark specs links-text-mismatched-delimiters: links-text-mismatched-delimiters 1`] = `\n\"[Hello \\\\\\\\externalLink{world!}{./hello-world.html}.\n\n\n\n[Hello \\\\\\\\externalLink{world!}{./hello-world.html}.\n\n\n\n![Hello \\\\\\\\externalLink{world!}{./hello-world.html}.\n\n\n\n![Hello \\\\\\\\externalLink{world!}{./hello-world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-double-quotes: links-title-double-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-double-quotes-delimiters: links-title-double-quotes-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-double-quotes-entity-delimiters: links-title-double-quotes-entity-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-double-quotes-escaped-delimiters: links-title-double-quotes-escaped-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-double-quotes-mismatched-delimiters: links-title-double-quotes-mismatched-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-empty-double-quotes: links-title-empty-double-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-empty-parentheses: links-title-empty-parentheses 1`] = `\n\"[Hello](./world.html ()).\n\n\n\n[Hello](<./world.html> ()).\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html ()).\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> ()).\"\n`;\n\nexports[`rebber: remark specs links-title-empty-single-quotes: links-title-empty-single-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-parentheses: links-title-parentheses 1`] = `\n\"[Hello](./world.html (Hello World!)).\n\n\n\n[Hello](<./world.html> (Hello World!)).\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html (Hello World!)).\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> (Hello World!)).\"\n`;\n\nexports[`rebber: remark specs links-title-single-quotes: links-title-single-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-single-quotes-delimiters: links-title-single-quotes-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-single-quotes-entity-delimiters: links-title-single-quotes-entity-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-single-quotes-escaped-delimiters: links-title-single-quotes-escaped-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-single-quotes-mismatched-delimiters: links-title-single-quotes-mismatched-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs links-title-unclosed: links-title-unclosed 1`] = `\n\"[Hello](./world.html 'Hello\n\n\n\n[Hello](<./world.html> 'Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html 'Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> 'Hello\n\n\n\n[Hello](./world.html \\\\\"Hello\n\n\n\n[Hello](<./world.html> \\\\\"Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html \\\\\"Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> \\\\\"Hello\n\n\n\n[Hello](./world.html (Hello\n\n\n\n[Hello](<./world.html> (Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html (Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> (Hello\"\n`;\n\nexports[`rebber: remark specs links-url-empty: links-url-empty 1`] = `\n\".\n\n\n\n.\n\n\n\n\\\\\\\\includegraphics{}.\n\n\n\n\\\\\\\\includegraphics{}.\"\n`;\n\nexports[`rebber: remark specs links-url-empty-title-double-quotes: links-url-empty-title-double-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{\\\\\"World!\\\\\"}.\n\n\n\n\\\\\\\\externalLink{Hello}{\\\\\"World!\\\\\"}.\n\n\n\n.\n\n\n\n\\\\\\\\includegraphics{\\\\\"World!\\\\\"}.\n\n\n\n\\\\\\\\includegraphics{\\\\\"World!\\\\\"}.\n\n\n\n\\\\\\\\includegraphics{}.\"\n`;\n\nexports[`rebber: remark specs links-url-empty-title-parentheses: links-url-empty-title-parentheses 1`] = `\n\"\\\\\\\\externalLink{Hello}{(World!)}.\n\n\n\n\\\\\\\\externalLink{Hello}{(World!)}.\n\n\n\n[World](<> (World!)).\n\n\n\n\\\\\\\\includegraphics{(World!)}.\n\n\n\n\\\\\\\\includegraphics{(World!)}.\n\n\n\n\\\\\\\\includegraphics{undefined}(<> (World!)).\"\n`;\n\nexports[`rebber: remark specs links-url-empty-title-single-quotes: links-url-empty-title-single-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{'World!'}.\n\n\n\n\\\\\\\\externalLink{Hello}{'World!'}.\n\n\n\n.\n\n\n\n\\\\\\\\includegraphics{'World!'}.\n\n\n\n\\\\\\\\includegraphics{'World!'}.\n\n\n\n\\\\\\\\includegraphics{}.\"\n`;\n\nexports[`rebber: remark specs links-url-entity-parentheses: links-url-entity-parentheses 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\"\n`;\n\nexports[`rebber: remark specs links-url-escaped-parentheses: links-url-escaped-parentheses 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\"\n`;\n\nexports[`rebber: remark specs links-url-mismatched-parentheses: links-url-mismatched-parentheses 1`] = `\n\"[Hello](./world(and-hello(world)).\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld}).\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{undefined}(./world(and-hello(world)).\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld}).\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\"\n`;\n\nexports[`rebber: remark specs links-url-nested-parentheses: links-url-nested-parentheses 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world(and)hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)hello(world)}.\"\n`;\n\nexports[`rebber: remark specs links-url-new-line: links-url-new-line 1`] = `\n\"[Hello](./wo\nrld.html).\n\n\n\n\\\\\\\\externalLink{Hello}{./wo\nrld.html}.\n\n\n\n\\\\\\\\includegraphics{undefined}(./wo\nrld.png).\n\n\n\n\\\\\\\\includegraphics{./wo\nrld.png}.\"\n`;\n\nexports[`rebber: remark specs links-url-unclosed: links-url-unclosed 1`] = `\n\"[Hello](\n\n\n\n[World](<\n\n\n\n\\\\\\\\includegraphics{undefined}(\n\n\n\n\\\\\\\\includegraphics{undefined}(<\"\n`;\n\nexports[`rebber: remark specs links-url-white-space: links-url-white-space 1`] = `\n\"[Hello](./wo rld.html).\n\n\n\n\\\\\\\\externalLink{Hello}{./wo rld.html}.\n\n\n\n\\\\\\\\includegraphics{undefined}(./wo rld.png).\n\n\n\n\\\\\\\\includegraphics{./wo rld.png}.\"\n`;\n\nexports[`rebber: remark specs list: list 1`] = `\n\"\\\\\\\\part{List bullets}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax One:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Nested one;\n\\\\\\\\item\\\\\\\\relax Nested two:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Nested three.\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax Two;\n\\\\\\\\item\\\\\\\\relax Three.\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs list-after-list: list-after-list 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{enumerate}\"\n`;\n\nexports[`rebber: remark specs list-and-code: list-and-code 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax This is a list item\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is code\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs list-continuation: list-continuation 1`] = `\n\"\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\begin{CodeBlock}{js}\ncode();\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\hyperref[foo]{foo}\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\footnote{\\\\\\\\label{foo}\\\\\\\\externalLink{http://google.com}{http://google.com}}\"\n`;\n\nexports[`rebber: remark specs list-indentation: list-indentation 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Hello 1a\n\nWorld 1a.\n\\\\\\\\item\\\\\\\\relax Hello 1b\n\nWorld 1b.\n\\\\\\\\item\\\\\\\\relax Hello 2a\n\nWorld 2a.\n\\\\\\\\item\\\\\\\\relax Hello 2b\n\nWorld 2b.\n\\\\\\\\item\\\\\\\\relax Hello 3a\n\nWorld 3a.\n\\\\\\\\item\\\\\\\\relax Hello 3b\n\nWorld 3b.\n\\\\\\\\item\\\\\\\\relax Hello 4a\n\nWorld 4a.\n\\\\\\\\item\\\\\\\\relax Hello 4b\n\nWorld 4b.\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nHello 5a\n\\\\\\\\end{CodeBlock}\n\nWorld 5a.\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nHello 5b\n\nWorld 5b.\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs list-item-empty: list-item-empty 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax foo\n\\\\\\\\item\\\\\\\\relax \n\\\\\\\\item\\\\\\\\relax bar\n\\\\\\\\item\\\\\\\\relax foo\n\\\\\\\\item\\\\\\\\relax \n\\\\\\\\item\\\\\\\\relax bar\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs list-item-empty-with-white-space: list-item-empty-with-white-space 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs list-item-indent: list-item-indent 1`] = `\n\"\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\n\\\\\\\\end{enumerate}\n\n\n<!--  -->\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\n\\\\\\\\end{enumerate}\n\n\n<!--  -->\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\n\\\\\\\\end{enumerate}\n\n\n<!--  -->\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\nfoo bar baz.\n\\\\\\\\end{enumerate}\n\n\n<!--  -->\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\nfoo bar baz.\n\\\\\\\\end{enumerate}\n\n\n<!--  -->\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\nfoo bar baz.\n\\\\\\\\end{enumerate}\n\n\n<!--  -->\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\n\\\\\\\\end{itemize}\n\n\n<!--  -->\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\nfoo bar baz.\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs list-item-newline: list-item-newline 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Foo\n\\\\\\\\item\\\\\\\\relax Bar\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs list-item-text: list-item-text 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item1\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item2\n\\\\\\\\end{itemize}\ntext\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs list-ordered: list-ordered 1`] = `\n\"\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo;\n\\\\\\\\item\\\\\\\\relax bar;\n\\\\\\\\item\\\\\\\\relax baz.\n\\\\\\\\end{enumerate}\"\n`;\n\nexports[`rebber: remark specs lists-with-code-and-rules: lists-with-code-and-rules 1`] = `\n\"\\\\\\\\chapter{foo}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax bar:\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax one\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax two\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax three\n\\\\\\\\item\\\\\\\\relax four\n\\\\\\\\item\\\\\\\\relax five\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\n\\\\\\\\item\\\\\\\\relax foo:\n\n\\\\\\\\begin{CodeBlock}{text}\nline 1\nline 2\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item\\\\\\\\relax foo:\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo \\\\\\\\texttt{bar} bar:\n\n\\\\\\\\begin{CodeBlock}{erb}\nsome code here\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item\\\\\\\\relax foo \\\\\\\\texttt{bar} bar:\n\n\\\\\\\\begin{CodeBlock}{erb}\nfoo\n---\nbar\n---\nfoo\nbar\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item\\\\\\\\relax foo \\\\\\\\texttt{bar} bar:\n\n\\\\\\\\begin{CodeBlock}{html}\n---\nfoo\nfoo\n---\nbar\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item\\\\\\\\relax foo \\\\\\\\texttt{bar} bar:\n\n\\\\\\\\begin{CodeBlock}{text}\nfoo\n---\nbar\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item\\\\\\\\relax foo\n\\\\\\\\end{enumerate}\n\\\\\\\\end{enumerate}\"\n`;\n\nexports[`rebber: remark specs loose-lists: loose-lists 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\nworld\n\nhow\nare\n\\\\\\\\item\\\\\\\\relax you\n\\\\\\\\end{itemize}\n\n\nbetter behavior:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax world\nhow\n\nare\nyou\n\\\\\\\\item\\\\\\\\relax today\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax hi\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\item\\\\\\\\relax world\n\\\\\\\\item\\\\\\\\relax hi\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\item\\\\\\\\relax world\n\\\\\\\\item\\\\\\\\relax hi\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\item\\\\\\\\relax world\n\nhow\n\\\\\\\\item\\\\\\\\relax hi\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\item\\\\\\\\relax world\n\\\\\\\\item\\\\\\\\relax how\nare\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\item\\\\\\\\relax world\n\\\\\\\\item\\\\\\\\relax how\nare\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs main: main 1`] = `\n\"\\\\\\\\footnote{\\\\\\\\label{test}\\\\\\\\externalLink{http://google.com/}{http://google.com/}}\n\n\\\\\\\\part{A heading}\n\n\nJust a note, I've found that I can't test my markdown parser vs others.\nFor example, both markdown.js and showdown code blocks in lists wrong. They're\nalso completely \\\\\\\\hyperref[test]{inconsistent} with regards to paragraphs in list items.\n\n\n\nA link. Not anymore.\n\n\n\n<aside>This will make me fail the test because\nmarkdown.js doesnt acknowledge arbitrary html blocks =/</aside>\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax List Item 1\n\\\\\\\\item\\\\\\\\relax List Item 2\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax New List Item 1\nHi, this is a list item.\n\\\\\\\\item\\\\\\\\relax New List Item 2\nAnother item\nCode goes here.\nLots of it...\n\\\\\\\\item\\\\\\\\relax New List Item 3\nThe last item\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax List Item 3\nThe final item.\n\\\\\\\\item\\\\\\\\relax List Item 4\nThe real final item.\n\\\\\\\\end{itemize}\n\n\nParagraph.\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax bq Item 1\n\\\\\\\\item\\\\\\\\relax bq Item 2\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax New bq Item 1\n\\\\\\\\item\\\\\\\\relax New bq Item 2\nText here\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\nAnother blockquote!\nI really need to get\nmore creative with\nmockup text..\nmarkdown.js breaks here again\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\chapter{Another Heading}\n\n\nHello \\\\\\\\textit{world}. Here is a \\\\\\\\externalLink{link}{//hello}.\nAnd an image \\\\\\\\includegraphics{src}.\nAnd an image with an empty alt attribute \\\\\\\\includegraphics{src}.\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nCode goes here.\nLots of it...\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs markdown-documentation-basics: markdown-documentation-basics 1`] = `\n\"\\\\\\\\part{Markdown: Basics}\n\n\n<ul id=\\\\\"ProjectSubmenu\\\\\">\n    <li><a href=\\\\\"/projects/markdown/\\\\\" title=\\\\\"Markdown Project Page\\\\\">Main</a></li>\n    <li><a class=\\\\\"selected\\\\\" title=\\\\\"Markdown Basics\\\\\">Basics</a></li>\n    <li><a href=\\\\\"/projects/markdown/syntax\\\\\" title=\\\\\"Markdown Syntax Documentation\\\\\">Syntax</a></li>\n    <li><a href=\\\\\"/projects/markdown/license\\\\\" title=\\\\\"Pricing and License Information\\\\\">License</a></li>\n    <li><a href=\\\\\"/projects/markdown/dingus\\\\\" title=\\\\\"Online Markdown Web Form\\\\\">Dingus</a></li>\n</ul>\n\n\\\\\\\\chapter{Getting the Gist of Markdown's Formatting Syntax}\n\n\nThis page offers a brief overview of what it's like to use Markdown.\nThe \\\\\\\\hyperref[s]{syntax page} provides complete, detailed documentation for\nevery feature, but Markdown should be very easy to pick up simply by\nlooking at a few examples of it in action. The examples on this page\nare written in a before/after style, showing example syntax and the\nHTML output produced by Markdown.\n\n\n\nIt's also helpful to simply try Markdown out; the \\\\\\\\hyperref[d]{Dingus} is a\nweb application that allows you type your own Markdown-formatted text\nand translate it to XHTML.\n\n\n\n\\\\\\\\textbf{Note:} This document is itself written using Markdown; you\ncan \\\\\\\\hyperref[src]{see the source for it by adding '.text' to the URL}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{s}\\\\\\\\externalLink{/projects/markdown/syntax}{/projects/markdown/syntax}}\n\n\\\\\\\\footnote{\\\\\\\\label{d}\\\\\\\\externalLink{/projects/markdown/dingus}{/projects/markdown/dingus}}\n\n\\\\\\\\footnote{\\\\\\\\label{src}\\\\\\\\externalLink{/projects/markdown/basics.text}{/projects/markdown/basics.text}}\n\n\\\\\\\\chapter{Paragraphs, Headers, Blockquotes}\n\n\nA paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing spaces or tabs is considered\nblank.) Normal paragraphs should not be intended with spaces or tabs.\n\n\n\nMarkdown offers two styles of headers: \\\\\\\\textit{Setext} and \\\\\\\\textit{atx}.\nSetext-style headers for \\\\\\\\texttt{<h1>} and \\\\\\\\texttt{<h2>} are created by\n\\\\\"underlining\\\\\" with equal signs (\\\\\\\\texttt{=}) and hyphens (\\\\\\\\texttt{-}), respectively.\nTo create an atx-style header, you put 1-6 hash marks (\\\\\\\\texttt{\\\\\\\\#}) at the\nbeginning of the line -- the number of hashes equals the resulting\nHTML header level.\n\n\n\nBlockquotes are indicated using email-style '\\\\\\\\texttt{>}' angle brackets.\n\n\n\nMarkdown:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nA First Level Header\n====================\n\nA Second Level Header\n---------------------\n\nNow is the time for all good men to come to\nthe aid of their country. This is just a\nregular paragraph.\n\nThe quick brown fox jumped over the lazy\ndog's back.\n\n### Header 3\n\n> This is a blockquote.\n> \n> This is the second paragraph in the blockquote.\n>\n> ## This is an H2 in a blockquote\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<h1>A First Level Header</h1>\n\n<h2>A Second Level Header</h2>\n\n<p>Now is the time for all good men to come to\nthe aid of their country. This is just a\nregular paragraph.</p>\n\n<p>The quick brown fox jumped over the lazy\ndog's back.</p>\n\n<h3>Header 3</h3>\n\n<blockquote>\n    <p>This is a blockquote.</p>\n    \n    <p>This is the second paragraph in the blockquote.</p>\n    \n    <h2>This is an H2 in a blockquote</h2>\n</blockquote>\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\section{Phrase Emphasis}\n\n\nMarkdown uses asterisks and underscores to indicate spans of emphasis.\n\n\n\nMarkdown:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nSome of these words *are emphasized*.\nSome of these words _are emphasized also_.\n\nUse two asterisks for **strong emphasis**.\nOr, if you prefer, __use two underscores instead__.\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>Some of these words <em>are emphasized</em>.\nSome of these words <em>are emphasized also</em>.</p>\n\n<p>Use two asterisks for <strong>strong emphasis</strong>.\nOr, if you prefer, <strong>use two underscores instead</strong>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\chapter{Lists}\n\n\nUnordered (bulleted) lists use asterisks, pluses, and hyphens (\\\\\\\\texttt{*},\n\\\\\\\\texttt{+}, and \\\\\\\\texttt{-}) as list markers. These three markers are\ninterchangable; this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   Candy.\n*   Gum.\n*   Booze.\n\\\\\\\\end{CodeBlock}\n\n\n\nthis:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n+   Candy.\n+   Gum.\n+   Booze.\n\\\\\\\\end{CodeBlock}\n\n\n\nand this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n-   Candy.\n-   Gum.\n-   Booze.\n\\\\\\\\end{CodeBlock}\n\n\n\nall produce the same output:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<ul>\n<li>Candy.</li>\n<li>Gum.</li>\n<li>Booze.</li>\n</ul>\n\\\\\\\\end{CodeBlock}\n\n\n\nOrdered (numbered) lists use regular numbers, followed by periods, as\nlist markers:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1.  Red\n2.  Green\n3.  Blue\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<ol>\n<li>Red</li>\n<li>Green</li>\n<li>Blue</li>\n</ol>\n\\\\\\\\end{CodeBlock}\n\n\n\nIf you put blank lines between items, you'll get \\\\\\\\texttt{<p>} tags for the\nlist item text. You can create multi-paragraph list items by indenting\nthe paragraphs by 4 spaces or 1 tab:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   A list item.\n\n    With multiple paragraphs.\n\n*   Another item in the list.\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<ul>\n<li><p>A list item.</p>\n<p>With multiple paragraphs.</p></li>\n<li><p>Another item in the list.</p></li>\n</ul>\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\section{Links}\n\n\nMarkdown supports two styles for creating links: \\\\\\\\textit{inline} and\n\\\\\\\\textit{reference}. With both styles, you use square brackets to delimit the\ntext you want to turn into a link.\n\n\n\nInline-style links use parentheses immediately after the link text.\nFor example:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is an [example link](http://example.com/).\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>This is an <a href=\\\\\"http://example.com/\\\\\">\nexample link</a>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nOptionally, you may include a title attribute in the parentheses:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is an [example link](http://example.com/ \\\\\"With a Title\\\\\").\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>This is an <a href=\\\\\"http://example.com/\\\\\" title=\\\\\"With a Title\\\\\">\nexample link</a>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nReference-style links allow you to refer to your links by names, which\nyou define elsewhere in your document:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nI get 10 times more traffic from [Google][1] than from\n[Yahoo][2] or [MSN][3].\n\n[1]: http://google.com/        \\\\\"Google\\\\\"\n[2]: http://search.yahoo.com/  \\\\\"Yahoo Search\\\\\"\n[3]: http://search.msn.com/    \\\\\"MSN Search\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>I get 10 times more traffic from <a href=\\\\\"http://google.com/\\\\\"\ntitle=\\\\\"Google\\\\\">Google</a> than from <a href=\\\\\"http://search.yahoo.com/\\\\\"\ntitle=\\\\\"Yahoo Search\\\\\">Yahoo</a> or <a href=\\\\\"http://search.msn.com/\\\\\"\ntitle=\\\\\"MSN Search\\\\\">MSN</a>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nThe title attribute is optional. Link names may contain letters,\nnumbers and spaces, but are \\\\\\\\textit{not} case sensitive:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nI start my morning with a cup of coffee and\n[The New York Times][NY Times].\n\n[ny times]: http://www.nytimes.com/\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>I start my morning with a cup of coffee and\n<a href=\\\\\"http://www.nytimes.com/\\\\\">The New York Times</a>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\section{Images}\n\n\nImage syntax is very much like link syntax.\n\n\n\nInline (titles are optional):\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n![alt text](/path/to/img.jpg \\\\\"Title\\\\\")\n\\\\\\\\end{CodeBlock}\n\n\n\nReference-style:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n![alt text][id]\n\n[id]: /path/to/img.jpg \\\\\"Title\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nBoth of the above examples produce the same output:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<img src=\\\\\"/path/to/img.jpg\\\\\" alt=\\\\\"alt text\\\\\" title=\\\\\"Title\\\\\" />\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\section{Code}\n\n\nIn a regular paragraph, you can create code span by wrapping text in\nbacktick quotes. Any ampersands (\\\\\\\\texttt{\\\\\\\\&}) and angle brackets (\\\\\\\\texttt{<} or\n\\\\\\\\texttt{>}) will automatically be translated into HTML entities. This makes\nit easy to use Markdown to write about HTML example code:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nI strongly recommend against using any \\`<blink>\\` tags.\n\nI wish SmartyPants used named entities like \\`&mdash;\\`\ninstead of decimal-encoded entites like \\`&#8212;\\`.\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>I strongly recommend against using any\n<code>&lt;blink&gt;</code> tags.</p>\n\n<p>I wish SmartyPants used named entities like\n<code>&amp;mdash;</code> instead of decimal-encoded\nentites like <code>&amp;#8212;</code>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nTo specify an entire block of pre-formatted code, indent every line of\nthe block by 4 spaces or 1 tab. Just like with code spans, \\\\\\\\texttt{\\\\\\\\&}, \\\\\\\\texttt{<},\nand \\\\\\\\texttt{>} characters will be escaped automatically.\n\n\n\nMarkdown:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nIf you want your page to validate under XHTML 1.0 Strict,\nyou've got to put paragraph tags in your blockquotes:\n\n    <blockquote>\n        <p>For example.</p>\n    </blockquote>\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>If you want your page to validate under XHTML 1.0 Strict,\nyou've got to put paragraph tags in your blockquotes:</p>\n\n<pre><code>&lt;blockquote&gt;\n    &lt;p&gt;For example.&lt;/p&gt;\n&lt;/blockquote&gt;\n</code></pre>\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs markdown-documentation-syntax: markdown-documentation-syntax 1`] = `\n\"\\\\\\\\part{Markdown: Syntax}\n\n\n<ul id=\\\\\"ProjectSubmenu\\\\\">\n    <li><a href=\\\\\"/projects/markdown/\\\\\" title=\\\\\"Markdown Project Page\\\\\">Main</a></li>\n    <li><a href=\\\\\"/projects/markdown/basics\\\\\" title=\\\\\"Markdown Basics\\\\\">Basics</a></li>\n    <li><a class=\\\\\"selected\\\\\" title=\\\\\"Markdown Syntax Documentation\\\\\">Syntax</a></li>\n    <li><a href=\\\\\"/projects/markdown/license\\\\\" title=\\\\\"Pricing and License Information\\\\\">License</a></li>\n    <li><a href=\\\\\"/projects/markdown/dingus\\\\\" title=\\\\\"Online Markdown Web Form\\\\\">Dingus</a></li>\n</ul>\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Overview}{\\\\\\\\#overview}\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Philosophy}{\\\\\\\\#philosophy}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Inline HTML}{\\\\\\\\#html}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Automatic Escaping for Special Characters}{\\\\\\\\#autoescape}\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Block Elements}{\\\\\\\\#block}\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Paragraphs and Line Breaks}{\\\\\\\\#p}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Headers}{\\\\\\\\#header}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Blockquotes}{\\\\\\\\#blockquote}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Lists}{\\\\\\\\#list}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Code Blocks}{\\\\\\\\#precode}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Horizontal Rules}{\\\\\\\\#hr}\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Span Elements}{\\\\\\\\#span}\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Links}{\\\\\\\\#link}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Emphasis}{\\\\\\\\#em}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Code}{\\\\\\\\#code}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Images}{\\\\\\\\#img}\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Miscellaneous}{\\\\\\\\#misc}\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Backslash Escapes}{\\\\\\\\#backslash}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Automatic Links}{\\\\\\\\#autolink}\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\textbf{Note:} This document is itself written using Markdown; you\ncan \\\\\\\\hyperref[src]{see the source for it by adding '.text' to the URL}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{src}\\\\\\\\externalLink{/projects/markdown/syntax.text}{/projects/markdown/syntax.text}}\n\n\\\\\\\\horizontalLine\n\n\n\n<h2 id=\\\\\"overview\\\\\">Overview</h2>\n\n<h3 id=\\\\\"philosophy\\\\\">Philosophy</h3>\n\nMarkdown is intended to be as easy-to-read and easy-to-write as is feasible.\n\n\n\nReadability, however, is emphasized above all else. A Markdown-formatted\ndocument should be publishable as-is, as plain text, without looking\nlike it's been marked up with tags or formatting instructions. While\nMarkdown's syntax has been influenced by several existing text-to-HTML\nfilters -- including \\\\\\\\hyperref[1]{Setext}, \\\\\\\\hyperref[2]{atx}, \\\\\\\\hyperref[3]{Textile}, \\\\\\\\hyperref[4]{reStructuredText},\n\\\\\\\\hyperref[5]{Grutatext}, and \\\\\\\\hyperref[6]{EtText} -- the single biggest source of\ninspiration for Markdown's syntax is the format of plain text email.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{http://docutils.sourceforge.net/mirror/setext.html}{http://docutils.sourceforge.net/mirror/setext.html}}\n\n\\\\\\\\footnote{\\\\\\\\label{2}\\\\\\\\externalLink{http://www.aaronsw.com/2002/atx/}{http://www.aaronsw.com/2002/atx/}}\n\n\\\\\\\\footnote{\\\\\\\\label{3}\\\\\\\\externalLink{http://textism.com/tools/textile/}{http://textism.com/tools/textile/}}\n\n\\\\\\\\footnote{\\\\\\\\label{4}\\\\\\\\externalLink{http://docutils.sourceforge.net/rst.html}{http://docutils.sourceforge.net/rst.html}}\n\n\\\\\\\\footnote{\\\\\\\\label{5}\\\\\\\\externalLink{http://www.triptico.com/software/grutatxt.html}{http://www.triptico.com/software/grutatxt.html}}\n\n\\\\\\\\footnote{\\\\\\\\label{6}\\\\\\\\externalLink{http://ettext.taint.org/doc/}{http://ettext.taint.org/doc/}}\n\nTo this end, Markdown's syntax is comprised entirely of punctuation\ncharacters, which punctuation characters have been carefully chosen so\nas to look like what they mean. E.g., asterisks around a word actually\nlook like *emphasis*. Markdown lists look like, well, lists. Even\nblockquotes look like quoted passages of text, assuming you've ever\nused email.\n\n\n\n<h3 id=\\\\\"html\\\\\">Inline HTML</h3>\n\nMarkdown's syntax is intended for one purpose: to be used as a\nformat for \\\\\\\\textit{writing} for the web.\n\n\n\nMarkdown is not a replacement for HTML, or even close to it. Its\nsyntax is very small, corresponding only to a very small subset of\nHTML tags. The idea is \\\\\\\\textit{not} to create a syntax that makes it easier\nto insert HTML tags. In my opinion, HTML tags are already easy to\ninsert. The idea for Markdown is to make it easy to read, write, and\nedit prose. HTML is a \\\\\\\\textit{publishing} format; Markdown is a \\\\\\\\textit{writing}\nformat. Thus, Markdown's formatting syntax only addresses issues that\ncan be conveyed in plain text.\n\n\n\nFor any markup that is not covered by Markdown's syntax, you simply\nuse HTML itself. There's no need to preface it or delimit it to\nindicate that you're switching from Markdown to HTML; you just use\nthe tags.\n\n\n\nThe only restrictions are that block-level HTML elements -- e.g. \\\\\\\\texttt{<div>},\n\\\\\\\\texttt{<table>}, \\\\\\\\texttt{<pre>}, \\\\\\\\texttt{<p>}, etc. -- must be separated from surrounding\ncontent by blank lines, and the start and end tags of the block should\nnot be indented with tabs or spaces. Markdown is smart enough not\nto add extra (unwanted) \\\\\\\\texttt{<p>} tags around HTML block-level tags.\n\n\n\nFor example, to add an HTML table to a Markdown article:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is a regular paragraph.\n\n<table>\n    <tr>\n        <td>Foo</td>\n    </tr>\n</table>\n\nThis is another regular paragraph.\n\\\\\\\\end{CodeBlock}\n\n\n\nNote that Markdown formatting syntax is not processed within block-level\nHTML tags. E.g., you can't use Markdown-style \\\\\\\\texttt{*emphasis*} inside an\nHTML block.\n\n\n\nSpan-level HTML tags -- e.g. \\\\\\\\texttt{<span>}, \\\\\\\\texttt{<cite>}, or \\\\\\\\texttt{<del>} -- can be\nused anywhere in a Markdown paragraph, list item, or header. If you\nwant, you can even use HTML tags instead of Markdown formatting; e.g. if\nyou'd prefer to use HTML \\\\\\\\texttt{<a>} or \\\\\\\\texttt{<img>} tags instead of Markdown's\nlink or image syntax, go right ahead.\n\n\n\nUnlike block-level HTML tags, Markdown syntax \\\\\\\\textit{is} processed within\nspan-level tags.\n\n\n\n<h3 id=\\\\\"autoescape\\\\\">Automatic Escaping for Special Characters</h3>\n\nIn HTML, there are two characters that demand special treatment: \\\\\\\\texttt{<}\nand \\\\\\\\texttt{\\\\\\\\&}. Left angle brackets are used to start tags; ampersands are\nused to denote HTML entities. If you want to use them as literal\ncharacters, you must escape them as entities, e.g. \\\\\\\\texttt{\\\\\\\\&lt;}, and\n\\\\\\\\texttt{\\\\\\\\&amp;}.\n\n\n\nAmpersands in particular are bedeviling for web writers. If you want to\nwrite about 'AT\\\\\\\\&T', you need to write '\\\\\\\\texttt{AT\\\\\\\\&amp;T}'. You even need to\nescape ampersands within URLs. Thus, if you want to link to:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nhttp://images.google.com/images?num=30&q=larry+bird\n\\\\\\\\end{CodeBlock}\n\n\n\nyou need to encode the URL as:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nhttp://images.google.com/images?num=30&amp;q=larry+bird\n\\\\\\\\end{CodeBlock}\n\n\n\nin your anchor tag \\\\\\\\texttt{href} attribute. Needless to say, this is easy to\nforget, and is probably the single most common source of HTML validation\nerrors in otherwise well-marked-up web sites.\n\n\n\nMarkdown allows you to use these characters naturally, taking care of\nall the necessary escaping for you. If you use an ampersand as part of\nan HTML entity, it remains unchanged; otherwise it will be translated\ninto \\\\\\\\texttt{\\\\\\\\&amp;}.\n\n\n\nSo, if you want to include a copyright symbol in your article, you can write:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n&copy;\n\\\\\\\\end{CodeBlock}\n\n\n\nand Markdown will leave it alone. But if you write:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nAT&T\n\\\\\\\\end{CodeBlock}\n\n\n\nMarkdown will translate it to:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nAT&amp;T\n\\\\\\\\end{CodeBlock}\n\n\n\nSimilarly, because Markdown supports \\\\\\\\externalLink{inline HTML}{\\\\\\\\#html}, if you use\nangle brackets as delimiters for HTML tags, Markdown will treat them as\nsuch. But if you write:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n4 < 5\n\\\\\\\\end{CodeBlock}\n\n\n\nMarkdown will translate it to:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n4 &lt; 5\n\\\\\\\\end{CodeBlock}\n\n\n\nHowever, inside Markdown code spans and blocks, angle brackets and\nampersands are \\\\\\\\textit{always} encoded automatically. This makes it easy to use\nMarkdown to write about HTML code. (As opposed to raw HTML, which is a\nterrible format for writing about HTML syntax, because every single \\\\\\\\texttt{<}\nand \\\\\\\\texttt{\\\\\\\\&} in your example code needs to be escaped.)\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n<h2 id=\\\\\"block\\\\\">Block Elements</h2>\n\n<h3 id=\\\\\"p\\\\\">Paragraphs and Line Breaks</h3>\n\nA paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing but spaces or tabs is considered\nblank.) Normal paragraphs should not be intended with spaces or tabs.\n\n\n\nThe implication of the \\\\\"one or more consecutive lines of text\\\\\" rule is\nthat Markdown supports \\\\\"hard-wrapped\\\\\" text paragraphs. This differs\nsignificantly from most other text-to-HTML formatters (including Movable\nType's \\\\\"Convert Line Breaks\\\\\" option) which translate every line break\ncharacter in a paragraph into a \\\\\\\\texttt{<br />} tag.\n\n\n\nWhen you \\\\\\\\textit{do} want to insert a \\\\\\\\texttt{<br />} break tag using Markdown, you\nend a line with two or more spaces, then type return.\n\n\n\nYes, this takes a tad more effort to create a \\\\\\\\texttt{<br />}, but a simplistic\n\\\\\"every line break is a \\\\\\\\texttt{<br />}\\\\\" rule wouldn't work for Markdown.\nMarkdown's email-style \\\\\\\\hyperref[bq]{blockquoting} and multi-paragraph \\\\\\\\hyperref[l]{list items}\nwork best -- and look better -- when you format them with hard breaks.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{bq}\\\\\\\\externalLink{\\\\\\\\#blockquote}{\\\\\\\\#blockquote}}\n\n\\\\\\\\footnote{\\\\\\\\label{l}\\\\\\\\externalLink{\\\\\\\\#list}{\\\\\\\\#list}}\n\n<h3 id=\\\\\"header\\\\\">Headers</h3>\n\nMarkdown supports two styles of headers, \\\\\\\\hyperref[1]{Setext} and \\\\\\\\hyperref[2]{atx}.\n\n\n\nSetext-style headers are \\\\\"underlined\\\\\" using equal signs (for first-level\nheaders) and dashes (for second-level headers). For example:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is an H1\n=============\n\nThis is an H2\n-------------\n\\\\\\\\end{CodeBlock}\n\n\n\nAny number of underlining \\\\\\\\texttt{=}'s or \\\\\\\\texttt{-}'s will work.\n\n\n\nAtx-style headers use 1-6 hash characters at the start of the line,\ncorresponding to header levels 1-6. For example:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n# This is an H1\n\n## This is an H2\n\n###### This is an H6\n\\\\\\\\end{CodeBlock}\n\n\n\nOptionally, you may \\\\\"close\\\\\" atx-style headers. This is purely\ncosmetic -- you can use this if you think it looks better. The\nclosing hashes don't even need to match the number of hashes\nused to open the header. (The number of opening hashes\ndetermines the header level.) :\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n# This is an H1 #\n\n## This is an H2 ##\n\n### This is an H3 ######\n\\\\\\\\end{CodeBlock}\n\n\n\n<h3 id=\\\\\"blockquote\\\\\">Blockquotes</h3>\n\nMarkdown uses email-style \\\\\\\\texttt{>} characters for blockquoting. If you're\nfamiliar with quoting passages of text in an email message, then you\nknow how to create a blockquote in Markdown. It looks best if you hard\nwrap the text and put a \\\\\\\\texttt{>} before every line:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n> \n> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n> id sem consectetuer libero luctus adipiscing.\n\\\\\\\\end{CodeBlock}\n\n\n\nMarkdown allows you to be lazy and only put the \\\\\\\\texttt{>} before the first\nline of a hard-wrapped paragraph:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\nconsectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\nVestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n\n> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\nid sem consectetuer libero luctus adipiscing.\n\\\\\\\\end{CodeBlock}\n\n\n\nBlockquotes can be nested (i.e. a blockquote-in-a-blockquote) by\nadding additional levels of \\\\\\\\texttt{>}:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n> This is the first level of quoting.\n>\n> > This is nested blockquote.\n>\n> Back to the first level.\n\\\\\\\\end{CodeBlock}\n\n\n\nBlockquotes can contain other Markdown elements, including headers, lists,\nand code blocks:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n> ## This is a header.\n> \n> 1.   This is the first list item.\n> 2.   This is the second list item.\n> \n> Here's some example code:\n> \n>     return shell_exec(\\\\\"echo $input | $markdown_script\\\\\");\n\\\\\\\\end{CodeBlock}\n\n\n\nAny decent text editor should make email-style quoting easy. For\nexample, with BBEdit, you can make a selection and choose Increase\nQuote Level from the Text menu.\n\n\n\n<h3 id=\\\\\"list\\\\\">Lists</h3>\n\nMarkdown supports ordered (numbered) and unordered (bulleted) lists.\n\n\n\nUnordered lists use asterisks, pluses, and hyphens -- interchangably\n-- as list markers:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   Red\n*   Green\n*   Blue\n\\\\\\\\end{CodeBlock}\n\n\n\nis equivalent to:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n+   Red\n+   Green\n+   Blue\n\\\\\\\\end{CodeBlock}\n\n\n\nand:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n-   Red\n-   Green\n-   Blue\n\\\\\\\\end{CodeBlock}\n\n\n\nOrdered lists use numbers followed by periods:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1.  Bird\n2.  McHale\n3.  Parish\n\\\\\\\\end{CodeBlock}\n\n\n\nIt's important to note that the actual numbers you use to mark the\nlist have no effect on the HTML output Markdown produces. The HTML\nMarkdown produces from the above list is:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<ol>\n<li>Bird</li>\n<li>McHale</li>\n<li>Parish</li>\n</ol>\n\\\\\\\\end{CodeBlock}\n\n\n\nIf you instead wrote the list in Markdown like this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1.  Bird\n1.  McHale\n1.  Parish\n\\\\\\\\end{CodeBlock}\n\n\n\nor even:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n3. Bird\n1. McHale\n8. Parish\n\\\\\\\\end{CodeBlock}\n\n\n\nyou'd get the exact same HTML output. The point is, if you want to,\nyou can use ordinal numbers in your ordered Markdown lists, so that\nthe numbers in your source match the numbers in your published HTML.\nBut if you want to be lazy, you don't have to.\n\n\n\nIf you do use lazy list numbering, however, you should still start the\nlist with the number 1. At some point in the future, Markdown may support\nstarting ordered lists at an arbitrary number.\n\n\n\nList markers typically start at the left margin, but may be indented by\nup to three spaces. List markers must be followed by one or more spaces\nor a tab.\n\n\n\nTo make lists look nice, you can wrap items with hanging indents:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n    Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\n    viverra nec, fringilla in, laoreet vitae, risus.\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n    Suspendisse id sem consectetuer libero luctus adipiscing.\n\\\\\\\\end{CodeBlock}\n\n\n\nBut if you want to be lazy, you don't have to:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\nAliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\nviverra nec, fringilla in, laoreet vitae, risus.\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\nSuspendisse id sem consectetuer libero luctus adipiscing.\n\\\\\\\\end{CodeBlock}\n\n\n\nIf list items are separated by blank lines, Markdown will wrap the\nitems in \\\\\\\\texttt{<p>} tags in the HTML output. For example, this input:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   Bird\n*   Magic\n\\\\\\\\end{CodeBlock}\n\n\n\nwill turn into:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<ul>\n<li>Bird</li>\n<li>Magic</li>\n</ul>\n\\\\\\\\end{CodeBlock}\n\n\n\nBut this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   Bird\n\n*   Magic\n\\\\\\\\end{CodeBlock}\n\n\n\nwill turn into:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<ul>\n<li><p>Bird</p></li>\n<li><p>Magic</p></li>\n</ul>\n\\\\\\\\end{CodeBlock}\n\n\n\nList items may consist of multiple paragraphs. Each subsequent\nparagraph in a list item must be intended by either 4 spaces\nor one tab:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1.  This is a list item with two paragraphs. Lorem ipsum dolor\n    sit amet, consectetuer adipiscing elit. Aliquam hendrerit\n    mi posuere lectus.\n\n    Vestibulum enim wisi, viverra nec, fringilla in, laoreet\n    vitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n    sit amet velit.\n\n2.  Suspendisse id sem consectetuer libero luctus adipiscing.\n\\\\\\\\end{CodeBlock}\n\n\n\nIt looks nice if you indent every line of the subsequent\nparagraphs, but here again, Markdown will allow you to be\nlazy:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   This is a list item with two paragraphs.\n\n    This is the second paragraph in the list item. You're\nonly required to indent the first line. Lorem ipsum dolor\nsit amet, consectetuer adipiscing elit.\n\n*   Another item in the same list.\n\\\\\\\\end{CodeBlock}\n\n\n\nTo put a blockquote within a list item, the blockquote's \\\\\\\\texttt{>}\ndelimiters need to be indented:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   A list item with a blockquote:\n\n    > This is a blockquote\n    > inside a list item.\n\\\\\\\\end{CodeBlock}\n\n\n\nTo put a code block within a list item, the code block needs\nto be indented \\\\\\\\textit{twice} -- 8 spaces or two tabs:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   A list item with a code block:\n\n        <code goes here>\n\\\\\\\\end{CodeBlock}\n\n\n\nIt's worth noting that it's possible to trigger an ordered list by\naccident, by writing something like this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1986. What a great season.\n\\\\\\\\end{CodeBlock}\n\n\n\nIn other words, a \\\\\\\\textit{number-period-space} sequence at the beginning of a\nline. To avoid this, you can backslash-escape the period:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1986\\\\\\\\. What a great season.\n\\\\\\\\end{CodeBlock}\n\n\n\n<h3 id=\\\\\"precode\\\\\">Code Blocks</h3>\n\nPre-formatted code blocks are used for writing about programming or\nmarkup source code. Rather than forming normal paragraphs, the lines\nof a code block are interpreted literally. Markdown wraps a code block\nin both \\\\\\\\texttt{<pre>} and \\\\\\\\texttt{<code>} tags.\n\n\n\nTo produce a code block in Markdown, simply indent every line of the\nblock by at least 4 spaces or 1 tab. For example, given this input:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is a normal paragraph:\n\n    This is a code block.\n\\\\\\\\end{CodeBlock}\n\n\n\nMarkdown will generate:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>This is a normal paragraph:</p>\n\n<pre><code>This is a code block.\n</code></pre>\n\\\\\\\\end{CodeBlock}\n\n\n\nOne level of indentation -- 4 spaces or 1 tab -- is removed from each\nline of the code block. For example, this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nHere is an example of AppleScript:\n\n    tell application \\\\\"Foo\\\\\"\n        beep\n    end tell\n\\\\\\\\end{CodeBlock}\n\n\n\nwill turn into:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>Here is an example of AppleScript:</p>\n\n<pre><code>tell application \\\\\"Foo\\\\\"\n    beep\nend tell\n</code></pre>\n\\\\\\\\end{CodeBlock}\n\n\n\nA code block continues until it reaches a line that is not indented\n(or the end of the article).\n\n\n\nWithin a code block, ampersands (\\\\\\\\texttt{\\\\\\\\&}) and angle brackets (\\\\\\\\texttt{<} and \\\\\\\\texttt{>})\nare automatically converted into HTML entities. This makes it very\neasy to include example HTML source code using Markdown -- just paste\nit and indent it, and Markdown will handle the hassle of encoding the\nampersands and angle brackets. For example, this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n    <div class=\\\\\"footer\\\\\">\n        &copy; 2004 Foo Corporation\n    </div>\n\\\\\\\\end{CodeBlock}\n\n\n\nwill turn into:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<pre><code>&lt;div class=\\\\\"footer\\\\\"&gt;\n    &amp;copy; 2004 Foo Corporation\n&lt;/div&gt;\n</code></pre>\n\\\\\\\\end{CodeBlock}\n\n\n\nRegular Markdown syntax is not processed within code blocks. E.g.,\nasterisks are just literal asterisks within a code block. This means\nit's also easy to use Markdown to write about Markdown's own syntax.\n\n\n\n<h3 id=\\\\\"hr\\\\\">Horizontal Rules</h3>\n\nYou can produce a horizontal rule tag (\\\\\\\\texttt{<hr>}) by placing three or\nmore hyphens, asterisks, or underscores on a line by themselves. If you\nwish, you may use spaces between the hyphens or asterisks. Each of the\nfollowing lines will produce a horizontal rule:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n* * *\n\n***\n\n*****\n\n- - -\n\n---------------------------------------\n\n_ _ _\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n<h2 id=\\\\\"span\\\\\">Span Elements</h2>\n\n<h3 id=\\\\\"link\\\\\">Links</h3>\n\nMarkdown supports two style of links: \\\\\\\\textit{inline} and \\\\\\\\textit{reference}.\n\n\n\nIn both styles, the link text is delimited by [square brackets].\n\n\n\nTo create an inline link, use a set of regular parentheses immediately\nafter the link text's closing square bracket. Inside the parentheses,\nput the URL where you want the link to point, along with an \\\\\\\\textit{optional}\ntitle for the link, surrounded in quotes. For example:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is [an example](http://example.com/ \\\\\"Title\\\\\") inline link.\n\n[This link](http://example.net/) has no title attribute.\n\\\\\\\\end{CodeBlock}\n\n\n\nWill produce:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>This is <a href=\\\\\"http://example.com/\\\\\" title=\\\\\"Title\\\\\">\nan example</a> inline link.</p>\n\n<p><a href=\\\\\"http://example.net/\\\\\">This link</a> has no\ntitle attribute.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nIf you're referring to a local resource on the same server, you can\nuse relative paths:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nSee my [About](/about/) page for details.\n\\\\\\\\end{CodeBlock}\n\n\n\nReference-style links use a second set of square brackets, inside\nwhich you place a label of your choosing to identify the link:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is [an example][id] reference-style link.\n\\\\\\\\end{CodeBlock}\n\n\n\nYou can optionally use a space to separate the sets of brackets:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is [an example] [id] reference-style link.\n\\\\\\\\end{CodeBlock}\n\n\n\nThen, anywhere in the document, you define your link label like this,\non a line by itself:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[id]: http://example.com/  \\\\\"Optional Title Here\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nThat is:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Square brackets containing the link identifier (optionally\nindented from the left margin using up to three spaces);\n\\\\\\\\item\\\\\\\\relax followed by a colon;\n\\\\\\\\item\\\\\\\\relax followed by one or more spaces (or tabs);\n\\\\\\\\item\\\\\\\\relax followed by the URL for the link;\n\\\\\\\\item\\\\\\\\relax optionally followed by a title attribute for the link, enclosed\nin double or single quotes.\n\\\\\\\\end{itemize}\n\n\nThe link URL may, optionally, be surrounded by angle brackets:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[id]: <http://example.com/>  \\\\\"Optional Title Here\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nYou can put the title attribute on the next line and use extra spaces\nor tabs for padding, which tends to look better with longer URLs:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[id]: http://example.com/longish/path/to/resource/here\n    \\\\\"Optional Title Here\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nLink definitions are only used for creating links during Markdown\nprocessing, and are stripped from your document in the HTML output.\n\n\n\nLink definition names may constist of letters, numbers, spaces, and punctuation -- but they are \\\\\\\\textit{not} case sensitive. E.g. these two links:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[link text][a]\n[link text][A]\n\\\\\\\\end{CodeBlock}\n\n\n\nare equivalent.\n\n\n\nThe \\\\\\\\textit{implicit link name} shortcut allows you to omit the name of the\nlink, in which case the link text itself is used as the name.\nJust use an empty set of square brackets -- e.g., to link the word\n\\\\\"Google\\\\\" to the google.com web site, you could simply write:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[Google][]\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd then define the link:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[Google]: http://google.com/\n\\\\\\\\end{CodeBlock}\n\n\n\nBecause link names may contain spaces, this shortcut even works for\nmultiple words in the link text:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nVisit [Daring Fireball][] for more information.\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd then define the link:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[Daring Fireball]: http://daringfireball.net/\n\\\\\\\\end{CodeBlock}\n\n\n\nLink definitions can be placed anywhere in your Markdown document. I\ntend to put them immediately after each paragraph in which they're\nused, but if you want, you can put them all at the end of your\ndocument, sort of like footnotes.\n\n\n\nHere's an example of reference links in action:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nI get 10 times more traffic from [Google] [1] than from\n[Yahoo] [2] or [MSN] [3].\n\n  [1]: http://google.com/        \\\\\"Google\\\\\"\n  [2]: http://search.yahoo.com/  \\\\\"Yahoo Search\\\\\"\n  [3]: http://search.msn.com/    \\\\\"MSN Search\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nUsing the implicit link name shortcut, you could instead write:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nI get 10 times more traffic from [Google][] than from\n[Yahoo][] or [MSN][].\n\n  [google]: http://google.com/        \\\\\"Google\\\\\"\n  [yahoo]:  http://search.yahoo.com/  \\\\\"Yahoo Search\\\\\"\n  [msn]:    http://search.msn.com/    \\\\\"MSN Search\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nBoth of the above examples will produce the following HTML output:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>I get 10 times more traffic from <a href=\\\\\"http://google.com/\\\\\"\ntitle=\\\\\"Google\\\\\">Google</a> than from\n<a href=\\\\\"http://search.yahoo.com/\\\\\" title=\\\\\"Yahoo Search\\\\\">Yahoo</a>\nor <a href=\\\\\"http://search.msn.com/\\\\\" title=\\\\\"MSN Search\\\\\">MSN</a>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nFor comparison, here is the same paragraph written using\nMarkdown's inline link style:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nI get 10 times more traffic from [Google](http://google.com/ \\\\\"Google\\\\\")\nthan from [Yahoo](http://search.yahoo.com/ \\\\\"Yahoo Search\\\\\") or\n[MSN](http://search.msn.com/ \\\\\"MSN Search\\\\\").\n\\\\\\\\end{CodeBlock}\n\n\n\nThe point of reference-style links is not that they're easier to\nwrite. The point is that with reference-style links, your document\nsource is vastly more readable. Compare the above examples: using\nreference-style links, the paragraph itself is only 81 characters\nlong; with inline-style links, it's 176 characters; and as raw HTML,\nit's 234 characters. In the raw HTML, there's more markup than there\nis text.\n\n\n\nWith Markdown's reference-style links, a source document much more\nclosely resembles the final output, as rendered in a browser. By\nallowing you to move the markup-related metadata out of the paragraph,\nyou can add links without interrupting the narrative flow of your\nprose.\n\n\n\n<h3 id=\\\\\"em\\\\\">Emphasis</h3>\n\nMarkdown treats asterisks (\\\\\\\\texttt{*}) and underscores (\\\\\\\\texttt{\\\\\\\\_}) as indicators of\nemphasis. Text wrapped with one \\\\\\\\texttt{*} or \\\\\\\\texttt{\\\\\\\\_} will be wrapped with an\nHTML \\\\\\\\texttt{<em>} tag; double \\\\\\\\texttt{*}'s or \\\\\\\\texttt{\\\\\\\\_}'s will be wrapped with an HTML\n\\\\\\\\texttt{<strong>} tag. E.g., this input:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*single asterisks*\n\n_single underscores_\n\n**double asterisks**\n\n__double underscores__\n\\\\\\\\end{CodeBlock}\n\n\n\nwill produce:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<em>single asterisks</em>\n\n<em>single underscores</em>\n\n<strong>double asterisks</strong>\n\n<strong>double underscores</strong>\n\\\\\\\\end{CodeBlock}\n\n\n\nYou can use whichever style you prefer; the lone restriction is that\nthe same character must be used to open and close an emphasis span.\n\n\n\nEmphasis can be used in the middle of a word:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nun*fucking*believable\n\\\\\\\\end{CodeBlock}\n\n\n\nBut if you surround an \\\\\\\\texttt{*} or \\\\\\\\texttt{\\\\\\\\_} with spaces, it'll be treated as a\nliteral asterisk or underscore.\n\n\n\nTo produce a literal asterisk or underscore at a position where it\nwould otherwise be used as an emphasis delimiter, you can backslash\nescape it:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\\\\\\\\*this text is surrounded by literal asterisks\\\\\\\\*\n\\\\\\\\end{CodeBlock}\n\n\n\n<h3 id=\\\\\"code\\\\\">Code</h3>\n\nTo indicate a span of code, wrap it with backtick quotes (\\\\\\\\texttt{\\`}).\nUnlike a pre-formatted code block, a code span indicates code within a\nnormal paragraph. For example:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nUse the \\`printf()\\` function.\n\\\\\\\\end{CodeBlock}\n\n\n\nwill produce:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>Use the <code>printf()</code> function.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nTo include a literal backtick character within a code span, you can use\nmultiple backticks as the opening and closing delimiters:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\\`\\`There is a literal backtick (\\`) here.\\`\\`\n\\\\\\\\end{CodeBlock}\n\n\n\nwhich will produce this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p><code>There is a literal backtick (\\`) here.</code></p>\n\\\\\\\\end{CodeBlock}\n\n\n\nThe backtick delimiters surrounding a code span may include spaces --\none after the opening, one before the closing. This allows you to place\nliteral backtick characters at the beginning or end of a code span:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nA single backtick in a code span: \\`\\` \\` \\`\\`\n\nA backtick-delimited string in a code span: \\`\\` \\`foo\\` \\`\\`\n\\\\\\\\end{CodeBlock}\n\n\n\nwill produce:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>A single backtick in a code span: <code>\\`</code></p>\n\n<p>A backtick-delimited string in a code span: <code>\\`foo\\`</code></p>\n\\\\\\\\end{CodeBlock}\n\n\n\nWith a code span, ampersands and angle brackets are encoded as HTML\nentities automatically, which makes it easy to include example HTML\ntags. Markdown will turn this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nPlease don't use any \\`<blink>\\` tags.\n\\\\\\\\end{CodeBlock}\n\n\n\ninto:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>Please don't use any <code>&lt;blink&gt;</code> tags.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nYou can write this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\\`&#8212;\\` is the decimal-encoded equivalent of \\`&mdash;\\`.\n\\\\\\\\end{CodeBlock}\n\n\n\nto produce:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p><code>&amp;#8212;</code> is the decimal-encoded\nequivalent of <code>&amp;mdash;</code>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\n<h3 id=\\\\\"img\\\\\">Images</h3>\n\nAdmittedly, it's fairly difficult to devise a \\\\\"natural\\\\\" syntax for\nplacing images into a plain text document format.\n\n\n\nMarkdown uses an image syntax that is intended to resemble the syntax\nfor links, allowing for two styles: \\\\\\\\textit{inline} and \\\\\\\\textit{reference}.\n\n\n\nInline image syntax looks like this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n![Alt text](/path/to/img.jpg)\n\n![Alt text](/path/to/img.jpg \\\\\"Optional title\\\\\")\n\\\\\\\\end{CodeBlock}\n\n\n\nThat is:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax An exclamation mark: \\\\\\\\texttt{!};\n\\\\\\\\item\\\\\\\\relax followed by a set of square brackets, containing the \\\\\\\\texttt{alt}\nattribute text for the image;\n\\\\\\\\item\\\\\\\\relax followed by a set of parentheses, containing the URL or path to\nthe image, and an optional \\\\\\\\texttt{title} attribute enclosed in double\nor single quotes.\n\\\\\\\\end{itemize}\n\n\nReference-style image syntax looks like this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n![Alt text][id]\n\\\\\\\\end{CodeBlock}\n\n\n\nWhere \\\\\"id\\\\\" is the name of a defined image reference. Image references\nare defined using syntax identical to link references:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[id]: url/to/image  \\\\\"Optional title attribute\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nAs of this writing, Markdown has no syntax for specifying the\ndimensions of an image; if this is important to you, you can simply\nuse regular HTML \\\\\\\\texttt{<img>} tags.\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n<h2 id=\\\\\"misc\\\\\">Miscellaneous</h2>\n\n<h3 id=\\\\\"autolink\\\\\">Automatic Links</h3>\n\nMarkdown supports a shortcut style for creating \\\\\"automatic\\\\\" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<http://example.com/>\n\\\\\\\\end{CodeBlock}\n\n\n\nMarkdown will turn this into:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<a href=\\\\\"http://example.com/\\\\\">http://example.com/</a>\n\\\\\\\\end{CodeBlock}\n\n\n\nAutomatic links for email addresses work similarly, except that\nMarkdown will also perform a bit of randomized decimal and hex\nentity-encoding to help obscure your address from address-harvesting\nspambots. For example, Markdown will turn this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<address@example.com>\n\\\\\\\\end{CodeBlock}\n\n\n\ninto something like this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<a href=\\\\\"&#x6D;&#x61;i&#x6C;&#x74;&#x6F;:&#x61;&#x64;&#x64;&#x72;&#x65;\n&#115;&#115;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;\n&#109;\\\\\">&#x61;&#x64;&#x64;&#x72;&#x65;&#115;&#115;&#64;&#101;&#120;&#x61;\n&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a>\n\\\\\\\\end{CodeBlock}\n\n\n\nwhich will render in a browser as a clickable link to \\\\\"\\\\\\\\externalLink{address@example.com}{mailto:address@example.com}\\\\\".\n\n\n\n(This sort of entity-encoding trick will indeed fool many, if not\nmost, address-harvesting bots, but it definitely won't fool all of\nthem. It's better than nothing, but an address published in this way\nwill probably eventually start receiving spam.)\n\n\n\n<h3 id=\\\\\"backslash\\\\\">Backslash Escapes</h3>\n\nMarkdown allows you to use backslash escapes to generate literal\ncharacters which would otherwise have special meaning in Markdown's\nformatting syntax. For example, if you wanted to surround a word with\nliteral asterisks (instead of an HTML \\\\\\\\texttt{<em>} tag), you can backslashes\nbefore the asterisks, like this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\\\\\\\\*literal asterisks\\\\\\\\*\n\\\\\\\\end{CodeBlock}\n\n\n\nMarkdown provides backslash escapes for the following characters:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\\\\\\\\   backslash\n\\`   backtick\n*   asterisk\n_   underscore\n{}  curly braces\n[]  square brackets\n()  parentheses\n#   hash mark\n+\tplus sign\n-\tminus sign (hyphen)\n.   dot\n!   exclamation mark\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs mixed-indentation: mixed-indentation 1`] = `\n\"\\\\\\\\part{Mixed spaces and tabs}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Very long\nparagraph\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax Very long\nparagraph\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Very long\nparagraph\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax Very long\nparagraph\n\\\\\\\\end{enumerate}\"\n`;\n\nexports[`rebber: remark specs nested-blockquotes: nested-blockquotes 1`] = `\n\"\\\\\\\\begin{Quotation}\nfoo\n\n\\\\\\\\begin{Quotation}\nbar\n\\\\\\\\end{Quotation}\n\nfoo\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs nested-code: nested-code 1`] = `\n\"\\\\\\\\texttt{hi ther \\`\\` ok \\`\\`\\`}\n\n\n\n\\\\\\\\texttt{\\`hi ther\\`}\"\n`;\n\nexports[`rebber: remark specs nested-em: nested-em 1`] = `\n\"\\\\\\\\textit{test \\\\\\\\textbf{test} test}\n\n\n\n\\\\\\\\textit{test \\\\\\\\textbf{test} test}\"\n`;\n\nexports[`rebber: remark specs nested-references: nested-references 1`] = `\n\"This nested image should work:\n\n\n\n[\\\\\\\\includegraphics{undefined}]\n\n\n\nThis nested link should not work:\n\n\n\n[[Foo][bar]]\"\n`;\n\nexports[`rebber: remark specs nested-square-link: nested-square-link 1`] = `\n\"[the \\`]\\` character](/url)\n\n\n\n[the \\\\\\\\texttt{[} character](/url)\n\n\n\n[the \\`\\` \\\\\\\\externalLink{ \\`\\`\\` character}{/url}\n\n\n\n\\\\\\\\externalLink{the \\\\\\\\texttt{\\`} character}{/url}\"\n`;\n\nexports[`rebber: remark specs no-positionals: no-positionals 1`] = `\n\"This document tests for the working of \\\\\\\\texttt{position: false} as a parse\noption.\n\n\n\n\\\\\\\\begin{Quotation}\nBlock-quotes\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax With list items.\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\n\n\n\nAnother block-quote:\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax And another list.\n\\\\\\\\end{enumerate}\n\\\\\\\\end{Quotation}\n\n\n\nSome \\\\\\\\externalLink{deeply \\\\\\\\textbf{nested \\\\\\\\textit{elements}}}{http://example.com}\n\n\n\nAn entity: ©, and an warning entity: ©.\"\n`;\n\nexports[`rebber: remark specs not-a-link: not-a-link 1`] = `\"[test](not a link)\"`;\n\nexports[`rebber: remark specs ordered-and-unordered-lists: ordered-and-unordered-lists 1`] = `\n\"\\\\\\\\chapter{Unordered}\n\n\nAsterisks tight:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax asterisk 1\n\\\\\\\\item\\\\\\\\relax asterisk 2\n\\\\\\\\item\\\\\\\\relax asterisk 3\n\\\\\\\\end{itemize}\n\n\nAsterisks loose:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax asterisk 1\n\\\\\\\\item\\\\\\\\relax asterisk 2\n\\\\\\\\item\\\\\\\\relax asterisk 3\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nPluses tight:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Plus 1\n\\\\\\\\item\\\\\\\\relax Plus 2\n\\\\\\\\item\\\\\\\\relax Plus 3\n\\\\\\\\end{itemize}\n\n\nPluses loose:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Plus 1\n\\\\\\\\item\\\\\\\\relax Plus 2\n\\\\\\\\item\\\\\\\\relax Plus 3\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nMinuses tight:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Minus 1\n\\\\\\\\item\\\\\\\\relax Minus 2\n\\\\\\\\item\\\\\\\\relax Minus 3\n\\\\\\\\end{itemize}\n\n\nMinuses loose:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Minus 1\n\\\\\\\\item\\\\\\\\relax Minus 2\n\\\\\\\\item\\\\\\\\relax Minus 3\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\chapter{Ordered}\n\n\nTight:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nand:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax One\n\\\\\\\\item\\\\\\\\relax Two\n\\\\\\\\item\\\\\\\\relax Three\n\\\\\\\\end{enumerate}\n\n\nLoose using tabs:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nand using spaces:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax One\n\\\\\\\\item\\\\\\\\relax Two\n\\\\\\\\item\\\\\\\\relax Three\n\\\\\\\\end{enumerate}\n\n\nMultiple paragraphs:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax Item 1, graf one.\n\nItem 2. graf two. The quick brown fox jumped over the lazy dog's\nback.\n\\\\\\\\item\\\\\\\\relax Item 2.\n\\\\\\\\item\\\\\\\\relax Item 3.\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\chapter{Nested}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Tab\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Tab\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Tab\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\n\nHere's another:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Fee\n\\\\\\\\item\\\\\\\\relax Fie\n\\\\\\\\item\\\\\\\\relax Foe\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nSame thing but with paragraphs:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Fee\n\\\\\\\\item\\\\\\\\relax Fie\n\\\\\\\\item\\\\\\\\relax Foe\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nThis was an error in Markdown 1.0.1:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax this\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax sub\n\\\\\\\\end{itemize}\nthat\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs ordered-different-types: ordered-different-types 1`] = `\n\"\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo\n\\\\\\\\item\\\\\\\\relax bar\n3) baz\n\\\\\\\\end{enumerate}\"\n`;\n\nexports[`rebber: remark specs ordered-with-parentheses: ordered-with-parentheses 1`] = `\n\"\\\\\\\\chapter{Ordered}\n\n\nTight:\n\n\n\n1)\tFirst\n2)\tSecond\n3)\tThird\n\n\n\nand:\n\n\n\n1) One\n2) Two\n3) Three\n\n\n\nLoose using tabs:\n\n\n\n1)\tFirst\n\n\n\n2)\tSecond\n\n\n\n3)\tThird\n\n\n\nand using spaces:\n\n\n\n1) One\n\n\n\n2) Two\n\n\n\n3) Three\n\n\n\nMultiple paragraphs:\n\n\n\n1)\tItem 1, graf one.\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nItem 2. graf two. The quick brown fox jumped over the lazy dog's\nback.\n\\\\\\\\end{CodeBlock}\n\n\n\n2)\tItem 2.\n\n\n\n3)\tItem 3.\"\n`;\n\nexports[`rebber: remark specs paragraphs-and-indentation: paragraphs-and-indentation 1`] = `\n\"\\\\\\\\part{Without lines.}\n\n\nThis is a paragraph\nand this is further text\n\n\n\nThis is a paragraph\nand this is further text\n\n\n\nThis is a paragraph with some asterisks\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n***\n\\\\\\\\end{CodeBlock}\n\n\n\nThis is a paragraph followed by a horizontal rule\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\part{With lines.}\n\n\nThis is a paragraph\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nand this is code\n\\\\\\\\end{CodeBlock}\n\n\n\nThis is a paragraph\n\n\n\nand this is a new paragraph\n\n\n\nThis is a paragraph with some asterisks in a code block\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n***\n\\\\\\\\end{CodeBlock}\n\n\n\nThis is a paragraph followed by a horizontal rule\n\n\n\n\\\\\\\\horizontalLine\"\n`;\n\nexports[`rebber: remark specs paragraphs-empty: paragraphs-empty 1`] = `\n\"aaa\n\n\n\n\\\\\\\\part{aaa}\n\n\nbbb\n\n\n\nccc\"\n`;\n\nexports[`rebber: remark specs ref-paren: ref-paren 1`] = `\n\"\\\\\\\\hyperref[hi]{hi}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{hi}\\\\\\\\externalLink{/url}{/url}}\"\n`;\n\nexports[`rebber: remark specs reference-image-empty-alt: reference-image-empty-alt 1`] = `\n\"\\\\\\\\includegraphics{/xyz.png}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{/xyz.png}{/xyz.png}}\"\n`;\n\nexports[`rebber: remark specs reference-link-escape: reference-link-escape 1`] = `\n\"[b*r*], \\\\\\\\hyperref[b\\\\\\\\*r*]{b*r*}, \\\\\\\\hyperref[b\\\\\\\\*r*]{b*r*}.\n\n\n\n\\\\\\\\includegraphics{http://google.com}, \\\\\\\\includegraphics{http://google.com}, \\\\\\\\includegraphics{http://google.com}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{b\\\\\\\\*r*}\\\\\\\\externalLink{http://google.com}{http://google.com}}\"\n`;\n\nexports[`rebber: remark specs reference-link-not-closed: reference-link-not-closed 1`] = `\n\"[bar]bar\n\n\n\n[bar]\n\n\n\n[bar]\"\n`;\n\nexports[`rebber: remark specs reference-link-with-angle-brackets: reference-link-with-angle-brackets 1`] = `\n\"\\\\\\\\hyperref[foo]{foo}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{foo}\\\\\\\\externalLink{./url with spaces}{./url with spaces}}\"\n`;\n\nexports[`rebber: remark specs reference-link-with-multiple-definitions: reference-link-with-multiple-definitions 1`] = `\n\"\\\\\\\\hyperref[foo]{foo}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{foo}\\\\\\\\externalLink{first}{first}}\n\n\\\\\\\\footnote{\\\\\\\\label{foo-1}\\\\\\\\externalLink{second}{second}}\"\n`;\n\nexports[`rebber: remark specs same-bullet: same-bullet 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax test\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax test\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax test\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs stringify-escape: stringify-escape 1`] = `\n\"Characters that should be escaped in general:\n\n\n\n\\\\\\\\textbackslash{} \\` * [\n\n\n\nCharacters that shouldn't:\n\n\n\n\\\\\\\\{\\\\\\\\}]()\\\\\\\\#+-.!>\\\\\"\\\\\\\\$\\\\\\\\%',/:;=?@\\\\\\\\textasciicircum{}\\\\\\\\textasciitilde{}\n\n\n\nUnderscores are \\\\\\\\_escaped\\\\\\\\_ unless they appear in\\\\\\\\_the\\\\\\\\_middle\\\\\\\\_of\\\\\\\\_a\\\\\\\\_word.\nor \\\\\\\\textbf{\\\\\\\\_here}, or here\\\\\\\\_\\\\\\\\_\n\n\n\nAmpersands are escaped only when they would otherwise start an entity:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textbackslash{}©cat \\\\\\\\textbackslash{}\\\\\\\\& \\\\\\\\textbackslash{}\\\\\\\\&\n\\\\\\\\item\\\\\\\\relax \\\\\\\\&copycat \\\\\\\\&amp; \\\\\\\\&\\\\\\\\#x26\n\\\\\\\\item\\\\\\\\relax But: ©cat; \\\\\\\\texttt{\\\\\\\\&between;} \\\\\\\\&foo; \\\\\\\\& AT\\\\\\\\&T \\\\\\\\&c\n\\\\\\\\end{itemize}\n\n\nOpen parenthesis should be escaped after a shortcut reference:\n\n\n\n[ref](text)\n\n\n\nAnd after a shortcut reference and a space (for GitHub):\n\n\n\n[ref] (text)\n\n\n\nHyphen should be escaped at the beginning of a line:\n\n\n\n- not a list item\n- not a list item\n+ not a list item\n\n\n\nSame for angle brackets:\n\n\n\n> not a block quote\n\n\n\nAnd hash signs:\n\n\n\n\\\\\\\\# not a heading\n\\\\\\\\#\\\\\\\\# not a subheading\n\n\n\nText under a shortcut reference should be preserved verbatim:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax [two*three]\n\\\\\\\\item\\\\\\\\relax [two*three]\n\\\\\\\\item\\\\\\\\relax [a\\\\\\\\textbackslash{}a]\n\\\\\\\\item\\\\\\\\relax [a\\\\\\\\textbackslash{}a]\n\\\\\\\\item\\\\\\\\relax [a\\\\\\\\textbackslash{}\\\\\\\\textbackslash{}a]\n\\\\\\\\item\\\\\\\\relax [a\\\\\\\\_a\\\\\\\\_a]\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\textbf{GFM:}\n\n\n\nColon should be escaped in URLs:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax http\\\\\\\\textbackslash{}://user:password@host:port/path?key=value\\\\\\\\#fragment\n\\\\\\\\item\\\\\\\\relax https\\\\\\\\textbackslash{}://user:password@host:port/path?key=value\\\\\\\\#fragment\n\\\\\\\\item\\\\\\\\relax http://user:password@host:port/path?key=value\\\\\\\\#fragment\n\\\\\\\\item\\\\\\\\relax https://user:password@host:port/path?key=value\\\\\\\\#fragment\n\\\\\\\\end{itemize}\n\n\nDouble tildes should be \\\\\\\\textasciitilde{}\\\\\\\\textasciitilde{}escaped\\\\\\\\textasciitilde{}\\\\\\\\textasciitilde{}.\nAnd here: foo\\\\\\\\textasciitilde{}\\\\\\\\textasciitilde{}.\n\n\n\nPipes should not be escaped here: |\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nhere & they \\\\\\\\\\\\\\\\\nshould & tho|ugh \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\nAnd here:\n\n\n\n| here   | they   |\n| ---- | ----- |\n| should | though |\n\n\n\nAnd here:\n\n\n\nhere   | they\n---- | ------\nshould | though\n\n\n\n\\\\\\\\textbf{Commonmark:}\n\n\n\nOpen angle bracket should be escaped:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textbackslash{}<div>\\\\\\\\textbackslash{}</div>\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textbackslash{}<http\\\\\\\\textbackslash{}:google.com>\n\\\\\\\\item\\\\\\\\relax <div></div>\n\\\\\\\\item\\\\\\\\relax <http:google.com>\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs strong-and-em-together-one: strong-and-em-together-one 1`] = `\n\"\\\\\\\\textbf{\\\\\\\\textit{This is strong and em.}}\n\n\n\nSo is \\\\\\\\textbf{\\\\\\\\textit{this}} word.\n\n\n\n\\\\\\\\textbf{\\\\\\\\textit{This is strong and em.}}\n\n\n\nSo is \\\\\\\\textbf{\\\\\\\\textit{this}} word.\"\n`;\n\nexports[`rebber: remark specs strong-and-em-together-two: strong-and-em-together-two 1`] = `\n\"perform\\\\\\\\_complicated\\\\\\\\_task\n\n\n\ndo\\\\\\\\_this\\\\\\\\_and\\\\\\\\_do\\\\\\\\_that\\\\\\\\_and\\\\\\\\_another\\\\\\\\_thing\n\n\n\nperform\\\\\\\\textit{complicated}task\n\n\n\ndo\\\\\\\\textit{this}and\\\\\\\\textit{do}that\\\\\\\\textit{and}another*thing\"\n`;\n\nexports[`rebber: remark specs strong-emphasis: strong-emphasis 1`] = `\n\"Foo \\\\\\\\textbf{bar} \\\\\\\\textbf{baz}.\n\n\n\nFoo \\\\\\\\textbf{bar} \\\\\\\\textbf{baz}.\"\n`;\n\nexports[`rebber: remark specs strong-initial-white-space: strong-initial-white-space 1`] = `\n\"\\\\\\\\textbf{ bar }.\n\n\n\n\\\\\\\\textbf{ bar }.\"\n`;\n\nexports[`rebber: remark specs table: table 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeading 1 & \\\\\\\\textbf{H}eading 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 & Header 3 & Header 4 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 & Cell 3 & Cell 4 \\\\\\\\\\\\\\\\\nCell 5 & Cell 6 & Cell 7 & Cell 8 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{CodeBlock}{text}\nTest code\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 & Header 3 & Header 4 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 & Cell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\textit{Cell 5} & Cell 6 & Cell 7 & Cell 8 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs table-empty-initial-cell: table-empty-initial-cell 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\n & a & c \\\\\\\\\\\\\\\\\na & b & c \\\\\\\\\\\\\\\\\na & b & c \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs table-escaped-pipes: table-escaped-pipes 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nFirst & Second & third \\\\\\\\\\\\\\\\\nfirst & second & third \\\\\\\\\\\\\\\\\nfirst & second | second & third | \\\\\\\\\\\\\\\\\nfirst & second \\\\\\\\textbackslash{} & third \\\\\\\\textbackslash{} \\\\\\\\\\\\\\\\\nfirst & second \\\\\\\\textbackslash{}| second & third \\\\\\\\textbackslash{}| \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs table-in-list: table-in-list 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Unordered:\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\\\\\\\\item\\\\\\\\relax Ordered:\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs table-invalid-alignment: table-invalid-alignment 1`] = `\n\"Missing alignment characters:\n\n\n\n| a | b | c |\n|   |---|---|\n| d | e | f |\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n| a | b | c |\n|---|---|   |\n| d | e | f |\n\n\n\nInvalid characters:\n\n\n\n| a | b | c |\n|---|-*-|---|\n| d | e | f |\"\n`;\n\nexports[`rebber: remark specs table-loose: table-loose 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs table-no-body: table-no-body 1`] = `\n\"\\\\\\\\part{Foo}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nName & GitHub & Twitter \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs table-no-end-of-line: table-no-end-of-line 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nfoo & bar \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs table-one-column: table-one-column 1`] = `\n\"This is a table:\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\na \\\\\\\\\\\\\\\\\nb \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs table-one-row: table-one-row 1`] = `\n\"This is a table:\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\na & b & c \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs table-padded: table-padded 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs table-pipes-in-code: table-pipes-in-code 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nabc & head2 \\\\\\\\\\\\\\\\\nx & \\` &  &  & \\` \\\\\\\\\\\\\\\\\nx & \\` \\\\\\\\\\\\\\\\\nx & \\` & \\` \\\\\\\\\\\\\\\\\nx & \\\\\\\\texttt{f} \\\\\\\\\\\\\\\\\nx & \\`\\`\\`\\` \\\\\\\\\\\\\\\\\nx & \\`\\\\\\\\texttt{f} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nabc & head2 \\\\\\\\\\\\\\\\\nx & \\` \\\\\\\\\\\\\\\\\nx & \\` & \\` \\\\\\\\\\\\\\\\\nx & \\\\\\\\texttt{f} \\\\\\\\\\\\\\\\\nx & \\`\\`\\`\\` \\\\\\\\\\\\\\\\\nx & \\`\\\\\\\\texttt{f} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs table-spaced: table-spaced 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs table-with-image: table-with-image 1`] = `\n\"Someone wanted to do this, let's implement it!\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nc1 & c2 \\\\\\\\\\\\\\\\\nc3 & \\\\\\\\includegraphics{https://zestedesavoir.com/media/galleries/426/56dc4a1e-416b-4a9d-830d-95b45d58a17a.png} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs tabs: tabs 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax this is a list item\nindented with tabs\n\\\\\\\\item\\\\\\\\relax this is a list item\nindented with spaces\n\\\\\\\\end{itemize}\n\n\nCode:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nthis code block is indented by one tab\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\tthis code block is indented by two tabs\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n+\tthis is an example list item\n\tindented with tabs\n\n+   this is an example list item\n    indented with spaces\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs tabs-and-spaces: tabs-and-spaces 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax this is a list item\nindented with tabs\n\\\\\\\\item\\\\\\\\relax this is a list item\nindented with spaces\n\\\\\\\\end{itemize}\n\n\nCode:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nthis code block is indented by one tab\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\tthis code block is indented by two tabs\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n+\tthis is an example list item\n\tindented with tabs\n\n+   this is an example list item\n    indented with spaces\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`rebber: remark specs task-list: task-list 1`] = `\n\"\\\\\\\\part{Empty items}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax [ ]\n\\\\\\\\item\\\\\\\\relax [\t]\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax [x]\n\\\\\\\\item\\\\\\\\relax [X]\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Single space}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Tab}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{No white space with content}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax [ ]Hello;\n\\\\\\\\item\\\\\\\\relax [\t]World;\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax [x]Foo.\n\\\\\\\\item\\\\\\\\relax [X]Bar\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Single space with content}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Hello;\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax World;\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Foo.\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax World :D\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Single tab with content}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Hello;\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax World;\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Foo.\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Hello.\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Multiple spaces with content}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nHello;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nWorld;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Foo.\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Bar.\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Multiple tabs with content}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nHello;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nWorld;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nFoo.\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nBar.\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Mixed tabs and spaces}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\n    Hello;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nWorld;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\n\tHello;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax World.\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Bar.\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Line breaks}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax [\n] Hello;\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax [\n] Hello;\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Multiple unfinished characters}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax [  ] Hello;\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax [\n] World;\n\\\\\\\\item\\\\\\\\relax [\t\t] Hello;\n\\\\\\\\item\\\\\\\\relax [ \t ] World.\n\\\\\\\\end{enumerate}\"\n`;\n\nexports[`rebber: remark specs task-list-ordered: task-list-ordered 1`] = `\n\"\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mercury;\n\\\\\\\\item\\\\\\\\relax [] Venus (this one’s invalid);\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Earth:\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Moon.\n\\\\\\\\end{enumerate}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mars;\n\\\\\\\\item\\\\\\\\relax [] Neptune (this one’s also invalid).\n\\\\\\\\end{enumerate}\"\n`;\n\nexports[`rebber: remark specs task-list-unordered-asterisk: task-list-unordered-asterisk 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mercury;\n\\\\\\\\item\\\\\\\\relax [] Venus (this one’s invalid);\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Earth:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Moon.\n\\\\\\\\end{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mars;\n\\\\\\\\item\\\\\\\\relax [] Neptune (this one’s also invalid).\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs task-list-unordered-dash: task-list-unordered-dash 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mercury;\n\\\\\\\\item\\\\\\\\relax [] Venus (this one’s invalid);\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Earth:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Moon.\n\\\\\\\\end{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mars;\n\\\\\\\\item\\\\\\\\relax [] Neptune (this one’s also invalid).\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs task-list-unordered-plus: task-list-unordered-plus 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mercury;\n\\\\\\\\item\\\\\\\\relax [] Venus (this one’s invalid);\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Earth:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Moon.\n\\\\\\\\end{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mars;\n\\\\\\\\item\\\\\\\\relax [] Neptune (this one’s also invalid).\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs tidyness: tidyness 1`] = `\n\"\\\\\\\\begin{Quotation}\nA list within a blockquote:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax asterisk 1\n\\\\\\\\item\\\\\\\\relax asterisk 2\n\\\\\\\\item\\\\\\\\relax asterisk 3\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`rebber: remark specs title-attributes: title-attributes 1`] = `\n\"\\\\\\\\part{Links}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nImplementation & Characters & Nested & Mismatched & Escaped & Named Entities & Numbered Entities \\\\\\\\\\\\\\\\\nMarkdown.pl & \\\\\\\\texttt{\\\\\"} & Yes & Yes & No & Yes & Yes \\\\\\\\\\\\\\\\\nGitHub & \\\\\\\\texttt{\\\\\"} & Yes & Yes & No & No & No \\\\\\\\\\\\\\\\\nCommonMark & \\\\\\\\texttt{\\\\\"} & No & No & Yes & Yes & Yes \\\\\\\\\\\\\\\\\nMarkdown.pl & \\\\\\\\texttt{'} & Yes & Yes & No & Yes & Yes \\\\\\\\\\\\\\\\\nGitHub & \\\\\\\\texttt{'} & Yes & Yes & No & No & No \\\\\\\\\\\\\\\\\nCommonMark & \\\\\\\\texttt{'} & No & No & Yes & Yes & Yes \\\\\\\\\\\\\\\\\nMarkdown.pl & \\\\\\\\texttt{()} & - & - & - & - & - \\\\\\\\\\\\\\\\\nGitHub & \\\\\\\\texttt{()} & - & - & - & - & - \\\\\\\\\\\\\\\\\nCommonMark & \\\\\\\\texttt{()} & No & Yes & Yes & Yes & Yes \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\chapter{Double quotes}\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\chapter{Single quotes}\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\part{Images}\n\n\n\\\\\\\\chapter{Double quotes}\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\chapter{Single quotes}\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\"\n`;\n\nexports[`rebber: remark specs toplevel-paragraphs: toplevel-paragraphs 1`] = `\n\"hello world\nhow are you\nhow are you\n\n\n\nhello world\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nhow are you\n\\\\\\\\end{CodeBlock}\n\n\n\nhello world\n\n\n\n\\\\\\\\horizontalLine\n\n\n\nhello world\n\n\n\n\\\\\\\\part{how are you}\n\n\nhello world\n\n\n\n\\\\\\\\part{how are you}\n\n\nhello world\n\n\n\n\\\\\\\\begin{Quotation}\nhow are you\n\\\\\\\\end{Quotation}\n\n\n\nhello world\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax how are you\n\\\\\\\\end{itemize}\n\n\nhello world\n\n\n\n<div>how are you</div>\n\nhello world\n<span>how are you</span>\n\n\n\nhello \\\\\\\\hyperref[how]{world}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{how}\\\\\\\\externalLink{/are/you}{/are/you}}\n\n<div>hello</div>\n\n<span>hello</span>\"\n`;\n\nexports[`rebber: remark specs tricky-list: tricky-list 1`] = `\n\"\\\\\\\\textbf{hello} \\\\\\\\textit{world}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello world\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\textbf{hello} \\\\\\\\textit{world}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello world\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\textbf{hello} \\\\\\\\textit{world}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Hello world\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\textbf{hello} \\\\\\\\textit{world}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello world\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros amps-and-angles-encoding 1`] = `\n\"AT\\\\\\\\&T has an ampersand in their name.\n\n\n\nAT\\\\\\\\&T is another way to write it.\n\n\n\nThis \\\\\\\\& that.\n\n\n\n4 < 5.\n\n\n\n6 > 5.\n\n\n\nHere's a [linkReference(reference=1, content=link)] with an ampersand in the URL.\n\n\n\nHere's a link with an amersand in the link text: [linkReference(reference=2, content=AT\\\\\\\\&T)].\n\n\n\nHere's an inline \\\\\\\\externalLink{link}{/script?foo=1\\\\\\\\&bar=2}.\n\n\n\nHere's an inline \\\\\\\\externalLink{link}{/script?foo=1\\\\\\\\&bar=2}.\n\n\n\n[definition(identifier=1, url=http://example.com/?foo=1&bar=2, title=null)]\n\n[definition(identifier=2, url=http://att.com/, title=AT&T)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros auto-link 1`] = `\n\"Link: \\\\\\\\externalLink{http://example.com/}{http://example.com/}.\n\n\n\nLink to an email: \\\\\\\\externalLink{somename@example.com}{mailto:somename@example.com}.\n\n\n\nLink to an email: \\\\\\\\externalLink{somename@example.com}{mailto:somename@example.com}.\n\n\n\nWith an ampersand: \\\\\\\\externalLink{http://example.com/?foo=1\\\\\\\\&bar=2}{http://example.com/?foo=1\\\\\\\\&bar=2}\n\n\n\n[unorderedList([listItem(In a list?)][listItem(\\\\\\\\externalLink{http://example.com/}{http://example.com/})][listItem(It should.)])]\n\n[blockquote(Blockquoted: \\\\\\\\externalLink{http://example.com/}{http://example.com/})]\n\nAuto-links should not occur here: \\\\\\\\texttt{<http://example.com/>}\n\n\n\n[code(or here: <http://example.com/>)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros auto-link-invalid 1`] = `\n\"<http:/\n\n\n\n<https:/\n\n\n\n<mailto:foobarbaz>\n\n\n\n<http:/google\n\n\n\n<foo@\"\n`;\n\nexports[`rebber: remark specs with config: custom macros auto-link-lines 1`] = `\n\"hello world\n\\\\\\\\externalLink{http://example.com}{http://example.com}\n\n\n\nhello world\n\\\\\\\\externalLink{somename@example.com}{mailto:somename@example.com}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros auto-link-output 1`] = `\n\"Link: \\\\\\\\externalLink{http://example.com/}{http://example.com/}.\n\n\n\nLink to an email: \\\\\\\\externalLink{somename@example.com}{mailto:somename@example.com}.\n\n\n\nLink without protocol, which should not render as an auto-link\nbecause they are easily mistaken for HTML: \\\\\\\\externalLink{google.com}{google.com}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros auto-link-url 1`] = `\n\"This should be a link: \\\\\\\\externalLink{http://example.com/hello-world}{http://example.com/hello-world}.\n\n\n\nAlso, subdomain should be a part of the link (\\\\\\\\externalLink{http://foo.example.com/(hello[world])}{http://foo.example.com/(hello[world])}).\n\n\n\nSo should this: \\\\\\\\externalLink{foo@bar.com}{mailto:foo@bar.com}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros auto-link-url-invalid 1`] = `\n\"http://<example\n\n\n\nhttps:// foo bar baz.\n\n\n\nmailto:.\n\n\n\nhttp://,\n\n\n\nhttps://:\n\n\n\nmailto:;\n\n\n\nhttp://\\\\\"\n\n\n\nhttps://'\n\n\n\nmailto:)\n\n\n\nhttp://]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros backslash-escapes 1`] = `\n\"These should all get escaped:\n\n\n\nBackslash: \\\\\\\\textbackslash{}\n\n\n\nBacktick: \\`\n\n\n\nAsterisk: *\n\n\n\nUnderscore: \\\\\\\\_\n\n\n\nLeft brace: \\\\\\\\{\n\n\n\nRight brace: \\\\\\\\}\n\n\n\nLeft bracket: [\n\n\n\nRight bracket: ]\n\n\n\nLeft paren: (\n\n\n\nRight paren: )\n\n\n\nGreater-than: >\n\n\n\nHash: \\\\\\\\#\n\n\n\nPeriod: .\n\n\n\nBang: !\n\n\n\nPlus: +\n\n\n\nMinus: -\n\n\n\n\\\\\\\\textbf{GFM:}\n\n\n\nPipe: |\n\n\n\nTilde: \\\\\\\\textasciitilde{}\n\n\n\n\\\\\\\\textbf{Commonmark:}\n\n\n\nQuote: \\\\\\\\textbackslash{}\\\\\"\n\n\n\nDollar: \\\\\\\\textbackslash{}\\\\\\\\$\n\n\n\nPercentage: \\\\\\\\textbackslash{}\\\\\\\\%\n\n\n\nAmpersand: \\\\\\\\textbackslash{}\\\\\\\\&\n\n\n\nSingle quote: \\\\\\\\textbackslash{}'\n\n\n\nComma: \\\\\\\\textbackslash{},\n\n\n\nForward slash: \\\\\\\\textbackslash{}/\n\n\n\nColon: \\\\\\\\textbackslash{}:\n\n\n\nSemicolon: \\\\\\\\textbackslash{};\n\n\n\nLess-than: \\\\\\\\textbackslash{}<\n\n\n\nEquals: \\\\\\\\textbackslash{}=\n\n\n\nQuestion mark: \\\\\\\\textbackslash{}?\n\n\n\nAt-sign: \\\\\\\\textbackslash{}@\n\n\n\nCaret: \\\\\\\\textbackslash{}\\\\\\\\textasciicircum{}\n\n\n\nNew line: \\\\\\\\textbackslash{}\nonly works in paragraphs.\n\n\n\nThese should not, because they occur within a code block:\n\n\n\n[code(Backslash: \\\\\\\\\\\\\\\\\n\nBacktick: \\\\\\\\\\`\n\nAsterisk: \\\\\\\\*\n\nUnderscore: \\\\\\\\_\n\nLeft brace: \\\\\\\\{\n\nRight brace: \\\\\\\\}\n\nLeft bracket: \\\\\\\\[\n\nRight bracket: \\\\\\\\]\n\nLeft paren: \\\\\\\\(\n\nRight paren: \\\\\\\\)\n\nGreater-than: \\\\\\\\>\n\nHash: \\\\\\\\#\n\nPeriod: \\\\\\\\.\n\nBang: \\\\\\\\!\n\nPlus: \\\\\\\\+\n\nMinus: \\\\\\\\-)]\n\n\\\\\\\\textbf{GFM:}\n\n\n\n[code(Pipe: \\\\\\\\|\n\nTilde: \\\\\\\\~)]\n\n\\\\\\\\textbf{Commonmark:}\n\n\n\n[code(Quote: \\\\\\\\\\\\\"\n\nDollar: \\\\\\\\$\n\nPercentage: \\\\\\\\%\n\nAmpersand: \\\\\\\\&\n\nSingle quote: \\\\\\\\'\n\nComma: \\\\\\\\,\n\nForward slash: \\\\\\\\/\n\nColon: \\\\\\\\:\n\nSemicolon: \\\\\\\\;\n\nLess-than: \\\\\\\\<\n\nEquals: \\\\\\\\=\n\nQuestion mark: \\\\\\\\?\n\nAt-sign: \\\\\\\\@\n\nCaret: \\\\\\\\^\n\nNew line: \\\\\\\\\nonly works in paragraphs.)]\n\nNor should these, which occur in code spans:\n\n\n\nBackslash: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\textbackslash{}}\n\n\n\nBacktick: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\`}\n\n\n\nAsterisk: \\\\\\\\texttt{\\\\\\\\textbackslash{}*}\n\n\n\nUnderscore: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\_}\n\n\n\nLeft brace: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\{}\n\n\n\nRight brace: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\}}\n\n\n\nLeft bracket: \\\\\\\\texttt{\\\\\\\\textbackslash{}[}\n\n\n\nRight bracket: \\\\\\\\texttt{\\\\\\\\textbackslash{}]}\n\n\n\nLeft paren: \\\\\\\\texttt{\\\\\\\\textbackslash{}(}\n\n\n\nRight paren: \\\\\\\\texttt{\\\\\\\\textbackslash{})}\n\n\n\nGreater-than: \\\\\\\\texttt{\\\\\\\\textbackslash{}>}\n\n\n\nHash: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\#}\n\n\n\nPeriod: \\\\\\\\texttt{\\\\\\\\textbackslash{}.}\n\n\n\nBang: \\\\\\\\texttt{\\\\\\\\textbackslash{}!}\n\n\n\nPlus: \\\\\\\\texttt{\\\\\\\\textbackslash{}+}\n\n\n\nMinus: \\\\\\\\texttt{\\\\\\\\textbackslash{}-}\n\n\n\n\\\\\\\\textbf{GFM:}\n\n\n\nPipe: \\\\\\\\texttt{\\\\\\\\textbackslash{}|}\n\n\n\nTilde: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\textasciitilde{}}\n\n\n\n\\\\\\\\textbf{Commonmark:}\n\n\n\nQuote: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\"}\n\n\n\nDollar: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\$}\n\n\n\nPercentage: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\%}\n\n\n\nAmpersand: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\&}\n\n\n\nSingle quote: \\\\\\\\texttt{\\\\\\\\textbackslash{}'}\n\n\n\nComma: \\\\\\\\texttt{\\\\\\\\textbackslash{},}\n\n\n\nForward slash: \\\\\\\\texttt{\\\\\\\\textbackslash{}/}\n\n\n\nColon: \\\\\\\\texttt{\\\\\\\\textbackslash{}:}\n\n\n\nSemicolon: \\\\\\\\texttt{\\\\\\\\textbackslash{};}\n\n\n\nLess-than: \\\\\\\\texttt{\\\\\\\\textbackslash{}<}\n\n\n\nEquals: \\\\\\\\texttt{\\\\\\\\textbackslash{}=}\n\n\n\nQuestion mark: \\\\\\\\texttt{\\\\\\\\textbackslash{}?}\n\n\n\nAt-sign: \\\\\\\\texttt{\\\\\\\\textbackslash{}@}\n\n\n\nCaret: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\textasciicircum{}}\n\n\n\nNew line: \\\\\\\\texttt{\\\\\\\\textbackslash{} } only works in paragraphs.\n\n\n\nThese should get escaped, even though they're matching pairs for\nother Markdown constructs:\n\n\n\n*asterisks*\n\n\n\n\\\\\\\\_underscores\\\\\\\\_\n\n\n\n\\`backticks\\`\n\n\n\nThis is a code span with a literal backslash-backtick sequence: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\`}\n\n\n\nThis is a tag with unescaped backticks <span attr='\\`ticks\\`'>bar</span>.\n\n\n\nThis is a tag with backslashes <span attr='\\\\\\\\\\\\\\\\backslashes\\\\\\\\\\\\\\\\'>bar</span>.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros block-elements 1`] = `\n\"[unorderedList([listItem(Different lists should receive two newline characters\nbetween them.)])]\n\n\n[unorderedList([listItem(This is another list.)])]\n\n[blockquote([unorderedList([listItem(The same goes for lists in block quotes.)])][unorderedList([listItem(This is another list.)])])]\n\n[unorderedList([listItem(And for lists in lists:\n\n[orderedList([listItem(First sublist.)])])])]\n\n\n[code(1.   Second sublist.)]\n\nAnd for lists followed by indented code blocks:\n\n\n\n[unorderedList([listItem(This is a paragraph in a list)])]\n\n\n[code(And this is code();)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros blockquote-indented 1`] = `\n\"[blockquote(bar\nbaz)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros blockquote-lazy-code 1`] = `\n\"[blockquote([code(foo\nbar)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros blockquote-lazy-fence 1`] = `\n\"[blockquote([code(aNormalCodeBlockInABlockqoute();)])]\n\nA paragraph.\n\n\n\n[blockquote([code(thisIsAlsoSomeCodeInABlockquote();)])]\n\nA paragraph.\n\n\n\n[blockquote([code(aNonTerminatedCodeBlockInABlockquote();)]aNewCodeBlockFollowingTheBlockQuote();\n\n[code()])]\n\nA paragraph.\n\n\n\n[blockquote(Something in a blockquote.\n\n[code(aNewCodeBlock();)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros blockquote-lazy-list 1`] = `\n\"[blockquote(This is a blockquote.\n\n[unorderedList([listItem(And in normal mode this is an internal list, but in commonmark this is a top level list.)])])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros blockquote-lazy-rule 1`] = `\n\"[blockquote(This is a blockquote. Followed by a rule.\n\n[thematicBreak(---)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros blockquote-list-item 1`] = `\n\"This fails in markdown.pl and upskirt:\n\n\n\n[unorderedList([listItem(hello\n\n[blockquote(world)])])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros blockquotes 1`] = `\n\"[blockquote(This is a blockquote.)]\n\n[blockquote(This is, in commonmark mode, another blockquote.)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros blockquotes-empty-lines 1`] = `\n\"[blockquote(Note there is no space on the following line.\n\nNote there is no space on the preceding line.)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros blockquotes-with-code-blocks 1`] = `\n\"[blockquote(Example:\n\n[code(sub status {\n    print \\\\\"working\\\\\";\n})]Or:\n\n[code(sub status {\n    return \\\\\"working\\\\\";\n})])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros bom 1`] = `\n\"heading1(Hello from a BOM)\n\nBe careful when editing this file!\"\n`;\n\nexports[`rebber: remark specs with config: custom macros breaks-hard 1`] = `\n\"These are not breaks:\n\n\n\nLook at the\npretty line\nbreaks.\n\n\n\nThese are breaks:\n\n\n\nLook at the[break(---)]pretty line[break(---)]breaks.\n\n\n\nIn \\\\\\\\texttt{commonmark: true} mode, an escaped newline character is exposed as a \\\\\\\\texttt{break} node:\n\n\n\nLook at the\\\\\\\\textbackslash{}\npretty line\\\\\\\\textbackslash{}\nbreaks.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros case-insensitive-refs 1`] = `\n\"[linkReference(reference=hi, content=hi)]\n\n\n\n[definition(identifier=hi, url=/url, title=null)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros code-block 1`] = `\n\"Tildes:\n\n\n\n[codeJavascript(alert('Hello World!');)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros code-block-escape 1`] = `\n\"A little flaw:\n\n\n\n[codePython(\\\\\\\\end{CodeBlock}\n\\\\\\\\end   {CodeBlock})]\n\nAn ingenuous flaw:\n\n\n\n[code(\\\\\\\\end\\\\\\\\end{CodeBlock}{CodeBlock}\n\\\\\\\\input{/etc/passwd}\n\\\\\\\\begin{CodeBlock}{text})]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros code-block-indentation 1`] = `\n\"Fenced code blocks are normally not exdented, however,\nwhen the initial fence is indented by spaces, the value of\nthe code is exdented by up to that amount of spaces.\n\n\n\n[code(    This is a code block...\n        \n    ...which is not exdented.)]\n\nBut...\n\n\n\n[code(  This one...\n      \n  ...is.)]\n\nAnd...\n\n\n\n[code(So is this...\n      \n  ...one.)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros code-block-nesting-bug 1`] = `\n\"GitHub, thus RedCarpet, has a bug where “nested” fenced code blocks,\neven with shorter fences, can exit their actual “parent” block.\n\n\n\nNote that this bug does not occur on indented code-blocks.\n\n\n\n[codeFoo(\\`\\`\\`bar\nbaz\n\\`\\`\\`)]\n\nEven with a different fence marker:\n\n\n\n[codeFoo(~~~bar\nbaz\n~~~)]\n\nAnd reversed:\n\n\n\n[codeFoo(~~~bar\nbaz\n~~~)]\n\n[codeFoo(\\`\\`\\`bar\nbaz\n\\`\\`\\`)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros code-blocks 1`] = `\n\"code block on the first line\n\n\n\nRegular text.\n\n\n\n[code(code block indented by spaces)]\n\nRegular text.\n\n\n\n[code(the lines in this block  \nall contain trailing spaces  )]\n\nRegular Text.\n\n\n\n[code(code block on the last line)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros code-spans 1`] = `\n\"\\\\\\\\texttt{<test a=\\\\\"} content of attribute \\\\\\\\texttt{\\\\\">}\n\n\n\nFix for backticks within HTML tag: <span attr='\\`ticks\\`'>like this</span>\n\n\n\nHere's how you put \\\\\\\\texttt{\\`backticks\\`} in a code span.\n\n\n\nAdditionally, empty code spans are NOT supported: \\`\\`.\n\n\n\nHere’s an example, \\\\\\\\texttt{foo \\` bar }.\n\n\n\nAnd here, \\\\\\\\texttt{\\`\\`}.\n\n\n\n\\\\\\\\texttt{// this is also inline code}\n\n\n\nSo is this \\\\\\\\texttt{foo bar baz}.\n\n\n\nAnd this \\\\\\\\texttt{foo \\`\\` bar}\n\n\n\nAnd \\\\\\\\texttt{this\\\\\\\\textbackslash{}}but this is text\\`.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros def-blocks 1`] = `\n\"[blockquote(hello\n\n[definition(identifier=1, url=hello, title=null)])]\n\n[thematicBreak(---)]\n\n[blockquote(hello)]\n\n[definition(identifier=2, url=hello, title=null)]\n\n[unorderedList([listItem(hello)][listItem([definition(identifier=3, url=hello, title=null)])])]\n\n\n[unorderedList([listItem(hello)])]\n\n[definition(identifier=4, url=hello, title=null)]\n\n[blockquote(foo\nbar)]\n\n[definition(identifier=1-1, url=foo, title=null)]\n\n[blockquote(bar)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros definition-newline 1`] = `\n\"[linkReference(reference=baz, content=baz)]: /url (\n)\n\n\n\n[foo]: /url \\\\\"\n\\\\\"\n\n\n\n[bar]: /url '\n'\n\n\n\n[definition(identifier=baz, url=/url, title=foo\nbar)]\n\n[definition(identifier=baz-1, url=/url, title=foo\nbar)]\n\n[definition(identifier=baz-1-1, url=/url, title=foo\nbar)]\n\n[linkReference(reference=baz, content=baz)]: /url 'foo\"\n`;\n\nexports[`rebber: remark specs with config: custom macros definition-unclosed 1`] = `\n\"[foo]:\n\n\n\n[definition(identifier=bar, url=</url, title=null)]\n\n[foo]:\"\n`;\n\nexports[`rebber: remark specs with config: custom macros definition-unclosed-attribute 1`] = `\n\"[baz]: /url (there\n\n\n\n[foo]: /url \\\\\"there\n\n\n\n[bar]: /url 'there\n\n\n\n[baz]: url (\n\n\n\n[foo]: url \\\\\"\n\n\n\n[bar]: /url '\n\n\n\n[baz]: <url>(\n\n\n\n[foo]: <url>\\\\\"\n\n\n\n[bar]: <url>'\"\n`;\n\nexports[`rebber: remark specs with config: custom macros deletion 1`] = `\"hello \\\\\\\\sout{hi} world\"`;\n\nexports[`rebber: remark specs with config: custom macros double-link 1`] = `\n\"<p>Already linked: <a href=\\\\\"http://example.com/\\\\\">http://example.com/</a>.</p>\n\nAlready linked: \\\\\\\\externalLink{http://example.com/}{http://example.com/}.\n\n\n\nAlready linked: <a href=\\\\\"http://example.com/\\\\\">\\\\\\\\textbf{http://example.com/}</a>.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros emphasis 1`] = `\n\"\\\\\\\\textit{emphasis}.\n\n\n\n\\\\\\\\textbf{strong}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros emphasis-empty 1`] = `\n\"Hello ** ** world.\n\n\n\nHello \\\\\\\\_\\\\\\\\_\t\\\\\\\\_\\\\\\\\_ world.\n\n\n\nHello *\t* world.\n\n\n\nHello \\\\\\\\_\t\\\\\\\\_ world.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros emphasis-escaped-final-marker 1`] = `\n\"*bar*\n\n\n\n**bar**\n\n\n\n\\\\\\\\_bar\\\\\\\\_\n\n\n\n\\\\\\\\_\\\\\\\\_bar\\\\\\\\_\\\\\\\\_\"\n`;\n\nexports[`rebber: remark specs with config: custom macros emphasis-internal 1`] = `\"These words should\\\\\\\\_not\\\\\\\\_be\\\\\\\\_emphasized.\"`;\n\nexports[`rebber: remark specs with config: custom macros empty 1`] = `\"\"`;\n\nexports[`rebber: remark specs with config: custom macros entities 1`] = `\n\"Lots of entities are supported in mdast:  , \\\\\\\\&, ©, Æ,\nĎ, ¾, ℋ, ⅆ,\n∲, \\\\\\\\&c.  Even some entities with a missing\nterminal semicolon are parsed correctly (as per the HTML5 spec):\nÿ, á, ©, and \\\\\\\\&.\n\n\n\nHowever, \\\\\\\\&MadeUpEntities; are kept in the document.\n\n\n\nEntities even work in the language flag of fenced code blocks:\n\n\n\n[codeSome—language(alert('Hello');)]\n\nOr in \\\\\\\\externalLink{línks}{\\\\\\\\textasciitilde{}/some—file}\n\n\n\nOr in \\\\\\\\includegraphics{~/an–image.png}\n\n\n\nBut, entities are not interpreted in \\\\\\\\texttt{inline c\\\\\\\\&ouml;de}, or in\ncode blocks:\n\n\n\n[code(C&Ouml;DE block.)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros entities-advanced 1`] = `\n\"[blockquote(However, \\\\\\\\&MadeUpEntities; are kept in the document.)]\n\n[blockquote(Entities even work in the language flag of fenced code blocks:)]\n\n[blockquote([codeSome©language(alert('Hello');)])]\n\n[blockquote(And in an auto-link: \\\\\\\\externalLink{http://example©xample.com}{http://example\\\\\\\\&copyxample.com})]\n\n[blockquote(Foo and bar and http://example©xample.com and baz.)]\n\n[blockquote(Or in \\\\\\\\externalLink{l©nks}{\\\\\\\\textasciitilde{}/some\\\\\\\\&copyfile})]\n\n[blockquote(Or in \\\\\\\\externalLink{l©lnks}{\\\\\\\\textasciitilde{}/some\\\\\\\\&copyfile})]\n\n[blockquote(Or in \\\\\\\\includegraphics{~/some&copyfile})]\n\n[thematicBreak(---)]\n\n[blockquote(Or in \\\\\\\\includegraphics{~/some&copyfile})]\n\n[blockquote(Or in \\\\\\\\includegraphics{undefined})]\n\n[blockquote([definition(identifier=1, url=http://example&copyxample.com, title=in some\npl©ce)])]\n\n[blockquote([definition(identifier= 1 , url=http://example&copyxample.com, title=in some\npl©ce)])]\n\n[thematicBreak(---)]\n\n[blockquote(But, entities are not interpreted in \\\\\\\\texttt{inline c\\\\\\\\&oumlde}, or in\ncode blocks:)]\n\n[blockquote([code(C&OumlDE block.)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros escaped-angles 1`] = `\">\"`;\n\nexports[`rebber: remark specs with config: custom macros fenced-code 1`] = `\n\"[codeJs(var a = 'hello';\nconsole.log(a + ' world');)]\n\n[codeBash(echo \\\\\"hello, \\${WORLD}\\\\\")]\n\n[codeLongfence(Q: What do you call a tall person who sells stolen goods?)]\n\n[codeManyTildes(A longfence!)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros fenced-code-empty 1`] = `\n\"Normal with language tag:\n\n\n\n[codeJs()]\n\nWith white space:\n\n\n\n[codeBash()]\n\nWith very long fences:\n\n\n\n[code()]\n\nWith nothing:\n\n\n\n[code()]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros fenced-code-trailing-characters 1`] = `\n\"[codeJs(foo();\n\\`\\`\\`bash)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros fenced-code-trailing-characters-2 1`] = `\"[code(\\`\\`\\` aaa)]\"`;\n\nexports[`rebber: remark specs with config: custom macros fenced-code-white-space-after-flag 1`] = `\n\"[codeJs(foo();)]\n\n[codeBash(echo \\\\\"hello, \\${WORLD}\\\\\")]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros hard-wrapped-paragraphs-with-list-like-lines 1`] = `\n\"In Markdown 1.0.0 and earlier. Version\n8. This line turns into a list item.\nBecause a hard-wrapped line in the\n123. middle of a paragraph looked like a\nlist item.\n\n\n\nHere's one with a bullet.\n\n\n\n[unorderedList([listItem(criminey.)])]\n\nNon-GFM does not create a list for either.\nGFM does not create a list for \\\\\\\\texttt{8.}, but does for \\\\\\\\texttt{*}.\nCommonMark creates a list for both.\nAll versions create lists for the following.\n\n\n\n[unorderedList([listItem(Here's one with a bullet.\n\n[unorderedList([listItem(criminey.)])])])]\n\n...and the following:\n\n\n\n[orderedList([listItem(In Markdown 1.0.0 and earlier. Version\n8. This line turns into a list item.)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros heading 1`] = `\n\"heading1(Heading 1)\n\nheading2(Heading 2)\n\nheading3(Heading 4)\n\nheading4(Heading 4)\n\nheading5(Heading 5)\n\nheading6(Heading 6)\"\n`;\n\nexports[`rebber: remark specs with config: custom macros heading-atx-closed-trailing-white-space 1`] = `\n\"heading1(Foo)\n\nheading2(Bar)\"\n`;\n\nexports[`rebber: remark specs with config: custom macros heading-atx-empty 1`] = `\n\"heading1()\n\nheading2()\n\nheading3()\n\nheading4()\n\nheading5()\n\nheading6()\"\n`;\n\nexports[`rebber: remark specs with config: custom macros heading-in-blockquote 1`] = `\n\"[blockquote(A blockquote\nwith some more text.)]\n\nA normal paragraph.\n\n\n\n[blockquote(heading2(A blockquote followed by a horizontal rule (in CommonMark).))]\n\n[blockquote(heading2(A heading in a blockquote))]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros heading-in-paragraph 1`] = `\n\"Hello\n\n\n\nheading1(World)\"\n`;\n\nexports[`rebber: remark specs with config: custom macros heading-not-atx 1`] = `\n\"\\\\\\\\#This is not a heading, per CommonMark: \\\\\\\\externalLink{http://spec.commonmark.org/0.17/\\\\\\\\#example-25}{http://spec.commonmark.org/0.17/\\\\\\\\#example-25}\n\n\n\nKramdown (GitHub) neither supports unspaced ATX-headings.\n\n\n\n\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\# h7?\n\n\n\n\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\# h8?\n\n\n\n\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\# h9?\n\n\n\nMore than six \\\\\\\\# characters is not a heading: \\\\\\\\externalLink{http://spec.commonmark.org/0.26/\\\\\\\\#example-33}{http://spec.commonmark.org/0.26/\\\\\\\\#example-33}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros heading-setext-with-initial-spacing 1`] = `\n\"heading1(Heading 1)\n\nheading2(Heading 2)\n\nBoth these headings caused positional problems in on commit daa344c and before.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros horizontal-rules 1`] = `\n\"Dashes:\n\n\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[code(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[code(- - -)]\n\nAsterisks:\n\n\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[code(***)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[code(* * *)]\n\nUnderscores:\n\n\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[code(___)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[code(_ _ _)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros horizontal-rules-adjacent 1`] = `\n\"[thematicBreak(---)]\n\n[thematicBreak(---)]\n\n[thematicBreak(---)]\n\nThe three asterisks are not a Setext header.\n\n\n\nThis is a paragraph.\n\n\n\n[thematicBreak(---)]\n\nThis is another paragraph.\n\n\n\n[thematicBreak(---)]\n\nheading2(But this is a secondary heading.)\n\n[thematicBreak(---)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros hr 1`] = `\"[thematicBreak(---)]\"`;\n\nexports[`rebber: remark specs with config: custom macros hr-list-break 1`] = `\n\"[unorderedList([listItem(hello world)][listItem(how are)])]\n\n[thematicBreak(---)]\n\nyou today?\n\n\n\nThe above asterisks do split the list, but the below ones do not.\n\n\n\n[unorderedList([listItem(hello world)][listItem(how are)][listItem([thematicBreak(---)]you today?)])]\n\n\n[unorderedList([listItem(Neither do these)][listItem(how are)][listItem([unorderedList([listItem([unorderedList([listItem(you today?)])])])])])]\n\n\n[unorderedList([listItem(But these do)][listItem(how are)])]\n\n[thematicBreak(---)]\n\nyou today?\"\n`;\n\nexports[`rebber: remark specs with config: custom macros html-advanced 1`] = `\n\"Simple block on one line:\n\n\n\n<div>foo</div>\n\nAnd nested without indentation:\n\n\n\n<div>\n<div>\n<div>\nfoo\n</div>\n<div style=\\\\\">\\\\\"/>\n</div>\n<div>bar</div>\n</div>\"\n`;\n\nexports[`rebber: remark specs with config: custom macros html-attributes 1`] = `\n\"heading1(Block-level)\n\n<article foo=\\\\\"bar 'baz' qux\\\\\" foo='bar \\\\\"baz\\\\\" qux' foo=baz>\n\n<article foo>\n\n<article>\n\n<article :foo:bar:09:=\\\\\"baz\\\\\">\n\n<article foo.bar_09->\n\n<article foo.bar_09-   >\n\n<article foo.bar_09-   />\n\n<div baz\nqux\n\nheading1(Inline)\n\n<span foo=\\\\\"bar 'baz' qux\\\\\" foo='bar \\\\\"baz\\\\\" qux' foo=baz>\n\n<span foo>\n\n<span>\n\n<span :foo:bar:09:=\\\\\"baz\\\\\">\n\n<span foo.bar_09->\n\n<span foo.bar_09-   >\n\n<span foo.bar_09-   />\n\n<span this is\ninvalid\"\n`;\n\nexports[`rebber: remark specs with config: custom macros html-cdata 1`] = `\n\"<![CDATA[\nfooBarBaz()\n]]>\n\nfoo <![CDATA[bar]]>\"\n`;\n\nexports[`rebber: remark specs with config: custom macros html-comments 1`] = `\n\"Paragraph one.\n\n\n\n<!-- This is a simple comment -->\n\n<!--\n\tThis is another comment.\n-->\n\nWhat follows is not an HTML comment because it contains\ntwo consecutive dashes:\n\\\\\\\\externalLink{https://html.spec.whatwg.org/multipage/syntax.html\\\\\\\\#comments}{https://html.spec.whatwg.org/multipage/syntax.html\\\\\\\\#comments}.\n\n\n\n<!-- one comment block -- -- with two comments -->\n\nBut this is fine (in commonmark):\n\n\n\n<!-- one comment block - with a dash -->\n\nAnd, this is wrong (in commonmark):\n\n\n\n<!-->-->\n\nThe end.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros html-declaration 1`] = `\n\"<!DOCTYPE html>\n\nfoo <!BAR br BAZ>\n\n\n\n<!doctype html>\n\n<!valid >\n\n<!invalid>\"\n`;\n\nexports[`rebber: remark specs with config: custom macros html-indented 1`] = `\n\"<div>\n  *hello*\n   <div>\n\n <span>\n  *hello*\n   <span>\n\n  <!doctype html>\n\n   <!-- baz -->\n\nalpha <!-- baz -->\"\n`;\n\nexports[`rebber: remark specs with config: custom macros html-processing-instruction 1`] = `\n\"<?php\n  echo '>';\n?>\"\n`;\n\nexports[`rebber: remark specs with config: custom macros html-simple 1`] = `\n\"Here's a simple block:\n\n\n\n<div>\n\tfoo\n</div>\n\nThis should be a code block, though:\n\n\n\n[code(<div>\n\tfoo\n</div>)]\n\nAs should this:\n\n\n\n[code(<div>foo</div>)]\n\nNow, nested:\n\n\n\n<div>\n\t<div>\n\t\t<div>\n\t\t\tfoo\n\t\t</div>\n\t</div>\n</div>\n\nThis should just be an HTML comment:\n\n\n\n<!-- Comment -->\n\nMultiline:\n\n\n\n<!--\nBlah\nBlah\n-->\n\nCode block:\n\n\n\n[code(<!-- Comment -->)]\n\nJust plain comment, with trailing spaces on the line:\n\n\n\n<!-- foo -->   \n\nCode:\n\n\n\n[code(<hr>)]\n\nHr's:\n\n\n\n<hr>\n\n<hr>\n\n<hr>\n\n<hr>   \n\n<hr>  \n\n<hr> \n\n<hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" />\n\n<hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\"/>\n\n<hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" >\"\n`;\n\nexports[`rebber: remark specs with config: custom macros html-tags 1`] = `\n\"heading1(Block)\n\n<article>\n\n<ARTICLE>\n\n<ArTiClE>\n\n<-article>\n\n\n\n<article foo=\n\n<article foo=\\\\\"bar\n\n<article foo='bar\n\n<article foo=bar \n\n<article foo=bar >\n\n<article/>\n\n<-article/>\n\n\n\n</article>\n\n</ARTICLE>\n\n</aRtIcLe>\n\n</article  >\n\n</-article  >\n\n\n\n</article\n\n</article  \n\nheading1(Inline)\n\n<span>\n\n<SPAN>\n\n<SpAn>\n\n<-span>\n\n\n\n<span/>\n\n<-span/>\n\n\n\n</span>\n\n</SPAN>\n\n</SpAn>\n\n</span  >\n\n</-span>\n\n\n\n</span\n\n\n\n</span\n\n\n\n<span foo=\n\n\n\n<span foo=\\\\\"bar\n\n\n\n<span foo='bar\n\n\n\n<span foo=bar\n\n\n\n<span foo=bar >\"\n`;\n\nexports[`rebber: remark specs with config: custom macros image-basename-dots 1`] = `\n\"\\\\\\\\includegraphics{{x.yz}.png}\n\n\n\n\\\\\\\\includegraphics{/a/{w.x.y.z}.png}\n\n\n\n\\\\\\\\includegraphics{/{w.x.y.z}.png}\n\n\n\n\\\\\\\\includegraphics{/foo.bar/{x.yz}.png}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros image-empty-alt 1`] = `\"\\\\\\\\includegraphics{/xyz.png}\"`;\n\nexports[`rebber: remark specs with config: custom macros image-in-link 1`] = `\n\"heading1(\\\\\\\\externalLink{\\\\\\\\includegraphics{https://img.shields.io/badge/unicorn-approved-ff69b4.svg}}{http://shields.io})\n\n\\\\\\\\externalLink{\\\\\\\\includegraphics{https://img.shields.io/travis/wooorm/mdast.svg?style=flat}}{https://travis-ci.org/wooorm/mdast}\n\n\n\n\\\\\\\\externalLink{\\\\\\\\includegraphics{https://img.shields.io/badge/style-flat--squared-green.svg?style=flat-square}}{http://example.com}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros image-path-escape 1`] = `\"\\\\\\\\includegraphics{a[b]\\\\\\\\ \\\\\\\\input{/etc/passwd\\\\\\\\image{[a](b)}\"`;\n\nexports[`rebber: remark specs with config: custom macros image-with-pipe 1`] = `\"f|\"`;\n\nexports[`rebber: remark specs with config: custom macros images 1`] = `\n\"Lorem ipsum dolor sit \\\\\\\\includegraphics{http://amet.com/amet.jpeg}, consectetur adipiscing elit. Praesent dictum purus ullamcorper ligula semper pellentesque.\n\n\n\nNulla \\\\\\\\includegraphics{http://finibus.com/finibus.png} neque et diam rhoncus convallis. Nam dictum sapien nec sem ultrices fermentum. Nulla \\\\\\\\includegraphics{http://facilisi.com/facilisi.gif}. In et feugiat massa.\n\n\n\nDonec sed sodales metus, ut aliquet quam. Suspendisse nec ipsum risus. Interdum et malesuada fames ac ante ipsum primis in \\\\\\\\includegraphics{http://faucibus.com/faucibus.tiff}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros invalid-link-definition 1`] = `\"Something[2-3]\"`;\n\nexports[`rebber: remark specs with config: custom macros lazy-blockquotes 1`] = `\n\"[blockquote(hi there\nbud)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros link-in-link 1`] = `\n\"heading1(\\\\\\\\externalLink{mailto:test@example.com}{http://shields.io})\n\n\\\\\\\\externalLink{https://travis-ci.org/wooorm/mdast}{https://travis-ci.org/wooorm/mdast}\n\n\n\n\\\\\\\\externalLink{[](http://example.com \\\\\"An example\\\\\")}{http://example.com}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros link-spaces 1`] = `\n\"[alpha] (bravo\n\n\n\n\\\\\\\\includegraphics{undefined} (delta\n.com)\n\n\n\n[echo]\t(\\\\\\\\externalLink{http://foxtrot.golf}{http://foxtrot.golf})\n\n\n\n\\\\\\\\includegraphics{undefined}   (india.com/juliett)\"\n`;\n\nexports[`rebber: remark specs with config: custom macros link-whitespace 1`] = `\n\"[alpha](\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo} charlie).\n\n\n\n[alpha](\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\tcharlie).\n\n\n\n[alpha](\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\ncharlie).\n\n\n\n\\\\\\\\includegraphics{undefined}(\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo} charlie).\n\n\n\n\\\\\\\\includegraphics{undefined}(\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\tcharlie).\n\n\n\n\\\\\\\\includegraphics{undefined}(\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\ncharlie).\n\n\n\n<\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo} charlie>.\n\n\n\n<\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\tcharlie>.\n\n\n\n<\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\ncharlie>.\n\n\n\n\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo} charlie.\n\n\n\n\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\tcharlie.\n\n\n\n\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\ncharlie.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros link-with-spaces 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world and some spaces.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world and some spaces.html}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links 1`] = `\n\"Lorem ipsum dolor sit \\\\\\\\externalLink{amet}{http://amet.com}, consectetur adipiscing elit. Praesent dictum purus ullamcorper ligula semper pellentesque.\n\n\n\nNulla \\\\\\\\externalLink{finibus}{http://finibus.com} neque et diam rhoncus convallis. Nam dictum sapien nec sem ultrices fermentum. Nulla \\\\\\\\externalLink{facilisi}{http://facilisi.com}. In et feugiat massa.\n\n\n\nDonec sed sodales metus, ut aliquet quam. Suspendisse nec ipsum risus. Interdum et malesuada fames ac ante ipsum primis in \\\\\\\\externalLink{faucibus}{http://faucibus.com}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-inline-style 1`] = `\n\"Just a \\\\\\\\externalLink{URL}{/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{/url/}.\n\n\n\n[URL and title]( /url/has space ).\n\n\n\n[URL and title]( /url/has space/ \\\\\"url has space and title\\\\\").\n\n\n\n.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-reference-proto 1`] = `\n\"A [linkReference(reference=tostring, content=primary)], [linkReference(reference=constructor, content=secondary)], and [linkReference(reference=__proto__, content=tertiary)] link.\n\n\n\n[definition(identifier=tostring, url=http://primary.com, title=null)]\n\n[definition(identifier=__proto__, url=http://tertiary.com, title=null)]\n\n[definition(identifier=constructor, url=http://secondary.com, title=null)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-reference-style 1`] = `\n\"Foo [linkReference(reference=1, content=bar)].\n\n\n\nFoo [linkReference(reference=1, content=bar)].\n\n\n\nFoo [linkReference(reference=1, content=bar)].\n\n\n\n[definition(identifier=1, url=/url/, title=Title)]\n\nWith [linkReference(reference=b, content=embedded [brackets])].\n\n\n\nIndented [linkReference(reference=once, content=once)].\n\n\n\nIndented [linkReference(reference=twice, content=twice)].\n\n\n\nIndented [linkReference(reference=thrice, content=thrice)].\n\n\n\nIndented [four] times.\n\n\n\n[definition(identifier=once, url=/url, title=null)]\n\n[definition(identifier=twice, url=/url, title=null)]\n\n[definition(identifier=thrice, url=/url, title=null)]\n\n[code([four]: /url)]\n\n[definition(identifier=b, url=/url/, title=null)]\n\n[thematicBreak(---)]\n\n[linkReference(reference=this, content=this)] should work\n\n\n\nSo should [linkReference(reference=this, content=this)].\n\n\n\nAnd [linkReference(reference=this, content=this)].\n\n\n\nAnd [linkReference(reference=this, content=this)].\n\n\n\nAnd [linkReference(reference=this, content=this)].\n\n\n\nBut not [that].\n\n\n\nNor [that].\n\n\n\nNor [that].\n\n\n\n[Something in brackets like [linkReference(reference=this, content=this)] should work]\n\n\n\n[Same with [linkReference(reference=this, content=this)].]\n\n\n\nIn this case, \\\\\\\\externalLink{this}{/somethingelse/} points to something else.\n\n\n\nBackslashing should suppress [this] and [this].\n\n\n\n[definition(identifier=this, url=foo, title=null)]\n\n[thematicBreak(---)]\n\nHere's one where the [linkReference(reference=link breaks, content=link\nbreaks)] across lines.\n\n\n\nHere's another where the [linkReference(reference=link breaks, content=link\nbreaks)] across lines, but with a line-ending space.\n\n\n\n[definition(identifier=link breaks, url=/url/, title=null)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-shortcut-references 1`] = `\n\"This is the [linkReference(reference=simple case, content=simple case)].\n\n\n\n[definition(identifier=simple case, url=/simple, title=null)]\n\nThis one has a [linkReference(reference=line break, content=line\nbreak)].\n\n\n\nThis one has a [linkReference(reference=line break, content=line\nbreak)] with a line-ending space.\n\n\n\n[definition(identifier=line break, url=/foo, title=null)]\n\n[linkReference(reference=that, content=this)] and the [linkReference(reference=other, content=other)]\n\n\n\n[definition(identifier=this, url=/this, title=null)]\n\n[definition(identifier=that, url=/that, title=null)]\n\n[definition(identifier=other, url=/other, title=null)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-text-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-text-empty 1`] = `\n\"\\\\\\\\externalLink{}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-text-entity-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-text-escaped-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-text-mismatched-delimiters 1`] = `\n\"[Hello \\\\\\\\externalLink{world!}{./hello-world.html}.\n\n\n\n[Hello \\\\\\\\externalLink{world!}{./hello-world.html}.\n\n\n\n![Hello \\\\\\\\externalLink{world!}{./hello-world.html}.\n\n\n\n![Hello \\\\\\\\externalLink{world!}{./hello-world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-double-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-double-quotes-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-double-quotes-entity-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-double-quotes-escaped-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-double-quotes-mismatched-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-empty-double-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-empty-parentheses 1`] = `\n\"[Hello](./world.html ()).\n\n\n\n[Hello](<./world.html> ()).\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html ()).\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> ()).\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-empty-single-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-parentheses 1`] = `\n\"[Hello](./world.html (Hello World!)).\n\n\n\n[Hello](<./world.html> (Hello World!)).\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html (Hello World!)).\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> (Hello World!)).\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-single-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-single-quotes-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-single-quotes-entity-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-single-quotes-escaped-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-single-quotes-mismatched-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-title-unclosed 1`] = `\n\"[Hello](./world.html 'Hello\n\n\n\n[Hello](<./world.html> 'Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html 'Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> 'Hello\n\n\n\n[Hello](./world.html \\\\\"Hello\n\n\n\n[Hello](<./world.html> \\\\\"Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html \\\\\"Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> \\\\\"Hello\n\n\n\n[Hello](./world.html (Hello\n\n\n\n[Hello](<./world.html> (Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html (Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> (Hello\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-url-empty 1`] = `\n\".\n\n\n\n.\n\n\n\n\\\\\\\\includegraphics{}.\n\n\n\n\\\\\\\\includegraphics{}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-url-empty-title-double-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{\\\\\"World!\\\\\"}.\n\n\n\n\\\\\\\\externalLink{Hello}{\\\\\"World!\\\\\"}.\n\n\n\n.\n\n\n\n\\\\\\\\includegraphics{\\\\\"World!\\\\\"}.\n\n\n\n\\\\\\\\includegraphics{\\\\\"World!\\\\\"}.\n\n\n\n\\\\\\\\includegraphics{}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-url-empty-title-parentheses 1`] = `\n\"\\\\\\\\externalLink{Hello}{(World!)}.\n\n\n\n\\\\\\\\externalLink{Hello}{(World!)}.\n\n\n\n[World](<> (World!)).\n\n\n\n\\\\\\\\includegraphics{(World!)}.\n\n\n\n\\\\\\\\includegraphics{(World!)}.\n\n\n\n\\\\\\\\includegraphics{undefined}(<> (World!)).\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-url-empty-title-single-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{'World!'}.\n\n\n\n\\\\\\\\externalLink{Hello}{'World!'}.\n\n\n\n.\n\n\n\n\\\\\\\\includegraphics{'World!'}.\n\n\n\n\\\\\\\\includegraphics{'World!'}.\n\n\n\n\\\\\\\\includegraphics{}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-url-entity-parentheses 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-url-escaped-parentheses 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-url-mismatched-parentheses 1`] = `\n\"[Hello](./world(and-hello(world)).\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld}).\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{undefined}(./world(and-hello(world)).\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld}).\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-url-nested-parentheses 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world(and)hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)hello(world)}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-url-new-line 1`] = `\n\"[Hello](./wo\nrld.html).\n\n\n\n\\\\\\\\externalLink{Hello}{./wo\nrld.html}.\n\n\n\n\\\\\\\\includegraphics{undefined}(./wo\nrld.png).\n\n\n\n\\\\\\\\includegraphics{./wo\nrld.png}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-url-unclosed 1`] = `\n\"[Hello](\n\n\n\n[World](<\n\n\n\n\\\\\\\\includegraphics{undefined}(\n\n\n\n\\\\\\\\includegraphics{undefined}(<\"\n`;\n\nexports[`rebber: remark specs with config: custom macros links-url-white-space 1`] = `\n\"[Hello](./wo rld.html).\n\n\n\n\\\\\\\\externalLink{Hello}{./wo rld.html}.\n\n\n\n\\\\\\\\includegraphics{undefined}(./wo rld.png).\n\n\n\n\\\\\\\\includegraphics{./wo rld.png}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros list 1`] = `\n\"heading1(List bullets)\n\n[unorderedList([listItem(One:\n\n[unorderedList([listItem(Nested one;)][listItem(Nested two:\n\n[unorderedList([listItem(Nested three.)])])])])][listItem(Two;)][listItem(Three.)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros list-after-list 1`] = `\n\"[unorderedList([listItem(item)][listItem(item)][listItem(item)])]\n\n[orderedList([listItem(item)][listItem(item)][listItem(item)])]\n\n[thematicBreak(---)]\n\n[unorderedList([listItem(item)][listItem(item)][listItem(item)])]\n\n[orderedList([listItem(item)][listItem(item)][listItem(item)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros list-and-code 1`] = `\n\"[unorderedList([listItem(This is a list item)])]\n\n\n[code(This is code)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros list-continuation 1`] = `\n\"[orderedList([listItem(foo)])]\n\n[thematicBreak(---)]\n\n[orderedList([listItem(foo)])]\n\n[codeJs(code();)]\n\n[orderedList([listItem([linkReference(reference=foo, content=foo)])])]\n\n[definition(identifier=foo, url=http://google.com, title=null)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros list-indentation 1`] = `\n\"[unorderedList([listItem(Hello 1a\n\nWorld 1a.)][listItem(Hello 1b\n\nWorld 1b.)][listItem(Hello 2a\n\nWorld 2a.)][listItem(Hello 2b\n\nWorld 2b.)][listItem(Hello 3a\n\nWorld 3a.)][listItem(Hello 3b\n\nWorld 3b.)][listItem(Hello 4a\n\nWorld 4a.)][listItem(Hello 4b\n\nWorld 4b.)][listItem([code(Hello 5a)]World 5a.)][listItem([code(Hello 5b\n\nWorld 5b.)])])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros list-item-empty 1`] = `\"[unorderedList([listItem(foo)][listItem()][listItem(bar)][listItem(foo)][listItem()][listItem(bar)])]\"`;\n\nexports[`rebber: remark specs with config: custom macros list-item-empty-with-white-space 1`] = `\"[unorderedList([listItem()])]\"`;\n\nexports[`rebber: remark specs with config: custom macros list-item-indent 1`] = `\n\"[orderedList([listItem(foo bar baz.)])]\n\n<!--  -->\n\n[orderedList([listItem(foo bar baz.)])]\n\n<!--  -->\n\n[orderedList([listItem(foo bar baz.)])]\n\n<!--  -->\n\n[orderedList([listItem(foo bar baz.\nfoo bar baz.)])]\n\n<!--  -->\n\n[orderedList([listItem(foo bar baz.\nfoo bar baz.)])]\n\n<!--  -->\n\n[orderedList([listItem(foo bar baz.\nfoo bar baz.)])]\n\n<!--  -->\n\n[unorderedList([listItem(foo bar baz.)])]\n\n<!--  -->\n\n[unorderedList([listItem(foo bar baz.\nfoo bar baz.)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros list-item-newline 1`] = `\"[unorderedList([listItem(Foo)][listItem(Bar)])]\"`;\n\nexports[`rebber: remark specs with config: custom macros list-item-text 1`] = `\n\"[unorderedList([listItem(item1\n\n[unorderedList([listItem(item2)])]text)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros list-ordered 1`] = `\"[orderedList([listItem(foo;)][listItem(bar;)][listItem(baz.)])]\"`;\n\nexports[`rebber: remark specs with config: custom macros lists-with-code-and-rules 1`] = `\n\"heading2(foo)\n\n[orderedList([listItem(bar:\n\n[blockquote([unorderedList([listItem(one\n\n[unorderedList([listItem(two\n\n[unorderedList([listItem(three)][listItem(four)][listItem(five)])])])])])])])][listItem(foo:\n\n[code(line 1\nline 2)])][listItem(foo:\n\n[orderedList([listItem(foo \\\\\\\\texttt{bar} bar:\n\n[codeErb(some code here)])][listItem(foo \\\\\\\\texttt{bar} bar:\n\n[codeErb(foo\n---\nbar\n---\nfoo\nbar)])][listItem(foo \\\\\\\\texttt{bar} bar:\n\n[codeHtml(---\nfoo\nfoo\n---\nbar)])][listItem(foo \\\\\\\\texttt{bar} bar:\n\n[code(foo\n---\nbar)])][listItem(foo)])])])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros loose-lists 1`] = `\n\"[unorderedList([listItem(hello\nworld\n\nhow\nare)][listItem(you)])]\n\nbetter behavior:\n\n\n\n[unorderedList([listItem(hello\n\n[unorderedList([listItem(world\nhow\n\nare\nyou)][listItem(today)])])][listItem(hi)])]\n\n\n[unorderedList([listItem(hello)][listItem(world)][listItem(hi)])]\n\n\n[unorderedList([listItem(hello)][listItem(world)][listItem(hi)])]\n\n\n[unorderedList([listItem(hello)][listItem(world\n\nhow)][listItem(hi)])]\n\n\n[unorderedList([listItem(hello)][listItem(world)][listItem(how\nare)])]\n\n\n[unorderedList([listItem(hello)][listItem(world)][listItem(how\nare)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros main 1`] = `\n\"[definition(identifier=test, url=http://google.com/, title=Google)]\n\nheading1(A heading)\n\nJust a note, I've found that I can't test my markdown parser vs others.\nFor example, both markdown.js and showdown code blocks in lists wrong. They're\nalso completely [linkReference(reference=test, content=inconsistent)] with regards to paragraphs in list items.\n\n\n\nA link. Not anymore.\n\n\n\n<aside>This will make me fail the test because\nmarkdown.js doesnt acknowledge arbitrary html blocks =/</aside>\n\n[unorderedList([listItem(List Item 1)][listItem(List Item 2\n\n[unorderedList([listItem(New List Item 1\nHi, this is a list item.)][listItem(New List Item 2\nAnother item\nCode goes here.\nLots of it...)][listItem(New List Item 3\nThe last item)])])][listItem(List Item 3\nThe final item.)][listItem(List Item 4\nThe real final item.)])]\n\nParagraph.\n\n\n\n[blockquote([unorderedList([listItem(bq Item 1)][listItem(bq Item 2\n\n[unorderedList([listItem(New bq Item 1)][listItem(New bq Item 2\nText here)])])])])]\n\n[thematicBreak(---)]\n\n[blockquote(Another blockquote!\nI really need to get\nmore creative with\nmockup text..\nmarkdown.js breaks here again)]\n\nheading2(Another Heading)\n\nHello \\\\\\\\textit{world}. Here is a \\\\\\\\externalLink{link}{//hello}.\nAnd an image \\\\\\\\includegraphics{src}.\nAnd an image with an empty alt attribute \\\\\\\\includegraphics{src}.\n\n\n\n[code(Code goes here.\nLots of it...)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros markdown-documentation-basics 1`] = `\n\"heading1(Markdown: Basics)\n\n<ul id=\\\\\"ProjectSubmenu\\\\\">\n    <li><a href=\\\\\"/projects/markdown/\\\\\" title=\\\\\"Markdown Project Page\\\\\">Main</a></li>\n    <li><a class=\\\\\"selected\\\\\" title=\\\\\"Markdown Basics\\\\\">Basics</a></li>\n    <li><a href=\\\\\"/projects/markdown/syntax\\\\\" title=\\\\\"Markdown Syntax Documentation\\\\\">Syntax</a></li>\n    <li><a href=\\\\\"/projects/markdown/license\\\\\" title=\\\\\"Pricing and License Information\\\\\">License</a></li>\n    <li><a href=\\\\\"/projects/markdown/dingus\\\\\" title=\\\\\"Online Markdown Web Form\\\\\">Dingus</a></li>\n</ul>\n\nheading2(Getting the Gist of Markdown's Formatting Syntax)\n\nThis page offers a brief overview of what it's like to use Markdown.\nThe [linkReference(reference=s, content=syntax page)] provides complete, detailed documentation for\nevery feature, but Markdown should be very easy to pick up simply by\nlooking at a few examples of it in action. The examples on this page\nare written in a before/after style, showing example syntax and the\nHTML output produced by Markdown.\n\n\n\nIt's also helpful to simply try Markdown out; the [linkReference(reference=d, content=Dingus)] is a\nweb application that allows you type your own Markdown-formatted text\nand translate it to XHTML.\n\n\n\n\\\\\\\\textbf{Note:} This document is itself written using Markdown; you\ncan [linkReference(reference=src, content=see the source for it by adding '.text' to the URL)].\n\n\n\n[definition(identifier=s, url=/projects/markdown/syntax, title=Markdown Syntax)]\n\n[definition(identifier=d, url=/projects/markdown/dingus, title=Markdown Dingus)]\n\n[definition(identifier=src, url=/projects/markdown/basics.text, title=null)]\n\nheading2(Paragraphs, Headers, Blockquotes)\n\nA paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing spaces or tabs is considered\nblank.) Normal paragraphs should not be intended with spaces or tabs.\n\n\n\nMarkdown offers two styles of headers: \\\\\\\\textit{Setext} and \\\\\\\\textit{atx}.\nSetext-style headers for \\\\\\\\texttt{<h1>} and \\\\\\\\texttt{<h2>} are created by\n\\\\\"underlining\\\\\" with equal signs (\\\\\\\\texttt{=}) and hyphens (\\\\\\\\texttt{-}), respectively.\nTo create an atx-style header, you put 1-6 hash marks (\\\\\\\\texttt{\\\\\\\\#}) at the\nbeginning of the line -- the number of hashes equals the resulting\nHTML header level.\n\n\n\nBlockquotes are indicated using email-style '\\\\\\\\texttt{>}' angle brackets.\n\n\n\nMarkdown:\n\n\n\n[code(A First Level Header\n====================\n\nA Second Level Header\n---------------------\n\nNow is the time for all good men to come to\nthe aid of their country. This is just a\nregular paragraph.\n\nThe quick brown fox jumped over the lazy\ndog's back.\n\n### Header 3\n\n> This is a blockquote.\n> \n> This is the second paragraph in the blockquote.\n>\n> ## This is an H2 in a blockquote)]\n\nOutput:\n\n\n\n[code(<h1>A First Level Header</h1>\n\n<h2>A Second Level Header</h2>\n\n<p>Now is the time for all good men to come to\nthe aid of their country. This is just a\nregular paragraph.</p>\n\n<p>The quick brown fox jumped over the lazy\ndog's back.</p>\n\n<h3>Header 3</h3>\n\n<blockquote>\n    <p>This is a blockquote.</p>\n    \n    <p>This is the second paragraph in the blockquote.</p>\n    \n    <h2>This is an H2 in a blockquote</h2>\n</blockquote>)]\n\nheading3(Phrase Emphasis)\n\nMarkdown uses asterisks and underscores to indicate spans of emphasis.\n\n\n\nMarkdown:\n\n\n\n[code(Some of these words *are emphasized*.\nSome of these words _are emphasized also_.\n\nUse two asterisks for **strong emphasis**.\nOr, if you prefer, __use two underscores instead__.)]\n\nOutput:\n\n\n\n[code(<p>Some of these words <em>are emphasized</em>.\nSome of these words <em>are emphasized also</em>.</p>\n\n<p>Use two asterisks for <strong>strong emphasis</strong>.\nOr, if you prefer, <strong>use two underscores instead</strong>.</p>)]\n\nheading2(Lists)\n\nUnordered (bulleted) lists use asterisks, pluses, and hyphens (\\\\\\\\texttt{*},\n\\\\\\\\texttt{+}, and \\\\\\\\texttt{-}) as list markers. These three markers are\ninterchangable; this:\n\n\n\n[code(*   Candy.\n*   Gum.\n*   Booze.)]\n\nthis:\n\n\n\n[code(+   Candy.\n+   Gum.\n+   Booze.)]\n\nand this:\n\n\n\n[code(-   Candy.\n-   Gum.\n-   Booze.)]\n\nall produce the same output:\n\n\n\n[code(<ul>\n<li>Candy.</li>\n<li>Gum.</li>\n<li>Booze.</li>\n</ul>)]\n\nOrdered (numbered) lists use regular numbers, followed by periods, as\nlist markers:\n\n\n\n[code(1.  Red\n2.  Green\n3.  Blue)]\n\nOutput:\n\n\n\n[code(<ol>\n<li>Red</li>\n<li>Green</li>\n<li>Blue</li>\n</ol>)]\n\nIf you put blank lines between items, you'll get \\\\\\\\texttt{<p>} tags for the\nlist item text. You can create multi-paragraph list items by indenting\nthe paragraphs by 4 spaces or 1 tab:\n\n\n\n[code(*   A list item.\n\n    With multiple paragraphs.\n\n*   Another item in the list.)]\n\nOutput:\n\n\n\n[code(<ul>\n<li><p>A list item.</p>\n<p>With multiple paragraphs.</p></li>\n<li><p>Another item in the list.</p></li>\n</ul>)]\n\nheading3(Links)\n\nMarkdown supports two styles for creating links: \\\\\\\\textit{inline} and\n\\\\\\\\textit{reference}. With both styles, you use square brackets to delimit the\ntext you want to turn into a link.\n\n\n\nInline-style links use parentheses immediately after the link text.\nFor example:\n\n\n\n[code(This is an [example link](http://example.com/).)]\n\nOutput:\n\n\n\n[code(<p>This is an <a href=\\\\\"http://example.com/\\\\\">\nexample link</a>.</p>)]\n\nOptionally, you may include a title attribute in the parentheses:\n\n\n\n[code(This is an [example link](http://example.com/ \\\\\"With a Title\\\\\").)]\n\nOutput:\n\n\n\n[code(<p>This is an <a href=\\\\\"http://example.com/\\\\\" title=\\\\\"With a Title\\\\\">\nexample link</a>.</p>)]\n\nReference-style links allow you to refer to your links by names, which\nyou define elsewhere in your document:\n\n\n\n[code(I get 10 times more traffic from [Google][1] than from\n[Yahoo][2] or [MSN][3].\n\n[1]: http://google.com/        \\\\\"Google\\\\\"\n[2]: http://search.yahoo.com/  \\\\\"Yahoo Search\\\\\"\n[3]: http://search.msn.com/    \\\\\"MSN Search\\\\\")]\n\nOutput:\n\n\n\n[code(<p>I get 10 times more traffic from <a href=\\\\\"http://google.com/\\\\\"\ntitle=\\\\\"Google\\\\\">Google</a> than from <a href=\\\\\"http://search.yahoo.com/\\\\\"\ntitle=\\\\\"Yahoo Search\\\\\">Yahoo</a> or <a href=\\\\\"http://search.msn.com/\\\\\"\ntitle=\\\\\"MSN Search\\\\\">MSN</a>.</p>)]\n\nThe title attribute is optional. Link names may contain letters,\nnumbers and spaces, but are \\\\\\\\textit{not} case sensitive:\n\n\n\n[code(I start my morning with a cup of coffee and\n[The New York Times][NY Times].\n\n[ny times]: http://www.nytimes.com/)]\n\nOutput:\n\n\n\n[code(<p>I start my morning with a cup of coffee and\n<a href=\\\\\"http://www.nytimes.com/\\\\\">The New York Times</a>.</p>)]\n\nheading3(Images)\n\nImage syntax is very much like link syntax.\n\n\n\nInline (titles are optional):\n\n\n\n[code(![alt text](/path/to/img.jpg \\\\\"Title\\\\\"))]\n\nReference-style:\n\n\n\n[code(![alt text][id]\n\n[id]: /path/to/img.jpg \\\\\"Title\\\\\")]\n\nBoth of the above examples produce the same output:\n\n\n\n[code(<img src=\\\\\"/path/to/img.jpg\\\\\" alt=\\\\\"alt text\\\\\" title=\\\\\"Title\\\\\" />)]\n\nheading3(Code)\n\nIn a regular paragraph, you can create code span by wrapping text in\nbacktick quotes. Any ampersands (\\\\\\\\texttt{\\\\\\\\&}) and angle brackets (\\\\\\\\texttt{<} or\n\\\\\\\\texttt{>}) will automatically be translated into HTML entities. This makes\nit easy to use Markdown to write about HTML example code:\n\n\n\n[code(I strongly recommend against using any \\`<blink>\\` tags.\n\nI wish SmartyPants used named entities like \\`&mdash;\\`\ninstead of decimal-encoded entites like \\`&#8212;\\`.)]\n\nOutput:\n\n\n\n[code(<p>I strongly recommend against using any\n<code>&lt;blink&gt;</code> tags.</p>\n\n<p>I wish SmartyPants used named entities like\n<code>&amp;mdash;</code> instead of decimal-encoded\nentites like <code>&amp;#8212;</code>.</p>)]\n\nTo specify an entire block of pre-formatted code, indent every line of\nthe block by 4 spaces or 1 tab. Just like with code spans, \\\\\\\\texttt{\\\\\\\\&}, \\\\\\\\texttt{<},\nand \\\\\\\\texttt{>} characters will be escaped automatically.\n\n\n\nMarkdown:\n\n\n\n[code(If you want your page to validate under XHTML 1.0 Strict,\nyou've got to put paragraph tags in your blockquotes:\n\n    <blockquote>\n        <p>For example.</p>\n    </blockquote>)]\n\nOutput:\n\n\n\n[code(<p>If you want your page to validate under XHTML 1.0 Strict,\nyou've got to put paragraph tags in your blockquotes:</p>\n\n<pre><code>&lt;blockquote&gt;\n    &lt;p&gt;For example.&lt;/p&gt;\n&lt;/blockquote&gt;\n</code></pre>)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros markdown-documentation-syntax 1`] = `\n\"heading1(Markdown: Syntax)\n\n<ul id=\\\\\"ProjectSubmenu\\\\\">\n    <li><a href=\\\\\"/projects/markdown/\\\\\" title=\\\\\"Markdown Project Page\\\\\">Main</a></li>\n    <li><a href=\\\\\"/projects/markdown/basics\\\\\" title=\\\\\"Markdown Basics\\\\\">Basics</a></li>\n    <li><a class=\\\\\"selected\\\\\" title=\\\\\"Markdown Syntax Documentation\\\\\">Syntax</a></li>\n    <li><a href=\\\\\"/projects/markdown/license\\\\\" title=\\\\\"Pricing and License Information\\\\\">License</a></li>\n    <li><a href=\\\\\"/projects/markdown/dingus\\\\\" title=\\\\\"Online Markdown Web Form\\\\\">Dingus</a></li>\n</ul>\n\n[unorderedList([listItem(\\\\\\\\externalLink{Overview}{\\\\\\\\#overview}\n\n[unorderedList([listItem(\\\\\\\\externalLink{Philosophy}{\\\\\\\\#philosophy})][listItem(\\\\\\\\externalLink{Inline HTML}{\\\\\\\\#html})][listItem(\\\\\\\\externalLink{Automatic Escaping for Special Characters}{\\\\\\\\#autoescape})])])][listItem(\\\\\\\\externalLink{Block Elements}{\\\\\\\\#block}\n\n[unorderedList([listItem(\\\\\\\\externalLink{Paragraphs and Line Breaks}{\\\\\\\\#p})][listItem(\\\\\\\\externalLink{Headers}{\\\\\\\\#header})][listItem(\\\\\\\\externalLink{Blockquotes}{\\\\\\\\#blockquote})][listItem(\\\\\\\\externalLink{Lists}{\\\\\\\\#list})][listItem(\\\\\\\\externalLink{Code Blocks}{\\\\\\\\#precode})][listItem(\\\\\\\\externalLink{Horizontal Rules}{\\\\\\\\#hr})])])][listItem(\\\\\\\\externalLink{Span Elements}{\\\\\\\\#span}\n\n[unorderedList([listItem(\\\\\\\\externalLink{Links}{\\\\\\\\#link})][listItem(\\\\\\\\externalLink{Emphasis}{\\\\\\\\#em})][listItem(\\\\\\\\externalLink{Code}{\\\\\\\\#code})][listItem(\\\\\\\\externalLink{Images}{\\\\\\\\#img})])])][listItem(\\\\\\\\externalLink{Miscellaneous}{\\\\\\\\#misc}\n\n[unorderedList([listItem(\\\\\\\\externalLink{Backslash Escapes}{\\\\\\\\#backslash})][listItem(\\\\\\\\externalLink{Automatic Links}{\\\\\\\\#autolink})])])])]\n\n\\\\\\\\textbf{Note:} This document is itself written using Markdown; you\ncan [linkReference(reference=src, content=see the source for it by adding '.text' to the URL)].\n\n\n\n[definition(identifier=src, url=/projects/markdown/syntax.text, title=null)]\n\n[thematicBreak(---)]\n\n<h2 id=\\\\\"overview\\\\\">Overview</h2>\n\n<h3 id=\\\\\"philosophy\\\\\">Philosophy</h3>\n\nMarkdown is intended to be as easy-to-read and easy-to-write as is feasible.\n\n\n\nReadability, however, is emphasized above all else. A Markdown-formatted\ndocument should be publishable as-is, as plain text, without looking\nlike it's been marked up with tags or formatting instructions. While\nMarkdown's syntax has been influenced by several existing text-to-HTML\nfilters -- including [linkReference(reference=1, content=Setext)], [linkReference(reference=2, content=atx)], [linkReference(reference=3, content=Textile)], [linkReference(reference=4, content=reStructuredText)],\n[linkReference(reference=5, content=Grutatext)], and [linkReference(reference=6, content=EtText)] -- the single biggest source of\ninspiration for Markdown's syntax is the format of plain text email.\n\n\n\n[definition(identifier=1, url=http://docutils.sourceforge.net/mirror/setext.html, title=null)]\n\n[definition(identifier=2, url=http://www.aaronsw.com/2002/atx/, title=null)]\n\n[definition(identifier=3, url=http://textism.com/tools/textile/, title=null)]\n\n[definition(identifier=4, url=http://docutils.sourceforge.net/rst.html, title=null)]\n\n[definition(identifier=5, url=http://www.triptico.com/software/grutatxt.html, title=null)]\n\n[definition(identifier=6, url=http://ettext.taint.org/doc/, title=null)]\n\nTo this end, Markdown's syntax is comprised entirely of punctuation\ncharacters, which punctuation characters have been carefully chosen so\nas to look like what they mean. E.g., asterisks around a word actually\nlook like *emphasis*. Markdown lists look like, well, lists. Even\nblockquotes look like quoted passages of text, assuming you've ever\nused email.\n\n\n\n<h3 id=\\\\\"html\\\\\">Inline HTML</h3>\n\nMarkdown's syntax is intended for one purpose: to be used as a\nformat for \\\\\\\\textit{writing} for the web.\n\n\n\nMarkdown is not a replacement for HTML, or even close to it. Its\nsyntax is very small, corresponding only to a very small subset of\nHTML tags. The idea is \\\\\\\\textit{not} to create a syntax that makes it easier\nto insert HTML tags. In my opinion, HTML tags are already easy to\ninsert. The idea for Markdown is to make it easy to read, write, and\nedit prose. HTML is a \\\\\\\\textit{publishing} format; Markdown is a \\\\\\\\textit{writing}\nformat. Thus, Markdown's formatting syntax only addresses issues that\ncan be conveyed in plain text.\n\n\n\nFor any markup that is not covered by Markdown's syntax, you simply\nuse HTML itself. There's no need to preface it or delimit it to\nindicate that you're switching from Markdown to HTML; you just use\nthe tags.\n\n\n\nThe only restrictions are that block-level HTML elements -- e.g. \\\\\\\\texttt{<div>},\n\\\\\\\\texttt{<table>}, \\\\\\\\texttt{<pre>}, \\\\\\\\texttt{<p>}, etc. -- must be separated from surrounding\ncontent by blank lines, and the start and end tags of the block should\nnot be indented with tabs or spaces. Markdown is smart enough not\nto add extra (unwanted) \\\\\\\\texttt{<p>} tags around HTML block-level tags.\n\n\n\nFor example, to add an HTML table to a Markdown article:\n\n\n\n[code(This is a regular paragraph.\n\n<table>\n    <tr>\n        <td>Foo</td>\n    </tr>\n</table>\n\nThis is another regular paragraph.)]\n\nNote that Markdown formatting syntax is not processed within block-level\nHTML tags. E.g., you can't use Markdown-style \\\\\\\\texttt{*emphasis*} inside an\nHTML block.\n\n\n\nSpan-level HTML tags -- e.g. \\\\\\\\texttt{<span>}, \\\\\\\\texttt{<cite>}, or \\\\\\\\texttt{<del>} -- can be\nused anywhere in a Markdown paragraph, list item, or header. If you\nwant, you can even use HTML tags instead of Markdown formatting; e.g. if\nyou'd prefer to use HTML \\\\\\\\texttt{<a>} or \\\\\\\\texttt{<img>} tags instead of Markdown's\nlink or image syntax, go right ahead.\n\n\n\nUnlike block-level HTML tags, Markdown syntax \\\\\\\\textit{is} processed within\nspan-level tags.\n\n\n\n<h3 id=\\\\\"autoescape\\\\\">Automatic Escaping for Special Characters</h3>\n\nIn HTML, there are two characters that demand special treatment: \\\\\\\\texttt{<}\nand \\\\\\\\texttt{\\\\\\\\&}. Left angle brackets are used to start tags; ampersands are\nused to denote HTML entities. If you want to use them as literal\ncharacters, you must escape them as entities, e.g. \\\\\\\\texttt{\\\\\\\\&lt;}, and\n\\\\\\\\texttt{\\\\\\\\&amp;}.\n\n\n\nAmpersands in particular are bedeviling for web writers. If you want to\nwrite about 'AT\\\\\\\\&T', you need to write '\\\\\\\\texttt{AT\\\\\\\\&amp;T}'. You even need to\nescape ampersands within URLs. Thus, if you want to link to:\n\n\n\n[code(http://images.google.com/images?num=30&q=larry+bird)]\n\nyou need to encode the URL as:\n\n\n\n[code(http://images.google.com/images?num=30&amp;q=larry+bird)]\n\nin your anchor tag \\\\\\\\texttt{href} attribute. Needless to say, this is easy to\nforget, and is probably the single most common source of HTML validation\nerrors in otherwise well-marked-up web sites.\n\n\n\nMarkdown allows you to use these characters naturally, taking care of\nall the necessary escaping for you. If you use an ampersand as part of\nan HTML entity, it remains unchanged; otherwise it will be translated\ninto \\\\\\\\texttt{\\\\\\\\&amp;}.\n\n\n\nSo, if you want to include a copyright symbol in your article, you can write:\n\n\n\n[code(&copy;)]\n\nand Markdown will leave it alone. But if you write:\n\n\n\n[code(AT&T)]\n\nMarkdown will translate it to:\n\n\n\n[code(AT&amp;T)]\n\nSimilarly, because Markdown supports \\\\\\\\externalLink{inline HTML}{\\\\\\\\#html}, if you use\nangle brackets as delimiters for HTML tags, Markdown will treat them as\nsuch. But if you write:\n\n\n\n[code(4 < 5)]\n\nMarkdown will translate it to:\n\n\n\n[code(4 &lt; 5)]\n\nHowever, inside Markdown code spans and blocks, angle brackets and\nampersands are \\\\\\\\textit{always} encoded automatically. This makes it easy to use\nMarkdown to write about HTML code. (As opposed to raw HTML, which is a\nterrible format for writing about HTML syntax, because every single \\\\\\\\texttt{<}\nand \\\\\\\\texttt{\\\\\\\\&} in your example code needs to be escaped.)\n\n\n\n[thematicBreak(---)]\n\n<h2 id=\\\\\"block\\\\\">Block Elements</h2>\n\n<h3 id=\\\\\"p\\\\\">Paragraphs and Line Breaks</h3>\n\nA paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing but spaces or tabs is considered\nblank.) Normal paragraphs should not be intended with spaces or tabs.\n\n\n\nThe implication of the \\\\\"one or more consecutive lines of text\\\\\" rule is\nthat Markdown supports \\\\\"hard-wrapped\\\\\" text paragraphs. This differs\nsignificantly from most other text-to-HTML formatters (including Movable\nType's \\\\\"Convert Line Breaks\\\\\" option) which translate every line break\ncharacter in a paragraph into a \\\\\\\\texttt{<br />} tag.\n\n\n\nWhen you \\\\\\\\textit{do} want to insert a \\\\\\\\texttt{<br />} break tag using Markdown, you\nend a line with two or more spaces, then type return.\n\n\n\nYes, this takes a tad more effort to create a \\\\\\\\texttt{<br />}, but a simplistic\n\\\\\"every line break is a \\\\\\\\texttt{<br />}\\\\\" rule wouldn't work for Markdown.\nMarkdown's email-style [linkReference(reference=bq, content=blockquoting)] and multi-paragraph [linkReference(reference=l, content=list items)]\nwork best -- and look better -- when you format them with hard breaks.\n\n\n\n[definition(identifier=bq, url=#blockquote, title=null)]\n\n[definition(identifier=l, url=#list, title=null)]\n\n<h3 id=\\\\\"header\\\\\">Headers</h3>\n\nMarkdown supports two styles of headers, [linkReference(reference=1, content=Setext)] and [linkReference(reference=2, content=atx)].\n\n\n\nSetext-style headers are \\\\\"underlined\\\\\" using equal signs (for first-level\nheaders) and dashes (for second-level headers). For example:\n\n\n\n[code(This is an H1\n=============\n\nThis is an H2\n-------------)]\n\nAny number of underlining \\\\\\\\texttt{=}'s or \\\\\\\\texttt{-}'s will work.\n\n\n\nAtx-style headers use 1-6 hash characters at the start of the line,\ncorresponding to header levels 1-6. For example:\n\n\n\n[code(# This is an H1\n\n## This is an H2\n\n###### This is an H6)]\n\nOptionally, you may \\\\\"close\\\\\" atx-style headers. This is purely\ncosmetic -- you can use this if you think it looks better. The\nclosing hashes don't even need to match the number of hashes\nused to open the header. (The number of opening hashes\ndetermines the header level.) :\n\n\n\n[code(# This is an H1 #\n\n## This is an H2 ##\n\n### This is an H3 ######)]\n\n<h3 id=\\\\\"blockquote\\\\\">Blockquotes</h3>\n\nMarkdown uses email-style \\\\\\\\texttt{>} characters for blockquoting. If you're\nfamiliar with quoting passages of text in an email message, then you\nknow how to create a blockquote in Markdown. It looks best if you hard\nwrap the text and put a \\\\\\\\texttt{>} before every line:\n\n\n\n[code(> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n> \n> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n> id sem consectetuer libero luctus adipiscing.)]\n\nMarkdown allows you to be lazy and only put the \\\\\\\\texttt{>} before the first\nline of a hard-wrapped paragraph:\n\n\n\n[code(> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\nconsectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\nVestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n\n> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\nid sem consectetuer libero luctus adipiscing.)]\n\nBlockquotes can be nested (i.e. a blockquote-in-a-blockquote) by\nadding additional levels of \\\\\\\\texttt{>}:\n\n\n\n[code(> This is the first level of quoting.\n>\n> > This is nested blockquote.\n>\n> Back to the first level.)]\n\nBlockquotes can contain other Markdown elements, including headers, lists,\nand code blocks:\n\n\n\n[code(> ## This is a header.\n> \n> 1.   This is the first list item.\n> 2.   This is the second list item.\n> \n> Here's some example code:\n> \n>     return shell_exec(\\\\\"echo $input | $markdown_script\\\\\");)]\n\nAny decent text editor should make email-style quoting easy. For\nexample, with BBEdit, you can make a selection and choose Increase\nQuote Level from the Text menu.\n\n\n\n<h3 id=\\\\\"list\\\\\">Lists</h3>\n\nMarkdown supports ordered (numbered) and unordered (bulleted) lists.\n\n\n\nUnordered lists use asterisks, pluses, and hyphens -- interchangably\n-- as list markers:\n\n\n\n[code(*   Red\n*   Green\n*   Blue)]\n\nis equivalent to:\n\n\n\n[code(+   Red\n+   Green\n+   Blue)]\n\nand:\n\n\n\n[code(-   Red\n-   Green\n-   Blue)]\n\nOrdered lists use numbers followed by periods:\n\n\n\n[code(1.  Bird\n2.  McHale\n3.  Parish)]\n\nIt's important to note that the actual numbers you use to mark the\nlist have no effect on the HTML output Markdown produces. The HTML\nMarkdown produces from the above list is:\n\n\n\n[code(<ol>\n<li>Bird</li>\n<li>McHale</li>\n<li>Parish</li>\n</ol>)]\n\nIf you instead wrote the list in Markdown like this:\n\n\n\n[code(1.  Bird\n1.  McHale\n1.  Parish)]\n\nor even:\n\n\n\n[code(3. Bird\n1. McHale\n8. Parish)]\n\nyou'd get the exact same HTML output. The point is, if you want to,\nyou can use ordinal numbers in your ordered Markdown lists, so that\nthe numbers in your source match the numbers in your published HTML.\nBut if you want to be lazy, you don't have to.\n\n\n\nIf you do use lazy list numbering, however, you should still start the\nlist with the number 1. At some point in the future, Markdown may support\nstarting ordered lists at an arbitrary number.\n\n\n\nList markers typically start at the left margin, but may be indented by\nup to three spaces. List markers must be followed by one or more spaces\nor a tab.\n\n\n\nTo make lists look nice, you can wrap items with hanging indents:\n\n\n\n[code(*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n    Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\n    viverra nec, fringilla in, laoreet vitae, risus.\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n    Suspendisse id sem consectetuer libero luctus adipiscing.)]\n\nBut if you want to be lazy, you don't have to:\n\n\n\n[code(*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\nAliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\nviverra nec, fringilla in, laoreet vitae, risus.\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\nSuspendisse id sem consectetuer libero luctus adipiscing.)]\n\nIf list items are separated by blank lines, Markdown will wrap the\nitems in \\\\\\\\texttt{<p>} tags in the HTML output. For example, this input:\n\n\n\n[code(*   Bird\n*   Magic)]\n\nwill turn into:\n\n\n\n[code(<ul>\n<li>Bird</li>\n<li>Magic</li>\n</ul>)]\n\nBut this:\n\n\n\n[code(*   Bird\n\n*   Magic)]\n\nwill turn into:\n\n\n\n[code(<ul>\n<li><p>Bird</p></li>\n<li><p>Magic</p></li>\n</ul>)]\n\nList items may consist of multiple paragraphs. Each subsequent\nparagraph in a list item must be intended by either 4 spaces\nor one tab:\n\n\n\n[code(1.  This is a list item with two paragraphs. Lorem ipsum dolor\n    sit amet, consectetuer adipiscing elit. Aliquam hendrerit\n    mi posuere lectus.\n\n    Vestibulum enim wisi, viverra nec, fringilla in, laoreet\n    vitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n    sit amet velit.\n\n2.  Suspendisse id sem consectetuer libero luctus adipiscing.)]\n\nIt looks nice if you indent every line of the subsequent\nparagraphs, but here again, Markdown will allow you to be\nlazy:\n\n\n\n[code(*   This is a list item with two paragraphs.\n\n    This is the second paragraph in the list item. You're\nonly required to indent the first line. Lorem ipsum dolor\nsit amet, consectetuer adipiscing elit.\n\n*   Another item in the same list.)]\n\nTo put a blockquote within a list item, the blockquote's \\\\\\\\texttt{>}\ndelimiters need to be indented:\n\n\n\n[code(*   A list item with a blockquote:\n\n    > This is a blockquote\n    > inside a list item.)]\n\nTo put a code block within a list item, the code block needs\nto be indented \\\\\\\\textit{twice} -- 8 spaces or two tabs:\n\n\n\n[code(*   A list item with a code block:\n\n        <code goes here>)]\n\nIt's worth noting that it's possible to trigger an ordered list by\naccident, by writing something like this:\n\n\n\n[code(1986. What a great season.)]\n\nIn other words, a \\\\\\\\textit{number-period-space} sequence at the beginning of a\nline. To avoid this, you can backslash-escape the period:\n\n\n\n[code(1986\\\\\\\\. What a great season.)]\n\n<h3 id=\\\\\"precode\\\\\">Code Blocks</h3>\n\nPre-formatted code blocks are used for writing about programming or\nmarkup source code. Rather than forming normal paragraphs, the lines\nof a code block are interpreted literally. Markdown wraps a code block\nin both \\\\\\\\texttt{<pre>} and \\\\\\\\texttt{<code>} tags.\n\n\n\nTo produce a code block in Markdown, simply indent every line of the\nblock by at least 4 spaces or 1 tab. For example, given this input:\n\n\n\n[code(This is a normal paragraph:\n\n    This is a code block.)]\n\nMarkdown will generate:\n\n\n\n[code(<p>This is a normal paragraph:</p>\n\n<pre><code>This is a code block.\n</code></pre>)]\n\nOne level of indentation -- 4 spaces or 1 tab -- is removed from each\nline of the code block. For example, this:\n\n\n\n[code(Here is an example of AppleScript:\n\n    tell application \\\\\"Foo\\\\\"\n        beep\n    end tell)]\n\nwill turn into:\n\n\n\n[code(<p>Here is an example of AppleScript:</p>\n\n<pre><code>tell application \\\\\"Foo\\\\\"\n    beep\nend tell\n</code></pre>)]\n\nA code block continues until it reaches a line that is not indented\n(or the end of the article).\n\n\n\nWithin a code block, ampersands (\\\\\\\\texttt{\\\\\\\\&}) and angle brackets (\\\\\\\\texttt{<} and \\\\\\\\texttt{>})\nare automatically converted into HTML entities. This makes it very\neasy to include example HTML source code using Markdown -- just paste\nit and indent it, and Markdown will handle the hassle of encoding the\nampersands and angle brackets. For example, this:\n\n\n\n[code(    <div class=\\\\\"footer\\\\\">\n        &copy; 2004 Foo Corporation\n    </div>)]\n\nwill turn into:\n\n\n\n[code(<pre><code>&lt;div class=\\\\\"footer\\\\\"&gt;\n    &amp;copy; 2004 Foo Corporation\n&lt;/div&gt;\n</code></pre>)]\n\nRegular Markdown syntax is not processed within code blocks. E.g.,\nasterisks are just literal asterisks within a code block. This means\nit's also easy to use Markdown to write about Markdown's own syntax.\n\n\n\n<h3 id=\\\\\"hr\\\\\">Horizontal Rules</h3>\n\nYou can produce a horizontal rule tag (\\\\\\\\texttt{<hr>}) by placing three or\nmore hyphens, asterisks, or underscores on a line by themselves. If you\nwish, you may use spaces between the hyphens or asterisks. Each of the\nfollowing lines will produce a horizontal rule:\n\n\n\n[code(* * *\n\n***\n\n*****\n\n- - -\n\n---------------------------------------\n\n_ _ _)]\n\n[thematicBreak(---)]\n\n<h2 id=\\\\\"span\\\\\">Span Elements</h2>\n\n<h3 id=\\\\\"link\\\\\">Links</h3>\n\nMarkdown supports two style of links: \\\\\\\\textit{inline} and \\\\\\\\textit{reference}.\n\n\n\nIn both styles, the link text is delimited by [square brackets].\n\n\n\nTo create an inline link, use a set of regular parentheses immediately\nafter the link text's closing square bracket. Inside the parentheses,\nput the URL where you want the link to point, along with an \\\\\\\\textit{optional}\ntitle for the link, surrounded in quotes. For example:\n\n\n\n[code(This is [an example](http://example.com/ \\\\\"Title\\\\\") inline link.\n\n[This link](http://example.net/) has no title attribute.)]\n\nWill produce:\n\n\n\n[code(<p>This is <a href=\\\\\"http://example.com/\\\\\" title=\\\\\"Title\\\\\">\nan example</a> inline link.</p>\n\n<p><a href=\\\\\"http://example.net/\\\\\">This link</a> has no\ntitle attribute.</p>)]\n\nIf you're referring to a local resource on the same server, you can\nuse relative paths:\n\n\n\n[code(See my [About](/about/) page for details.)]\n\nReference-style links use a second set of square brackets, inside\nwhich you place a label of your choosing to identify the link:\n\n\n\n[code(This is [an example][id] reference-style link.)]\n\nYou can optionally use a space to separate the sets of brackets:\n\n\n\n[code(This is [an example] [id] reference-style link.)]\n\nThen, anywhere in the document, you define your link label like this,\non a line by itself:\n\n\n\n[code([id]: http://example.com/  \\\\\"Optional Title Here\\\\\")]\n\nThat is:\n\n\n\n[unorderedList([listItem(Square brackets containing the link identifier (optionally\nindented from the left margin using up to three spaces);)][listItem(followed by a colon;)][listItem(followed by one or more spaces (or tabs);)][listItem(followed by the URL for the link;)][listItem(optionally followed by a title attribute for the link, enclosed\nin double or single quotes.)])]\n\nThe link URL may, optionally, be surrounded by angle brackets:\n\n\n\n[code([id]: <http://example.com/>  \\\\\"Optional Title Here\\\\\")]\n\nYou can put the title attribute on the next line and use extra spaces\nor tabs for padding, which tends to look better with longer URLs:\n\n\n\n[code([id]: http://example.com/longish/path/to/resource/here\n    \\\\\"Optional Title Here\\\\\")]\n\nLink definitions are only used for creating links during Markdown\nprocessing, and are stripped from your document in the HTML output.\n\n\n\nLink definition names may constist of letters, numbers, spaces, and punctuation -- but they are \\\\\\\\textit{not} case sensitive. E.g. these two links:\n\n\n\n[code([link text][a]\n[link text][A])]\n\nare equivalent.\n\n\n\nThe \\\\\\\\textit{implicit link name} shortcut allows you to omit the name of the\nlink, in which case the link text itself is used as the name.\nJust use an empty set of square brackets -- e.g., to link the word\n\\\\\"Google\\\\\" to the google.com web site, you could simply write:\n\n\n\n[code([Google][])]\n\nAnd then define the link:\n\n\n\n[code([Google]: http://google.com/)]\n\nBecause link names may contain spaces, this shortcut even works for\nmultiple words in the link text:\n\n\n\n[code(Visit [Daring Fireball][] for more information.)]\n\nAnd then define the link:\n\n\n\n[code([Daring Fireball]: http://daringfireball.net/)]\n\nLink definitions can be placed anywhere in your Markdown document. I\ntend to put them immediately after each paragraph in which they're\nused, but if you want, you can put them all at the end of your\ndocument, sort of like footnotes.\n\n\n\nHere's an example of reference links in action:\n\n\n\n[code(I get 10 times more traffic from [Google] [1] than from\n[Yahoo] [2] or [MSN] [3].\n\n  [1]: http://google.com/        \\\\\"Google\\\\\"\n  [2]: http://search.yahoo.com/  \\\\\"Yahoo Search\\\\\"\n  [3]: http://search.msn.com/    \\\\\"MSN Search\\\\\")]\n\nUsing the implicit link name shortcut, you could instead write:\n\n\n\n[code(I get 10 times more traffic from [Google][] than from\n[Yahoo][] or [MSN][].\n\n  [google]: http://google.com/        \\\\\"Google\\\\\"\n  [yahoo]:  http://search.yahoo.com/  \\\\\"Yahoo Search\\\\\"\n  [msn]:    http://search.msn.com/    \\\\\"MSN Search\\\\\")]\n\nBoth of the above examples will produce the following HTML output:\n\n\n\n[code(<p>I get 10 times more traffic from <a href=\\\\\"http://google.com/\\\\\"\ntitle=\\\\\"Google\\\\\">Google</a> than from\n<a href=\\\\\"http://search.yahoo.com/\\\\\" title=\\\\\"Yahoo Search\\\\\">Yahoo</a>\nor <a href=\\\\\"http://search.msn.com/\\\\\" title=\\\\\"MSN Search\\\\\">MSN</a>.</p>)]\n\nFor comparison, here is the same paragraph written using\nMarkdown's inline link style:\n\n\n\n[code(I get 10 times more traffic from [Google](http://google.com/ \\\\\"Google\\\\\")\nthan from [Yahoo](http://search.yahoo.com/ \\\\\"Yahoo Search\\\\\") or\n[MSN](http://search.msn.com/ \\\\\"MSN Search\\\\\").)]\n\nThe point of reference-style links is not that they're easier to\nwrite. The point is that with reference-style links, your document\nsource is vastly more readable. Compare the above examples: using\nreference-style links, the paragraph itself is only 81 characters\nlong; with inline-style links, it's 176 characters; and as raw HTML,\nit's 234 characters. In the raw HTML, there's more markup than there\nis text.\n\n\n\nWith Markdown's reference-style links, a source document much more\nclosely resembles the final output, as rendered in a browser. By\nallowing you to move the markup-related metadata out of the paragraph,\nyou can add links without interrupting the narrative flow of your\nprose.\n\n\n\n<h3 id=\\\\\"em\\\\\">Emphasis</h3>\n\nMarkdown treats asterisks (\\\\\\\\texttt{*}) and underscores (\\\\\\\\texttt{\\\\\\\\_}) as indicators of\nemphasis. Text wrapped with one \\\\\\\\texttt{*} or \\\\\\\\texttt{\\\\\\\\_} will be wrapped with an\nHTML \\\\\\\\texttt{<em>} tag; double \\\\\\\\texttt{*}'s or \\\\\\\\texttt{\\\\\\\\_}'s will be wrapped with an HTML\n\\\\\\\\texttt{<strong>} tag. E.g., this input:\n\n\n\n[code(*single asterisks*\n\n_single underscores_\n\n**double asterisks**\n\n__double underscores__)]\n\nwill produce:\n\n\n\n[code(<em>single asterisks</em>\n\n<em>single underscores</em>\n\n<strong>double asterisks</strong>\n\n<strong>double underscores</strong>)]\n\nYou can use whichever style you prefer; the lone restriction is that\nthe same character must be used to open and close an emphasis span.\n\n\n\nEmphasis can be used in the middle of a word:\n\n\n\n[code(un*fucking*believable)]\n\nBut if you surround an \\\\\\\\texttt{*} or \\\\\\\\texttt{\\\\\\\\_} with spaces, it'll be treated as a\nliteral asterisk or underscore.\n\n\n\nTo produce a literal asterisk or underscore at a position where it\nwould otherwise be used as an emphasis delimiter, you can backslash\nescape it:\n\n\n\n[code(\\\\\\\\*this text is surrounded by literal asterisks\\\\\\\\*)]\n\n<h3 id=\\\\\"code\\\\\">Code</h3>\n\nTo indicate a span of code, wrap it with backtick quotes (\\\\\\\\texttt{\\`}).\nUnlike a pre-formatted code block, a code span indicates code within a\nnormal paragraph. For example:\n\n\n\n[code(Use the \\`printf()\\` function.)]\n\nwill produce:\n\n\n\n[code(<p>Use the <code>printf()</code> function.</p>)]\n\nTo include a literal backtick character within a code span, you can use\nmultiple backticks as the opening and closing delimiters:\n\n\n\n[code(\\`\\`There is a literal backtick (\\`) here.\\`\\`)]\n\nwhich will produce this:\n\n\n\n[code(<p><code>There is a literal backtick (\\`) here.</code></p>)]\n\nThe backtick delimiters surrounding a code span may include spaces --\none after the opening, one before the closing. This allows you to place\nliteral backtick characters at the beginning or end of a code span:\n\n\n\n[code(A single backtick in a code span: \\`\\` \\` \\`\\`\n\nA backtick-delimited string in a code span: \\`\\` \\`foo\\` \\`\\`)]\n\nwill produce:\n\n\n\n[code(<p>A single backtick in a code span: <code>\\`</code></p>\n\n<p>A backtick-delimited string in a code span: <code>\\`foo\\`</code></p>)]\n\nWith a code span, ampersands and angle brackets are encoded as HTML\nentities automatically, which makes it easy to include example HTML\ntags. Markdown will turn this:\n\n\n\n[code(Please don't use any \\`<blink>\\` tags.)]\n\ninto:\n\n\n\n[code(<p>Please don't use any <code>&lt;blink&gt;</code> tags.</p>)]\n\nYou can write this:\n\n\n\n[code(\\`&#8212;\\` is the decimal-encoded equivalent of \\`&mdash;\\`.)]\n\nto produce:\n\n\n\n[code(<p><code>&amp;#8212;</code> is the decimal-encoded\nequivalent of <code>&amp;mdash;</code>.</p>)]\n\n<h3 id=\\\\\"img\\\\\">Images</h3>\n\nAdmittedly, it's fairly difficult to devise a \\\\\"natural\\\\\" syntax for\nplacing images into a plain text document format.\n\n\n\nMarkdown uses an image syntax that is intended to resemble the syntax\nfor links, allowing for two styles: \\\\\\\\textit{inline} and \\\\\\\\textit{reference}.\n\n\n\nInline image syntax looks like this:\n\n\n\n[code(![Alt text](/path/to/img.jpg)\n\n![Alt text](/path/to/img.jpg \\\\\"Optional title\\\\\"))]\n\nThat is:\n\n\n\n[unorderedList([listItem(An exclamation mark: \\\\\\\\texttt{!};)][listItem(followed by a set of square brackets, containing the \\\\\\\\texttt{alt}\nattribute text for the image;)][listItem(followed by a set of parentheses, containing the URL or path to\nthe image, and an optional \\\\\\\\texttt{title} attribute enclosed in double\nor single quotes.)])]\n\nReference-style image syntax looks like this:\n\n\n\n[code(![Alt text][id])]\n\nWhere \\\\\"id\\\\\" is the name of a defined image reference. Image references\nare defined using syntax identical to link references:\n\n\n\n[code([id]: url/to/image  \\\\\"Optional title attribute\\\\\")]\n\nAs of this writing, Markdown has no syntax for specifying the\ndimensions of an image; if this is important to you, you can simply\nuse regular HTML \\\\\\\\texttt{<img>} tags.\n\n\n\n[thematicBreak(---)]\n\n<h2 id=\\\\\"misc\\\\\">Miscellaneous</h2>\n\n<h3 id=\\\\\"autolink\\\\\">Automatic Links</h3>\n\nMarkdown supports a shortcut style for creating \\\\\"automatic\\\\\" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:\n\n\n\n[code(<http://example.com/>)]\n\nMarkdown will turn this into:\n\n\n\n[code(<a href=\\\\\"http://example.com/\\\\\">http://example.com/</a>)]\n\nAutomatic links for email addresses work similarly, except that\nMarkdown will also perform a bit of randomized decimal and hex\nentity-encoding to help obscure your address from address-harvesting\nspambots. For example, Markdown will turn this:\n\n\n\n[code(<address@example.com>)]\n\ninto something like this:\n\n\n\n[code(<a href=\\\\\"&#x6D;&#x61;i&#x6C;&#x74;&#x6F;:&#x61;&#x64;&#x64;&#x72;&#x65;\n&#115;&#115;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;\n&#109;\\\\\">&#x61;&#x64;&#x64;&#x72;&#x65;&#115;&#115;&#64;&#101;&#120;&#x61;\n&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a>)]\n\nwhich will render in a browser as a clickable link to \\\\\"\\\\\\\\externalLink{address@example.com}{mailto:address@example.com}\\\\\".\n\n\n\n(This sort of entity-encoding trick will indeed fool many, if not\nmost, address-harvesting bots, but it definitely won't fool all of\nthem. It's better than nothing, but an address published in this way\nwill probably eventually start receiving spam.)\n\n\n\n<h3 id=\\\\\"backslash\\\\\">Backslash Escapes</h3>\n\nMarkdown allows you to use backslash escapes to generate literal\ncharacters which would otherwise have special meaning in Markdown's\nformatting syntax. For example, if you wanted to surround a word with\nliteral asterisks (instead of an HTML \\\\\\\\texttt{<em>} tag), you can backslashes\nbefore the asterisks, like this:\n\n\n\n[code(\\\\\\\\*literal asterisks\\\\\\\\*)]\n\nMarkdown provides backslash escapes for the following characters:\n\n\n\n[code(\\\\\\\\   backslash\n\\`   backtick\n*   asterisk\n_   underscore\n{}  curly braces\n[]  square brackets\n()  parentheses\n#   hash mark\n+\tplus sign\n-\tminus sign (hyphen)\n.   dot\n!   exclamation mark)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros mixed-indentation 1`] = `\n\"heading1(Mixed spaces and tabs)\n\n[unorderedList([listItem(Very long\nparagraph)])]\n\n[orderedList([listItem(Very long\nparagraph)])]\n\n[unorderedList([listItem(Very long\nparagraph)])]\n\n[orderedList([listItem(Very long\nparagraph)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros nested-blockquotes 1`] = `\n\"[blockquote(foo\n\n[blockquote(bar)]foo)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros nested-code 1`] = `\n\"\\\\\\\\texttt{hi ther \\`\\` ok \\`\\`\\`}\n\n\n\n\\\\\\\\texttt{\\`hi ther\\`}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros nested-em 1`] = `\n\"\\\\\\\\textit{test \\\\\\\\textbf{test} test}\n\n\n\n\\\\\\\\textit{test \\\\\\\\textbf{test} test}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros nested-references 1`] = `\n\"This nested image should work:\n\n\n\n[\\\\\\\\includegraphics{undefined}]\n\n\n\nThis nested link should not work:\n\n\n\n[[Foo][bar]]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros nested-square-link 1`] = `\n\"[the \\`]\\` character](/url)\n\n\n\n[the \\\\\\\\texttt{[} character](/url)\n\n\n\n[the \\`\\` \\\\\\\\externalLink{ \\`\\`\\` character}{/url}\n\n\n\n\\\\\\\\externalLink{the \\\\\\\\texttt{\\`} character}{/url}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros no-positionals 1`] = `\n\"This document tests for the working of \\\\\\\\texttt{position: false} as a parse\noption.\n\n\n\n[blockquote(Block-quotes\n\n[unorderedList([listItem(With list items.)])])]\n\nAnother block-quote:\n\n\n\n[blockquote([orderedList([listItem(And another list.)])])]\n\nSome \\\\\\\\externalLink{deeply \\\\\\\\textbf{nested \\\\\\\\textit{elements}}}{http://example.com}\n\n\n\nAn entity: ©, and an warning entity: ©.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros not-a-link 1`] = `\"[test](not a link)\"`;\n\nexports[`rebber: remark specs with config: custom macros ordered-and-unordered-lists 1`] = `\n\"heading2(Unordered)\n\nAsterisks tight:\n\n\n\n[unorderedList([listItem(asterisk 1)][listItem(asterisk 2)][listItem(asterisk 3)])]\n\nAsterisks loose:\n\n\n\n[unorderedList([listItem(asterisk 1)][listItem(asterisk 2)][listItem(asterisk 3)])]\n\n[thematicBreak(---)]\n\nPluses tight:\n\n\n\n[unorderedList([listItem(Plus 1)][listItem(Plus 2)][listItem(Plus 3)])]\n\nPluses loose:\n\n\n\n[unorderedList([listItem(Plus 1)][listItem(Plus 2)][listItem(Plus 3)])]\n\n[thematicBreak(---)]\n\nMinuses tight:\n\n\n\n[unorderedList([listItem(Minus 1)][listItem(Minus 2)][listItem(Minus 3)])]\n\nMinuses loose:\n\n\n\n[unorderedList([listItem(Minus 1)][listItem(Minus 2)][listItem(Minus 3)])]\n\nheading2(Ordered)\n\nTight:\n\n\n\n[orderedList([listItem(First)][listItem(Second)][listItem(Third)])]\n\nand:\n\n\n\n[orderedList([listItem(One)][listItem(Two)][listItem(Three)])]\n\nLoose using tabs:\n\n\n\n[orderedList([listItem(First)][listItem(Second)][listItem(Third)])]\n\nand using spaces:\n\n\n\n[orderedList([listItem(One)][listItem(Two)][listItem(Three)])]\n\nMultiple paragraphs:\n\n\n\n[orderedList([listItem(Item 1, graf one.\n\nItem 2. graf two. The quick brown fox jumped over the lazy dog's\nback.)][listItem(Item 2.)][listItem(Item 3.)])]\n\nheading2(Nested)\n\n[unorderedList([listItem(Tab\n\n[unorderedList([listItem(Tab\n\n[unorderedList([listItem(Tab)])])])])])]\n\nHere's another:\n\n\n\n[orderedList([listItem(First)][listItem(Second:\n\n[unorderedList([listItem(Fee)][listItem(Fie)][listItem(Foe)])])][listItem(Third)])]\n\nSame thing but with paragraphs:\n\n\n\n[orderedList([listItem(First)][listItem(Second:\n\n[unorderedList([listItem(Fee)][listItem(Fie)][listItem(Foe)])])][listItem(Third)])]\n\nThis was an error in Markdown 1.0.1:\n\n\n\n[unorderedList([listItem(this\n\n[unorderedList([listItem(sub)])]that)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros ordered-different-types 1`] = `\n\"[orderedList([listItem(foo)][listItem(bar\n3) baz)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros ordered-with-parentheses 1`] = `\n\"heading2(Ordered)\n\nTight:\n\n\n\n1)\tFirst\n2)\tSecond\n3)\tThird\n\n\n\nand:\n\n\n\n1) One\n2) Two\n3) Three\n\n\n\nLoose using tabs:\n\n\n\n1)\tFirst\n\n\n\n2)\tSecond\n\n\n\n3)\tThird\n\n\n\nand using spaces:\n\n\n\n1) One\n\n\n\n2) Two\n\n\n\n3) Three\n\n\n\nMultiple paragraphs:\n\n\n\n1)\tItem 1, graf one.\n\n\n\n[code(Item 2. graf two. The quick brown fox jumped over the lazy dog's\nback.)]\n\n2)\tItem 2.\n\n\n\n3)\tItem 3.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros paragraphs-and-indentation 1`] = `\n\"heading1(Without lines.)\n\nThis is a paragraph\nand this is further text\n\n\n\nThis is a paragraph\nand this is further text\n\n\n\nThis is a paragraph with some asterisks\n\n\n\n[code(***)]\n\nThis is a paragraph followed by a horizontal rule\n\n\n\n[thematicBreak(---)]\n\nheading1(With lines.)\n\nThis is a paragraph\n\n\n\n[code(and this is code)]\n\nThis is a paragraph\n\n\n\nand this is a new paragraph\n\n\n\nThis is a paragraph with some asterisks in a code block\n\n\n\n[code(***)]\n\nThis is a paragraph followed by a horizontal rule\n\n\n\n[thematicBreak(---)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros paragraphs-empty 1`] = `\n\"aaa\n\n\n\nheading1(aaa)\n\nbbb\n\n\n\nccc\"\n`;\n\nexports[`rebber: remark specs with config: custom macros ref-paren 1`] = `\n\"[linkReference(reference=hi, content=hi)]\n\n\n\n[definition(identifier=hi, url=/url, title=there)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros reference-image-empty-alt 1`] = `\n\"\\\\\\\\includegraphics{/xyz.png}\n\n\n\n[definition(identifier=1, url=/xyz.png, title=null)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros reference-link-escape 1`] = `\n\"[b*r*], [linkReference(reference=b\\\\\\\\*r*, content=b*r*)], [linkReference(reference=b\\\\\\\\*r*, content=b*r*)].\n\n\n\n\\\\\\\\includegraphics{http://google.com}, \\\\\\\\includegraphics{http://google.com}, \\\\\\\\includegraphics{http://google.com}.\n\n\n\n[definition(identifier=b\\\\\\\\*r*, url=http://google.com, title=null)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros reference-link-not-closed 1`] = `\n\"[bar]bar\n\n\n\n[bar]\n\n\n\n[bar]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros reference-link-with-angle-brackets 1`] = `\n\"[linkReference(reference=foo, content=foo)]\n\n\n\n[definition(identifier=foo, url=./url with spaces, title=null)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros reference-link-with-multiple-definitions 1`] = `\n\"[linkReference(reference=foo, content=foo)]\n\n\n\n[definition(identifier=foo, url=first, title=null)]\n\n[definition(identifier=foo-1, url=second, title=null)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros same-bullet 1`] = `\n\"[unorderedList([listItem(test)])]\n\n\n[unorderedList([listItem(test)])]\n\n\n[unorderedList([listItem(test)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros stringify-escape 1`] = `\n\"Characters that should be escaped in general:\n\n\n\n\\\\\\\\textbackslash{} \\` * [\n\n\n\nCharacters that shouldn't:\n\n\n\n\\\\\\\\{\\\\\\\\}]()\\\\\\\\#+-.!>\\\\\"\\\\\\\\$\\\\\\\\%',/:;=?@\\\\\\\\textasciicircum{}\\\\\\\\textasciitilde{}\n\n\n\nUnderscores are \\\\\\\\_escaped\\\\\\\\_ unless they appear in\\\\\\\\_the\\\\\\\\_middle\\\\\\\\_of\\\\\\\\_a\\\\\\\\_word.\nor \\\\\\\\textbf{\\\\\\\\_here}, or here\\\\\\\\_\\\\\\\\_\n\n\n\nAmpersands are escaped only when they would otherwise start an entity:\n\n\n\n[unorderedList([listItem(\\\\\\\\textbackslash{}©cat \\\\\\\\textbackslash{}\\\\\\\\& \\\\\\\\textbackslash{}\\\\\\\\&)][listItem(\\\\\\\\&copycat \\\\\\\\&amp; \\\\\\\\&\\\\\\\\#x26)][listItem(But: ©cat; \\\\\\\\texttt{\\\\\\\\&between;} \\\\\\\\&foo; \\\\\\\\& AT\\\\\\\\&T \\\\\\\\&c)])]\n\nOpen parenthesis should be escaped after a shortcut reference:\n\n\n\n[ref](text)\n\n\n\nAnd after a shortcut reference and a space (for GitHub):\n\n\n\n[ref] (text)\n\n\n\nHyphen should be escaped at the beginning of a line:\n\n\n\n- not a list item\n- not a list item\n+ not a list item\n\n\n\nSame for angle brackets:\n\n\n\n> not a block quote\n\n\n\nAnd hash signs:\n\n\n\n\\\\\\\\# not a heading\n\\\\\\\\#\\\\\\\\# not a subheading\n\n\n\nText under a shortcut reference should be preserved verbatim:\n\n\n\n[unorderedList([listItem([two*three])][listItem([two*three])][listItem([a\\\\\\\\textbackslash{}a])][listItem([a\\\\\\\\textbackslash{}a])][listItem([a\\\\\\\\textbackslash{}\\\\\\\\textbackslash{}a])][listItem([a\\\\\\\\_a\\\\\\\\_a])])]\n\n\\\\\\\\textbf{GFM:}\n\n\n\nColon should be escaped in URLs:\n\n\n\n[unorderedList([listItem(http\\\\\\\\textbackslash{}://user:password@host:port/path?key=value\\\\\\\\#fragment)][listItem(https\\\\\\\\textbackslash{}://user:password@host:port/path?key=value\\\\\\\\#fragment)][listItem(http://user:password@host:port/path?key=value\\\\\\\\#fragment)][listItem(https://user:password@host:port/path?key=value\\\\\\\\#fragment)])]\n\nDouble tildes should be \\\\\\\\textasciitilde{}\\\\\\\\textasciitilde{}escaped\\\\\\\\textasciitilde{}\\\\\\\\textasciitilde{}.\nAnd here: foo\\\\\\\\textasciitilde{}\\\\\\\\textasciitilde{}.\n\n\n\nPipes should not be escaped here: |\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nhere & they \\\\\\\\\\\\\\\\\nshould & tho|ugh \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\nAnd here:\n\n\n\n| here   | they   |\n| ---- | ----- |\n| should | though |\n\n\n\nAnd here:\n\n\n\nhere   | they\n---- | ------\nshould | though\n\n\n\n\\\\\\\\textbf{Commonmark:}\n\n\n\nOpen angle bracket should be escaped:\n\n\n\n[unorderedList([listItem(\\\\\\\\textbackslash{}<div>\\\\\\\\textbackslash{}</div>)][listItem(\\\\\\\\textbackslash{}<http\\\\\\\\textbackslash{}:google.com>)][listItem(<div></div>)][listItem(<http:google.com>)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros strong-and-em-together-one 1`] = `\n\"\\\\\\\\textbf{\\\\\\\\textit{This is strong and em.}}\n\n\n\nSo is \\\\\\\\textbf{\\\\\\\\textit{this}} word.\n\n\n\n\\\\\\\\textbf{\\\\\\\\textit{This is strong and em.}}\n\n\n\nSo is \\\\\\\\textbf{\\\\\\\\textit{this}} word.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros strong-and-em-together-two 1`] = `\n\"perform\\\\\\\\_complicated\\\\\\\\_task\n\n\n\ndo\\\\\\\\_this\\\\\\\\_and\\\\\\\\_do\\\\\\\\_that\\\\\\\\_and\\\\\\\\_another\\\\\\\\_thing\n\n\n\nperform\\\\\\\\textit{complicated}task\n\n\n\ndo\\\\\\\\textit{this}and\\\\\\\\textit{do}that\\\\\\\\textit{and}another*thing\"\n`;\n\nexports[`rebber: remark specs with config: custom macros strong-emphasis 1`] = `\n\"Foo \\\\\\\\textbf{bar} \\\\\\\\textbf{baz}.\n\n\n\nFoo \\\\\\\\textbf{bar} \\\\\\\\textbf{baz}.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros strong-initial-white-space 1`] = `\n\"\\\\\\\\textbf{ bar }.\n\n\n\n\\\\\\\\textbf{ bar }.\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeading 1 & \\\\\\\\textbf{H}eading 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 & Header 3 & Header 4 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 & Cell 3 & Cell 4 \\\\\\\\\\\\\\\\\nCell 5 & Cell 6 & Cell 7 & Cell 8 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n[code(Test code)]\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 & Header 3 & Header 4 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 & Cell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\textit{Cell 5} & Cell 6 & Cell 7 & Cell 8 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-empty-initial-cell 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\n & a & c \\\\\\\\\\\\\\\\\na & b & c \\\\\\\\\\\\\\\\\na & b & c \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-escaped-pipes 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nFirst & Second & third \\\\\\\\\\\\\\\\\nfirst & second & third \\\\\\\\\\\\\\\\\nfirst & second | second & third | \\\\\\\\\\\\\\\\\nfirst & second \\\\\\\\textbackslash{} & third \\\\\\\\textbackslash{} \\\\\\\\\\\\\\\\\nfirst & second \\\\\\\\textbackslash{}| second & third \\\\\\\\textbackslash{}| \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-in-list 1`] = `\n\"[unorderedList([listItem(Unordered:\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr})][listItem(Ordered:\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr})])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-invalid-alignment 1`] = `\n\"Missing alignment characters:\n\n\n\n| a | b | c |\n|   |---|---|\n| d | e | f |\n\n\n\n[thematicBreak(---)]\n\n| a | b | c |\n|---|---|   |\n| d | e | f |\n\n\n\nInvalid characters:\n\n\n\n| a | b | c |\n|---|-*-|---|\n| d | e | f |\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-loose 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-no-body 1`] = `\n\"heading1(Foo)\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nName & GitHub & Twitter \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-no-end-of-line 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nfoo & bar \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-one-column 1`] = `\n\"This is a table:\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\na \\\\\\\\\\\\\\\\\nb \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-one-row 1`] = `\n\"This is a table:\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\na & b & c \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-padded 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-pipes-in-code 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nabc & head2 \\\\\\\\\\\\\\\\\nx & \\` &  &  & \\` \\\\\\\\\\\\\\\\\nx & \\` \\\\\\\\\\\\\\\\\nx & \\` & \\` \\\\\\\\\\\\\\\\\nx & \\\\\\\\texttt{f} \\\\\\\\\\\\\\\\\nx & \\`\\`\\`\\` \\\\\\\\\\\\\\\\\nx & \\`\\\\\\\\texttt{f} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nabc & head2 \\\\\\\\\\\\\\\\\nx & \\` \\\\\\\\\\\\\\\\\nx & \\` & \\` \\\\\\\\\\\\\\\\\nx & \\\\\\\\texttt{f} \\\\\\\\\\\\\\\\\nx & \\`\\`\\`\\` \\\\\\\\\\\\\\\\\nx & \\`\\\\\\\\texttt{f} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-spaced 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros table-with-image 1`] = `\n\"Someone wanted to do this, let's implement it!\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nc1 & c2 \\\\\\\\\\\\\\\\\nc3 & \\\\\\\\includegraphics{https://zestedesavoir.com/media/galleries/426/56dc4a1e-416b-4a9d-830d-95b45d58a17a.png} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros tabs 1`] = `\n\"[unorderedList([listItem(this is a list item\nindented with tabs)][listItem(this is a list item\nindented with spaces)])]\n\nCode:\n\n\n\n[code(this code block is indented by one tab)]\n\nAnd:\n\n\n\n[code(\tthis code block is indented by two tabs)]\n\nAnd:\n\n\n\n[code(+\tthis is an example list item\n\tindented with tabs\n\n+   this is an example list item\n    indented with spaces)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros tabs-and-spaces 1`] = `\n\"[unorderedList([listItem(this is a list item\nindented with tabs)][listItem(this is a list item\nindented with spaces)])]\n\nCode:\n\n\n\n[code(this code block is indented by one tab)]\n\nAnd:\n\n\n\n[code(\tthis code block is indented by two tabs)]\n\nAnd:\n\n\n\n[code(+\tthis is an example list item\n\tindented with tabs\n\n+   this is an example list item\n    indented with spaces)]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros task-list 1`] = `\n\"heading1(Empty items)\n\n[unorderedList([listItem([ ])][listItem([\t])])]\n\n[orderedList([listItem([x])][listItem([X])])]\n\nheading1(Single space)\n\n[unorderedList(\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \n)]\n\n[orderedList(\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \n)]\n\nheading1(Tab)\n\n[unorderedList(\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \n)]\n\n[orderedList(\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \n)]\n\nheading1(No white space with content)\n\n[unorderedList([listItem([ ]Hello;)][listItem([\t]World;)])]\n\n[orderedList([listItem([x]Foo.)][listItem([X]Bar)])]\n\nheading1(Single space with content)\n\n[unorderedList(\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Hello;\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax World;\n)]\n\n[orderedList(\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Foo.\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax World :D\n)]\n\nheading1(Single tab with content)\n\n[unorderedList(\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Hello;\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax World;\n)]\n\n[orderedList(\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Foo.\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Hello.\n)]\n\nheading1(Multiple spaces with content)\n\n[unorderedList(\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax [code(Hello;)]\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax [code(World;)]\n)]\n\n[orderedList(\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Foo.\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Bar.\n)]\n\nheading1(Multiple tabs with content)\n\n[unorderedList(\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax [code(Hello;)]\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax [code(World;)]\n)]\n\n[orderedList(\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax [code(Foo.)]\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax [code(Bar.)]\n)]\n\nheading1(Mixed tabs and spaces)\n\n[unorderedList(\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax [code(    Hello;)]\n)]\n\n[orderedList(\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax [code(World;)]\n)]\n\n[unorderedList(\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax [code(\tHello;)]\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax World.\n)]\n\n[orderedList(\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Bar.\n)]\n\nheading1(Line breaks)\n\n[unorderedList([listItem([\n] Hello;)])]\n\n[orderedList([listItem([\n] Hello;)])]\n\nheading1(Multiple unfinished characters)\n\n[unorderedList([listItem([  ] Hello;)])]\n\n[orderedList([listItem([\n] World;)][listItem([\t\t] Hello;)][listItem([ \t ] World.)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros task-list-ordered 1`] = `\n\"[orderedList(\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mercury;\n[listItem([] Venus (this one’s invalid);)]\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Earth:\n\n[orderedList(\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Moon.\n)]\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mars;\n[listItem([] Neptune (this one’s also invalid).)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros task-list-unordered-asterisk 1`] = `\n\"[unorderedList(\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mercury;\n[listItem([] Venus (this one’s invalid);)]\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Earth:\n\n[unorderedList(\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Moon.\n)]\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mars;\n[listItem([] Neptune (this one’s also invalid).)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros task-list-unordered-dash 1`] = `\n\"[unorderedList(\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mercury;\n[listItem([] Venus (this one’s invalid);)]\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Earth:\n\n[unorderedList(\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Moon.\n)]\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mars;\n[listItem([] Neptune (this one’s also invalid).)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros task-list-unordered-plus 1`] = `\n\"[unorderedList(\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mercury;\n[listItem([] Venus (this one’s invalid);)]\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Earth:\n\n[unorderedList(\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Moon.\n)]\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mars;\n[listItem([] Neptune (this one’s also invalid).)])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros tidyness 1`] = `\n\"[blockquote(A list within a blockquote:\n\n[unorderedList([listItem(asterisk 1)][listItem(asterisk 2)][listItem(asterisk 3)])])]\"\n`;\n\nexports[`rebber: remark specs with config: custom macros title-attributes 1`] = `\n\"heading1(Links)\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nImplementation & Characters & Nested & Mismatched & Escaped & Named Entities & Numbered Entities \\\\\\\\\\\\\\\\\nMarkdown.pl & \\\\\\\\texttt{\\\\\"} & Yes & Yes & No & Yes & Yes \\\\\\\\\\\\\\\\\nGitHub & \\\\\\\\texttt{\\\\\"} & Yes & Yes & No & No & No \\\\\\\\\\\\\\\\\nCommonMark & \\\\\\\\texttt{\\\\\"} & No & No & Yes & Yes & Yes \\\\\\\\\\\\\\\\\nMarkdown.pl & \\\\\\\\texttt{'} & Yes & Yes & No & Yes & Yes \\\\\\\\\\\\\\\\\nGitHub & \\\\\\\\texttt{'} & Yes & Yes & No & No & No \\\\\\\\\\\\\\\\\nCommonMark & \\\\\\\\texttt{'} & No & No & Yes & Yes & Yes \\\\\\\\\\\\\\\\\nMarkdown.pl & \\\\\\\\texttt{()} & - & - & - & - & - \\\\\\\\\\\\\\\\\nGitHub & \\\\\\\\texttt{()} & - & - & - & - & - \\\\\\\\\\\\\\\\\nCommonMark & \\\\\\\\texttt{()} & No & Yes & Yes & Yes & Yes \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\nheading2(Double quotes)\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\nheading2(Single quotes)\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\nheading1(Images)\n\nheading2(Double quotes)\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\nheading2(Single quotes)\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\"\n`;\n\nexports[`rebber: remark specs with config: custom macros toplevel-paragraphs 1`] = `\n\"hello world\nhow are you\nhow are you\n\n\n\nhello world\n\n\n\n[code(how are you)]\n\nhello world\n\n\n\n[thematicBreak(---)]\n\nhello world\n\n\n\nheading1(how are you)\n\nhello world\n\n\n\nheading1(how are you)\n\nhello world\n\n\n\n[blockquote(how are you)]\n\nhello world\n\n\n\n[unorderedList([listItem(how are you)])]\n\nhello world\n\n\n\n<div>how are you</div>\n\nhello world\n<span>how are you</span>\n\n\n\nhello [linkReference(reference=how, content=world)]\n\n\n\n[definition(identifier=how, url=/are/you, title=null)]\n\n<div>hello</div>\n\n<span>hello</span>\"\n`;\n\nexports[`rebber: remark specs with config: custom macros tricky-list 1`] = `\n\"\\\\\\\\textbf{hello} \\\\\\\\textit{world}\n\n\n\n[unorderedList([listItem(hello world)])]\n\n\\\\\\\\textbf{hello} \\\\\\\\textit{world}\n\n\n\n[unorderedList([listItem(hello world)])]\n\n\\\\\\\\textbf{hello} \\\\\\\\textit{world}\n\n\n\n[unorderedList([listItem(Hello world)])]\n\n\\\\\\\\textbf{hello} \\\\\\\\textit{world}\n\n\n\n[unorderedList([listItem(hello world)])]\"\n`;\n\nexports[`toLaTeX: remark specs amps-and-angles-encoding: amps-and-angles-encoding 1`] = `\n\"AT\\\\\\\\&T has an ampersand in their name.\n\n\n\nAT\\\\\\\\&T is another way to write it.\n\n\n\nThis \\\\\\\\& that.\n\n\n\n4 < 5.\n\n\n\n6 > 5.\n\n\n\nHere's a \\\\\\\\hyperref[1]{link} with an ampersand in the URL.\n\n\n\nHere's a link with an amersand in the link text: \\\\\\\\hyperref[2]{AT\\\\\\\\&T}.\n\n\n\nHere's an inline \\\\\\\\externalLink{link}{/script?foo=1\\\\\\\\&bar=2}.\n\n\n\nHere's an inline \\\\\\\\externalLink{link}{/script?foo=1\\\\\\\\&bar=2}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{http://example.com/?foo=1\\\\\\\\&bar=2}{http://example.com/?foo=1\\\\\\\\&bar=2}}\n\n\\\\\\\\footnote{\\\\\\\\label{2}\\\\\\\\externalLink{http://att.com/}{http://att.com/}}\"\n`;\n\nexports[`toLaTeX: remark specs auto-link: auto-link 1`] = `\n\"Link: \\\\\\\\externalLink{http://example.com/}{http://example.com/}.\n\n\n\nLink to an email: \\\\\\\\externalLink{somename@example.com}{mailto:somename@example.com}.\n\n\n\nLink to an email: \\\\\\\\externalLink{somename@example.com}{mailto:somename@example.com}.\n\n\n\nWith an ampersand: \\\\\\\\externalLink{http://example.com/?foo=1\\\\\\\\&bar=2}{http://example.com/?foo=1\\\\\\\\&bar=2}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax In a list?\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{http://example.com/}{http://example.com/}\n\\\\\\\\item\\\\\\\\relax It should.\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{Quotation}\nBlockquoted: \\\\\\\\externalLink{http://example.com/}{http://example.com/}\n\\\\\\\\end{Quotation}\n\n\n\nAuto-links should not occur here: \\\\\\\\texttt{<http://example.com/>}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nor here: <http://example.com/>\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs auto-link-invalid: auto-link-invalid 1`] = `\n\"<http:/\n\n\n\n<https:/\n\n\n\n<mailto:foobarbaz>\n\n\n\n<http:/google\n\n\n\n<foo@\n\n\"\n`;\n\nexports[`toLaTeX: remark specs auto-link-lines: auto-link-lines 1`] = `\n\"hello world\n\\\\\\\\externalLink{http://example.com}{http://example.com}\n\n\n\nhello world\n\\\\\\\\externalLink{somename@example.com}{mailto:somename@example.com}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs auto-link-output: auto-link-output 1`] = `\n\"Link: \\\\\\\\externalLink{http://example.com/}{http://example.com/}.\n\n\n\nLink to an email: \\\\\\\\externalLink{somename@example.com}{mailto:somename@example.com}.\n\n\n\nLink without protocol, which should not render as an auto-link\nbecause they are easily mistaken for HTML: \\\\\\\\externalLink{google.com}{google.com}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs auto-link-url: auto-link-url 1`] = `\n\"This should be a link: \\\\\\\\externalLink{http://example.com/hello-world}{http://example.com/hello-world}.\n\n\n\nAlso, subdomain should be a part of the link (\\\\\\\\externalLink{http://foo.example.com/(hello[world])}{http://foo.example.com/(hello[world])}).\n\n\n\nSo should this: \\\\\\\\externalLink{foo@bar.com}{mailto:foo@bar.com}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs auto-link-url-invalid: auto-link-url-invalid 1`] = `\n\"http://<example\n\n\n\nhttps:// foo bar baz.\n\n\n\nmailto:.\n\n\n\nhttp://,\n\n\n\nhttps://:\n\n\n\nmailto:;\n\n\n\nhttp://\\\\\"\n\n\n\nhttps://'\n\n\n\nmailto:)\n\n\n\nhttp://]\n\n\"\n`;\n\nexports[`toLaTeX: remark specs backslash-escapes: backslash-escapes 1`] = `\n\"These should all get escaped:\n\n\n\nBackslash: \\\\\\\\textbackslash{}\n\n\n\nBacktick: \\`\n\n\n\nAsterisk: *\n\n\n\nUnderscore: \\\\\\\\_\n\n\n\nLeft brace: \\\\\\\\{\n\n\n\nRight brace: \\\\\\\\}\n\n\n\nLeft bracket: [\n\n\n\nRight bracket: ]\n\n\n\nLeft paren: (\n\n\n\nRight paren: )\n\n\n\nGreater-than: >\n\n\n\nHash: \\\\\\\\#\n\n\n\nPeriod: .\n\n\n\nBang: !\n\n\n\nPlus: +\n\n\n\nMinus: -\n\n\n\n\\\\\\\\textbf{GFM:}\n\n\n\nPipe: |\n\n\n\nTilde: \\\\\\\\textasciitilde{}\n\n\n\n\\\\\\\\textbf{Commonmark:}\n\n\n\nQuote: \\\\\\\\textbackslash{}\\\\\"\n\n\n\nDollar: \\\\\\\\textbackslash{}\\\\\\\\$\n\n\n\nPercentage: \\\\\\\\textbackslash{}\\\\\\\\%\n\n\n\nAmpersand: \\\\\\\\textbackslash{}\\\\\\\\&\n\n\n\nSingle quote: \\\\\\\\textbackslash{}'\n\n\n\nComma: \\\\\\\\textbackslash{},\n\n\n\nForward slash: \\\\\\\\textbackslash{}/\n\n\n\nColon: \\\\\\\\textbackslash{}:\n\n\n\nSemicolon: \\\\\\\\textbackslash{};\n\n\n\nLess-than: \\\\\\\\textbackslash{}<\n\n\n\nEquals: \\\\\\\\textbackslash{}=\n\n\n\nQuestion mark: \\\\\\\\textbackslash{}?\n\n\n\nAt-sign: \\\\\\\\textbackslash{}@\n\n\n\nCaret: \\\\\\\\textbackslash{}\\\\\\\\textasciicircum{}\n\n\n\nNew line: \\\\\\\\textbackslash{}\nonly works in paragraphs.\n\n\n\nThese should not, because they occur within a code block:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nBackslash: \\\\\\\\\\\\\\\\\n\nBacktick: \\\\\\\\\\`\n\nAsterisk: \\\\\\\\*\n\nUnderscore: \\\\\\\\_\n\nLeft brace: \\\\\\\\{\n\nRight brace: \\\\\\\\}\n\nLeft bracket: \\\\\\\\[\n\nRight bracket: \\\\\\\\]\n\nLeft paren: \\\\\\\\(\n\nRight paren: \\\\\\\\)\n\nGreater-than: \\\\\\\\>\n\nHash: \\\\\\\\#\n\nPeriod: \\\\\\\\.\n\nBang: \\\\\\\\!\n\nPlus: \\\\\\\\+\n\nMinus: \\\\\\\\-\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\textbf{GFM:}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nPipe: \\\\\\\\|\n\nTilde: \\\\\\\\~\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\textbf{Commonmark:}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nQuote: \\\\\\\\\\\\\"\n\nDollar: \\\\\\\\$\n\nPercentage: \\\\\\\\%\n\nAmpersand: \\\\\\\\&\n\nSingle quote: \\\\\\\\'\n\nComma: \\\\\\\\,\n\nForward slash: \\\\\\\\/\n\nColon: \\\\\\\\:\n\nSemicolon: \\\\\\\\;\n\nLess-than: \\\\\\\\<\n\nEquals: \\\\\\\\=\n\nQuestion mark: \\\\\\\\?\n\nAt-sign: \\\\\\\\@\n\nCaret: \\\\\\\\^\n\nNew line: \\\\\\\\\nonly works in paragraphs.\n\\\\\\\\end{CodeBlock}\n\n\n\nNor should these, which occur in code spans:\n\n\n\nBackslash: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\textbackslash{}}\n\n\n\nBacktick: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\`}\n\n\n\nAsterisk: \\\\\\\\texttt{\\\\\\\\textbackslash{}*}\n\n\n\nUnderscore: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\_}\n\n\n\nLeft brace: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\{}\n\n\n\nRight brace: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\}}\n\n\n\nLeft bracket: \\\\\\\\texttt{\\\\\\\\textbackslash{}[}\n\n\n\nRight bracket: \\\\\\\\texttt{\\\\\\\\textbackslash{}]}\n\n\n\nLeft paren: \\\\\\\\texttt{\\\\\\\\textbackslash{}(}\n\n\n\nRight paren: \\\\\\\\texttt{\\\\\\\\textbackslash{})}\n\n\n\nGreater-than: \\\\\\\\texttt{\\\\\\\\textbackslash{}>}\n\n\n\nHash: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\#}\n\n\n\nPeriod: \\\\\\\\texttt{\\\\\\\\textbackslash{}.}\n\n\n\nBang: \\\\\\\\texttt{\\\\\\\\textbackslash{}!}\n\n\n\nPlus: \\\\\\\\texttt{\\\\\\\\textbackslash{}+}\n\n\n\nMinus: \\\\\\\\texttt{\\\\\\\\textbackslash{}-}\n\n\n\n\\\\\\\\textbf{GFM:}\n\n\n\nPipe: \\\\\\\\texttt{\\\\\\\\textbackslash{}|}\n\n\n\nTilde: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\textasciitilde{}}\n\n\n\n\\\\\\\\textbf{Commonmark:}\n\n\n\nQuote: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\"}\n\n\n\nDollar: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\$}\n\n\n\nPercentage: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\%}\n\n\n\nAmpersand: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\&}\n\n\n\nSingle quote: \\\\\\\\texttt{\\\\\\\\textbackslash{}'}\n\n\n\nComma: \\\\\\\\texttt{\\\\\\\\textbackslash{},}\n\n\n\nForward slash: \\\\\\\\texttt{\\\\\\\\textbackslash{}/}\n\n\n\nColon: \\\\\\\\texttt{\\\\\\\\textbackslash{}:}\n\n\n\nSemicolon: \\\\\\\\texttt{\\\\\\\\textbackslash{};}\n\n\n\nLess-than: \\\\\\\\texttt{\\\\\\\\textbackslash{}<}\n\n\n\nEquals: \\\\\\\\texttt{\\\\\\\\textbackslash{}=}\n\n\n\nQuestion mark: \\\\\\\\texttt{\\\\\\\\textbackslash{}?}\n\n\n\nAt-sign: \\\\\\\\texttt{\\\\\\\\textbackslash{}@}\n\n\n\nCaret: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\\\\\\\textasciicircum{}}\n\n\n\nNew line: \\\\\\\\texttt{\\\\\\\\textbackslash{} } only works in paragraphs.\n\n\n\nThese should get escaped, even though they're matching pairs for\nother Markdown constructs:\n\n\n\n*asterisks*\n\n\n\n\\\\\\\\_underscores\\\\\\\\_\n\n\n\n\\`backticks\\`\n\n\n\nThis is a code span with a literal backslash-backtick sequence: \\\\\\\\texttt{\\\\\\\\textbackslash{}\\`}\n\n\n\nThis is a tag with unescaped backticks <span attr='\\`ticks\\`'>bar</span>.\n\n\n\nThis is a tag with backslashes <span attr='\\\\\\\\\\\\\\\\backslashes\\\\\\\\\\\\\\\\'>bar</span>.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs block-elements: block-elements 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Different lists should receive two newline characters\nbetween them.\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax This is another list.\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax The same goes for lists in block quotes.\n\\\\\\\\end{itemize}\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax This is another list.\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax And for lists in lists:\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First sublist.\n\\\\\\\\end{enumerate}\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1.   Second sublist.\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd for lists followed by indented code blocks:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax This is a paragraph in a list\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nAnd this is code();\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs blockquote-indented: blockquote-indented 1`] = `\n\"\\\\\\\\begin{Quotation}\nbar\nbaz\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs blockquote-lazy-code: blockquote-lazy-code 1`] = `\n\"\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{text}\nfoo\nbar\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs blockquote-lazy-fence: blockquote-lazy-fence 1`] = `\n\"\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{text}\naNormalCodeBlockInABlockqoute();\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\n\nA paragraph.\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{text}\nthisIsAlsoSomeCodeInABlockquote();\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\n\nA paragraph.\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{text}\naNonTerminatedCodeBlockInABlockquote();\n\\\\\\\\end{CodeBlock}\n\naNewCodeBlockFollowingTheBlockQuote();\n\n\\\\\\\\begin{CodeBlock}{text}\n\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\n\nA paragraph.\n\n\n\n\\\\\\\\begin{Quotation}\nSomething in a blockquote.\n\n\\\\\\\\begin{CodeBlock}{text}\naNewCodeBlock();\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs blockquote-lazy-list: blockquote-lazy-list 1`] = `\n\"\\\\\\\\begin{Quotation}\nThis is a blockquote.\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax And in normal mode this is an internal list, but in commonmark this is a top level list.\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs blockquote-lazy-rule: blockquote-lazy-rule 1`] = `\n\"\\\\\\\\begin{Quotation}\nThis is a blockquote. Followed by a rule.\n\n\\\\\\\\horizontalLine\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs blockquote-list-item: blockquote-list-item 1`] = `\n\"This fails in markdown.pl and upskirt:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\n\\\\\\\\begin{Quotation}\nworld\n\\\\\\\\end{Quotation}\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs blockquotes: blockquotes 1`] = `\n\"\\\\\\\\begin{Quotation}\nThis is a blockquote.\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nThis is, in commonmark mode, another blockquote.\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs blockquotes-empty-lines: blockquotes-empty-lines 1`] = `\n\"\\\\\\\\begin{Quotation}\nNote there is no space on the following line.\n\nNote there is no space on the preceding line.\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs blockquotes-with-code-blocks: blockquotes-with-code-blocks 1`] = `\n\"\\\\\\\\begin{Quotation}\nExample:\n\n\\\\\\\\begin{CodeBlock}{text}\nsub status {\n    print \\\\\"working\\\\\";\n}\n\\\\\\\\end{CodeBlock}\n\nOr:\n\n\\\\\\\\begin{CodeBlock}{text}\nsub status {\n    return \\\\\"working\\\\\";\n}\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs bom: bom 1`] = `\n\"\\\\\\\\part{Hello from a BOM}\n\n\nBe careful when editing this file!\n\n\"\n`;\n\nexports[`toLaTeX: remark specs breaks-hard: breaks-hard 1`] = `\n\"These are not breaks:\n\n\n\nLook at the\npretty line\nbreaks.\n\n\n\nThese are breaks:\n\n\n\nLook at the \\\\\\\\\\\\\\\\\npretty line \\\\\\\\\\\\\\\\\nbreaks.\n\n\n\nIn \\\\\\\\texttt{commonmark: true} mode, an escaped newline character is exposed as a \\\\\\\\texttt{break} node:\n\n\n\nLook at the\\\\\\\\textbackslash{}\npretty line\\\\\\\\textbackslash{}\nbreaks.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs case-insensitive-refs: case-insensitive-refs 1`] = `\n\"\\\\\\\\hyperref[hi]{hi}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{hi}\\\\\\\\externalLink{/url}{/url}}\"\n`;\n\nexports[`toLaTeX: remark specs code-block: code-block 1`] = `\n\"Tildes:\n\n\n\n\\\\\\\\begin{CodeBlock}{javascript}\nalert('Hello World!');\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs code-block-escape: code-block-escape 1`] = `\n\"A little flaw:\n\n\n\n\\\\\\\\begin{CodeBlock}{python}\n\n\n\\\\\\\\end{CodeBlock}\n\n\n\nAn ingenuous flaw:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\n\\\\\\\\input{/etc/passwd}\n\\\\\\\\begin{CodeBlock}{text}\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs code-block-indentation: code-block-indentation 1`] = `\n\"Fenced code blocks are normally not exdented, however,\nwhen the initial fence is indented by spaces, the value of\nthe code is exdented by up to that amount of spaces.\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n    This is a code block...\n        \n    ...which is not exdented.\n\\\\\\\\end{CodeBlock}\n\n\n\nBut...\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n  This one...\n      \n  ...is.\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd...\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nSo is this...\n      \n  ...one.\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs code-block-nesting-bug: code-block-nesting-bug 1`] = `\n\"GitHub, thus RedCarpet, has a bug where “nested” fenced code blocks,\neven with shorter fences, can exit their actual “parent” block.\n\n\n\nNote that this bug does not occur on indented code-blocks.\n\n\n\n\\\\\\\\begin{CodeBlock}{foo}\n\\`\\`\\`bar\nbaz\n\\`\\`\\`\n\\\\\\\\end{CodeBlock}\n\n\n\nEven with a different fence marker:\n\n\n\n\\\\\\\\begin{CodeBlock}{foo}\n~~~bar\nbaz\n~~~\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd reversed:\n\n\n\n\\\\\\\\begin{CodeBlock}{foo}\n~~~bar\nbaz\n~~~\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}{foo}\n\\`\\`\\`bar\nbaz\n\\`\\`\\`\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs code-blocks: code-blocks 1`] = `\n\"code block on the first line\n\n\n\nRegular text.\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\ncode block indented by spaces\n\\\\\\\\end{CodeBlock}\n\n\n\nRegular text.\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nthe lines in this block  \nall contain trailing spaces  \n\\\\\\\\end{CodeBlock}\n\n\n\nRegular Text.\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\ncode block on the last line\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs code-spans: code-spans 1`] = `\n\"\\\\\\\\texttt{<test a=\\\\\"} content of attribute \\\\\\\\texttt{\\\\\">}\n\n\n\nFix for backticks within HTML tag: <span attr='\\`ticks\\`'>like this</span>\n\n\n\nHere's how you put \\\\\\\\texttt{\\`backticks\\`} in a code span.\n\n\n\nAdditionally, empty code spans are NOT supported: \\`\\`.\n\n\n\nHere’s an example, \\\\\\\\texttt{foo \\` bar }.\n\n\n\nAnd here, \\\\\\\\texttt{\\`\\`}.\n\n\n\n\\\\\\\\texttt{// this is also inline code}\n\n\n\nSo is this \\\\\\\\texttt{foo bar baz}.\n\n\n\nAnd this \\\\\\\\texttt{foo \\`\\` bar}\n\n\n\nAnd \\\\\\\\texttt{this\\\\\\\\textbackslash{}}but this is text\\`.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs def-blocks: def-blocks 1`] = `\n\"\\\\\\\\begin{Quotation}\nhello\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{hello}{hello}}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\nhello\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{2}\\\\\\\\externalLink{hello}{hello}}\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\item\\\\\\\\relax \\\\\\\\footnote{\\\\\\\\label{3}\\\\\\\\externalLink{hello}{hello}}\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\footnote{\\\\\\\\label{4}\\\\\\\\externalLink{hello}{hello}}\n\n\\\\\\\\begin{Quotation}\nfoo\nbar\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1-1}\\\\\\\\externalLink{foo}{foo}}\n\n\\\\\\\\begin{Quotation}\nbar\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs definition-newline: definition-newline 1`] = `\n\"\\\\\\\\hyperref[baz]{baz}: /url (\n)\n\n\n\n[foo]: /url \\\\\"\n\\\\\"\n\n\n\n[bar]: /url '\n'\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{baz}\\\\\\\\externalLink{/url}{/url}}\n\n\\\\\\\\footnote{\\\\\\\\label{baz-1}\\\\\\\\externalLink{/url}{/url}}\n\n\\\\\\\\footnote{\\\\\\\\label{baz-1-1}\\\\\\\\externalLink{/url}{/url}}\n\n\\\\\\\\hyperref[baz]{baz}: /url 'foo\n\n\"\n`;\n\nexports[`toLaTeX: remark specs definition-unclosed: definition-unclosed 1`] = `\n\"[foo]:\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{bar}\\\\\\\\externalLink{</url}{</url}}\n\n[foo]:\n\n\"\n`;\n\nexports[`toLaTeX: remark specs definition-unclosed-attribute: definition-unclosed-attribute 1`] = `\n\"[baz]: /url (there\n\n\n\n[foo]: /url \\\\\"there\n\n\n\n[bar]: /url 'there\n\n\n\n[baz]: url (\n\n\n\n[foo]: url \\\\\"\n\n\n\n[bar]: /url '\n\n\n\n[baz]: <url>(\n\n\n\n[foo]: <url>\\\\\"\n\n\n\n[bar]: <url>'\n\n\"\n`;\n\nexports[`toLaTeX: remark specs deletion: deletion 1`] = `\n\"hello \\\\\\\\sout{hi} world\n\n\"\n`;\n\nexports[`toLaTeX: remark specs double-link: double-link 1`] = `\n\"<p>Already linked: <a href=\\\\\"http://example.com/\\\\\">http://example.com/</a>.</p>\n\nAlready linked: \\\\\\\\externalLink{http://example.com/}{http://example.com/}.\n\n\n\nAlready linked: <a href=\\\\\"http://example.com/\\\\\">\\\\\\\\textbf{http://example.com/}</a>.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs emphasis: emphasis 1`] = `\n\"\\\\\\\\textit{emphasis}.\n\n\n\n\\\\\\\\textbf{strong}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs emphasis-empty: emphasis-empty 1`] = `\n\"Hello ** ** world.\n\n\n\nHello \\\\\\\\_\\\\\\\\_\t\\\\\\\\_\\\\\\\\_ world.\n\n\n\nHello *\t* world.\n\n\n\nHello \\\\\\\\_\t\\\\\\\\_ world.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs emphasis-escaped-final-marker: emphasis-escaped-final-marker 1`] = `\n\"*bar*\n\n\n\n**bar**\n\n\n\n\\\\\\\\_bar\\\\\\\\_\n\n\n\n\\\\\\\\_\\\\\\\\_bar\\\\\\\\_\\\\\\\\_\n\n\"\n`;\n\nexports[`toLaTeX: remark specs emphasis-internal: emphasis-internal 1`] = `\n\"These words should\\\\\\\\_not\\\\\\\\_be\\\\\\\\_emphasized.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs empty: empty 1`] = `\"\"`;\n\nexports[`toLaTeX: remark specs entities: entities 1`] = `\n\"Lots of entities are supported in mdast:  , \\\\\\\\&, ©, Æ,\nĎ, ¾, ℋ, ⅆ,\n∲, \\\\\\\\&c.  Even some entities with a missing\nterminal semicolon are parsed correctly (as per the HTML5 spec):\nÿ, á, ©, and \\\\\\\\&.\n\n\n\nHowever, \\\\\\\\&MadeUpEntities; are kept in the document.\n\n\n\nEntities even work in the language flag of fenced code blocks:\n\n\n\n\\\\\\\\begin{CodeBlock}{some—language}\nalert('Hello');\n\\\\\\\\end{CodeBlock}\n\n\n\nOr in \\\\\\\\externalLink{línks}{\\\\\\\\textasciitilde{}/some—file}\n\n\n\nOr in \\\\\\\\includegraphics{~/an–image.png}\n\n\n\nBut, entities are not interpreted in \\\\\\\\texttt{inline c\\\\\\\\&ouml;de}, or in\ncode blocks:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nC&Ouml;DE block.\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs entities-advanced: entities-advanced 1`] = `\n\"\\\\\\\\begin{Quotation}\nHowever, \\\\\\\\&MadeUpEntities; are kept in the document.\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nEntities even work in the language flag of fenced code blocks:\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{some©language}\nalert('Hello');\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nAnd in an auto-link: \\\\\\\\externalLink{http://example©xample.com}{http://example\\\\\\\\&copyxample.com}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nFoo and bar and http://example©xample.com and baz.\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nOr in \\\\\\\\externalLink{l©nks}{\\\\\\\\textasciitilde{}/some\\\\\\\\&copyfile}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nOr in \\\\\\\\externalLink{l©lnks}{\\\\\\\\textasciitilde{}/some\\\\\\\\&copyfile}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nOr in \\\\\\\\includegraphics{~/some&copyfile}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\nOr in \\\\\\\\includegraphics{~/some&copyfile}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nOr in \\\\\\\\includegraphics{undefined}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{http://example\\\\\\\\&copyxample.com}{http://example\\\\\\\\&copyxample.com}}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\footnote{\\\\\\\\label{ 1 }\\\\\\\\externalLink{http://example\\\\\\\\&copyxample.com}{http://example\\\\\\\\&copyxample.com}}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\nBut, entities are not interpreted in \\\\\\\\texttt{inline c\\\\\\\\&oumlde}, or in\ncode blocks:\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{text}\nC&OumlDE block.\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs escaped-angles: escaped-angles 1`] = `\n\">\n\n\"\n`;\n\nexports[`toLaTeX: remark specs fenced-code: fenced-code 1`] = `\n\"\\\\\\\\begin{CodeBlock}{js}\nvar a = 'hello';\nconsole.log(a + ' world');\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}{bash}\necho \\\\\"hello, \\${WORLD}\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}{longfence}\nQ: What do you call a tall person who sells stolen goods?\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}{ManyTildes}\nA longfence!\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs fenced-code-empty: fenced-code-empty 1`] = `\n\"Normal with language tag:\n\n\n\n\\\\\\\\begin{CodeBlock}{js}\n\n\\\\\\\\end{CodeBlock}\n\n\n\nWith white space:\n\n\n\n\\\\\\\\begin{CodeBlock}{bash}\n\n\\\\\\\\end{CodeBlock}\n\n\n\nWith very long fences:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\n\\\\\\\\end{CodeBlock}\n\n\n\nWith nothing:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs fenced-code-trailing-characters: fenced-code-trailing-characters 1`] = `\n\"\\\\\\\\begin{CodeBlock}{js}\nfoo();\n\\`\\`\\`bash\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs fenced-code-trailing-characters-2: fenced-code-trailing-characters-2 1`] = `\n\"\\\\\\\\begin{CodeBlock}{text}\n\\`\\`\\` aaa\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs fenced-code-white-space-after-flag: fenced-code-white-space-after-flag 1`] = `\n\"\\\\\\\\begin{CodeBlock}{js}\nfoo();\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}{bash}\necho \\\\\"hello, \\${WORLD}\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs hard-wrapped-paragraphs-with-list-like-lines: hard-wrapped-paragraphs-with-list-like-lines 1`] = `\n\"In Markdown 1.0.0 and earlier. Version\n8. This line turns into a list item.\nBecause a hard-wrapped line in the\n123. middle of a paragraph looked like a\nlist item.\n\n\n\nHere's one with a bullet.\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax criminey.\n\\\\\\\\end{itemize}\n\n\nNon-GFM does not create a list for either.\nGFM does not create a list for \\\\\\\\texttt{8.}, but does for \\\\\\\\texttt{*}.\nCommonMark creates a list for both.\nAll versions create lists for the following.\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Here's one with a bullet.\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax criminey.\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\n\n...and the following:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax In Markdown 1.0.0 and earlier. Version\n8. This line turns into a list item.\n\\\\\\\\end{enumerate}\n\"\n`;\n\nexports[`toLaTeX: remark specs heading: heading 1`] = `\n\"\\\\\\\\part{Heading 1}\n\n\n\\\\\\\\chapter{Heading 2}\n\n\n\\\\\\\\section{Heading 4}\n\n\n\\\\\\\\subsection{Heading 4}\n\n\n\\\\\\\\subsubsection{Heading 5}\n\n\n\\\\\\\\paragraph{Heading 6}\n\"\n`;\n\nexports[`toLaTeX: remark specs heading-atx-closed-trailing-white-space: heading-atx-closed-trailing-white-space 1`] = `\n\"\\\\\\\\part{Foo}\n\n\n\\\\\\\\chapter{Bar}\n\"\n`;\n\nexports[`toLaTeX: remark specs heading-atx-empty: heading-atx-empty 1`] = `\n\"\\\\\\\\part{}\n\n\n\\\\\\\\chapter{}\n\n\n\\\\\\\\section{}\n\n\n\\\\\\\\subsection{}\n\n\n\\\\\\\\subsubsection{}\n\n\n\\\\\\\\paragraph{}\n\"\n`;\n\nexports[`toLaTeX: remark specs heading-in-blockquote: heading-in-blockquote 1`] = `\n\"\\\\\\\\begin{Quotation}\nA blockquote\nwith some more text.\n\\\\\\\\end{Quotation}\n\n\n\nA normal paragraph.\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\chapter{A blockquote followed by a horizontal rule (in CommonMark).}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\chapter{A heading in a blockquote}\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs heading-in-paragraph: heading-in-paragraph 1`] = `\n\"Hello\n\n\n\n\\\\\\\\part{World}\n\"\n`;\n\nexports[`toLaTeX: remark specs heading-not-atx: heading-not-atx 1`] = `\n\"\\\\\\\\#This is not a heading, per CommonMark: \\\\\\\\externalLink{http://spec.commonmark.org/0.17/\\\\\\\\#example-25}{http://spec.commonmark.org/0.17/\\\\\\\\#example-25}\n\n\n\nKramdown (GitHub) neither supports unspaced ATX-headings.\n\n\n\n\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\# h7?\n\n\n\n\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\# h8?\n\n\n\n\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\#\\\\\\\\# h9?\n\n\n\nMore than six \\\\\\\\# characters is not a heading: \\\\\\\\externalLink{http://spec.commonmark.org/0.26/\\\\\\\\#example-33}{http://spec.commonmark.org/0.26/\\\\\\\\#example-33}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs heading-setext-with-initial-spacing: heading-setext-with-initial-spacing 1`] = `\n\"\\\\\\\\part{Heading 1}\n\n\n\\\\\\\\chapter{Heading 2}\n\n\nBoth these headings caused positional problems in on commit daa344c and before.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs horizontal-rules: horizontal-rules 1`] = `\n\"Dashes:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n---\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n- - -\n\\\\\\\\end{CodeBlock}\n\n\n\nAsterisks:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n***\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n* * *\n\\\\\\\\end{CodeBlock}\n\n\n\nUnderscores:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n___\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n_ _ _\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs horizontal-rules-adjacent: horizontal-rules-adjacent 1`] = `\n\"\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\nThe three asterisks are not a Setext header.\n\n\n\nThis is a paragraph.\n\n\n\n\\\\\\\\horizontalLine\n\n\n\nThis is another paragraph.\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\chapter{But this is a secondary heading.}\n\n\n\\\\\\\\horizontalLine\n\n\"\n`;\n\nexports[`toLaTeX: remark specs hr: hr 1`] = `\n\"\\\\\\\\horizontalLine\n\n\"\n`;\n\nexports[`toLaTeX: remark specs hr-list-break: hr-list-break 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello world\n\\\\\\\\item\\\\\\\\relax how are\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nyou today?\n\n\n\nThe above asterisks do split the list, but the below ones do not.\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello world\n\\\\\\\\item\\\\\\\\relax how are\n\\\\\\\\item\\\\\\\\relax \\\\\\\\horizontalLine\n\nyou today?\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Neither do these\n\\\\\\\\item\\\\\\\\relax how are\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax you today?\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax But these do\n\\\\\\\\item\\\\\\\\relax how are\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nyou today?\n\n\"\n`;\n\nexports[`toLaTeX: remark specs html-advanced: html-advanced 1`] = `\n\"Simple block on one line:\n\n\n\n<div>foo</div>\n\nAnd nested without indentation:\n\n\n\n<div>\n<div>\n<div>\nfoo\n</div>\n<div style=\\\\\">\\\\\"/>\n</div>\n<div>bar</div>\n</div>\"\n`;\n\nexports[`toLaTeX: remark specs html-attributes: html-attributes 1`] = `\n\"\\\\\\\\part{Block-level}\n\n\n<article foo=\\\\\"bar 'baz' qux\\\\\" foo='bar \\\\\"baz\\\\\" qux' foo=baz>\n\n<article foo>\n\n<article>\n\n<article :foo:bar:09:=\\\\\"baz\\\\\">\n\n<article foo.bar_09->\n\n<article foo.bar_09-   >\n\n<article foo.bar_09-   />\n\n<div baz\nqux\n\n\\\\\\\\part{Inline}\n\n\n<span foo=\\\\\"bar 'baz' qux\\\\\" foo='bar \\\\\"baz\\\\\" qux' foo=baz>\n\n<span foo>\n\n<span>\n\n<span :foo:bar:09:=\\\\\"baz\\\\\">\n\n<span foo.bar_09->\n\n<span foo.bar_09-   >\n\n<span foo.bar_09-   />\n\n<span this is\ninvalid\n\n\"\n`;\n\nexports[`toLaTeX: remark specs html-cdata: html-cdata 1`] = `\n\"<![CDATA[\nfooBarBaz()\n]]>\n\nfoo <![CDATA[bar]]>\n\n\"\n`;\n\nexports[`toLaTeX: remark specs html-comments: html-comments 1`] = `\n\"Paragraph one.\n\n\n\n<!-- This is a simple comment -->\n\n<!--\n\tThis is another comment.\n-->\n\nWhat follows is not an HTML comment because it contains\ntwo consecutive dashes:\n\\\\\\\\externalLink{https://html.spec.whatwg.org/multipage/syntax.html\\\\\\\\#comments}{https://html.spec.whatwg.org/multipage/syntax.html\\\\\\\\#comments}.\n\n\n\n<!-- one comment block -- -- with two comments -->\n\nBut this is fine (in commonmark):\n\n\n\n<!-- one comment block - with a dash -->\n\nAnd, this is wrong (in commonmark):\n\n\n\n<!-->-->\n\nThe end.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs html-declaration: html-declaration 1`] = `\n\"<!DOCTYPE html>\n\nfoo <!BAR br BAZ>\n\n\n\n<!doctype html>\n\n<!valid >\n\n<!invalid>\"\n`;\n\nexports[`toLaTeX: remark specs html-indented: html-indented 1`] = `\n\"<div>\n  *hello*\n   <div>\n\n <span>\n  *hello*\n   <span>\n\n  <!doctype html>\n\n   <!-- baz -->\n\nalpha <!-- baz -->\n\n\"\n`;\n\nexports[`toLaTeX: remark specs html-processing-instruction: html-processing-instruction 1`] = `\n\"<?php\n  echo '>';\n?>\"\n`;\n\nexports[`toLaTeX: remark specs html-simple: html-simple 1`] = `\n\"Here's a simple block:\n\n\n\n<div>\n\tfoo\n</div>\n\nThis should be a code block, though:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<div>\n\tfoo\n</div>\n\\\\\\\\end{CodeBlock}\n\n\n\nAs should this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<div>foo</div>\n\\\\\\\\end{CodeBlock}\n\n\n\nNow, nested:\n\n\n\n<div>\n\t<div>\n\t\t<div>\n\t\t\tfoo\n\t\t</div>\n\t</div>\n</div>\n\nThis should just be an HTML comment:\n\n\n\n<!-- Comment -->\n\nMultiline:\n\n\n\n<!--\nBlah\nBlah\n-->\n\nCode block:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<!-- Comment -->\n\\\\\\\\end{CodeBlock}\n\n\n\nJust plain comment, with trailing spaces on the line:\n\n\n\n<!-- foo -->   \n\nCode:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<hr>\n\\\\\\\\end{CodeBlock}\n\n\n\nHr's:\n\n\n\n<hr>\n\n<hr>\n\n<hr>\n\n<hr>   \n\n<hr>  \n\n<hr> \n\n<hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" />\n\n<hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\"/>\n\n<hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" >\"\n`;\n\nexports[`toLaTeX: remark specs html-tags: html-tags 1`] = `\n\"\\\\\\\\part{Block}\n\n\n<article>\n\n<ARTICLE>\n\n<ArTiClE>\n\n<-article>\n\n\n\n<article foo=\n\n<article foo=\\\\\"bar\n\n<article foo='bar\n\n<article foo=bar \n\n<article foo=bar >\n\n<article/>\n\n<-article/>\n\n\n\n</article>\n\n</ARTICLE>\n\n</aRtIcLe>\n\n</article  >\n\n</-article  >\n\n\n\n</article\n\n</article  \n\n\\\\\\\\part{Inline}\n\n\n<span>\n\n<SPAN>\n\n<SpAn>\n\n<-span>\n\n\n\n<span/>\n\n<-span/>\n\n\n\n</span>\n\n</SPAN>\n\n</SpAn>\n\n</span  >\n\n</-span>\n\n\n\n</span\n\n\n\n</span\n\n\n\n<span foo=\n\n\n\n<span foo=\\\\\"bar\n\n\n\n<span foo='bar\n\n\n\n<span foo=bar\n\n\n\n<span foo=bar >\"\n`;\n\nexports[`toLaTeX: remark specs image-basename-dots: image-basename-dots 1`] = `\n\"\\\\\\\\includegraphics{{x.yz}.png}\n\n\n\n\\\\\\\\includegraphics{/a/{w.x.y.z}.png}\n\n\n\n\\\\\\\\includegraphics{/{w.x.y.z}.png}\n\n\n\n\\\\\\\\includegraphics{/foo.bar/{x.yz}.png}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs image-empty-alt: image-empty-alt 1`] = `\n\"\\\\\\\\includegraphics{/xyz.png}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs image-in-link: image-in-link 1`] = `\n\"\\\\\\\\part{\\\\\\\\externalLink{\\\\\\\\includegraphics{https://img.shields.io/badge/unicorn-approved-ff69b4.svg}}{http://shields.io}}\n\n\n\\\\\\\\externalLink{\\\\\\\\includegraphics{https://img.shields.io/travis/wooorm/mdast.svg?style=flat}}{https://travis-ci.org/wooorm/mdast}\n\n\n\n\\\\\\\\externalLink{\\\\\\\\includegraphics{https://img.shields.io/badge/style-flat--squared-green.svg?style=flat-square}}{http://example.com}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs image-path-escape: image-path-escape 1`] = `\n\"\\\\\\\\includegraphics{a[b]\\\\\\\\ \\\\\\\\input{/etc/passwd\\\\\\\\image{[a](b)}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs image-with-pipe: image-with-pipe 1`] = `\n\"f|\n\n\"\n`;\n\nexports[`toLaTeX: remark specs images: images 1`] = `\n\"Lorem ipsum dolor sit \\\\\\\\includegraphics{http://amet.com/amet.jpeg}, consectetur adipiscing elit. Praesent dictum purus ullamcorper ligula semper pellentesque.\n\n\n\nNulla \\\\\\\\includegraphics{http://finibus.com/finibus.png} neque et diam rhoncus convallis. Nam dictum sapien nec sem ultrices fermentum. Nulla \\\\\\\\includegraphics{http://facilisi.com/facilisi.gif}. In et feugiat massa.\n\n\n\nDonec sed sodales metus, ut aliquet quam. Suspendisse nec ipsum risus. Interdum et malesuada fames ac ante ipsum primis in \\\\\\\\includegraphics{http://faucibus.com/faucibus.tiff}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs invalid-link-definition: invalid-link-definition 1`] = `\n\"Something[2-3]\n\n\"\n`;\n\nexports[`toLaTeX: remark specs lazy-blockquotes: lazy-blockquotes 1`] = `\n\"\\\\\\\\begin{Quotation}\nhi there\nbud\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs link-in-link: link-in-link 1`] = `\n\"\\\\\\\\part{\\\\\\\\externalLink{mailto:test@example.com}{http://shields.io}}\n\n\n\\\\\\\\externalLink{https://travis-ci.org/wooorm/mdast}{https://travis-ci.org/wooorm/mdast}\n\n\n\n\\\\\\\\externalLink{[](http://example.com \\\\\"An example\\\\\")}{http://example.com}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs link-spaces: link-spaces 1`] = `\n\"[alpha] (bravo\n\n\n\n\\\\\\\\includegraphics{undefined} (delta\n.com)\n\n\n\n[echo]\t(\\\\\\\\externalLink{http://foxtrot.golf}{http://foxtrot.golf})\n\n\n\n\\\\\\\\includegraphics{undefined}   (india.com/juliett)\n\n\"\n`;\n\nexports[`toLaTeX: remark specs link-whitespace: link-whitespace 1`] = `\n\"[alpha](\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo} charlie).\n\n\n\n[alpha](\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\tcharlie).\n\n\n\n[alpha](\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\ncharlie).\n\n\n\n\\\\\\\\includegraphics{undefined}(\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo} charlie).\n\n\n\n\\\\\\\\includegraphics{undefined}(\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\tcharlie).\n\n\n\n\\\\\\\\includegraphics{undefined}(\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\ncharlie).\n\n\n\n<\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo} charlie>.\n\n\n\n<\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\tcharlie>.\n\n\n\n<\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\ncharlie>.\n\n\n\n\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo} charlie.\n\n\n\n\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\tcharlie.\n\n\n\n\\\\\\\\externalLink{https://example.com?bravo}{https://example.com?bravo}\ncharlie.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs link-with-spaces: link-with-spaces 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world and some spaces.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world and some spaces.html}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links: links 1`] = `\n\"Lorem ipsum dolor sit \\\\\\\\externalLink{amet}{http://amet.com}, consectetur adipiscing elit. Praesent dictum purus ullamcorper ligula semper pellentesque.\n\n\n\nNulla \\\\\\\\externalLink{finibus}{http://finibus.com} neque et diam rhoncus convallis. Nam dictum sapien nec sem ultrices fermentum. Nulla \\\\\\\\externalLink{facilisi}{http://facilisi.com}. In et feugiat massa.\n\n\n\nDonec sed sodales metus, ut aliquet quam. Suspendisse nec ipsum risus. Interdum et malesuada fames ac ante ipsum primis in \\\\\\\\externalLink{faucibus}{http://faucibus.com}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-inline-style: links-inline-style 1`] = `\n\"Just a \\\\\\\\externalLink{URL}{/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{/url/}.\n\n\n\n[URL and title]( /url/has space ).\n\n\n\n[URL and title]( /url/has space/ \\\\\"url has space and title\\\\\").\n\n\n\n.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-reference-proto: links-reference-proto 1`] = `\n\"A \\\\\\\\hyperref[tostring]{primary}, \\\\\\\\hyperref[constructor]{secondary}, and \\\\\\\\hyperref[__proto__]{tertiary} link.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{tostring}\\\\\\\\externalLink{http://primary.com}{http://primary.com}}\n\n\\\\\\\\footnote{\\\\\\\\label{__proto__}\\\\\\\\externalLink{http://tertiary.com}{http://tertiary.com}}\n\n\\\\\\\\footnote{\\\\\\\\label{constructor}\\\\\\\\externalLink{http://secondary.com}{http://secondary.com}}\"\n`;\n\nexports[`toLaTeX: remark specs links-reference-style: links-reference-style 1`] = `\n\"Foo \\\\\\\\hyperref[1]{bar}.\n\n\n\nFoo \\\\\\\\hyperref[1]{bar}.\n\n\n\nFoo \\\\\\\\hyperref[1]{bar}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{/url/}{/url/}}\n\nWith \\\\\\\\hyperref[b]{embedded [brackets]}.\n\n\n\nIndented \\\\\\\\hyperref[once]{once}.\n\n\n\nIndented \\\\\\\\hyperref[twice]{twice}.\n\n\n\nIndented \\\\\\\\hyperref[thrice]{thrice}.\n\n\n\nIndented [four] times.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{once}\\\\\\\\externalLink{/url}{/url}}\n\n\\\\\\\\footnote{\\\\\\\\label{twice}\\\\\\\\externalLink{/url}{/url}}\n\n\\\\\\\\footnote{\\\\\\\\label{thrice}\\\\\\\\externalLink{/url}{/url}}\n\n\\\\\\\\begin{CodeBlock}{text}\n[four]: /url\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{b}\\\\\\\\externalLink{/url/}{/url/}}\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\hyperref[this]{this} should work\n\n\n\nSo should \\\\\\\\hyperref[this]{this}.\n\n\n\nAnd \\\\\\\\hyperref[this]{this}.\n\n\n\nAnd \\\\\\\\hyperref[this]{this}.\n\n\n\nAnd \\\\\\\\hyperref[this]{this}.\n\n\n\nBut not [that].\n\n\n\nNor [that].\n\n\n\nNor [that].\n\n\n\n[Something in brackets like \\\\\\\\hyperref[this]{this} should work]\n\n\n\n[Same with \\\\\\\\hyperref[this]{this}.]\n\n\n\nIn this case, \\\\\\\\externalLink{this}{/somethingelse/} points to something else.\n\n\n\nBackslashing should suppress [this] and [this].\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{this}\\\\\\\\externalLink{foo}{foo}}\n\n\\\\\\\\horizontalLine\n\n\n\nHere's one where the \\\\\\\\hyperref[link breaks]{link\nbreaks} across lines.\n\n\n\nHere's another where the \\\\\\\\hyperref[link breaks]{link\nbreaks} across lines, but with a line-ending space.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{link breaks}\\\\\\\\externalLink{/url/}{/url/}}\"\n`;\n\nexports[`toLaTeX: remark specs links-shortcut-references: links-shortcut-references 1`] = `\n\"This is the \\\\\\\\hyperref[simple case]{simple case}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{simple case}\\\\\\\\externalLink{/simple}{/simple}}\n\nThis one has a \\\\\\\\hyperref[line break]{line\nbreak}.\n\n\n\nThis one has a \\\\\\\\hyperref[line break]{line\nbreak} with a line-ending space.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{line break}\\\\\\\\externalLink{/foo}{/foo}}\n\n\\\\\\\\hyperref[that]{this} and the \\\\\\\\hyperref[other]{other}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{this}\\\\\\\\externalLink{/this}{/this}}\n\n\\\\\\\\footnote{\\\\\\\\label{that}\\\\\\\\externalLink{/that}{/that}}\n\n\\\\\\\\footnote{\\\\\\\\label{other}\\\\\\\\externalLink{/other}{/other}}\"\n`;\n\nexports[`toLaTeX: remark specs links-text-delimiters: links-text-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-text-empty: links-text-empty 1`] = `\n\"\\\\\\\\externalLink{}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-text-entity-delimiters: links-text-entity-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-text-escaped-delimiters: links-text-escaped-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\externalLink{Hello [world]!}{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\n\n\\\\\\\\includegraphics{./hello-world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-text-mismatched-delimiters: links-text-mismatched-delimiters 1`] = `\n\"[Hello \\\\\\\\externalLink{world!}{./hello-world.html}.\n\n\n\n[Hello \\\\\\\\externalLink{world!}{./hello-world.html}.\n\n\n\n![Hello \\\\\\\\externalLink{world!}{./hello-world.html}.\n\n\n\n![Hello \\\\\\\\externalLink{world!}{./hello-world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-double-quotes: links-title-double-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-double-quotes-delimiters: links-title-double-quotes-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-double-quotes-entity-delimiters: links-title-double-quotes-entity-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-double-quotes-escaped-delimiters: links-title-double-quotes-escaped-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-double-quotes-mismatched-delimiters: links-title-double-quotes-mismatched-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-empty-double-quotes: links-title-empty-double-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-empty-parentheses: links-title-empty-parentheses 1`] = `\n\"[Hello](./world.html ()).\n\n\n\n[Hello](<./world.html> ()).\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html ()).\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> ()).\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-empty-single-quotes: links-title-empty-single-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-parentheses: links-title-parentheses 1`] = `\n\"[Hello](./world.html (Hello World!)).\n\n\n\n[Hello](<./world.html> (Hello World!)).\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html (Hello World!)).\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> (Hello World!)).\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-single-quotes: links-title-single-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-single-quotes-delimiters: links-title-single-quotes-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-single-quotes-entity-delimiters: links-title-single-quotes-entity-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-single-quotes-escaped-delimiters: links-title-single-quotes-escaped-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-single-quotes-mismatched-delimiters: links-title-single-quotes-mismatched-delimiters 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\n\n\\\\\\\\includegraphics{./world.html}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-title-unclosed: links-title-unclosed 1`] = `\n\"[Hello](./world.html 'Hello\n\n\n\n[Hello](<./world.html> 'Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html 'Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> 'Hello\n\n\n\n[Hello](./world.html \\\\\"Hello\n\n\n\n[Hello](<./world.html> \\\\\"Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html \\\\\"Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> \\\\\"Hello\n\n\n\n[Hello](./world.html (Hello\n\n\n\n[Hello](<./world.html> (Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(./world.html (Hello\n\n\n\n\\\\\\\\includegraphics{undefined}(<./world.html> (Hello\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-url-empty: links-url-empty 1`] = `\n\".\n\n\n\n.\n\n\n\n\\\\\\\\includegraphics{}.\n\n\n\n\\\\\\\\includegraphics{}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-url-empty-title-double-quotes: links-url-empty-title-double-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{\\\\\"World!\\\\\"}.\n\n\n\n\\\\\\\\externalLink{Hello}{\\\\\"World!\\\\\"}.\n\n\n\n.\n\n\n\n\\\\\\\\includegraphics{\\\\\"World!\\\\\"}.\n\n\n\n\\\\\\\\includegraphics{\\\\\"World!\\\\\"}.\n\n\n\n\\\\\\\\includegraphics{}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-url-empty-title-parentheses: links-url-empty-title-parentheses 1`] = `\n\"\\\\\\\\externalLink{Hello}{(World!)}.\n\n\n\n\\\\\\\\externalLink{Hello}{(World!)}.\n\n\n\n[World](<> (World!)).\n\n\n\n\\\\\\\\includegraphics{(World!)}.\n\n\n\n\\\\\\\\includegraphics{(World!)}.\n\n\n\n\\\\\\\\includegraphics{undefined}(<> (World!)).\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-url-empty-title-single-quotes: links-url-empty-title-single-quotes 1`] = `\n\"\\\\\\\\externalLink{Hello}{'World!'}.\n\n\n\n\\\\\\\\externalLink{Hello}{'World!'}.\n\n\n\n.\n\n\n\n\\\\\\\\includegraphics{'World!'}.\n\n\n\n\\\\\\\\includegraphics{'World!'}.\n\n\n\n\\\\\\\\includegraphics{}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-url-entity-parentheses: links-url-entity-parentheses 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-url-escaped-parentheses: links-url-escaped-parentheses 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-url-mismatched-parentheses: links-url-mismatched-parentheses 1`] = `\n\"[Hello](./world(and-hello(world)).\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and-hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld}).\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)helloworld)}.\n\n\n\n\\\\\\\\includegraphics{undefined}(./world(and-hello(world)).\n\n\n\n\\\\\\\\includegraphics{./world(and-hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld}).\n\n\n\n\\\\\\\\includegraphics{./world(and)helloworld)}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-url-nested-parentheses: links-url-nested-parentheses 1`] = `\n\"\\\\\\\\externalLink{Hello}{./world(and)hello(world)}.\n\n\n\n\\\\\\\\externalLink{Hello}{./world(and)hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)hello(world)}.\n\n\n\n\\\\\\\\includegraphics{./world(and)hello(world)}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-url-new-line: links-url-new-line 1`] = `\n\"[Hello](./wo\nrld.html).\n\n\n\n\\\\\\\\externalLink{Hello}{./wo\nrld.html}.\n\n\n\n\\\\\\\\includegraphics{undefined}(./wo\nrld.png).\n\n\n\n\\\\\\\\includegraphics{./wo\nrld.png}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-url-unclosed: links-url-unclosed 1`] = `\n\"[Hello](\n\n\n\n[World](<\n\n\n\n\\\\\\\\includegraphics{undefined}(\n\n\n\n\\\\\\\\includegraphics{undefined}(<\n\n\"\n`;\n\nexports[`toLaTeX: remark specs links-url-white-space: links-url-white-space 1`] = `\n\"[Hello](./wo rld.html).\n\n\n\n\\\\\\\\externalLink{Hello}{./wo rld.html}.\n\n\n\n\\\\\\\\includegraphics{undefined}(./wo rld.png).\n\n\n\n\\\\\\\\includegraphics{./wo rld.png}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs list: list 1`] = `\n\"\\\\\\\\part{List bullets}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax One:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Nested one;\n\\\\\\\\item\\\\\\\\relax Nested two:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Nested three.\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax Two;\n\\\\\\\\item\\\\\\\\relax Three.\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs list-after-list: list-after-list 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{enumerate}\n\"\n`;\n\nexports[`toLaTeX: remark specs list-and-code: list-and-code 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax This is a list item\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is code\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs list-continuation: list-continuation 1`] = `\n\"\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\begin{CodeBlock}{js}\ncode();\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\hyperref[foo]{foo}\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\footnote{\\\\\\\\label{foo}\\\\\\\\externalLink{http://google.com}{http://google.com}}\"\n`;\n\nexports[`toLaTeX: remark specs list-indentation: list-indentation 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Hello 1a\n\nWorld 1a.\n\\\\\\\\item\\\\\\\\relax Hello 1b\n\nWorld 1b.\n\\\\\\\\item\\\\\\\\relax Hello 2a\n\nWorld 2a.\n\\\\\\\\item\\\\\\\\relax Hello 2b\n\nWorld 2b.\n\\\\\\\\item\\\\\\\\relax Hello 3a\n\nWorld 3a.\n\\\\\\\\item\\\\\\\\relax Hello 3b\n\nWorld 3b.\n\\\\\\\\item\\\\\\\\relax Hello 4a\n\nWorld 4a.\n\\\\\\\\item\\\\\\\\relax Hello 4b\n\nWorld 4b.\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nHello 5a\n\\\\\\\\end{CodeBlock}\n\nWorld 5a.\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nHello 5b\n\nWorld 5b.\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs list-item-empty: list-item-empty 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax foo\n\\\\\\\\item\\\\\\\\relax \n\\\\\\\\item\\\\\\\\relax bar\n\\\\\\\\item\\\\\\\\relax foo\n\\\\\\\\item\\\\\\\\relax \n\\\\\\\\item\\\\\\\\relax bar\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs list-item-empty-with-white-space: list-item-empty-with-white-space 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs list-item-indent: list-item-indent 1`] = `\n\"\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\n\\\\\\\\end{enumerate}\n\n\n<!--  -->\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\n\\\\\\\\end{enumerate}\n\n\n<!--  -->\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\n\\\\\\\\end{enumerate}\n\n\n<!--  -->\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\nfoo bar baz.\n\\\\\\\\end{enumerate}\n\n\n<!--  -->\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\nfoo bar baz.\n\\\\\\\\end{enumerate}\n\n\n<!--  -->\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\nfoo bar baz.\n\\\\\\\\end{enumerate}\n\n\n<!--  -->\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\n\\\\\\\\end{itemize}\n\n\n<!--  -->\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax foo bar baz.\nfoo bar baz.\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs list-item-newline: list-item-newline 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Foo\n\\\\\\\\item\\\\\\\\relax Bar\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs list-item-text: list-item-text 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item1\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item2\n\\\\\\\\end{itemize}\ntext\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs list-ordered: list-ordered 1`] = `\n\"\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo;\n\\\\\\\\item\\\\\\\\relax bar;\n\\\\\\\\item\\\\\\\\relax baz.\n\\\\\\\\end{enumerate}\n\"\n`;\n\nexports[`toLaTeX: remark specs lists-with-code-and-rules: lists-with-code-and-rules 1`] = `\n\"\\\\\\\\chapter{foo}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax bar:\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax one\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax two\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax three\n\\\\\\\\item\\\\\\\\relax four\n\\\\\\\\item\\\\\\\\relax five\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\n\\\\\\\\item\\\\\\\\relax foo:\n\n\\\\\\\\begin{CodeBlock}{text}\nline 1\nline 2\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item\\\\\\\\relax foo:\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo \\\\\\\\texttt{bar} bar:\n\n\\\\\\\\begin{CodeBlock}{erb}\nsome code here\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item\\\\\\\\relax foo \\\\\\\\texttt{bar} bar:\n\n\\\\\\\\begin{CodeBlock}{erb}\nfoo\n---\nbar\n---\nfoo\nbar\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item\\\\\\\\relax foo \\\\\\\\texttt{bar} bar:\n\n\\\\\\\\begin{CodeBlock}{html}\n---\nfoo\nfoo\n---\nbar\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item\\\\\\\\relax foo \\\\\\\\texttt{bar} bar:\n\n\\\\\\\\begin{CodeBlock}{text}\nfoo\n---\nbar\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item\\\\\\\\relax foo\n\\\\\\\\end{enumerate}\n\\\\\\\\end{enumerate}\n\"\n`;\n\nexports[`toLaTeX: remark specs loose-lists: loose-lists 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\nworld\n\nhow\nare\n\\\\\\\\item\\\\\\\\relax you\n\\\\\\\\end{itemize}\n\n\nbetter behavior:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax world\nhow\n\nare\nyou\n\\\\\\\\item\\\\\\\\relax today\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax hi\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\item\\\\\\\\relax world\n\\\\\\\\item\\\\\\\\relax hi\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\item\\\\\\\\relax world\n\\\\\\\\item\\\\\\\\relax hi\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\item\\\\\\\\relax world\n\nhow\n\\\\\\\\item\\\\\\\\relax hi\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\item\\\\\\\\relax world\n\\\\\\\\item\\\\\\\\relax how\nare\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello\n\\\\\\\\item\\\\\\\\relax world\n\\\\\\\\item\\\\\\\\relax how\nare\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs main: main 1`] = `\n\"\\\\\\\\footnote{\\\\\\\\label{test}\\\\\\\\externalLink{http://google.com/}{http://google.com/}}\n\n\\\\\\\\part{A heading}\n\n\nJust a note, I've found that I can't test my markdown parser vs others.\nFor example, both markdown.js and showdown code blocks in lists wrong. They're\nalso completely \\\\\\\\hyperref[test]{inconsistent} with regards to paragraphs in list items.\n\n\n\nA link. Not anymore.\n\n\n\n<aside>This will make me fail the test because\nmarkdown.js doesnt acknowledge arbitrary html blocks =/</aside>\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax List Item 1\n\\\\\\\\item\\\\\\\\relax List Item 2\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax New List Item 1\nHi, this is a list item.\n\\\\\\\\item\\\\\\\\relax New List Item 2\nAnother item\nCode goes here.\nLots of it...\n\\\\\\\\item\\\\\\\\relax New List Item 3\nThe last item\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax List Item 3\nThe final item.\n\\\\\\\\item\\\\\\\\relax List Item 4\nThe real final item.\n\\\\\\\\end{itemize}\n\n\nParagraph.\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax bq Item 1\n\\\\\\\\item\\\\\\\\relax bq Item 2\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax New bq Item 1\n\\\\\\\\item\\\\\\\\relax New bq Item 2\nText here\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\nAnother blockquote!\nI really need to get\nmore creative with\nmockup text..\nmarkdown.js breaks here again\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\chapter{Another Heading}\n\n\nHello \\\\\\\\textit{world}. Here is a \\\\\\\\externalLink{link}{//hello}.\nAnd an image \\\\\\\\includegraphics{src}.\nAnd an image with an empty alt attribute \\\\\\\\includegraphics{src}.\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nCode goes here.\nLots of it...\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs markdown-documentation-basics: markdown-documentation-basics 1`] = `\n\"\\\\\\\\part{Markdown: Basics}\n\n\n<ul id=\\\\\"ProjectSubmenu\\\\\">\n    <li><a href=\\\\\"/projects/markdown/\\\\\" title=\\\\\"Markdown Project Page\\\\\">Main</a></li>\n    <li><a class=\\\\\"selected\\\\\" title=\\\\\"Markdown Basics\\\\\">Basics</a></li>\n    <li><a href=\\\\\"/projects/markdown/syntax\\\\\" title=\\\\\"Markdown Syntax Documentation\\\\\">Syntax</a></li>\n    <li><a href=\\\\\"/projects/markdown/license\\\\\" title=\\\\\"Pricing and License Information\\\\\">License</a></li>\n    <li><a href=\\\\\"/projects/markdown/dingus\\\\\" title=\\\\\"Online Markdown Web Form\\\\\">Dingus</a></li>\n</ul>\n\n\\\\\\\\chapter{Getting the Gist of Markdown's Formatting Syntax}\n\n\nThis page offers a brief overview of what it's like to use Markdown.\nThe \\\\\\\\hyperref[s]{syntax page} provides complete, detailed documentation for\nevery feature, but Markdown should be very easy to pick up simply by\nlooking at a few examples of it in action. The examples on this page\nare written in a before/after style, showing example syntax and the\nHTML output produced by Markdown.\n\n\n\nIt's also helpful to simply try Markdown out; the \\\\\\\\hyperref[d]{Dingus} is a\nweb application that allows you type your own Markdown-formatted text\nand translate it to XHTML.\n\n\n\n\\\\\\\\textbf{Note:} This document is itself written using Markdown; you\ncan \\\\\\\\hyperref[src]{see the source for it by adding '.text' to the URL}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{s}\\\\\\\\externalLink{/projects/markdown/syntax}{/projects/markdown/syntax}}\n\n\\\\\\\\footnote{\\\\\\\\label{d}\\\\\\\\externalLink{/projects/markdown/dingus}{/projects/markdown/dingus}}\n\n\\\\\\\\footnote{\\\\\\\\label{src}\\\\\\\\externalLink{/projects/markdown/basics.text}{/projects/markdown/basics.text}}\n\n\\\\\\\\chapter{Paragraphs, Headers, Blockquotes}\n\n\nA paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing spaces or tabs is considered\nblank.) Normal paragraphs should not be intended with spaces or tabs.\n\n\n\nMarkdown offers two styles of headers: \\\\\\\\textit{Setext} and \\\\\\\\textit{atx}.\nSetext-style headers for \\\\\\\\texttt{<h1>} and \\\\\\\\texttt{<h2>} are created by\n\\\\\"underlining\\\\\" with equal signs (\\\\\\\\texttt{=}) and hyphens (\\\\\\\\texttt{-}), respectively.\nTo create an atx-style header, you put 1-6 hash marks (\\\\\\\\texttt{\\\\\\\\#}) at the\nbeginning of the line -- the number of hashes equals the resulting\nHTML header level.\n\n\n\nBlockquotes are indicated using email-style '\\\\\\\\texttt{>}' angle brackets.\n\n\n\nMarkdown:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nA First Level Header\n====================\n\nA Second Level Header\n---------------------\n\nNow is the time for all good men to come to\nthe aid of their country. This is just a\nregular paragraph.\n\nThe quick brown fox jumped over the lazy\ndog's back.\n\n### Header 3\n\n> This is a blockquote.\n> \n> This is the second paragraph in the blockquote.\n>\n> ## This is an H2 in a blockquote\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<h1>A First Level Header</h1>\n\n<h2>A Second Level Header</h2>\n\n<p>Now is the time for all good men to come to\nthe aid of their country. This is just a\nregular paragraph.</p>\n\n<p>The quick brown fox jumped over the lazy\ndog's back.</p>\n\n<h3>Header 3</h3>\n\n<blockquote>\n    <p>This is a blockquote.</p>\n    \n    <p>This is the second paragraph in the blockquote.</p>\n    \n    <h2>This is an H2 in a blockquote</h2>\n</blockquote>\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\section{Phrase Emphasis}\n\n\nMarkdown uses asterisks and underscores to indicate spans of emphasis.\n\n\n\nMarkdown:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nSome of these words *are emphasized*.\nSome of these words _are emphasized also_.\n\nUse two asterisks for **strong emphasis**.\nOr, if you prefer, __use two underscores instead__.\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>Some of these words <em>are emphasized</em>.\nSome of these words <em>are emphasized also</em>.</p>\n\n<p>Use two asterisks for <strong>strong emphasis</strong>.\nOr, if you prefer, <strong>use two underscores instead</strong>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\chapter{Lists}\n\n\nUnordered (bulleted) lists use asterisks, pluses, and hyphens (\\\\\\\\texttt{*},\n\\\\\\\\texttt{+}, and \\\\\\\\texttt{-}) as list markers. These three markers are\ninterchangable; this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   Candy.\n*   Gum.\n*   Booze.\n\\\\\\\\end{CodeBlock}\n\n\n\nthis:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n+   Candy.\n+   Gum.\n+   Booze.\n\\\\\\\\end{CodeBlock}\n\n\n\nand this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n-   Candy.\n-   Gum.\n-   Booze.\n\\\\\\\\end{CodeBlock}\n\n\n\nall produce the same output:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<ul>\n<li>Candy.</li>\n<li>Gum.</li>\n<li>Booze.</li>\n</ul>\n\\\\\\\\end{CodeBlock}\n\n\n\nOrdered (numbered) lists use regular numbers, followed by periods, as\nlist markers:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1.  Red\n2.  Green\n3.  Blue\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<ol>\n<li>Red</li>\n<li>Green</li>\n<li>Blue</li>\n</ol>\n\\\\\\\\end{CodeBlock}\n\n\n\nIf you put blank lines between items, you'll get \\\\\\\\texttt{<p>} tags for the\nlist item text. You can create multi-paragraph list items by indenting\nthe paragraphs by 4 spaces or 1 tab:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   A list item.\n\n    With multiple paragraphs.\n\n*   Another item in the list.\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<ul>\n<li><p>A list item.</p>\n<p>With multiple paragraphs.</p></li>\n<li><p>Another item in the list.</p></li>\n</ul>\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\section{Links}\n\n\nMarkdown supports two styles for creating links: \\\\\\\\textit{inline} and\n\\\\\\\\textit{reference}. With both styles, you use square brackets to delimit the\ntext you want to turn into a link.\n\n\n\nInline-style links use parentheses immediately after the link text.\nFor example:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is an [example link](http://example.com/).\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>This is an <a href=\\\\\"http://example.com/\\\\\">\nexample link</a>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nOptionally, you may include a title attribute in the parentheses:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is an [example link](http://example.com/ \\\\\"With a Title\\\\\").\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>This is an <a href=\\\\\"http://example.com/\\\\\" title=\\\\\"With a Title\\\\\">\nexample link</a>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nReference-style links allow you to refer to your links by names, which\nyou define elsewhere in your document:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nI get 10 times more traffic from [Google][1] than from\n[Yahoo][2] or [MSN][3].\n\n[1]: http://google.com/        \\\\\"Google\\\\\"\n[2]: http://search.yahoo.com/  \\\\\"Yahoo Search\\\\\"\n[3]: http://search.msn.com/    \\\\\"MSN Search\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>I get 10 times more traffic from <a href=\\\\\"http://google.com/\\\\\"\ntitle=\\\\\"Google\\\\\">Google</a> than from <a href=\\\\\"http://search.yahoo.com/\\\\\"\ntitle=\\\\\"Yahoo Search\\\\\">Yahoo</a> or <a href=\\\\\"http://search.msn.com/\\\\\"\ntitle=\\\\\"MSN Search\\\\\">MSN</a>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nThe title attribute is optional. Link names may contain letters,\nnumbers and spaces, but are \\\\\\\\textit{not} case sensitive:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nI start my morning with a cup of coffee and\n[The New York Times][NY Times].\n\n[ny times]: http://www.nytimes.com/\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>I start my morning with a cup of coffee and\n<a href=\\\\\"http://www.nytimes.com/\\\\\">The New York Times</a>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\section{Images}\n\n\nImage syntax is very much like link syntax.\n\n\n\nInline (titles are optional):\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n![alt text](/path/to/img.jpg \\\\\"Title\\\\\")\n\\\\\\\\end{CodeBlock}\n\n\n\nReference-style:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n![alt text][id]\n\n[id]: /path/to/img.jpg \\\\\"Title\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nBoth of the above examples produce the same output:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<img src=\\\\\"/path/to/img.jpg\\\\\" alt=\\\\\"alt text\\\\\" title=\\\\\"Title\\\\\" />\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\section{Code}\n\n\nIn a regular paragraph, you can create code span by wrapping text in\nbacktick quotes. Any ampersands (\\\\\\\\texttt{\\\\\\\\&}) and angle brackets (\\\\\\\\texttt{<} or\n\\\\\\\\texttt{>}) will automatically be translated into HTML entities. This makes\nit easy to use Markdown to write about HTML example code:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nI strongly recommend against using any \\`<blink>\\` tags.\n\nI wish SmartyPants used named entities like \\`&mdash;\\`\ninstead of decimal-encoded entites like \\`&#8212;\\`.\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>I strongly recommend against using any\n<code>&lt;blink&gt;</code> tags.</p>\n\n<p>I wish SmartyPants used named entities like\n<code>&amp;mdash;</code> instead of decimal-encoded\nentites like <code>&amp;#8212;</code>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nTo specify an entire block of pre-formatted code, indent every line of\nthe block by 4 spaces or 1 tab. Just like with code spans, \\\\\\\\texttt{\\\\\\\\&}, \\\\\\\\texttt{<},\nand \\\\\\\\texttt{>} characters will be escaped automatically.\n\n\n\nMarkdown:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nIf you want your page to validate under XHTML 1.0 Strict,\nyou've got to put paragraph tags in your blockquotes:\n\n    <blockquote>\n        <p>For example.</p>\n    </blockquote>\n\\\\\\\\end{CodeBlock}\n\n\n\nOutput:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>If you want your page to validate under XHTML 1.0 Strict,\nyou've got to put paragraph tags in your blockquotes:</p>\n\n<pre><code>&lt;blockquote&gt;\n    &lt;p&gt;For example.&lt;/p&gt;\n&lt;/blockquote&gt;\n</code></pre>\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs markdown-documentation-syntax: markdown-documentation-syntax 1`] = `\n\"\\\\\\\\part{Markdown: Syntax}\n\n\n<ul id=\\\\\"ProjectSubmenu\\\\\">\n    <li><a href=\\\\\"/projects/markdown/\\\\\" title=\\\\\"Markdown Project Page\\\\\">Main</a></li>\n    <li><a href=\\\\\"/projects/markdown/basics\\\\\" title=\\\\\"Markdown Basics\\\\\">Basics</a></li>\n    <li><a class=\\\\\"selected\\\\\" title=\\\\\"Markdown Syntax Documentation\\\\\">Syntax</a></li>\n    <li><a href=\\\\\"/projects/markdown/license\\\\\" title=\\\\\"Pricing and License Information\\\\\">License</a></li>\n    <li><a href=\\\\\"/projects/markdown/dingus\\\\\" title=\\\\\"Online Markdown Web Form\\\\\">Dingus</a></li>\n</ul>\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Overview}{\\\\\\\\#overview}\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Philosophy}{\\\\\\\\#philosophy}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Inline HTML}{\\\\\\\\#html}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Automatic Escaping for Special Characters}{\\\\\\\\#autoescape}\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Block Elements}{\\\\\\\\#block}\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Paragraphs and Line Breaks}{\\\\\\\\#p}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Headers}{\\\\\\\\#header}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Blockquotes}{\\\\\\\\#blockquote}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Lists}{\\\\\\\\#list}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Code Blocks}{\\\\\\\\#precode}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Horizontal Rules}{\\\\\\\\#hr}\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Span Elements}{\\\\\\\\#span}\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Links}{\\\\\\\\#link}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Emphasis}{\\\\\\\\#em}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Code}{\\\\\\\\#code}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Images}{\\\\\\\\#img}\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Miscellaneous}{\\\\\\\\#misc}\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Backslash Escapes}{\\\\\\\\#backslash}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{Automatic Links}{\\\\\\\\#autolink}\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\textbf{Note:} This document is itself written using Markdown; you\ncan \\\\\\\\hyperref[src]{see the source for it by adding '.text' to the URL}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{src}\\\\\\\\externalLink{/projects/markdown/syntax.text}{/projects/markdown/syntax.text}}\n\n\\\\\\\\horizontalLine\n\n\n\n<h2 id=\\\\\"overview\\\\\">Overview</h2>\n\n<h3 id=\\\\\"philosophy\\\\\">Philosophy</h3>\n\nMarkdown is intended to be as easy-to-read and easy-to-write as is feasible.\n\n\n\nReadability, however, is emphasized above all else. A Markdown-formatted\ndocument should be publishable as-is, as plain text, without looking\nlike it's been marked up with tags or formatting instructions. While\nMarkdown's syntax has been influenced by several existing text-to-HTML\nfilters -- including \\\\\\\\hyperref[1]{Setext}, \\\\\\\\hyperref[2]{atx}, \\\\\\\\hyperref[3]{Textile}, \\\\\\\\hyperref[4]{reStructuredText},\n\\\\\\\\hyperref[5]{Grutatext}, and \\\\\\\\hyperref[6]{EtText} -- the single biggest source of\ninspiration for Markdown's syntax is the format of plain text email.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{http://docutils.sourceforge.net/mirror/setext.html}{http://docutils.sourceforge.net/mirror/setext.html}}\n\n\\\\\\\\footnote{\\\\\\\\label{2}\\\\\\\\externalLink{http://www.aaronsw.com/2002/atx/}{http://www.aaronsw.com/2002/atx/}}\n\n\\\\\\\\footnote{\\\\\\\\label{3}\\\\\\\\externalLink{http://textism.com/tools/textile/}{http://textism.com/tools/textile/}}\n\n\\\\\\\\footnote{\\\\\\\\label{4}\\\\\\\\externalLink{http://docutils.sourceforge.net/rst.html}{http://docutils.sourceforge.net/rst.html}}\n\n\\\\\\\\footnote{\\\\\\\\label{5}\\\\\\\\externalLink{http://www.triptico.com/software/grutatxt.html}{http://www.triptico.com/software/grutatxt.html}}\n\n\\\\\\\\footnote{\\\\\\\\label{6}\\\\\\\\externalLink{http://ettext.taint.org/doc/}{http://ettext.taint.org/doc/}}\n\nTo this end, Markdown's syntax is comprised entirely of punctuation\ncharacters, which punctuation characters have been carefully chosen so\nas to look like what they mean. E.g., asterisks around a word actually\nlook like *emphasis*. Markdown lists look like, well, lists. Even\nblockquotes look like quoted passages of text, assuming you've ever\nused email.\n\n\n\n<h3 id=\\\\\"html\\\\\">Inline HTML</h3>\n\nMarkdown's syntax is intended for one purpose: to be used as a\nformat for \\\\\\\\textit{writing} for the web.\n\n\n\nMarkdown is not a replacement for HTML, or even close to it. Its\nsyntax is very small, corresponding only to a very small subset of\nHTML tags. The idea is \\\\\\\\textit{not} to create a syntax that makes it easier\nto insert HTML tags. In my opinion, HTML tags are already easy to\ninsert. The idea for Markdown is to make it easy to read, write, and\nedit prose. HTML is a \\\\\\\\textit{publishing} format; Markdown is a \\\\\\\\textit{writing}\nformat. Thus, Markdown's formatting syntax only addresses issues that\ncan be conveyed in plain text.\n\n\n\nFor any markup that is not covered by Markdown's syntax, you simply\nuse HTML itself. There's no need to preface it or delimit it to\nindicate that you're switching from Markdown to HTML; you just use\nthe tags.\n\n\n\nThe only restrictions are that block-level HTML elements -- e.g. \\\\\\\\texttt{<div>},\n\\\\\\\\texttt{<table>}, \\\\\\\\texttt{<pre>}, \\\\\\\\texttt{<p>}, etc. -- must be separated from surrounding\ncontent by blank lines, and the start and end tags of the block should\nnot be indented with tabs or spaces. Markdown is smart enough not\nto add extra (unwanted) \\\\\\\\texttt{<p>} tags around HTML block-level tags.\n\n\n\nFor example, to add an HTML table to a Markdown article:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is a regular paragraph.\n\n<table>\n    <tr>\n        <td>Foo</td>\n    </tr>\n</table>\n\nThis is another regular paragraph.\n\\\\\\\\end{CodeBlock}\n\n\n\nNote that Markdown formatting syntax is not processed within block-level\nHTML tags. E.g., you can't use Markdown-style \\\\\\\\texttt{*emphasis*} inside an\nHTML block.\n\n\n\nSpan-level HTML tags -- e.g. \\\\\\\\texttt{<span>}, \\\\\\\\texttt{<cite>}, or \\\\\\\\texttt{<del>} -- can be\nused anywhere in a Markdown paragraph, list item, or header. If you\nwant, you can even use HTML tags instead of Markdown formatting; e.g. if\nyou'd prefer to use HTML \\\\\\\\texttt{<a>} or \\\\\\\\texttt{<img>} tags instead of Markdown's\nlink or image syntax, go right ahead.\n\n\n\nUnlike block-level HTML tags, Markdown syntax \\\\\\\\textit{is} processed within\nspan-level tags.\n\n\n\n<h3 id=\\\\\"autoescape\\\\\">Automatic Escaping for Special Characters</h3>\n\nIn HTML, there are two characters that demand special treatment: \\\\\\\\texttt{<}\nand \\\\\\\\texttt{\\\\\\\\&}. Left angle brackets are used to start tags; ampersands are\nused to denote HTML entities. If you want to use them as literal\ncharacters, you must escape them as entities, e.g. \\\\\\\\texttt{\\\\\\\\&lt;}, and\n\\\\\\\\texttt{\\\\\\\\&amp;}.\n\n\n\nAmpersands in particular are bedeviling for web writers. If you want to\nwrite about 'AT\\\\\\\\&T', you need to write '\\\\\\\\texttt{AT\\\\\\\\&amp;T}'. You even need to\nescape ampersands within URLs. Thus, if you want to link to:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nhttp://images.google.com/images?num=30&q=larry+bird\n\\\\\\\\end{CodeBlock}\n\n\n\nyou need to encode the URL as:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nhttp://images.google.com/images?num=30&amp;q=larry+bird\n\\\\\\\\end{CodeBlock}\n\n\n\nin your anchor tag \\\\\\\\texttt{href} attribute. Needless to say, this is easy to\nforget, and is probably the single most common source of HTML validation\nerrors in otherwise well-marked-up web sites.\n\n\n\nMarkdown allows you to use these characters naturally, taking care of\nall the necessary escaping for you. If you use an ampersand as part of\nan HTML entity, it remains unchanged; otherwise it will be translated\ninto \\\\\\\\texttt{\\\\\\\\&amp;}.\n\n\n\nSo, if you want to include a copyright symbol in your article, you can write:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n&copy;\n\\\\\\\\end{CodeBlock}\n\n\n\nand Markdown will leave it alone. But if you write:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nAT&T\n\\\\\\\\end{CodeBlock}\n\n\n\nMarkdown will translate it to:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nAT&amp;T\n\\\\\\\\end{CodeBlock}\n\n\n\nSimilarly, because Markdown supports \\\\\\\\externalLink{inline HTML}{\\\\\\\\#html}, if you use\nangle brackets as delimiters for HTML tags, Markdown will treat them as\nsuch. But if you write:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n4 < 5\n\\\\\\\\end{CodeBlock}\n\n\n\nMarkdown will translate it to:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n4 &lt; 5\n\\\\\\\\end{CodeBlock}\n\n\n\nHowever, inside Markdown code spans and blocks, angle brackets and\nampersands are \\\\\\\\textit{always} encoded automatically. This makes it easy to use\nMarkdown to write about HTML code. (As opposed to raw HTML, which is a\nterrible format for writing about HTML syntax, because every single \\\\\\\\texttt{<}\nand \\\\\\\\texttt{\\\\\\\\&} in your example code needs to be escaped.)\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n<h2 id=\\\\\"block\\\\\">Block Elements</h2>\n\n<h3 id=\\\\\"p\\\\\">Paragraphs and Line Breaks</h3>\n\nA paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing but spaces or tabs is considered\nblank.) Normal paragraphs should not be intended with spaces or tabs.\n\n\n\nThe implication of the \\\\\"one or more consecutive lines of text\\\\\" rule is\nthat Markdown supports \\\\\"hard-wrapped\\\\\" text paragraphs. This differs\nsignificantly from most other text-to-HTML formatters (including Movable\nType's \\\\\"Convert Line Breaks\\\\\" option) which translate every line break\ncharacter in a paragraph into a \\\\\\\\texttt{<br />} tag.\n\n\n\nWhen you \\\\\\\\textit{do} want to insert a \\\\\\\\texttt{<br />} break tag using Markdown, you\nend a line with two or more spaces, then type return.\n\n\n\nYes, this takes a tad more effort to create a \\\\\\\\texttt{<br />}, but a simplistic\n\\\\\"every line break is a \\\\\\\\texttt{<br />}\\\\\" rule wouldn't work for Markdown.\nMarkdown's email-style \\\\\\\\hyperref[bq]{blockquoting} and multi-paragraph \\\\\\\\hyperref[l]{list items}\nwork best -- and look better -- when you format them with hard breaks.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{bq}\\\\\\\\externalLink{\\\\\\\\#blockquote}{\\\\\\\\#blockquote}}\n\n\\\\\\\\footnote{\\\\\\\\label{l}\\\\\\\\externalLink{\\\\\\\\#list}{\\\\\\\\#list}}\n\n<h3 id=\\\\\"header\\\\\">Headers</h3>\n\nMarkdown supports two styles of headers, \\\\\\\\hyperref[1]{Setext} and \\\\\\\\hyperref[2]{atx}.\n\n\n\nSetext-style headers are \\\\\"underlined\\\\\" using equal signs (for first-level\nheaders) and dashes (for second-level headers). For example:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is an H1\n=============\n\nThis is an H2\n-------------\n\\\\\\\\end{CodeBlock}\n\n\n\nAny number of underlining \\\\\\\\texttt{=}'s or \\\\\\\\texttt{-}'s will work.\n\n\n\nAtx-style headers use 1-6 hash characters at the start of the line,\ncorresponding to header levels 1-6. For example:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n# This is an H1\n\n## This is an H2\n\n###### This is an H6\n\\\\\\\\end{CodeBlock}\n\n\n\nOptionally, you may \\\\\"close\\\\\" atx-style headers. This is purely\ncosmetic -- you can use this if you think it looks better. The\nclosing hashes don't even need to match the number of hashes\nused to open the header. (The number of opening hashes\ndetermines the header level.) :\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n# This is an H1 #\n\n## This is an H2 ##\n\n### This is an H3 ######\n\\\\\\\\end{CodeBlock}\n\n\n\n<h3 id=\\\\\"blockquote\\\\\">Blockquotes</h3>\n\nMarkdown uses email-style \\\\\\\\texttt{>} characters for blockquoting. If you're\nfamiliar with quoting passages of text in an email message, then you\nknow how to create a blockquote in Markdown. It looks best if you hard\nwrap the text and put a \\\\\\\\texttt{>} before every line:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n> \n> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n> id sem consectetuer libero luctus adipiscing.\n\\\\\\\\end{CodeBlock}\n\n\n\nMarkdown allows you to be lazy and only put the \\\\\\\\texttt{>} before the first\nline of a hard-wrapped paragraph:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\nconsectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\nVestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n\n> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\nid sem consectetuer libero luctus adipiscing.\n\\\\\\\\end{CodeBlock}\n\n\n\nBlockquotes can be nested (i.e. a blockquote-in-a-blockquote) by\nadding additional levels of \\\\\\\\texttt{>}:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n> This is the first level of quoting.\n>\n> > This is nested blockquote.\n>\n> Back to the first level.\n\\\\\\\\end{CodeBlock}\n\n\n\nBlockquotes can contain other Markdown elements, including headers, lists,\nand code blocks:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n> ## This is a header.\n> \n> 1.   This is the first list item.\n> 2.   This is the second list item.\n> \n> Here's some example code:\n> \n>     return shell_exec(\\\\\"echo $input | $markdown_script\\\\\");\n\\\\\\\\end{CodeBlock}\n\n\n\nAny decent text editor should make email-style quoting easy. For\nexample, with BBEdit, you can make a selection and choose Increase\nQuote Level from the Text menu.\n\n\n\n<h3 id=\\\\\"list\\\\\">Lists</h3>\n\nMarkdown supports ordered (numbered) and unordered (bulleted) lists.\n\n\n\nUnordered lists use asterisks, pluses, and hyphens -- interchangably\n-- as list markers:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   Red\n*   Green\n*   Blue\n\\\\\\\\end{CodeBlock}\n\n\n\nis equivalent to:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n+   Red\n+   Green\n+   Blue\n\\\\\\\\end{CodeBlock}\n\n\n\nand:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n-   Red\n-   Green\n-   Blue\n\\\\\\\\end{CodeBlock}\n\n\n\nOrdered lists use numbers followed by periods:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1.  Bird\n2.  McHale\n3.  Parish\n\\\\\\\\end{CodeBlock}\n\n\n\nIt's important to note that the actual numbers you use to mark the\nlist have no effect on the HTML output Markdown produces. The HTML\nMarkdown produces from the above list is:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<ol>\n<li>Bird</li>\n<li>McHale</li>\n<li>Parish</li>\n</ol>\n\\\\\\\\end{CodeBlock}\n\n\n\nIf you instead wrote the list in Markdown like this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1.  Bird\n1.  McHale\n1.  Parish\n\\\\\\\\end{CodeBlock}\n\n\n\nor even:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n3. Bird\n1. McHale\n8. Parish\n\\\\\\\\end{CodeBlock}\n\n\n\nyou'd get the exact same HTML output. The point is, if you want to,\nyou can use ordinal numbers in your ordered Markdown lists, so that\nthe numbers in your source match the numbers in your published HTML.\nBut if you want to be lazy, you don't have to.\n\n\n\nIf you do use lazy list numbering, however, you should still start the\nlist with the number 1. At some point in the future, Markdown may support\nstarting ordered lists at an arbitrary number.\n\n\n\nList markers typically start at the left margin, but may be indented by\nup to three spaces. List markers must be followed by one or more spaces\nor a tab.\n\n\n\nTo make lists look nice, you can wrap items with hanging indents:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n    Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\n    viverra nec, fringilla in, laoreet vitae, risus.\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n    Suspendisse id sem consectetuer libero luctus adipiscing.\n\\\\\\\\end{CodeBlock}\n\n\n\nBut if you want to be lazy, you don't have to:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\nAliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\nviverra nec, fringilla in, laoreet vitae, risus.\n*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\nSuspendisse id sem consectetuer libero luctus adipiscing.\n\\\\\\\\end{CodeBlock}\n\n\n\nIf list items are separated by blank lines, Markdown will wrap the\nitems in \\\\\\\\texttt{<p>} tags in the HTML output. For example, this input:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   Bird\n*   Magic\n\\\\\\\\end{CodeBlock}\n\n\n\nwill turn into:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<ul>\n<li>Bird</li>\n<li>Magic</li>\n</ul>\n\\\\\\\\end{CodeBlock}\n\n\n\nBut this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   Bird\n\n*   Magic\n\\\\\\\\end{CodeBlock}\n\n\n\nwill turn into:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<ul>\n<li><p>Bird</p></li>\n<li><p>Magic</p></li>\n</ul>\n\\\\\\\\end{CodeBlock}\n\n\n\nList items may consist of multiple paragraphs. Each subsequent\nparagraph in a list item must be intended by either 4 spaces\nor one tab:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1.  This is a list item with two paragraphs. Lorem ipsum dolor\n    sit amet, consectetuer adipiscing elit. Aliquam hendrerit\n    mi posuere lectus.\n\n    Vestibulum enim wisi, viverra nec, fringilla in, laoreet\n    vitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n    sit amet velit.\n\n2.  Suspendisse id sem consectetuer libero luctus adipiscing.\n\\\\\\\\end{CodeBlock}\n\n\n\nIt looks nice if you indent every line of the subsequent\nparagraphs, but here again, Markdown will allow you to be\nlazy:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   This is a list item with two paragraphs.\n\n    This is the second paragraph in the list item. You're\nonly required to indent the first line. Lorem ipsum dolor\nsit amet, consectetuer adipiscing elit.\n\n*   Another item in the same list.\n\\\\\\\\end{CodeBlock}\n\n\n\nTo put a blockquote within a list item, the blockquote's \\\\\\\\texttt{>}\ndelimiters need to be indented:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   A list item with a blockquote:\n\n    > This is a blockquote\n    > inside a list item.\n\\\\\\\\end{CodeBlock}\n\n\n\nTo put a code block within a list item, the code block needs\nto be indented \\\\\\\\textit{twice} -- 8 spaces or two tabs:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*   A list item with a code block:\n\n        <code goes here>\n\\\\\\\\end{CodeBlock}\n\n\n\nIt's worth noting that it's possible to trigger an ordered list by\naccident, by writing something like this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1986. What a great season.\n\\\\\\\\end{CodeBlock}\n\n\n\nIn other words, a \\\\\\\\textit{number-period-space} sequence at the beginning of a\nline. To avoid this, you can backslash-escape the period:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n1986\\\\\\\\. What a great season.\n\\\\\\\\end{CodeBlock}\n\n\n\n<h3 id=\\\\\"precode\\\\\">Code Blocks</h3>\n\nPre-formatted code blocks are used for writing about programming or\nmarkup source code. Rather than forming normal paragraphs, the lines\nof a code block are interpreted literally. Markdown wraps a code block\nin both \\\\\\\\texttt{<pre>} and \\\\\\\\texttt{<code>} tags.\n\n\n\nTo produce a code block in Markdown, simply indent every line of the\nblock by at least 4 spaces or 1 tab. For example, given this input:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is a normal paragraph:\n\n    This is a code block.\n\\\\\\\\end{CodeBlock}\n\n\n\nMarkdown will generate:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>This is a normal paragraph:</p>\n\n<pre><code>This is a code block.\n</code></pre>\n\\\\\\\\end{CodeBlock}\n\n\n\nOne level of indentation -- 4 spaces or 1 tab -- is removed from each\nline of the code block. For example, this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nHere is an example of AppleScript:\n\n    tell application \\\\\"Foo\\\\\"\n        beep\n    end tell\n\\\\\\\\end{CodeBlock}\n\n\n\nwill turn into:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>Here is an example of AppleScript:</p>\n\n<pre><code>tell application \\\\\"Foo\\\\\"\n    beep\nend tell\n</code></pre>\n\\\\\\\\end{CodeBlock}\n\n\n\nA code block continues until it reaches a line that is not indented\n(or the end of the article).\n\n\n\nWithin a code block, ampersands (\\\\\\\\texttt{\\\\\\\\&}) and angle brackets (\\\\\\\\texttt{<} and \\\\\\\\texttt{>})\nare automatically converted into HTML entities. This makes it very\neasy to include example HTML source code using Markdown -- just paste\nit and indent it, and Markdown will handle the hassle of encoding the\nampersands and angle brackets. For example, this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n    <div class=\\\\\"footer\\\\\">\n        &copy; 2004 Foo Corporation\n    </div>\n\\\\\\\\end{CodeBlock}\n\n\n\nwill turn into:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<pre><code>&lt;div class=\\\\\"footer\\\\\"&gt;\n    &amp;copy; 2004 Foo Corporation\n&lt;/div&gt;\n</code></pre>\n\\\\\\\\end{CodeBlock}\n\n\n\nRegular Markdown syntax is not processed within code blocks. E.g.,\nasterisks are just literal asterisks within a code block. This means\nit's also easy to use Markdown to write about Markdown's own syntax.\n\n\n\n<h3 id=\\\\\"hr\\\\\">Horizontal Rules</h3>\n\nYou can produce a horizontal rule tag (\\\\\\\\texttt{<hr>}) by placing three or\nmore hyphens, asterisks, or underscores on a line by themselves. If you\nwish, you may use spaces between the hyphens or asterisks. Each of the\nfollowing lines will produce a horizontal rule:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n* * *\n\n***\n\n*****\n\n- - -\n\n---------------------------------------\n\n_ _ _\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n<h2 id=\\\\\"span\\\\\">Span Elements</h2>\n\n<h3 id=\\\\\"link\\\\\">Links</h3>\n\nMarkdown supports two style of links: \\\\\\\\textit{inline} and \\\\\\\\textit{reference}.\n\n\n\nIn both styles, the link text is delimited by [square brackets].\n\n\n\nTo create an inline link, use a set of regular parentheses immediately\nafter the link text's closing square bracket. Inside the parentheses,\nput the URL where you want the link to point, along with an \\\\\\\\textit{optional}\ntitle for the link, surrounded in quotes. For example:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is [an example](http://example.com/ \\\\\"Title\\\\\") inline link.\n\n[This link](http://example.net/) has no title attribute.\n\\\\\\\\end{CodeBlock}\n\n\n\nWill produce:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>This is <a href=\\\\\"http://example.com/\\\\\" title=\\\\\"Title\\\\\">\nan example</a> inline link.</p>\n\n<p><a href=\\\\\"http://example.net/\\\\\">This link</a> has no\ntitle attribute.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nIf you're referring to a local resource on the same server, you can\nuse relative paths:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nSee my [About](/about/) page for details.\n\\\\\\\\end{CodeBlock}\n\n\n\nReference-style links use a second set of square brackets, inside\nwhich you place a label of your choosing to identify the link:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is [an example][id] reference-style link.\n\\\\\\\\end{CodeBlock}\n\n\n\nYou can optionally use a space to separate the sets of brackets:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nThis is [an example] [id] reference-style link.\n\\\\\\\\end{CodeBlock}\n\n\n\nThen, anywhere in the document, you define your link label like this,\non a line by itself:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[id]: http://example.com/  \\\\\"Optional Title Here\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nThat is:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Square brackets containing the link identifier (optionally\nindented from the left margin using up to three spaces);\n\\\\\\\\item\\\\\\\\relax followed by a colon;\n\\\\\\\\item\\\\\\\\relax followed by one or more spaces (or tabs);\n\\\\\\\\item\\\\\\\\relax followed by the URL for the link;\n\\\\\\\\item\\\\\\\\relax optionally followed by a title attribute for the link, enclosed\nin double or single quotes.\n\\\\\\\\end{itemize}\n\n\nThe link URL may, optionally, be surrounded by angle brackets:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[id]: <http://example.com/>  \\\\\"Optional Title Here\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nYou can put the title attribute on the next line and use extra spaces\nor tabs for padding, which tends to look better with longer URLs:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[id]: http://example.com/longish/path/to/resource/here\n    \\\\\"Optional Title Here\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nLink definitions are only used for creating links during Markdown\nprocessing, and are stripped from your document in the HTML output.\n\n\n\nLink definition names may constist of letters, numbers, spaces, and punctuation -- but they are \\\\\\\\textit{not} case sensitive. E.g. these two links:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[link text][a]\n[link text][A]\n\\\\\\\\end{CodeBlock}\n\n\n\nare equivalent.\n\n\n\nThe \\\\\\\\textit{implicit link name} shortcut allows you to omit the name of the\nlink, in which case the link text itself is used as the name.\nJust use an empty set of square brackets -- e.g., to link the word\n\\\\\"Google\\\\\" to the google.com web site, you could simply write:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[Google][]\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd then define the link:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[Google]: http://google.com/\n\\\\\\\\end{CodeBlock}\n\n\n\nBecause link names may contain spaces, this shortcut even works for\nmultiple words in the link text:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nVisit [Daring Fireball][] for more information.\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd then define the link:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[Daring Fireball]: http://daringfireball.net/\n\\\\\\\\end{CodeBlock}\n\n\n\nLink definitions can be placed anywhere in your Markdown document. I\ntend to put them immediately after each paragraph in which they're\nused, but if you want, you can put them all at the end of your\ndocument, sort of like footnotes.\n\n\n\nHere's an example of reference links in action:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nI get 10 times more traffic from [Google] [1] than from\n[Yahoo] [2] or [MSN] [3].\n\n  [1]: http://google.com/        \\\\\"Google\\\\\"\n  [2]: http://search.yahoo.com/  \\\\\"Yahoo Search\\\\\"\n  [3]: http://search.msn.com/    \\\\\"MSN Search\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nUsing the implicit link name shortcut, you could instead write:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nI get 10 times more traffic from [Google][] than from\n[Yahoo][] or [MSN][].\n\n  [google]: http://google.com/        \\\\\"Google\\\\\"\n  [yahoo]:  http://search.yahoo.com/  \\\\\"Yahoo Search\\\\\"\n  [msn]:    http://search.msn.com/    \\\\\"MSN Search\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nBoth of the above examples will produce the following HTML output:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>I get 10 times more traffic from <a href=\\\\\"http://google.com/\\\\\"\ntitle=\\\\\"Google\\\\\">Google</a> than from\n<a href=\\\\\"http://search.yahoo.com/\\\\\" title=\\\\\"Yahoo Search\\\\\">Yahoo</a>\nor <a href=\\\\\"http://search.msn.com/\\\\\" title=\\\\\"MSN Search\\\\\">MSN</a>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nFor comparison, here is the same paragraph written using\nMarkdown's inline link style:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nI get 10 times more traffic from [Google](http://google.com/ \\\\\"Google\\\\\")\nthan from [Yahoo](http://search.yahoo.com/ \\\\\"Yahoo Search\\\\\") or\n[MSN](http://search.msn.com/ \\\\\"MSN Search\\\\\").\n\\\\\\\\end{CodeBlock}\n\n\n\nThe point of reference-style links is not that they're easier to\nwrite. The point is that with reference-style links, your document\nsource is vastly more readable. Compare the above examples: using\nreference-style links, the paragraph itself is only 81 characters\nlong; with inline-style links, it's 176 characters; and as raw HTML,\nit's 234 characters. In the raw HTML, there's more markup than there\nis text.\n\n\n\nWith Markdown's reference-style links, a source document much more\nclosely resembles the final output, as rendered in a browser. By\nallowing you to move the markup-related metadata out of the paragraph,\nyou can add links without interrupting the narrative flow of your\nprose.\n\n\n\n<h3 id=\\\\\"em\\\\\">Emphasis</h3>\n\nMarkdown treats asterisks (\\\\\\\\texttt{*}) and underscores (\\\\\\\\texttt{\\\\\\\\_}) as indicators of\nemphasis. Text wrapped with one \\\\\\\\texttt{*} or \\\\\\\\texttt{\\\\\\\\_} will be wrapped with an\nHTML \\\\\\\\texttt{<em>} tag; double \\\\\\\\texttt{*}'s or \\\\\\\\texttt{\\\\\\\\_}'s will be wrapped with an HTML\n\\\\\\\\texttt{<strong>} tag. E.g., this input:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n*single asterisks*\n\n_single underscores_\n\n**double asterisks**\n\n__double underscores__\n\\\\\\\\end{CodeBlock}\n\n\n\nwill produce:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<em>single asterisks</em>\n\n<em>single underscores</em>\n\n<strong>double asterisks</strong>\n\n<strong>double underscores</strong>\n\\\\\\\\end{CodeBlock}\n\n\n\nYou can use whichever style you prefer; the lone restriction is that\nthe same character must be used to open and close an emphasis span.\n\n\n\nEmphasis can be used in the middle of a word:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nun*fucking*believable\n\\\\\\\\end{CodeBlock}\n\n\n\nBut if you surround an \\\\\\\\texttt{*} or \\\\\\\\texttt{\\\\\\\\_} with spaces, it'll be treated as a\nliteral asterisk or underscore.\n\n\n\nTo produce a literal asterisk or underscore at a position where it\nwould otherwise be used as an emphasis delimiter, you can backslash\nescape it:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\\\\\\\\*this text is surrounded by literal asterisks\\\\\\\\*\n\\\\\\\\end{CodeBlock}\n\n\n\n<h3 id=\\\\\"code\\\\\">Code</h3>\n\nTo indicate a span of code, wrap it with backtick quotes (\\\\\\\\texttt{\\`}).\nUnlike a pre-formatted code block, a code span indicates code within a\nnormal paragraph. For example:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nUse the \\`printf()\\` function.\n\\\\\\\\end{CodeBlock}\n\n\n\nwill produce:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>Use the <code>printf()</code> function.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nTo include a literal backtick character within a code span, you can use\nmultiple backticks as the opening and closing delimiters:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\\`\\`There is a literal backtick (\\`) here.\\`\\`\n\\\\\\\\end{CodeBlock}\n\n\n\nwhich will produce this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p><code>There is a literal backtick (\\`) here.</code></p>\n\\\\\\\\end{CodeBlock}\n\n\n\nThe backtick delimiters surrounding a code span may include spaces --\none after the opening, one before the closing. This allows you to place\nliteral backtick characters at the beginning or end of a code span:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nA single backtick in a code span: \\`\\` \\` \\`\\`\n\nA backtick-delimited string in a code span: \\`\\` \\`foo\\` \\`\\`\n\\\\\\\\end{CodeBlock}\n\n\n\nwill produce:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>A single backtick in a code span: <code>\\`</code></p>\n\n<p>A backtick-delimited string in a code span: <code>\\`foo\\`</code></p>\n\\\\\\\\end{CodeBlock}\n\n\n\nWith a code span, ampersands and angle brackets are encoded as HTML\nentities automatically, which makes it easy to include example HTML\ntags. Markdown will turn this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nPlease don't use any \\`<blink>\\` tags.\n\\\\\\\\end{CodeBlock}\n\n\n\ninto:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>Please don't use any <code>&lt;blink&gt;</code> tags.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nYou can write this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\\`&#8212;\\` is the decimal-encoded equivalent of \\`&mdash;\\`.\n\\\\\\\\end{CodeBlock}\n\n\n\nto produce:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p><code>&amp;#8212;</code> is the decimal-encoded\nequivalent of <code>&amp;mdash;</code>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\n<h3 id=\\\\\"img\\\\\">Images</h3>\n\nAdmittedly, it's fairly difficult to devise a \\\\\"natural\\\\\" syntax for\nplacing images into a plain text document format.\n\n\n\nMarkdown uses an image syntax that is intended to resemble the syntax\nfor links, allowing for two styles: \\\\\\\\textit{inline} and \\\\\\\\textit{reference}.\n\n\n\nInline image syntax looks like this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n![Alt text](/path/to/img.jpg)\n\n![Alt text](/path/to/img.jpg \\\\\"Optional title\\\\\")\n\\\\\\\\end{CodeBlock}\n\n\n\nThat is:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax An exclamation mark: \\\\\\\\texttt{!};\n\\\\\\\\item\\\\\\\\relax followed by a set of square brackets, containing the \\\\\\\\texttt{alt}\nattribute text for the image;\n\\\\\\\\item\\\\\\\\relax followed by a set of parentheses, containing the URL or path to\nthe image, and an optional \\\\\\\\texttt{title} attribute enclosed in double\nor single quotes.\n\\\\\\\\end{itemize}\n\n\nReference-style image syntax looks like this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n![Alt text][id]\n\\\\\\\\end{CodeBlock}\n\n\n\nWhere \\\\\"id\\\\\" is the name of a defined image reference. Image references\nare defined using syntax identical to link references:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n[id]: url/to/image  \\\\\"Optional title attribute\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nAs of this writing, Markdown has no syntax for specifying the\ndimensions of an image; if this is important to you, you can simply\nuse regular HTML \\\\\\\\texttt{<img>} tags.\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n<h2 id=\\\\\"misc\\\\\">Miscellaneous</h2>\n\n<h3 id=\\\\\"autolink\\\\\">Automatic Links</h3>\n\nMarkdown supports a shortcut style for creating \\\\\"automatic\\\\\" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<http://example.com/>\n\\\\\\\\end{CodeBlock}\n\n\n\nMarkdown will turn this into:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<a href=\\\\\"http://example.com/\\\\\">http://example.com/</a>\n\\\\\\\\end{CodeBlock}\n\n\n\nAutomatic links for email addresses work similarly, except that\nMarkdown will also perform a bit of randomized decimal and hex\nentity-encoding to help obscure your address from address-harvesting\nspambots. For example, Markdown will turn this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<address@example.com>\n\\\\\\\\end{CodeBlock}\n\n\n\ninto something like this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<a href=\\\\\"&#x6D;&#x61;i&#x6C;&#x74;&#x6F;:&#x61;&#x64;&#x64;&#x72;&#x65;\n&#115;&#115;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;\n&#109;\\\\\">&#x61;&#x64;&#x64;&#x72;&#x65;&#115;&#115;&#64;&#101;&#120;&#x61;\n&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a>\n\\\\\\\\end{CodeBlock}\n\n\n\nwhich will render in a browser as a clickable link to \\\\\"\\\\\\\\externalLink{address@example.com}{mailto:address@example.com}\\\\\".\n\n\n\n(This sort of entity-encoding trick will indeed fool many, if not\nmost, address-harvesting bots, but it definitely won't fool all of\nthem. It's better than nothing, but an address published in this way\nwill probably eventually start receiving spam.)\n\n\n\n<h3 id=\\\\\"backslash\\\\\">Backslash Escapes</h3>\n\nMarkdown allows you to use backslash escapes to generate literal\ncharacters which would otherwise have special meaning in Markdown's\nformatting syntax. For example, if you wanted to surround a word with\nliteral asterisks (instead of an HTML \\\\\\\\texttt{<em>} tag), you can backslashes\nbefore the asterisks, like this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\\\\\\\\*literal asterisks\\\\\\\\*\n\\\\\\\\end{CodeBlock}\n\n\n\nMarkdown provides backslash escapes for the following characters:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\\\\\\\\   backslash\n\\`   backtick\n*   asterisk\n_   underscore\n{}  curly braces\n[]  square brackets\n()  parentheses\n#   hash mark\n+\tplus sign\n-\tminus sign (hyphen)\n.   dot\n!   exclamation mark\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs mixed-indentation: mixed-indentation 1`] = `\n\"\\\\\\\\part{Mixed spaces and tabs}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Very long\nparagraph\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax Very long\nparagraph\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Very long\nparagraph\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax Very long\nparagraph\n\\\\\\\\end{enumerate}\n\"\n`;\n\nexports[`toLaTeX: remark specs nested-blockquotes: nested-blockquotes 1`] = `\n\"\\\\\\\\begin{Quotation}\nfoo\n\n\\\\\\\\begin{Quotation}\nbar\n\\\\\\\\end{Quotation}\n\nfoo\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs nested-code: nested-code 1`] = `\n\"\\\\\\\\texttt{hi ther \\`\\` ok \\`\\`\\`}\n\n\n\n\\\\\\\\texttt{\\`hi ther\\`}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs nested-em: nested-em 1`] = `\n\"\\\\\\\\textit{test \\\\\\\\textbf{test} test}\n\n\n\n\\\\\\\\textit{test \\\\\\\\textbf{test} test}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs nested-references: nested-references 1`] = `\n\"This nested image should work:\n\n\n\n[\\\\\\\\includegraphics{undefined}]\n\n\n\nThis nested link should not work:\n\n\n\n[[Foo][bar]]\n\n\"\n`;\n\nexports[`toLaTeX: remark specs nested-square-link: nested-square-link 1`] = `\n\"[the \\`]\\` character](/url)\n\n\n\n[the \\\\\\\\texttt{[} character](/url)\n\n\n\n[the \\`\\` \\\\\\\\externalLink{ \\`\\`\\` character}{/url}\n\n\n\n\\\\\\\\externalLink{the \\\\\\\\texttt{\\`} character}{/url}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs no-positionals: no-positionals 1`] = `\n\"This document tests for the working of \\\\\\\\texttt{position: false} as a parse\noption.\n\n\n\n\\\\\\\\begin{Quotation}\nBlock-quotes\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax With list items.\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\n\n\n\nAnother block-quote:\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax And another list.\n\\\\\\\\end{enumerate}\n\\\\\\\\end{Quotation}\n\n\n\nSome \\\\\\\\externalLink{deeply \\\\\\\\textbf{nested \\\\\\\\textit{elements}}}{http://example.com}\n\n\n\nAn entity: ©, and an warning entity: ©.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs not-a-link: not-a-link 1`] = `\n\"[test](not a link)\n\n\"\n`;\n\nexports[`toLaTeX: remark specs ordered-and-unordered-lists: ordered-and-unordered-lists 1`] = `\n\"\\\\\\\\chapter{Unordered}\n\n\nAsterisks tight:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax asterisk 1\n\\\\\\\\item\\\\\\\\relax asterisk 2\n\\\\\\\\item\\\\\\\\relax asterisk 3\n\\\\\\\\end{itemize}\n\n\nAsterisks loose:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax asterisk 1\n\\\\\\\\item\\\\\\\\relax asterisk 2\n\\\\\\\\item\\\\\\\\relax asterisk 3\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nPluses tight:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Plus 1\n\\\\\\\\item\\\\\\\\relax Plus 2\n\\\\\\\\item\\\\\\\\relax Plus 3\n\\\\\\\\end{itemize}\n\n\nPluses loose:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Plus 1\n\\\\\\\\item\\\\\\\\relax Plus 2\n\\\\\\\\item\\\\\\\\relax Plus 3\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nMinuses tight:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Minus 1\n\\\\\\\\item\\\\\\\\relax Minus 2\n\\\\\\\\item\\\\\\\\relax Minus 3\n\\\\\\\\end{itemize}\n\n\nMinuses loose:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Minus 1\n\\\\\\\\item\\\\\\\\relax Minus 2\n\\\\\\\\item\\\\\\\\relax Minus 3\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\chapter{Ordered}\n\n\nTight:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nand:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax One\n\\\\\\\\item\\\\\\\\relax Two\n\\\\\\\\item\\\\\\\\relax Three\n\\\\\\\\end{enumerate}\n\n\nLoose using tabs:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nand using spaces:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax One\n\\\\\\\\item\\\\\\\\relax Two\n\\\\\\\\item\\\\\\\\relax Three\n\\\\\\\\end{enumerate}\n\n\nMultiple paragraphs:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax Item 1, graf one.\n\nItem 2. graf two. The quick brown fox jumped over the lazy dog's\nback.\n\\\\\\\\item\\\\\\\\relax Item 2.\n\\\\\\\\item\\\\\\\\relax Item 3.\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\chapter{Nested}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Tab\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Tab\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Tab\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\n\nHere's another:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Fee\n\\\\\\\\item\\\\\\\\relax Fie\n\\\\\\\\item\\\\\\\\relax Foe\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nSame thing but with paragraphs:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Fee\n\\\\\\\\item\\\\\\\\relax Fie\n\\\\\\\\item\\\\\\\\relax Foe\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nThis was an error in Markdown 1.0.1:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax this\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax sub\n\\\\\\\\end{itemize}\nthat\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs ordered-different-types: ordered-different-types 1`] = `\n\"\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax foo\n\\\\\\\\item\\\\\\\\relax bar\n3) baz\n\\\\\\\\end{enumerate}\n\"\n`;\n\nexports[`toLaTeX: remark specs ordered-with-parentheses: ordered-with-parentheses 1`] = `\n\"\\\\\\\\chapter{Ordered}\n\n\nTight:\n\n\n\n1)\tFirst\n2)\tSecond\n3)\tThird\n\n\n\nand:\n\n\n\n1) One\n2) Two\n3) Three\n\n\n\nLoose using tabs:\n\n\n\n1)\tFirst\n\n\n\n2)\tSecond\n\n\n\n3)\tThird\n\n\n\nand using spaces:\n\n\n\n1) One\n\n\n\n2) Two\n\n\n\n3) Three\n\n\n\nMultiple paragraphs:\n\n\n\n1)\tItem 1, graf one.\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nItem 2. graf two. The quick brown fox jumped over the lazy dog's\nback.\n\\\\\\\\end{CodeBlock}\n\n\n\n2)\tItem 2.\n\n\n\n3)\tItem 3.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs paragraphs-and-indentation: paragraphs-and-indentation 1`] = `\n\"\\\\\\\\part{Without lines.}\n\n\nThis is a paragraph\nand this is further text\n\n\n\nThis is a paragraph\nand this is further text\n\n\n\nThis is a paragraph with some asterisks\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n***\n\\\\\\\\end{CodeBlock}\n\n\n\nThis is a paragraph followed by a horizontal rule\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\part{With lines.}\n\n\nThis is a paragraph\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nand this is code\n\\\\\\\\end{CodeBlock}\n\n\n\nThis is a paragraph\n\n\n\nand this is a new paragraph\n\n\n\nThis is a paragraph with some asterisks in a code block\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n***\n\\\\\\\\end{CodeBlock}\n\n\n\nThis is a paragraph followed by a horizontal rule\n\n\n\n\\\\\\\\horizontalLine\n\n\"\n`;\n\nexports[`toLaTeX: remark specs paragraphs-empty: paragraphs-empty 1`] = `\n\"aaa\n\n\n\n\\\\\\\\part{aaa}\n\n\nbbb\n\n\n\nccc\n\n\"\n`;\n\nexports[`toLaTeX: remark specs ref-paren: ref-paren 1`] = `\n\"\\\\\\\\hyperref[hi]{hi}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{hi}\\\\\\\\externalLink{/url}{/url}}\"\n`;\n\nexports[`toLaTeX: remark specs reference-image-empty-alt: reference-image-empty-alt 1`] = `\n\"\\\\\\\\includegraphics{/xyz.png}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{/xyz.png}{/xyz.png}}\"\n`;\n\nexports[`toLaTeX: remark specs reference-link-escape: reference-link-escape 1`] = `\n\"[b*r*], \\\\\\\\hyperref[b\\\\\\\\*r*]{b*r*}, \\\\\\\\hyperref[b\\\\\\\\*r*]{b*r*}.\n\n\n\n\\\\\\\\includegraphics{http://google.com}, \\\\\\\\includegraphics{http://google.com}, \\\\\\\\includegraphics{http://google.com}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{b\\\\\\\\*r*}\\\\\\\\externalLink{http://google.com}{http://google.com}}\"\n`;\n\nexports[`toLaTeX: remark specs reference-link-not-closed: reference-link-not-closed 1`] = `\n\"[bar]bar\n\n\n\n[bar]\n\n\n\n[bar]\n\n\"\n`;\n\nexports[`toLaTeX: remark specs reference-link-with-angle-brackets: reference-link-with-angle-brackets 1`] = `\n\"\\\\\\\\hyperref[foo]{foo}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{foo}\\\\\\\\externalLink{./url with spaces}{./url with spaces}}\"\n`;\n\nexports[`toLaTeX: remark specs reference-link-with-multiple-definitions: reference-link-with-multiple-definitions 1`] = `\n\"\\\\\\\\hyperref[foo]{foo}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{foo}\\\\\\\\externalLink{first}{first}}\n\n\\\\\\\\footnote{\\\\\\\\label{foo-1}\\\\\\\\externalLink{second}{second}}\"\n`;\n\nexports[`toLaTeX: remark specs same-bullet: same-bullet 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax test\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax test\n\\\\\\\\end{itemize}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax test\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs stringify-escape: stringify-escape 1`] = `\n\"Characters that should be escaped in general:\n\n\n\n\\\\\\\\textbackslash{} \\` * [\n\n\n\nCharacters that shouldn't:\n\n\n\n\\\\\\\\{\\\\\\\\}]()\\\\\\\\#+-.!>\\\\\"\\\\\\\\$\\\\\\\\%',/:;=?@\\\\\\\\textasciicircum{}\\\\\\\\textasciitilde{}\n\n\n\nUnderscores are \\\\\\\\_escaped\\\\\\\\_ unless they appear in\\\\\\\\_the\\\\\\\\_middle\\\\\\\\_of\\\\\\\\_a\\\\\\\\_word.\nor \\\\\\\\textbf{\\\\\\\\_here}, or here\\\\\\\\_\\\\\\\\_\n\n\n\nAmpersands are escaped only when they would otherwise start an entity:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textbackslash{}©cat \\\\\\\\textbackslash{}\\\\\\\\& \\\\\\\\textbackslash{}\\\\\\\\&\n\\\\\\\\item\\\\\\\\relax \\\\\\\\&copycat \\\\\\\\&amp; \\\\\\\\&\\\\\\\\#x26\n\\\\\\\\item\\\\\\\\relax But: ©cat; \\\\\\\\texttt{\\\\\\\\&between;} \\\\\\\\&foo; \\\\\\\\& AT\\\\\\\\&T \\\\\\\\&c\n\\\\\\\\end{itemize}\n\n\nOpen parenthesis should be escaped after a shortcut reference:\n\n\n\n[ref](text)\n\n\n\nAnd after a shortcut reference and a space (for GitHub):\n\n\n\n[ref] (text)\n\n\n\nHyphen should be escaped at the beginning of a line:\n\n\n\n- not a list item\n- not a list item\n+ not a list item\n\n\n\nSame for angle brackets:\n\n\n\n> not a block quote\n\n\n\nAnd hash signs:\n\n\n\n\\\\\\\\# not a heading\n\\\\\\\\#\\\\\\\\# not a subheading\n\n\n\nText under a shortcut reference should be preserved verbatim:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax [two*three]\n\\\\\\\\item\\\\\\\\relax [two*three]\n\\\\\\\\item\\\\\\\\relax [a\\\\\\\\textbackslash{}a]\n\\\\\\\\item\\\\\\\\relax [a\\\\\\\\textbackslash{}a]\n\\\\\\\\item\\\\\\\\relax [a\\\\\\\\textbackslash{}\\\\\\\\textbackslash{}a]\n\\\\\\\\item\\\\\\\\relax [a\\\\\\\\_a\\\\\\\\_a]\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\textbf{GFM:}\n\n\n\nColon should be escaped in URLs:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax http\\\\\\\\textbackslash{}://user:password@host:port/path?key=value\\\\\\\\#fragment\n\\\\\\\\item\\\\\\\\relax https\\\\\\\\textbackslash{}://user:password@host:port/path?key=value\\\\\\\\#fragment\n\\\\\\\\item\\\\\\\\relax http://user:password@host:port/path?key=value\\\\\\\\#fragment\n\\\\\\\\item\\\\\\\\relax https://user:password@host:port/path?key=value\\\\\\\\#fragment\n\\\\\\\\end{itemize}\n\n\nDouble tildes should be \\\\\\\\textasciitilde{}\\\\\\\\textasciitilde{}escaped\\\\\\\\textasciitilde{}\\\\\\\\textasciitilde{}.\nAnd here: foo\\\\\\\\textasciitilde{}\\\\\\\\textasciitilde{}.\n\n\n\nPipes should not be escaped here: |\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nhere & they \\\\\\\\\\\\\\\\\nshould & tho|ugh \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\nAnd here:\n\n\n\n| here   | they   |\n| ---- | ----- |\n| should | though |\n\n\n\nAnd here:\n\n\n\nhere   | they\n---- | ------\nshould | though\n\n\n\n\\\\\\\\textbf{Commonmark:}\n\n\n\nOpen angle bracket should be escaped:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textbackslash{}<div>\\\\\\\\textbackslash{}</div>\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textbackslash{}<http\\\\\\\\textbackslash{}:google.com>\n\\\\\\\\item\\\\\\\\relax <div></div>\n\\\\\\\\item\\\\\\\\relax <http:google.com>\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs strong-and-em-together-one: strong-and-em-together-one 1`] = `\n\"\\\\\\\\textbf{\\\\\\\\textit{This is strong and em.}}\n\n\n\nSo is \\\\\\\\textbf{\\\\\\\\textit{this}} word.\n\n\n\n\\\\\\\\textbf{\\\\\\\\textit{This is strong and em.}}\n\n\n\nSo is \\\\\\\\textbf{\\\\\\\\textit{this}} word.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs strong-and-em-together-two: strong-and-em-together-two 1`] = `\n\"perform\\\\\\\\_complicated\\\\\\\\_task\n\n\n\ndo\\\\\\\\_this\\\\\\\\_and\\\\\\\\_do\\\\\\\\_that\\\\\\\\_and\\\\\\\\_another\\\\\\\\_thing\n\n\n\nperform\\\\\\\\textit{complicated}task\n\n\n\ndo\\\\\\\\textit{this}and\\\\\\\\textit{do}that\\\\\\\\textit{and}another*thing\n\n\"\n`;\n\nexports[`toLaTeX: remark specs strong-emphasis: strong-emphasis 1`] = `\n\"Foo \\\\\\\\textbf{bar} \\\\\\\\textbf{baz}.\n\n\n\nFoo \\\\\\\\textbf{bar} \\\\\\\\textbf{baz}.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs strong-initial-white-space: strong-initial-white-space 1`] = `\n\"\\\\\\\\textbf{ bar }.\n\n\n\n\\\\\\\\textbf{ bar }.\n\n\"\n`;\n\nexports[`toLaTeX: remark specs table: table 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeading 1 & \\\\\\\\textbf{H}eading 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 & Header 3 & Header 4 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 & Cell 3 & Cell 4 \\\\\\\\\\\\\\\\\nCell 5 & Cell 6 & Cell 7 & Cell 8 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{CodeBlock}{text}\nTest code\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 & Header 3 & Header 4 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 & Cell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\textit{Cell 5} & Cell 6 & Cell 7 & Cell 8 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\"\n`;\n\nexports[`toLaTeX: remark specs table-empty-initial-cell: table-empty-initial-cell 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\n & a & c \\\\\\\\\\\\\\\\\na & b & c \\\\\\\\\\\\\\\\\na & b & c \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\"\n`;\n\nexports[`toLaTeX: remark specs table-escaped-pipes: table-escaped-pipes 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nFirst & Second & third \\\\\\\\\\\\\\\\\nfirst & second & third \\\\\\\\\\\\\\\\\nfirst & second | second & third | \\\\\\\\\\\\\\\\\nfirst & second \\\\\\\\textbackslash{} & third \\\\\\\\textbackslash{} \\\\\\\\\\\\\\\\\nfirst & second \\\\\\\\textbackslash{}| second & third \\\\\\\\textbackslash{}| \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\"\n`;\n\nexports[`toLaTeX: remark specs table-in-list: table-in-list 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Unordered:\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\\\\\\\\item\\\\\\\\relax Ordered:\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs table-invalid-alignment: table-invalid-alignment 1`] = `\n\"Missing alignment characters:\n\n\n\n| a | b | c |\n|   |---|---|\n| d | e | f |\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n| a | b | c |\n|---|---|   |\n| d | e | f |\n\n\n\nInvalid characters:\n\n\n\n| a | b | c |\n|---|-*-|---|\n| d | e | f |\n\n\"\n`;\n\nexports[`toLaTeX: remark specs table-loose: table-loose 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\"\n`;\n\nexports[`toLaTeX: remark specs table-no-body: table-no-body 1`] = `\n\"\\\\\\\\part{Foo}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nName & GitHub & Twitter \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\"\n`;\n\nexports[`toLaTeX: remark specs table-no-end-of-line: table-no-end-of-line 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nfoo & bar \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\"\n`;\n\nexports[`toLaTeX: remark specs table-one-column: table-one-column 1`] = `\n\"This is a table:\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\na \\\\\\\\\\\\\\\\\nb \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\"\n`;\n\nexports[`toLaTeX: remark specs table-one-row: table-one-row 1`] = `\n\"This is a table:\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\na & b & c \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\"\n`;\n\nexports[`toLaTeX: remark specs table-padded: table-padded 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\"\n`;\n\nexports[`toLaTeX: remark specs table-pipes-in-code: table-pipes-in-code 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nabc & head2 \\\\\\\\\\\\\\\\\nx & \\` &  &  & \\` \\\\\\\\\\\\\\\\\nx & \\` \\\\\\\\\\\\\\\\\nx & \\` & \\` \\\\\\\\\\\\\\\\\nx & \\\\\\\\texttt{f} \\\\\\\\\\\\\\\\\nx & \\`\\`\\`\\` \\\\\\\\\\\\\\\\\nx & \\`\\\\\\\\texttt{f} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nabc & head2 \\\\\\\\\\\\\\\\\nx & \\` \\\\\\\\\\\\\\\\\nx & \\` & \\` \\\\\\\\\\\\\\\\\nx & \\\\\\\\texttt{f} \\\\\\\\\\\\\\\\\nx & \\`\\`\\`\\` \\\\\\\\\\\\\\\\\nx & \\`\\\\\\\\texttt{f} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\"\n`;\n\nexports[`toLaTeX: remark specs table-spaced: table-spaced 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nHeader 1 & Header 2 \\\\\\\\\\\\\\\\\nCell 1 & Cell 2 \\\\\\\\\\\\\\\\\nCell 3 & Cell 4 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\"\n`;\n\nexports[`toLaTeX: remark specs table-with-image: table-with-image 1`] = `\n\"Someone wanted to do this, let's implement it!\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nc1 & c2 \\\\\\\\\\\\\\\\\nc3 & \\\\\\\\includegraphics{https://zestedesavoir.com/media/galleries/426/56dc4a1e-416b-4a9d-830d-95b45d58a17a.png} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\"\n`;\n\nexports[`toLaTeX: remark specs tabs: tabs 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax this is a list item\nindented with tabs\n\\\\\\\\item\\\\\\\\relax this is a list item\nindented with spaces\n\\\\\\\\end{itemize}\n\n\nCode:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nthis code block is indented by one tab\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\tthis code block is indented by two tabs\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n+\tthis is an example list item\n\tindented with tabs\n\n+   this is an example list item\n    indented with spaces\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs tabs-and-spaces: tabs-and-spaces 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax this is a list item\nindented with tabs\n\\\\\\\\item\\\\\\\\relax this is a list item\nindented with spaces\n\\\\\\\\end{itemize}\n\n\nCode:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nthis code block is indented by one tab\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\tthis code block is indented by two tabs\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n+\tthis is an example list item\n\tindented with tabs\n\n+   this is an example list item\n    indented with spaces\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs task-list: task-list 1`] = `\n\"\\\\\\\\part{Empty items}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax [ ]\n\\\\\\\\item\\\\\\\\relax [\t]\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax [x]\n\\\\\\\\item\\\\\\\\relax [X]\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Single space}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Tab}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{No white space with content}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax [ ]Hello;\n\\\\\\\\item\\\\\\\\relax [\t]World;\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax [x]Foo.\n\\\\\\\\item\\\\\\\\relax [X]Bar\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Single space with content}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Hello;\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax World;\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Foo.\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax World :D\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Single tab with content}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Hello;\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax World;\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Foo.\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Hello.\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Multiple spaces with content}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nHello;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nWorld;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Foo.\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Bar.\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Multiple tabs with content}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nHello;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nWorld;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nFoo.\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nBar.\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Mixed tabs and spaces}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\n    Hello;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\nWorld;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax \\\\\\\\begin{CodeBlock}{text}\n\tHello;\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax World.\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Bar.\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Line breaks}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax [\n] Hello;\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax [\n] Hello;\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\part{Multiple unfinished characters}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax [  ] Hello;\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax [\n] World;\n\\\\\\\\item\\\\\\\\relax [\t\t] Hello;\n\\\\\\\\item\\\\\\\\relax [ \t ] World.\n\\\\\\\\end{enumerate}\n\"\n`;\n\nexports[`toLaTeX: remark specs task-list-ordered: task-list-ordered 1`] = `\n\"\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mercury;\n\\\\\\\\item\\\\\\\\relax [] Venus (this one’s invalid);\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Earth:\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Moon.\n\\\\\\\\end{enumerate}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mars;\n\\\\\\\\item\\\\\\\\relax [] Neptune (this one’s also invalid).\n\\\\\\\\end{enumerate}\n\"\n`;\n\nexports[`toLaTeX: remark specs task-list-unordered-asterisk: task-list-unordered-asterisk 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mercury;\n\\\\\\\\item\\\\\\\\relax [] Venus (this one’s invalid);\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Earth:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Moon.\n\\\\\\\\end{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mars;\n\\\\\\\\item\\\\\\\\relax [] Neptune (this one’s also invalid).\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs task-list-unordered-dash: task-list-unordered-dash 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mercury;\n\\\\\\\\item\\\\\\\\relax [] Venus (this one’s invalid);\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Earth:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Moon.\n\\\\\\\\end{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mars;\n\\\\\\\\item\\\\\\\\relax [] Neptune (this one’s also invalid).\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs task-list-unordered-plus: task-list-unordered-plus 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mercury;\n\\\\\\\\item\\\\\\\\relax [] Venus (this one’s invalid);\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Earth:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax Moon.\n\\\\\\\\end{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax Mars;\n\\\\\\\\item\\\\\\\\relax [] Neptune (this one’s also invalid).\n\\\\\\\\end{itemize}\n\"\n`;\n\nexports[`toLaTeX: remark specs tidyness: tidyness 1`] = `\n\"\\\\\\\\begin{Quotation}\nA list within a blockquote:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax asterisk 1\n\\\\\\\\item\\\\\\\\relax asterisk 2\n\\\\\\\\item\\\\\\\\relax asterisk 3\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs title-attributes: title-attributes 1`] = `\n\"\\\\\\\\part{Links}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nImplementation & Characters & Nested & Mismatched & Escaped & Named Entities & Numbered Entities \\\\\\\\\\\\\\\\\nMarkdown.pl & \\\\\\\\texttt{\\\\\"} & Yes & Yes & No & Yes & Yes \\\\\\\\\\\\\\\\\nGitHub & \\\\\\\\texttt{\\\\\"} & Yes & Yes & No & No & No \\\\\\\\\\\\\\\\\nCommonMark & \\\\\\\\texttt{\\\\\"} & No & No & Yes & Yes & Yes \\\\\\\\\\\\\\\\\nMarkdown.pl & \\\\\\\\texttt{'} & Yes & Yes & No & Yes & Yes \\\\\\\\\\\\\\\\\nGitHub & \\\\\\\\texttt{'} & Yes & Yes & No & No & No \\\\\\\\\\\\\\\\\nCommonMark & \\\\\\\\texttt{'} & No & No & Yes & Yes & Yes \\\\\\\\\\\\\\\\\nMarkdown.pl & \\\\\\\\texttt{()} & - & - & - & - & - \\\\\\\\\\\\\\\\\nGitHub & \\\\\\\\texttt{()} & - & - & - & - & - \\\\\\\\\\\\\\\\\nCommonMark & \\\\\\\\texttt{()} & No & Yes & Yes & Yes & Yes \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\chapter{Double quotes}\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\chapter{Single quotes}\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\externalLink{Hello}{./world.html}\n\n\n\n\\\\\\\\part{Images}\n\n\n\\\\\\\\chapter{Double quotes}\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\chapter{Single quotes}\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\n\n\\\\\\\\includegraphics{./world.png}\n\n\"\n`;\n\nexports[`toLaTeX: remark specs toplevel-paragraphs: toplevel-paragraphs 1`] = `\n\"hello world\nhow are you\nhow are you\n\n\n\nhello world\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nhow are you\n\\\\\\\\end{CodeBlock}\n\n\n\nhello world\n\n\n\n\\\\\\\\horizontalLine\n\n\n\nhello world\n\n\n\n\\\\\\\\part{how are you}\n\n\nhello world\n\n\n\n\\\\\\\\part{how are you}\n\n\nhello world\n\n\n\n\\\\\\\\begin{Quotation}\nhow are you\n\\\\\\\\end{Quotation}\n\n\n\nhello world\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax how are you\n\\\\\\\\end{itemize}\n\n\nhello world\n\n\n\n<div>how are you</div>\n\nhello world\n<span>how are you</span>\n\n\n\nhello \\\\\\\\hyperref[how]{world}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{how}\\\\\\\\externalLink{/are/you}{/are/you}}\n\n<div>hello</div>\n\n<span>hello</span>\n\n\"\n`;\n\nexports[`toLaTeX: remark specs tricky-list: tricky-list 1`] = `\n\"\\\\\\\\textbf{hello} \\\\\\\\textit{world}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello world\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\textbf{hello} \\\\\\\\textit{world}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello world\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\textbf{hello} \\\\\\\\textit{world}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Hello world\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\textbf{hello} \\\\\\\\textit{world}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax hello world\n\\\\\\\\end{itemize}\n\"\n`;\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/amps-and-angles-encoding.text",
    "content": "AT&T has an ampersand in their name.\n\nAT&amp;T is another way to write it.\n\nThis & that.\n\n4 < 5.\n\n6 > 5.\n\nHere's a [link] [1] with an ampersand in the URL.\n\nHere's a link with an amersand in the link text: [AT&T] [2].\n\nHere's an inline [link](/script?foo=1&bar=2).\n\nHere's an inline [link](</script?foo=1&bar=2>).\n\n\n[1]: http://example.com/?foo=1&bar=2\n[2]: http://att.com/  \"AT&T\"\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/auto-link-invalid.text",
    "content": "<http:/\n\n<https:/ \n\n<mailto:foobarbaz>\n\n<http:/google\n\n<foo@\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/auto-link-lines.text",
    "content": "hello world\n<http://example.com>\n\nhello world\n<mailto:somename@example.com>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/auto-link-output.output.text",
    "content": "Link: <http://example.com/>.\n\nLink to an email: <mailto:somename@example.com>.\n\nLink without protocol, which should not render as an auto-link\nbecause they are easily mistaken for HTML: [google.com](google.com).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/auto-link-url-invalid.text",
    "content": "http://<example\n\nhttps:// foo bar baz.\n\nmailto:.\n\nhttp://,\n\nhttps://:\n\nmailto:;\n\nhttp://\"\n\nhttps://'\n\nmailto:)\n\nhttp://]\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/auto-link-url.text",
    "content": "This should be a link: http://example.com/hello-world.\n\nAlso, subdomain should be a part of the link (http://foo.example.com/(hello[world])).\n\nSo should this: foo@bar.com.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/auto-link.text",
    "content": "Link: <http://example.com/>.\n\nLink to an email: <somename@example.com>.\n\nLink to an email: <mailto:somename@example.com>.\n\nWith an ampersand: <http://example.com/?foo=1&bar=2>\n\n* In a list?\n* <http://example.com/>\n* It should.\n\n> Blockquoted: <http://example.com/>\n\nAuto-links should not occur here: `<http://example.com/>`\n\n\tor here: <http://example.com/>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/backslash-escapes.text",
    "content": "These should all get escaped:\n\nBackslash: \\\\\n\nBacktick: \\`\n\nAsterisk: \\*\n\nUnderscore: \\_\n\nLeft brace: \\{\n\nRight brace: \\}\n\nLeft bracket: \\[\n\nRight bracket: \\]\n\nLeft paren: \\(\n\nRight paren: \\)\n\nGreater-than: \\>\n\nHash: \\#\n\nPeriod: \\.\n\nBang: \\!\n\nPlus: \\+\n\nMinus: \\-\n\n**GFM:**\n\nPipe: \\|\n\nTilde: \\~\n\n**Commonmark:**\n\nQuote: \\\"\n\nDollar: \\$\n\nPercentage: \\%\n\nAmpersand: \\&\n\nSingle quote: \\'\n\nComma: \\,\n\nForward slash: \\/\n\nColon: \\:\n\nSemicolon: \\;\n\nLess-than: \\<\n\nEquals: \\=\n\nQuestion mark: \\?\n\nAt-sign: \\@\n\nCaret: \\^\n\nNew line: \\\nonly works in paragraphs.\n\nThese should not, because they occur within a code block:\n\n\tBackslash: \\\\\n\n\tBacktick: \\`\n\n\tAsterisk: \\*\n\n\tUnderscore: \\_\n\n\tLeft brace: \\{\n\n\tRight brace: \\}\n\n\tLeft bracket: \\[\n\n\tRight bracket: \\]\n\n\tLeft paren: \\(\n\n\tRight paren: \\)\n\n\tGreater-than: \\>\n\n\tHash: \\#\n\n\tPeriod: \\.\n\n\tBang: \\!\n\n\tPlus: \\+\n\n\tMinus: \\-\n\n**GFM:**\n\n\tPipe: \\|\n\n\tTilde: \\~\n\n**Commonmark:**\n\n\tQuote: \\\"\n\n\tDollar: \\$\n\n\tPercentage: \\%\n\n\tAmpersand: \\&\n\n\tSingle quote: \\'\n\n\tComma: \\,\n\n\tForward slash: \\/\n\n\tColon: \\:\n\n\tSemicolon: \\;\n\n\tLess-than: \\<\n\n\tEquals: \\=\n\n\tQuestion mark: \\?\n\n\tAt-sign: \\@\n\n\tCaret: \\^\n\n\tNew line: \\\n\tonly works in paragraphs.\n\n\nNor should these, which occur in code spans:\n\nBackslash: `\\\\`\n\nBacktick: `` \\` ``\n\nAsterisk: `\\*`\n\nUnderscore: `\\_`\n\nLeft brace: `\\{`\n\nRight brace: `\\}`\n\nLeft bracket: `\\[`\n\nRight bracket: `\\]`\n\nLeft paren: `\\(`\n\nRight paren: `\\)`\n\nGreater-than: `\\>`\n\nHash: `\\#`\n\nPeriod: `\\.`\n\nBang: `\\!`\n\nPlus: `\\+`\n\nMinus: `\\-`\n\n**GFM:**\n\nPipe: `\\|`\n\nTilde: `\\~`\n\n**Commonmark:**\n\nQuote: `\\\"`\n\nDollar: `\\$`\n\nPercentage: `\\%`\n\nAmpersand: `\\&`\n\nSingle quote: `\\'`\n\nComma: `\\,`\n\nForward slash: `\\/`\n\nColon: `\\:`\n\nSemicolon: `\\;`\n\nLess-than: `\\<`\n\nEquals: `\\=`\n\nQuestion mark: `\\?`\n\nAt-sign: `\\@`\n\nCaret: `\\^`\n\nNew line: `\\\n` only works in paragraphs.\n\nThese should get escaped, even though they're matching pairs for\nother Markdown constructs:\n\n\\*asterisks\\*\n\n\\_underscores\\_\n\n\\`backticks\\`\n\nThis is a code span with a literal backslash-backtick sequence: `` \\` ``\n\nThis is a tag with unescaped backticks <span attr='`ticks`'>bar</span>.\n\nThis is a tag with backslashes <span attr='\\\\backslashes\\\\'>bar</span>.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/block-elements.text",
    "content": "*   Different lists should receive two newline characters\n    between them.\n\n\n*   This is another list.\n\n>  *   The same goes for lists in block quotes.\n>\n>\n>  *   This is another list.\n\n*   And for lists in lists:\n\n    1.   First sublist.\n\n\n    1.   Second sublist.\n\nAnd for lists followed by indented code blocks:\n\n*   This is a paragraph in a list\n\n\n    And this is code();\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/blockquote-indented.text",
    "content": "   > bar\n > baz\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/blockquote-lazy-code.text",
    "content": ">     foo\n    bar\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/blockquote-lazy-fence.text",
    "content": "> ```\n> aNormalCodeBlockInABlockqoute();\n> ```\n\nA paragraph.\n\n> ```\nthisIsAlsoSomeCodeInABlockquote();\n> ```\n\nA paragraph.\n\n> ```\naNonTerminatedCodeBlockInABlockquote();\n```\naNewCodeBlockFollowingTheBlockQuote();\n```\n\nA paragraph.\n\n> Something in a blockquote.\n```\naNewCodeBlock();\n```\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/blockquote-lazy-list.text",
    "content": "> This is a blockquote.\n- And in normal mode this is an internal list, but in commonmark this is a top level list.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/blockquote-lazy-rule.text",
    "content": "> This is a blockquote. Followed by a rule.\n* * *\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/blockquote-list-item.text",
    "content": "This fails in markdown.pl and upskirt:\n\n* hello\n  > world\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/blockquotes-empty-lines.output.text",
    "content": "> Note there is no space on the following line.\n>\n> Note there is no space on the preceding line.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/blockquotes-with-code-blocks.text",
    "content": "> Example:\n> \n>     sub status {\n>         print \"working\";\n>     }\n> \n> Or:\n> \n>     sub status {\n>         return \"working\";\n>     }\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/blockquotes.text",
    "content": "> This is a blockquote.\n\n> This is, in commonmark mode, another blockquote.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/bom.text",
    "content": "﻿# Hello from a BOM\n\nBe careful when editing this file!\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/breaks-hard.text",
    "content": "These are not breaks:\n\nLook at the\npretty line\nbreaks.\n\nThese are breaks:\n\nLook at the  \npretty line  \nbreaks.\n\nIn `commonmark: true` mode, an escaped newline character is exposed as a `break` node:\n\nLook at the\\\npretty line\\\nbreaks.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/case-insensitive-refs.text",
    "content": "[hi]\n\n[HI]: /url\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/code-block-escape.text",
    "content": "A little flaw:\n\n```python\n\\end{CodeBlock}\n\\end   {CodeBlock}\n```\n\nAn ingenuous flaw:\n\n```\n\\end\\end{CodeBlock}{CodeBlock}\n\\input{/etc/passwd}\n\\begin{CodeBlock}{text}\n```\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/code-block-indentation.nooutput.text",
    "content": "Fenced code blocks are normally not exdented, however,\nwhen the initial fence is indented by spaces, the value of\nthe code is exdented by up to that amount of spaces.\n\n```\n    This is a code block...\n        \n    ...which is not exdented.\n```\n\nBut...\n\n  ```\n    This one...\n        \n    ...is.\n  ```\n\nAnd...\n\n ```\nSo is this...\n       \n   ...one.\n ```\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/code-block-nesting-bug.nooutput.text",
    "content": "GitHub, thus RedCarpet, has a bug where “nested” fenced code blocks,\neven with shorter fences, can exit their actual “parent” block.\n\nNote that this bug does not occur on indented code-blocks.\n\n````foo\n```bar\nbaz\n```\n````\n\nEven with a different fence marker:\n\n````foo\n~~~bar\nbaz\n~~~\n````\n\nAnd reversed:\n\n~~~~foo\n~~~bar\nbaz\n~~~\n~~~~\n\n~~~~foo\n```bar\nbaz\n```\n~~~~\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/code-block.output.fence=`.text",
    "content": "Ticks:\n\n```javascript\nalert('Hello World!');\n```\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/code-block.output.fence=~.text",
    "content": "Tildes:\n\n~~~javascript\nalert('Hello World!');\n~~~\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/code-blocks.output.fences.text",
    "content": "A code block using fences:\n\n```\nalert('Hello World!');\n```\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/code-blocks.output.text",
    "content": "A code block NOT using fences:\n\n    alert('Hello World!');\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/code-blocks.text",
    "content": "\tcode block on the first line\n\t\nRegular text.\n\n    code block indented by spaces\n\nRegular text.\n\n\tthe lines in this block  \n\tall contain trailing spaces  \n\nRegular Text.\n\n\tcode block on the last line\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/code-spans.text",
    "content": "`<test a=\"` content of attribute `\">`\n\nFix for backticks within HTML tag: <span attr='`ticks`'>like this</span>\n\nHere's how you put `` `backticks` `` in a code span.\n\nAdditionally, empty code spans are NOT supported: ``.\n\nHere’s an example, `` foo ` bar  ``.\n\nAnd here, ` `` `.\n\n``\n// this is also inline code\n``\n\nSo is this `foo   bar\n  baz`.\n\nAnd this `foo `` bar`\n\nAnd `this\\`but this is text`.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/def-blocks.text",
    "content": "> hello\n> [1]: hello\n\n* * *\n\n> hello\n[2]: hello\n\n\n* hello\n* [3]: hello\n\n\n* hello\n[4]: hello\n\n\n> foo\n> bar\n[1]: foo\n> bar\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/definition-newline.text",
    "content": "[baz]: /url (\n)\n\n[foo]: /url \"\n\"\n\n[bar]: /url '\n'\n[baz]: /url (foo\nbar)\n\n[baz]: /url \"foo\nbar\"\n\n[baz]: /url 'foo\nbar'\n\n[baz]: /url 'foo"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/definition-unclosed-attribute.text",
    "content": "\n[baz]: /url (there\n\n[foo]: /url \"there\n\n[bar]: /url 'there\n\n[baz]: url (\n\n[foo]: url \"\n\n[bar]: /url '\n\n[baz]: <url>(\n\n[foo]: <url>\"\n\n[bar]: <url>'"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/definition-unclosed.text",
    "content": "[foo]:\n\n[bar]: </url\n\n[foo]:"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/deletion.text",
    "content": "hello ~~hi~~ world\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/double-link.text",
    "content": "<p>Already linked: <a href=\"http://example.com/\">http://example.com/</a>.</p>\n\nAlready linked: [http://example.com/](http://example.com/).\n\nAlready linked: <a href=\"http://example.com/\">**http://example.com/**</a>.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/emphasis-empty.text",
    "content": "Hello ** ** world.\n\nHello __\t__ world.\n\nHello *\t* world.\n\nHello _\t_ world.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/emphasis-escaped-final-marker.text",
    "content": "*bar\\*\n\n**bar\\**\n\n_bar\\_\n\n__bar\\__\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/emphasis-internal.text",
    "content": "These words should_not_be_emphasized.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/emphasis.output.emphasis=-asterisk-.strong=_.text",
    "content": "*emphasis*.\n\n__strong__.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/emphasis.output.emphasis=_.strong=-asterisk-.text",
    "content": "_emphasis_.\n\n**strong**.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/empty.text",
    "content": ""
  },
  {
    "path": "packages/rebber/__tests__/fixtures/entities-advanced.text",
    "content": "> However, &MadeUpEntities; are kept in the document.\n\n> Entities even work in the language flag of fenced code blocks:\n\n> ```some&copylanguage\n> alert('Hello');\n> ```\n\n> And in an auto-link: <http://example&copyxample.com>\n\n> Foo and bar and http://example&copyxample.com and baz.\n\n> Or in [l&copynks](\n>   ~/some&copyfile \"in some pl&copyce\")\n\n> Or in [l&copylnks](\n>   <~/some&copyfile>\n>   \"in some pl&copyce\")\n\n> Or in ![\n>   l&copynks\n> ](\n>   ~/some&copyfile \"in some pl&copyce\")\n\n***\n\n> Or in ![l&copylnks](\n>   <~/some&copyfile>\n>   \"in some pl&copyce\")\n\n> Or in ![\n>   l&copynks\n> ][12]\n\n> [1]: http://example&copyxample.com \"in some\n> pl&copyce\"\n\n> [\n>   1\n> ]: http://example&copyxample.com \"in some\n> pl&copyce\"\n\n***\n\n> But, entities are not interpreted in `inline c&oumlde`, or in\n> code blocks:\n\n>     C&OumlDE block.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/entities.output.entities.text",
    "content": "# Entities\n\nPlain&nbsp;text:\n\nAT&amp;T with entity, AT&amp;T with numeric entity, AT&amp;T without entity.\n\nFenced code language flags:\n\n```AT&amp;T\nSomething in the AT&amp;T language\n```\n\n```AT&amp;T\nSomething in the AT&#x26;T language\n```\n\nAutomatic links:\n\n<http://at&amp;t.com>, <http://at&amp;t.com>, and <http://at&amp;t.com>.\n\nLink `href`:\n\n[With entity](http://at&amp;t.com), [numeric entity](http://at&amp;t.com), [without entity](http://at&amp;t.com).\n\nLink `title`:\n\n[With entity](http://att.com \"AT&amp;T\"), [numeric entity](http://att.com \"AT&amp;T\"), [without entity](http://example.com \"AT&amp;T\").\n\nImage `src`:\n\n![With entity](http://at&amp;t.com/fav.ico), ![numeric entity](http://at&amp;t.com/fav.ico), ![without entity](http://at&amp;t.com/fav.ico).\n\nImage `alt`:\n\n![AT&amp;T with entity](http://att.com/fav.ico), ![AT&amp;T with numeric entity](http://att.com/fav.ico), ![AT&amp;T without entity](http://att.com/fav.ico).\n\nImage `title`:\n\n![With entity](http://att.com/fav.ico \"AT&amp;T\"), ![numeric entity](http://att.com/fav.ico \"AT&amp;T\"), ![without entity](http://att.com/fav.ico \"AT&amp;T\").\n\nImage Reference `alt`:\n\n![AT&amp;T with entity][favicon], ![AT&amp;T with numeric entity][favicon], ![AT&amp;T without entity][favicon].\n\n[favicon]: http://att.com/fav.ico \"ATT favicon\"\n\nShortcut and collapsed references:\n\n[foo&bar], [foo&bar][], [foo&amp;bar], [foo&amp;bar][].\n\n[foo&bar]: http://example.com\n\n[foo&amp;bar]: http://example.com\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/entities.output.entities=escape.text",
    "content": "# Entities\n\nPlain text:\n\nAT&amp;T with entity, AT&amp;T with numeric entity, AT&amp;T without entity.\n\nFenced code language flags:\n\n```AT&amp;T\nSomething in the AT&amp;T language\n```\n\n```AT&amp;T\nSomething in the AT&#x26;T language\n```\n\nAutomatic links:\n\n<http://at&amp;t.com>, <http://at&amp;t.com>, and <http://at&amp;t.com>.\n\nLink `href`:\n\n[With entity](http://at&amp;t.com), [numeric entity](http://at&amp;t.com), [without entity](http://at&amp;t.com).\n\nLink `title`:\n\n[With entity](http://att.com \"AT&amp;T\"), [numeric entity](http://att.com \"AT&amp;T\"), [without entity](http://example.com \"AT&amp;T\").\n\nImage `src`:\n\n![With entity](http://at&amp;t.com/fav.ico), ![numeric entity](http://at&amp;t.com/fav.ico), ![without entity](http://at&amp;t.com/fav.ico).\n\nImage `alt`:\n\n![AT&amp;T with entity](http://att.com/fav.ico), ![AT&amp;T with numeric entity](http://att.com/fav.ico), ![AT&amp;T without entity](http://att.com/fav.ico).\n\nImage `title`:\n\n![With entity](http://att.com/fav.ico \"AT&amp;T\"), ![numeric entity](http://att.com/fav.ico \"AT&amp;T\"), ![without entity](http://att.com/fav.ico \"AT&amp;T\").\n\nImage Reference `alt`:\n\n![AT&amp;T with entity][favicon], ![AT&amp;T with numeric entity][favicon], ![AT&amp;T without entity][favicon].\n\n[favicon]: http://att.com/fav.ico \"ATT favicon\"\n\nShortcut and collapsed references:\n\n[foo&bar], [foo&bar][], [foo&amp;bar], [foo&amp;bar][].\n\n[foo&bar]: http://example.com\n\n[foo&amp;bar]: http://example.com\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/entities.output.entities=numbers.text",
    "content": "# Entities\n\nPlain&#xA0;text:\n\nAT&#x26;T with entity, AT&#x26;T with numeric entity, AT&#x26;T without entity.\n\nFenced code language flags:\n\n```AT&#x26;T\nSomething in the AT&amp;T language\n```\n\n```AT&#x26;T\nSomething in the AT&#x26;T language\n```\n\nAutomatic links:\n\n<http://at&#x26;t.com>, <http://at&#x26;t.com>, and <http://at&#x26;t.com>.\n\nLink `href`:\n\n[With entity](http://at&#x26;t.com), [numeric entity](http://at&#x26;t.com), [without entity](http://at&#x26;t.com).\n\nLink `title`:\n\n[With entity](http://att.com \"AT&#x26;T\"), [numeric entity](http://att.com \"AT&#x26;T\"), [without entity](http://example.com \"AT&#x26;T\").\n\nImage `src`:\n\n![With entity](http://at&#x26;t.com/fav.ico), ![numeric entity](http://at&#x26;t.com/fav.ico), ![without entity](http://at&#x26;t.com/fav.ico).\n\nImage `alt`:\n\n![AT&#x26;T with entity](http://att.com/fav.ico), ![AT&#x26;T with numeric entity](http://att.com/fav.ico), ![AT&#x26;T without entity](http://att.com/fav.ico).\n\nImage `title`:\n\n![With entity](http://att.com/fav.ico \"AT&#x26;T\"), ![numeric entity](http://att.com/fav.ico \"AT&#x26;T\"), ![without entity](http://att.com/fav.ico \"AT&#x26;T\").\n\nImage Reference `alt`:\n\n![AT&#x26;T with entity][favicon], ![AT&#x26;T with numeric entity][favicon], ![AT&#x26;T without entity][favicon].\n\n[favicon]: http://att.com/fav.ico \"ATT favicon\"\n\nShortcut and collapsed references:\n\n[foo&bar], [foo&bar][], [foo&amp;bar], [foo&amp;bar][].\n\n[foo&bar]: http://example.com\n\n[foo&amp;bar]: http://example.com\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/entities.output.noentities.text",
    "content": "# Entities\n\nPlain text:\n\nAT&T with entity, AT&T with numeric entity, AT&T without entity.\n\nFenced code language flags:\n\n```AT&T\nSomething in the AT&amp;T language\n```\n\n```AT&T\nSomething in the AT&#x26;T language\n```\n\nAutomatic links:\n\n<http://at&t.com>, <http://at&t.com>, and <http://at&t.com>.\n\nLink `href`:\n\n[With entity](http://at&t.com), [numeric entity](http://at&t.com), [without entity](http://at&t.com).\n\nLink `title`:\n\n[With entity](http://att.com \"AT&T\"), [numeric entity](http://att.com \"AT&T\"), [without entity](http://example.com \"AT&T\").\n\nImage `src`:\n\n![With entity](http://at&t.com/fav.ico), ![numeric entity](http://at&t.com/fav.ico), ![without entity](http://at&t.com/fav.ico).\n\nImage `alt`:\n\n![AT&T with entity](http://att.com/fav.ico), ![AT&T with numeric entity](http://att.com/fav.ico), ![AT&T without entity](http://att.com/fav.ico).\n\nImage `title`:\n\n![With entity](http://att.com/fav.ico \"AT&T\"), ![numeric entity](http://att.com/fav.ico \"AT&T\"), ![without entity](http://att.com/fav.ico \"AT&T\").\n\nImage Reference `alt`:\n\n![AT&T with entity][favicon], ![AT&T with numeric entity][favicon], ![AT&T without entity][favicon].\n\n[favicon]: http://att.com/fav.ico \"ATT favicon\"\n\nShortcut and collapsed references:\n\n[foo&bar], [foo&bar][], [foo&amp;bar], [foo&amp;bar][].\n\n[foo&bar]: http://example.com\n\n[foo&amp;bar]: http://example.com\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/entities.text",
    "content": "Lots of entities are supported in mdast: &nbsp;, &amp;, &copy;, &AElig;,\n&Dcaron;, &frac34;, &HilbertSpace;, &DifferentialD;,\n&ClockwiseContourIntegral;, &c.  Even some entities with a missing\nterminal semicolon are parsed correctly (as per the HTML5 spec):\n&yuml, &aacute, &copy, and &amp.\n\nHowever, &MadeUpEntities; are kept in the document.\n\nEntities even work in the language flag of fenced code blocks:\n\n```some&mdash;language\nalert('Hello');\n```\n\nOr in [l&iacute;nks](~/some&mdash;file \"in some pl&aelig;ce\")\n\nOr in ![&iacute;mages](~/an&ndash;image.png \"&copy Someone\")\n\nBut, entities are not interpreted in `inline c&ouml;de`, or in\ncode blocks:\n\n\tC&Ouml;DE block.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/escaped-angles.text",
    "content": "\\>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/fenced-code-empty.text",
    "content": "Normal with language tag:\n\n```js\n```\n\nWith white space:\n\n``` bash\n```\n\nWith very long fences:\n\n``````\n``````\n\nWith nothing:\n\n```\n```\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/fenced-code-trailing-characters-2.nooutput.text",
    "content": "```\n``` aaa\n```\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/fenced-code-trailing-characters.nooutput.text",
    "content": "```js\nfoo();\n```bash\n```\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/fenced-code-white-space-after-flag.text",
    "content": "``` js \nfoo();\n```\n\n~~~~~ bash\t\necho \"hello, ${WORLD}\"\n~~~~~\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/fenced-code.text",
    "content": "``` js\nvar a = 'hello';\nconsole.log(a + ' world');\n```\n\n~~~bash\necho \"hello, ${WORLD}\"\n~~~\n\n```````longfence\nQ: What do you call a tall person who sells stolen goods?\n```````\n\n~~~~~~~~~~  ManyTildes\nA longfence!\n~~~~~~~~~~\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/hard-wrapped-paragraphs-with-list-like-lines.text",
    "content": "In Markdown 1.0.0 and earlier. Version\n8. This line turns into a list item.\nBecause a hard-wrapped line in the\n123. middle of a paragraph looked like a\nlist item.\n\nHere's one with a bullet.\n* criminey.\n\nNon-GFM does not create a list for either.\nGFM does not create a list for `8.`, but does for `*`.\nCommonMark creates a list for both.\nAll versions create lists for the following.\n\n* Here's one with a bullet.\n  * criminey.\n\n...and the following:\n\n1. In Markdown 1.0.0 and earlier. Version\n   8. This line turns into a list item.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/heading-atx-closed-trailing-white-space.text",
    "content": "# Foo # \n\n## Bar ##\t\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/heading-atx-empty.text",
    "content": "# #\n\n##\n\n### ###\n\n####\n\n##### #####\n\n######\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/heading-in-blockquote.text",
    "content": "> A blockquote\nwith some more text.\n\nA normal paragraph.\n\n> A blockquote followed by a horizontal rule (in CommonMark).\n---\n\n> A heading in a blockquote\n> ---\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/heading-in-paragraph.text",
    "content": "Hello\nWorld\n===\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/heading-not-atx.text",
    "content": "#This is not a heading, per CommonMark: <http://spec.commonmark.org/0.17/#example-25>\n\nKramdown (GitHub) neither supports unspaced ATX-headings.\n\n######## h7?\n\n######### h8?\n\n########## h9?\n\nMore than six # characters is not a heading: <http://spec.commonmark.org/0.26/#example-33>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/heading-setext-with-initial-spacing.text",
    "content": "  Heading 1\n=========\n\n   Heading 2\n---------\n\nBoth these headings caused positional problems in on commit daa344c and before.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/heading.output.close-atx.text",
    "content": "# Heading 1 #\n\n## Heading 2 ##\n\n### Heading 4 ###\n\n#### Heading 4 ####\n\n##### Heading 5 #####\n\n###### Heading 6 ######\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/heading.output.setext.text",
    "content": "Heading 1\n=========\n\nHeading 2\n---------\n\n### Heading 4\n\n#### Heading 4\n\n##### Heading 5\n\n###### Heading 6\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/horizontal-rules-adjacent.text",
    "content": "***\n---\n___\n\nThe three asterisks are not a Setext header.\n\nThis is a paragraph.\n***\n\nThis is another paragraph.\n___\n\nBut this is a secondary heading.\n---\n\n---\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/horizontal-rules.text",
    "content": "Dashes:\n\n---\n\n ---\n \n  ---\n\n   ---\n\n\t---\n\n- - -\n\n - - -\n \n  - - -\n\n   - - -\n\n\t- - -\n\n\nAsterisks:\n\n***\n\n ***\n \n  ***\n\n   ***\n\n\t***\n\n* * *\n\n * * *\n \n  * * *\n\n   * * *\n\n\t* * *\n\n\nUnderscores:\n\n___\n\n ___\n \n  ___\n\n   ___\n\n    ___\n\n_ _ _\n\n _ _ _\n \n  _ _ _\n\n   _ _ _\n\n    _ _ _\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/hr-list-break.text",
    "content": "* hello world\n* how are\n* * *\nyou today?\n\n\nThe above asterisks do split the list, but the below ones do not.\n\n\n- hello world\n- how are\n- * * *\nyou today?\n\n\n+ Neither do these\n+ how are\n+ * *\nyou today?\n\n\n- But these do\n- how are\n- - - -\nyou today?\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/hr.output.norule-spaces.text",
    "content": "***\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/hr.output.rule-repetition=5.text",
    "content": "* * * * *\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/hr.output.rule=-.text",
    "content": "- - -\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/hr.output.rule=-asterisk-.text",
    "content": "* * *\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/hr.output.rule=_.text",
    "content": "_ _ _\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/html-advanced.text",
    "content": "Simple block on one line:\n\n<div>foo</div>\n\nAnd nested without indentation:\n\n<div>\n<div>\n<div>\nfoo\n</div>\n<div style=\">\"/>\n</div>\n<div>bar</div>\n</div>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/html-attributes.text",
    "content": "# Block-level\n\n<article foo=\"bar 'baz' qux\" foo='bar \"baz\" qux' foo=baz>\n\n\n<article foo>\n\n\n<article>\n\n\n<article :foo:bar:09:=\"baz\">\n\n\n<article foo.bar_09->\n\n\n<article foo.bar_09-   >\n\n\n<article foo.bar_09-   />\n\n\n<div baz\nqux\n\n# Inline\n\n<span foo=\"bar 'baz' qux\" foo='bar \"baz\" qux' foo=baz>\n\n\n<span foo>\n\n\n<span>\n\n\n<span :foo:bar:09:=\"baz\">\n\n\n<span foo.bar_09->\n\n\n<span foo.bar_09-   >\n\n\n<span foo.bar_09-   />\n\n\n<span this is\ninvalid\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/html-cdata.text",
    "content": "<![CDATA[\nfooBarBaz()\n]]>\n\nfoo <![CDATA[bar]]>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/html-comments.text",
    "content": "Paragraph one.\n\n<!-- This is a simple comment -->\n\n<!--\n\tThis is another comment.\n-->\n\nWhat follows is not an HTML comment because it contains\ntwo consecutive dashes:\n<https://html.spec.whatwg.org/multipage/syntax.html#comments>.\n\n<!-- one comment block -- -- with two comments -->\n\nBut this is fine (in commonmark):\n\n<!-- one comment block - with a dash -->\n\nAnd, this is wrong (in commonmark):\n\n<!-->-->\n\nThe end.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/html-declaration.text",
    "content": "<!DOCTYPE html>\n\nfoo <!BAR br BAZ>\n\n<!doctype html>\n\n<!valid >\n\n<!invalid>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/html-indented.text",
    "content": " <div>\n  *hello*\n   <div>\n\n\n <span>\n  *hello*\n   <span>\n\n\n  <!doctype html>\n\n\n   <!-- baz -->\n\n\nalpha <!-- baz -->\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/html-processing-instruction.text",
    "content": "<?php\n  echo '>';\n?>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/html-simple.text",
    "content": "Here's a simple block:\n\n<div>\n\tfoo\n</div>\n\nThis should be a code block, though:\n\n\t<div>\n\t\tfoo\n\t</div>\n\nAs should this:\n\n\t<div>foo</div>\n\nNow, nested:\n\n<div>\n\t<div>\n\t\t<div>\n\t\t\tfoo\n\t\t</div>\n\t</div>\n</div>\n\nThis should just be an HTML comment:\n\n<!-- Comment -->\n\nMultiline:\n\n<!--\nBlah\nBlah\n-->\n\nCode block:\n\n\t<!-- Comment -->\n\nJust plain comment, with trailing spaces on the line:\n\n<!-- foo -->   \n\nCode:\n\n\t<hr>\n\t\nHr's:\n\n<hr>\n\n<hr>\n\n<hr>\n\n<hr>   \n\n<hr>  \n\n<hr> \n\n<hr class=\"foo\" id=\"bar\" />\n\n<hr class=\"foo\" id=\"bar\"/>\n\n<hr class=\"foo\" id=\"bar\" >\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/html-tags.text",
    "content": "# Block\n\n<article>\n\n\n<ARTICLE>\n\n\n<ArTiClE>\n\n\n<-article>\n\n\n<article foo=\n\n\n<article foo=\"bar\n\n\n<article foo='bar\n\n\n<article foo=bar \n\n\n<article foo=bar >\n\n\n<article/>\n\n\n<-article/>\n\n\n</article>\n\n\n</ARTICLE>\n\n\n</aRtIcLe>\n\n\n</article  >\n\n\n</-article  >\n\n\n</article\n\n\n</article  \n\n\n# Inline\n\n<span>\n\n\n<SPAN>\n\n\n<SpAn>\n\n\n<-span>\n\n\n<span/>\n\n\n<-span/>\n\n\n</span>\n\n\n</SPAN>\n\n\n</SpAn>\n\n\n</span  >\n\n\n</-span>\n\n\n</span\n\n\n</span  \n\n\n<span foo=\n\n\n<span foo=\"bar\n\n\n<span foo='bar\n\n\n<span foo=bar \n\n\n<span foo=bar >\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/image-basename-dots.text",
    "content": "![](x.yz.png)\n\n![](/a/w.x.y.z.png)\n\n![](/w.x.y.z.png)\n\n![](/foo.bar/x.yz.png)\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/image-empty-alt.text",
    "content": "![](/xyz.png)\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/image-in-link.text",
    "content": "# [![Unicorn approved](https://img.shields.io/badge/unicorn-approved-ff69b4.svg)](http://shields.io)\n\n[![Build Status](https://img.shields.io/travis/wooorm/mdast.svg?style=flat)](https://travis-ci.org/wooorm/mdast)\n\n[![Be Square](https://img.shields.io/badge/style-flat--squared-green.svg?style=flat-square)](http://example.com \"An example\")\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/image-path-escape.text",
    "content": "![](a}[b]\\ \\input{/etc/passwd}\\image{[a](b))\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/image-with-pipe.text",
    "content": "f|"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/images.output.noreference-images.text",
    "content": "Lorem ipsum dolor sit ![amet](http://amet.com/amet.jpeg \"Amet\"), consectetur adipiscing elit. Praesent dictum purus ullamcorper ligula semper pellentesque.\n\nNulla ![finibus](http://finibus.com/finibus.png \"Finibus\") neque et diam rhoncus convallis. Nam dictum sapien nec sem ultrices fermentum. Nulla ![facilisi](http://facilisi.com/facilisi.gif \"Facilisi\"). In et feugiat massa.\n\nDonec sed sodales metus, ut aliquet quam. Suspendisse nec ipsum risus. Interdum et malesuada fames ac ante ipsum primis in ![faucibus](http://faucibus.com/faucibus.tiff \"Faucibus\").\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/invalid-link-definition.text",
    "content": "Something[2-3]\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/lazy-blockquotes.text",
    "content": "> hi there\nbud\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/link-in-link.text",
    "content": "# [mailto:test@example.com](http://shields.io)\n\n[https://travis-ci.org/wooorm/mdast](https://travis-ci.org/wooorm/mdast \"mdast\")\n\n[[](http://example.com \"An example\")](http://example.com \"An example\")\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/link-spaces.text",
    "content": "[alpha] (bravo\n\n![charlie] (delta\n.com)\n\n[echo]\t(http://foxtrot.golf)\n\n![hotel]   (india.com/juliett)\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/link-whitespace.text",
    "content": "[alpha](https://example.com?bravo charlie).\n\n[alpha](https://example.com?bravo\tcharlie).\n\n[alpha](https://example.com?bravo\ncharlie).\n\n![alpha](https://example.com?bravo charlie).\n\n![alpha](https://example.com?bravo\tcharlie).\n\n![alpha](https://example.com?bravo\ncharlie).\n\n<https://example.com?bravo charlie>.\n\n<https://example.com?bravo\tcharlie>.\n\n<https://example.com?bravo\ncharlie>.\n\nhttps://example.com?bravo charlie.\n\nhttps://example.com?bravo\tcharlie.\n\nhttps://example.com?bravo\ncharlie.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/link-with-spaces.text",
    "content": "[Hello](<./world and some spaces.html>)\n\n[Hello](<./world and some spaces.html> \"and a title\")"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-inline-style.text",
    "content": "Just a [URL](/url/).\n\n[URL and title](/url/ \"title\").\n\n[URL and title](/url/  \"title preceded by two spaces\").\n\n[URL and title](/url/\t\"title preceded by a tab\").\n\n[URL and title](/url/ \"title has spaces afterward\"  ).\n\n[URL and title]( /url/has space ).\n\n[URL and title]( /url/has space/ \"url has space and title\").\n\n[Empty]().\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-reference-proto.text",
    "content": "A [primary][toString], [secondary][constructor], and [tertiary][__proto__] link.\n\n[toString]: http://primary.com\n[__proto__]: http://tertiary.com\n[constructor]: http://secondary.com\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-reference-style.text",
    "content": "Foo [bar] [1].\n\nFoo [bar][1].\n\nFoo [bar]\n[1].\n\n[1]: /url/  \"Title\"\n\n\nWith [embedded \\[brackets\\]] [b].\n\n\nIndented [once][].\n\nIndented [twice][].\n\nIndented [thrice][].\n\nIndented [four][] times.\n\n [once]: /url\n\n  [twice]: /url\n\n   [thrice]: /url\n\n    [four]: /url\n\n\n[b]: /url/\n\n* * *\n\n[this] [this] should work\n\nSo should [this][this].\n\nAnd [this] [].\n\nAnd [this][].\n\nAnd [this].\n\nBut not [that] [].\n\nNor [that][].\n\nNor [that].\n\n[Something in brackets like [this][] should work]\n\n[Same with [this].]\n\nIn this case, [this](/somethingelse/) points to something else.\n\nBackslashing should suppress \\[this] and [this\\].\n\n[this]: foo\n\n\n* * *\n\nHere's one where the [link\nbreaks] across lines.\n\nHere's another where the [link \nbreaks] across lines, but with a line-ending space.\n\n\n[link breaks]: /url/\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-shortcut-references.text",
    "content": "This is the [simple case].\n\n[simple case]: /simple\n\n\n\nThis one has a [line\nbreak].\n\nThis one has a [line \nbreak] with a line-ending space.\n\n[line break]: /foo\n\n\n[this] [that] and the [other]\n\n[this]: /this\n[that]: /that\n[other]: /other\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-text-delimiters.text",
    "content": "[Hello [world]!](./hello-world.html).\n\n[Hello [world]!](<./hello-world.html>).\n\n![Hello [world]!](./hello-world.html).\n\n![Hello [world]!](<./hello-world.html>).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-text-empty.text",
    "content": "[](./hello-world.html).\n\n[](<./hello-world.html>).\n\n![](./hello-world.html).\n\n![](<./hello-world.html>).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-text-entity-delimiters.text",
    "content": "[Hello &lsqb;world&rsqb;!](./hello-world.html).\n\n[Hello &lsqb;world&rsqb;!](<./hello-world.html>).\n\n![Hello &lsqb;world&rsqb;!](./hello-world.html).\n\n![Hello &lsqb;world&rsqb;!](<./hello-world.html>).\n\n[Hello &#x5B;world&#x5D;!](./hello-world.html).\n\n[Hello &#x5B;world&#x5D;!](<./hello-world.html>).\n\n![Hello &#x5B;world&#x5D;!](./hello-world.html).\n\n![Hello &#x5B;world&#x5D;!](<./hello-world.html>).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-text-escaped-delimiters.text",
    "content": "[Hello \\[world\\]!](./hello-world.html).\n\n[Hello \\[world\\]!](<./hello-world.html>).\n\n![Hello \\[world\\]!](./hello-world.html).\n\n![Hello \\[world\\]!](<./hello-world.html>).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-text-mismatched-delimiters.text",
    "content": "[Hello [world!](./hello-world.html).\n\n[Hello [world!](<./hello-world.html>).\n\n![Hello [world!](./hello-world.html).\n\n![Hello [world!](<./hello-world.html>).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-double-quotes-delimiters.text",
    "content": "[Hello](./world.html \"Hello \"World\" Hello!\").\n\n[Hello](<./world.html> \"Hello \"World\" Hello!\").\n\n![Hello](./world.html \"Hello \"World\" Hello!\").\n\n![Hello](<./world.html> \"Hello \"World\" Hello!\").\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-double-quotes-entity-delimiters.text",
    "content": "[Hello](./world.html \"Hello &quot;World&quot; Hello!\").\n\n[Hello](<./world.html> \"Hello &quot;World&quot; Hello!\").\n\n![Hello](./world.html \"Hello &quot;World&quot; Hello!\").\n\n![Hello](<./world.html> \"Hello &quot;World&quot; Hello!\").\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-double-quotes-escaped-delimiters.text",
    "content": "[Hello](./world.html \"Hello \\\"World\\\" Hello!\").\n\n[Hello](<./world.html> \"Hello \\\"World\\\" Hello!\").\n\n![Hello](./world.html \"Hello \\\"World\\\" Hello!\").\n\n![Hello](<./world.html> \"Hello \\\"World\\\" Hello!\").\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-double-quotes-mismatched-delimiters.text",
    "content": "[Hello](./world.html \"Hello \"World Hello!\").\n\n[Hello](<./world.html> \"Hello \"World Hello!\").\n\n![Hello](./world.html \"Hello \"World Hello!\").\n\n![Hello](<./world.html> \"Hello \"World Hello!\").\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-double-quotes.text",
    "content": "[Hello](./world.html \"Hello World!\").\n\n[Hello](<./world.html> \"Hello World!\").\n\n![Hello](./world.html \"Hello World!\").\n\n![Hello](<./world.html> \"Hello World!\").\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-empty-double-quotes.text",
    "content": "[Hello](./world.html \"\").\n\n[Hello](<./world.html> \"\").\n\n![Hello](./world.html \"\").\n\n![Hello](<./world.html> \"\").\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-empty-parentheses.text",
    "content": "[Hello](./world.html ()).\n\n[Hello](<./world.html> ()).\n\n![Hello](./world.html ()).\n\n![Hello](<./world.html> ()).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-empty-single-quotes.text",
    "content": "[Hello](./world.html '').\n\n[Hello](<./world.html> '').\n\n![Hello](./world.html '').\n\n![Hello](<./world.html> '').\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-parentheses.text",
    "content": "[Hello](./world.html (Hello World!)).\n\n[Hello](<./world.html> (Hello World!)).\n\n![Hello](./world.html (Hello World!)).\n\n![Hello](<./world.html> (Hello World!)).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-single-quotes-delimiters.text",
    "content": "[Hello](./world.html 'Hello 'World' Hello!').\n\n[Hello](<./world.html> 'Hello 'World' Hello!').\n\n![Hello](./world.html 'Hello 'World' Hello!').\n\n![Hello](<./world.html> 'Hello 'World' Hello!').\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-single-quotes-entity-delimiters.text",
    "content": "[Hello](./world.html \"Hello &apos;World&apos; Hello!\").\n\n[Hello](<./world.html> \"Hello &apos;World&apos; Hello!\").\n\n![Hello](./world.html \"Hello &apos;World&apos; Hello!\").\n\n![Hello](<./world.html> \"Hello &apos;World&apos; Hello!\").\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-single-quotes-escaped-delimiters.text",
    "content": "[Hello](./world.html 'Hello \\'World\\' Hello!').\n\n[Hello](<./world.html> 'Hello \\'World\\' Hello!').\n\n![Hello](./world.html 'Hello \\'World\\' Hello!').\n\n![Hello](<./world.html> 'Hello \\'World\\' Hello!').\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-single-quotes-mismatched-delimiters.text",
    "content": "[Hello](./world.html 'Hello 'World Hello!').\n\n[Hello](<./world.html> 'Hello 'World Hello!').\n\n![Hello](./world.html 'Hello 'World Hello!').\n\n![Hello](<./world.html> 'Hello 'World Hello!').\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-single-quotes.text",
    "content": "[Hello](./world.html 'Hello World!').\n\n[Hello](<./world.html> 'Hello World!').\n\n![Hello](./world.html 'Hello World!').\n\n![Hello](<./world.html> 'Hello World!').\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-title-unclosed.text",
    "content": "[Hello](./world.html 'Hello\n\n[Hello](<./world.html> 'Hello\n\n![Hello](./world.html 'Hello\n\n![Hello](<./world.html> 'Hello\n\n[Hello](./world.html \"Hello\n\n[Hello](<./world.html> \"Hello\n\n![Hello](./world.html \"Hello\n\n![Hello](<./world.html> \"Hello\n\n[Hello](./world.html (Hello\n\n[Hello](<./world.html> (Hello\n\n![Hello](./world.html (Hello\n\n![Hello](<./world.html> (Hello\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-url-empty-title-double-quotes.text",
    "content": "[Hello](\"World!\").\n\n[Hello]( \"World!\").\n\n[World](<> \"World!\").\n\n![Hello](\"World!\").\n\n![Hello]( \"World!\").\n\n![World](<> \"World!\").\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-url-empty-title-parentheses.text",
    "content": "[Hello]((World!)).\n\n[Hello]( (World!)).\n\n[World](<> (World!)).\n\n![Hello]((World!)).\n\n![Hello]( (World!)).\n\n![World](<> (World!)).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-url-empty-title-single-quotes.text",
    "content": "[Hello]('World!').\n\n[Hello]( 'World!').\n\n[World](<> 'World!').\n\n![Hello]('World!').\n\n![Hello]( 'World!').\n\n![World](<> 'World!').\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-url-empty.text",
    "content": "[Hello]().\n\n[World](<>).\n\n![Hello]().\n\n![World](<>).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-url-entity-parentheses.text",
    "content": "[Hello](./world&lpar;and-hello&lpar;world&rpar;).\n\n[Hello](<./world&lpar;and-hello&lpar;world&rpar;>).\n\n[Hello](./world&lpar;and&rpar;helloworld&rpar;).\n\n[Hello](<./world&lpar;and&rpar;helloworld&rpar;>).\n\n[Hello](./world&#x28;and-hello&#x28;world&#x29;).\n\n[Hello](<./world&#x28;and-hello&#x28;world&#x29;>).\n\n[Hello](./world&#x28;and&#x29;helloworld&#x29;).\n\n[Hello](<./world&#x28;and&#x29;helloworld&#x29;>).\n\n![Hello](./world&lpar;and-hello&lpar;world&rpar;).\n\n![Hello](<./world&lpar;and-hello&lpar;world&rpar;>).\n\n![Hello](./world&lpar;and&rpar;helloworld&rpar;).\n\n![Hello](<./world&lpar;and&rpar;helloworld&rpar;>).\n\n![Hello](./world&#x28;and-hello&#x28;world&#x29;).\n\n![Hello](<./world&#x28;and-hello&#x28;world&#x29;>).\n\n![Hello](./world&#x28;and&#x29;helloworld&#x29;).\n\n![Hello](<./world&#x28;and&#x29;helloworld&#x29;>).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-url-escaped-parentheses.text",
    "content": "[Hello](./world\\(and-hello\\(world\\)).\n\n[Hello](<./world\\(and-hello\\(world\\)>).\n\n[Hello](./world\\(and\\)helloworld\\)).\n\n[Hello](<./world\\(and\\)helloworld\\)>).\n\n![Hello](./world\\(and-hello\\(world\\)).\n\n![Hello](<./world\\(and-hello\\(world\\)>).\n\n![Hello](./world\\(and\\)helloworld\\)).\n\n![Hello](<./world\\(and\\)helloworld\\)>).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-url-mismatched-parentheses.text",
    "content": "[Hello](./world(and-hello(world)).\n\n[Hello](<./world(and-hello(world)>).\n\n[Hello](./world(and)helloworld)).\n\n[Hello](<./world(and)helloworld)>).\n\n![Hello](./world(and-hello(world)).\n\n![Hello](<./world(and-hello(world)>).\n\n![Hello](./world(and)helloworld)).\n\n![Hello](<./world(and)helloworld)>).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-url-nested-parentheses.text",
    "content": "[Hello](./world(and)hello(world)).\n\n[Hello](<./world(and)hello(world)>).\n\n![Hello](./world(and)hello(world)).\n\n![Hello](<./world(and)hello(world)>).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-url-new-line.text",
    "content": "[Hello](./wo\nrld.html).\n\n[Hello](<./wo\nrld.html>).\n\n![Hello](./wo\nrld.png).\n\n![Hello](<./wo\nrld.png>).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-url-unclosed.text",
    "content": "[Hello](\n\n\n[World](<\n\n\n![Hello](\n\n\n![World](<\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links-url-white-space.text",
    "content": "[Hello](./wo rld.html).\n\n[Hello](<./wo rld.html>).\n\n![Hello](./wo rld.png).\n\n![Hello](<./wo rld.png>).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/links.output.noreference-links.text",
    "content": "Lorem ipsum dolor sit [amet](http://amet.com \"Amet\"), consectetur adipiscing elit. Praesent dictum purus ullamcorper ligula semper pellentesque.\n\nNulla [finibus](http://finibus.com \"Finibus\") neque et diam rhoncus convallis. Nam dictum sapien nec sem ultrices fermentum. Nulla [facilisi](http://facilisi.com \"Facilisi\"). In et feugiat massa.\n\nDonec sed sodales metus, ut aliquet quam. Suspendisse nec ipsum risus. Interdum et malesuada fames ac ante ipsum primis in [faucibus](http://faucibus.com \"Faucibus\").\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-after-list.text",
    "content": "- item\n- item\n- item\n\n1. item\n1. item\n1. item\n\n---\n\n- item\n- item\n- item\n1. item\n1. item\n1. item\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-and-code.text",
    "content": "*   This is a list item\n\n\n    This is code\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-continuation.text",
    "content": "1. foo\n---\n\n\n1. foo\n```js\ncode();\n```\n\n\n1. [foo][]\n[foo]: http://google.com\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-indentation.nooutput.text",
    "content": "- Hello 1a\n\n World 1a.\n\n- Hello 1b\n\n  World 1b.\n\n-  Hello 2a\n\n  World 2a.\n\n-  Hello 2b\n\n   World 2b.\n\n-   Hello 3a\n\n   World 3a.\n\n-   Hello 3b\n\n    World 3b.\n\n-    Hello 4a\n\n    World 4a.\n\n-    Hello 4b\n\n     World 4b.\n\n-     Hello 5a\n\n     World 5a.\n\n-     Hello 5b\n\n      World 5b.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-item-empty-with-white-space.text",
    "content": "- \n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-item-empty.text",
    "content": "-   foo\n-\n-   bar\n\n  -   foo\n  -\n  -   bar\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-item-indent.list-item-indent=1.output.text",
    "content": "1. foo bar baz.\n\n<!--  -->\n\n99. foo bar baz.\n\n<!--  -->\n\n999. foo bar baz.\n\n<!--  -->\n\n1. foo bar baz.\n   foo bar baz.\n\n<!--  -->\n\n99. foo bar baz.\n    foo bar baz.\n\n<!--  -->\n\n999. foo bar baz.\n     foo bar baz.\n\n<!--  -->\n\n- foo bar baz.\n\n<!--  -->\n\n- foo bar baz.\n  foo bar baz.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-item-indent.list-item-indent=mixed.output.text",
    "content": "1. foo bar baz.\n\n<!--  -->\n\n99. foo bar baz.\n\n<!--  -->\n\n999. foo bar baz.\n\n<!--  -->\n\n1.  foo bar baz.\n    foo bar baz.\n\n<!--  -->\n\n99. foo bar baz.\n    foo bar baz.\n\n<!--  -->\n\n999.    foo bar baz.\n        foo bar baz.\n\n<!--  -->\n\n- foo bar baz.\n\n<!--  -->\n\n-   foo bar baz.\n    foo bar baz.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-item-indent.list-item-indent=tab.output.text",
    "content": "1.  foo bar baz.\n\n<!--  -->\n\n99. foo bar baz.\n\n<!--  -->\n\n999.    foo bar baz.\n\n<!--  -->\n\n1.  foo bar baz.\n    foo bar baz.\n\n<!--  -->\n\n99. foo bar baz.\n    foo bar baz.\n\n<!--  -->\n\n999.    foo bar baz.\n        foo bar baz.\n\n<!--  -->\n\n-   foo bar baz.\n\n<!--  -->\n\n-   foo bar baz.\n    foo bar baz.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-item-newline.nooutput.text",
    "content": "-   Foo\n-\n    Bar\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-item-text.text",
    "content": "  * item1\n\n    * item2\n\n  text\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-ordered.increment-list-marker.output.text",
    "content": "2.  foo;\n3.  bar;\n4.  baz.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list-ordered.noincrement-list-marker.output.text",
    "content": "2.  foo;\n2.  bar;\n2.  baz.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list.output.bullet=+.text",
    "content": "# List bullets\n\n+   One:\n    +   Nested one;\n    +   Nested two:\n        +   Nested three.\n+   Two;\n+   Three.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list.output.bullet=-.text",
    "content": "# List bullets\n\n-   One:\n    -   Nested one;\n    -   Nested two:\n        -   Nested three.\n-   Two;\n-   Three.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/list.output.bullet=-asterisk-.text",
    "content": "# List bullets\n\n*   One:\n    *   Nested one;\n    *   Nested two:\n        *   Nested three.\n*   Two;\n*   Three.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/lists-with-code-and-rules.text",
    "content": "## foo\n\n1. bar:\n\n    > - one\n        - two\n            - three\n            - four\n            - five\n\n1. foo:\n\n    ```\n    line 1\n    line 2\n    ```\n\n1. foo:\n\n    1. foo `bar` bar:\n\n        ``` erb\n        some code here\n        ```\n\n    2. foo `bar` bar:\n\n        ``` erb\n        foo\n        ---\n        bar\n        ---\n        foo\n        bar\n        ```\n\n    3. foo `bar` bar:\n\n        ``` html\n        ---\n        foo\n        foo\n        ---\n        bar\n        ```\n\n    4. foo `bar` bar:\n\n            foo\n            ---\n            bar\n\n    5. foo\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/loose-lists.text",
    "content": "* hello\n  world\n\n  how\n  are\n* you\n\n\n\nbetter behavior:\n\n* hello\n  * world\n    how\n\n    are\n    you\n\n  * today\n* hi\n\n\n\n* hello\n\n* world\n* hi\n\n\n\n* hello\n* world\n\n* hi\n\n\n\n* hello\n* world\n\n  how\n* hi\n\n\n\n* hello\n* world\n* how\n  are\n\n\n\n* hello\n* world\n\n* how\n  are\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/main.text",
    "content": "[test]: http://google.com/ \"Google\"\n\n# A heading\n\nJust a note, I've found that I can't test my markdown parser vs others.\nFor example, both markdown.js and showdown code blocks in lists wrong. They're\nalso completely [inconsistent][test] with regards to paragraphs in list items.\n\nA link. Not anymore.\n\n<aside>This will make me fail the test because\nmarkdown.js doesnt acknowledge arbitrary html blocks =/</aside>\n\n* List Item 1\n\n* List Item 2\n  * New List Item 1\n    Hi, this is a list item.\n  * New List Item 2\n    Another item\n        Code goes here.\n        Lots of it...\n  * New List Item 3\n    The last item\n\n* List Item 3\nThe final item.\n\n* List Item 4\nThe real final item.\n\nParagraph.\n\n> * bq Item 1\n> * bq Item 2\n>   * New bq Item 1\n>   * New bq Item 2\n>   Text here\n\n* * *\n\n> Another blockquote!\n> I really need to get\n> more creative with\n> mockup text..\n> markdown.js breaks here again\n\nAnother Heading\n-------------\n\nHello *world*. Here is a [link](//hello).\nAnd an image ![alt](src \"a title\").\nAnd an image with an empty alt attribute ![](src).\n\n    Code goes here.\n    Lots of it...\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/markdown-documentation-basics.text",
    "content": "Markdown: Basics\n================\n\n<ul id=\"ProjectSubmenu\">\n    <li><a href=\"/projects/markdown/\" title=\"Markdown Project Page\">Main</a></li>\n    <li><a class=\"selected\" title=\"Markdown Basics\">Basics</a></li>\n    <li><a href=\"/projects/markdown/syntax\" title=\"Markdown Syntax Documentation\">Syntax</a></li>\n    <li><a href=\"/projects/markdown/license\" title=\"Pricing and License Information\">License</a></li>\n    <li><a href=\"/projects/markdown/dingus\" title=\"Online Markdown Web Form\">Dingus</a></li>\n</ul>\n\n\nGetting the Gist of Markdown's Formatting Syntax\n------------------------------------------------\n\nThis page offers a brief overview of what it's like to use Markdown.\nThe [syntax page] [s] provides complete, detailed documentation for\nevery feature, but Markdown should be very easy to pick up simply by\nlooking at a few examples of it in action. The examples on this page\nare written in a before/after style, showing example syntax and the\nHTML output produced by Markdown.\n\nIt's also helpful to simply try Markdown out; the [Dingus] [d] is a\nweb application that allows you type your own Markdown-formatted text\nand translate it to XHTML.\n\n**Note:** This document is itself written using Markdown; you\ncan [see the source for it by adding '.text' to the URL] [src].\n\n  [s]: /projects/markdown/syntax  \"Markdown Syntax\"\n  [d]: /projects/markdown/dingus  \"Markdown Dingus\"\n  [src]: /projects/markdown/basics.text\n\n\n## Paragraphs, Headers, Blockquotes ##\n\nA paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing spaces or tabs is considered\nblank.) Normal paragraphs should not be intended with spaces or tabs.\n\nMarkdown offers two styles of headers: *Setext* and *atx*.\nSetext-style headers for `<h1>` and `<h2>` are created by\n\"underlining\" with equal signs (`=`) and hyphens (`-`), respectively.\nTo create an atx-style header, you put 1-6 hash marks (`#`) at the\nbeginning of the line -- the number of hashes equals the resulting\nHTML header level.\n\nBlockquotes are indicated using email-style '`>`' angle brackets.\n\nMarkdown:\n\n    A First Level Header\n    ====================\n    \n    A Second Level Header\n    ---------------------\n\n    Now is the time for all good men to come to\n    the aid of their country. This is just a\n    regular paragraph.\n\n    The quick brown fox jumped over the lazy\n    dog's back.\n    \n    ### Header 3\n\n    > This is a blockquote.\n    > \n    > This is the second paragraph in the blockquote.\n    >\n    > ## This is an H2 in a blockquote\n\n\nOutput:\n\n    <h1>A First Level Header</h1>\n    \n    <h2>A Second Level Header</h2>\n    \n    <p>Now is the time for all good men to come to\n    the aid of their country. This is just a\n    regular paragraph.</p>\n    \n    <p>The quick brown fox jumped over the lazy\n    dog's back.</p>\n    \n    <h3>Header 3</h3>\n    \n    <blockquote>\n        <p>This is a blockquote.</p>\n        \n        <p>This is the second paragraph in the blockquote.</p>\n        \n        <h2>This is an H2 in a blockquote</h2>\n    </blockquote>\n\n\n\n### Phrase Emphasis ###\n\nMarkdown uses asterisks and underscores to indicate spans of emphasis.\n\nMarkdown:\n\n    Some of these words *are emphasized*.\n    Some of these words _are emphasized also_.\n    \n    Use two asterisks for **strong emphasis**.\n    Or, if you prefer, __use two underscores instead__.\n\nOutput:\n\n    <p>Some of these words <em>are emphasized</em>.\n    Some of these words <em>are emphasized also</em>.</p>\n    \n    <p>Use two asterisks for <strong>strong emphasis</strong>.\n    Or, if you prefer, <strong>use two underscores instead</strong>.</p>\n   \n\n\n## Lists ##\n\nUnordered (bulleted) lists use asterisks, pluses, and hyphens (`*`,\n`+`, and `-`) as list markers. These three markers are\ninterchangable; this:\n\n    *   Candy.\n    *   Gum.\n    *   Booze.\n\nthis:\n\n    +   Candy.\n    +   Gum.\n    +   Booze.\n\nand this:\n\n    -   Candy.\n    -   Gum.\n    -   Booze.\n\nall produce the same output:\n\n    <ul>\n    <li>Candy.</li>\n    <li>Gum.</li>\n    <li>Booze.</li>\n    </ul>\n\nOrdered (numbered) lists use regular numbers, followed by periods, as\nlist markers:\n\n    1.  Red\n    2.  Green\n    3.  Blue\n\nOutput:\n\n    <ol>\n    <li>Red</li>\n    <li>Green</li>\n    <li>Blue</li>\n    </ol>\n\nIf you put blank lines between items, you'll get `<p>` tags for the\nlist item text. You can create multi-paragraph list items by indenting\nthe paragraphs by 4 spaces or 1 tab:\n\n    *   A list item.\n    \n        With multiple paragraphs.\n\n    *   Another item in the list.\n\nOutput:\n\n    <ul>\n    <li><p>A list item.</p>\n    <p>With multiple paragraphs.</p></li>\n    <li><p>Another item in the list.</p></li>\n    </ul>\n    \n\n\n### Links ###\n\nMarkdown supports two styles for creating links: *inline* and\n*reference*. With both styles, you use square brackets to delimit the\ntext you want to turn into a link.\n\nInline-style links use parentheses immediately after the link text.\nFor example:\n\n    This is an [example link](http://example.com/).\n\nOutput:\n\n    <p>This is an <a href=\"http://example.com/\">\n    example link</a>.</p>\n\nOptionally, you may include a title attribute in the parentheses:\n\n    This is an [example link](http://example.com/ \"With a Title\").\n\nOutput:\n\n    <p>This is an <a href=\"http://example.com/\" title=\"With a Title\">\n    example link</a>.</p>\n\nReference-style links allow you to refer to your links by names, which\nyou define elsewhere in your document:\n\n    I get 10 times more traffic from [Google][1] than from\n    [Yahoo][2] or [MSN][3].\n\n    [1]: http://google.com/        \"Google\"\n    [2]: http://search.yahoo.com/  \"Yahoo Search\"\n    [3]: http://search.msn.com/    \"MSN Search\"\n\nOutput:\n\n    <p>I get 10 times more traffic from <a href=\"http://google.com/\"\n    title=\"Google\">Google</a> than from <a href=\"http://search.yahoo.com/\"\n    title=\"Yahoo Search\">Yahoo</a> or <a href=\"http://search.msn.com/\"\n    title=\"MSN Search\">MSN</a>.</p>\n\nThe title attribute is optional. Link names may contain letters,\nnumbers and spaces, but are *not* case sensitive:\n\n    I start my morning with a cup of coffee and\n    [The New York Times][NY Times].\n\n    [ny times]: http://www.nytimes.com/\n\nOutput:\n\n    <p>I start my morning with a cup of coffee and\n    <a href=\"http://www.nytimes.com/\">The New York Times</a>.</p>\n\n\n### Images ###\n\nImage syntax is very much like link syntax.\n\nInline (titles are optional):\n\n    ![alt text](/path/to/img.jpg \"Title\")\n\nReference-style:\n\n    ![alt text][id]\n\n    [id]: /path/to/img.jpg \"Title\"\n\nBoth of the above examples produce the same output:\n\n    <img src=\"/path/to/img.jpg\" alt=\"alt text\" title=\"Title\" />\n\n\n\n### Code ###\n\nIn a regular paragraph, you can create code span by wrapping text in\nbacktick quotes. Any ampersands (`&`) and angle brackets (`<` or\n`>`) will automatically be translated into HTML entities. This makes\nit easy to use Markdown to write about HTML example code:\n\n    I strongly recommend against using any `<blink>` tags.\n\n    I wish SmartyPants used named entities like `&mdash;`\n    instead of decimal-encoded entites like `&#8212;`.\n\nOutput:\n\n    <p>I strongly recommend against using any\n    <code>&lt;blink&gt;</code> tags.</p>\n    \n    <p>I wish SmartyPants used named entities like\n    <code>&amp;mdash;</code> instead of decimal-encoded\n    entites like <code>&amp;#8212;</code>.</p>\n\n\nTo specify an entire block of pre-formatted code, indent every line of\nthe block by 4 spaces or 1 tab. Just like with code spans, `&`, `<`,\nand `>` characters will be escaped automatically.\n\nMarkdown:\n\n    If you want your page to validate under XHTML 1.0 Strict,\n    you've got to put paragraph tags in your blockquotes:\n\n        <blockquote>\n            <p>For example.</p>\n        </blockquote>\n\nOutput:\n\n    <p>If you want your page to validate under XHTML 1.0 Strict,\n    you've got to put paragraph tags in your blockquotes:</p>\n    \n    <pre><code>&lt;blockquote&gt;\n        &lt;p&gt;For example.&lt;/p&gt;\n    &lt;/blockquote&gt;\n    </code></pre>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/markdown-documentation-syntax.text",
    "content": "Markdown: Syntax\n================\n\n<ul id=\"ProjectSubmenu\">\n    <li><a href=\"/projects/markdown/\" title=\"Markdown Project Page\">Main</a></li>\n    <li><a href=\"/projects/markdown/basics\" title=\"Markdown Basics\">Basics</a></li>\n    <li><a class=\"selected\" title=\"Markdown Syntax Documentation\">Syntax</a></li>\n    <li><a href=\"/projects/markdown/license\" title=\"Pricing and License Information\">License</a></li>\n    <li><a href=\"/projects/markdown/dingus\" title=\"Online Markdown Web Form\">Dingus</a></li>\n</ul>\n\n\n*   [Overview](#overview)\n    *   [Philosophy](#philosophy)\n    *   [Inline HTML](#html)\n    *   [Automatic Escaping for Special Characters](#autoescape)\n*   [Block Elements](#block)\n    *   [Paragraphs and Line Breaks](#p)\n    *   [Headers](#header)\n    *   [Blockquotes](#blockquote)\n    *   [Lists](#list)\n    *   [Code Blocks](#precode)\n    *   [Horizontal Rules](#hr)\n*   [Span Elements](#span)\n    *   [Links](#link)\n    *   [Emphasis](#em)\n    *   [Code](#code)\n    *   [Images](#img)\n*   [Miscellaneous](#misc)\n    *   [Backslash Escapes](#backslash)\n    *   [Automatic Links](#autolink)\n\n\n**Note:** This document is itself written using Markdown; you\ncan [see the source for it by adding '.text' to the URL][src].\n\n  [src]: /projects/markdown/syntax.text\n\n* * *\n\n<h2 id=\"overview\">Overview</h2>\n\n<h3 id=\"philosophy\">Philosophy</h3>\n\nMarkdown is intended to be as easy-to-read and easy-to-write as is feasible.\n\nReadability, however, is emphasized above all else. A Markdown-formatted\ndocument should be publishable as-is, as plain text, without looking\nlike it's been marked up with tags or formatting instructions. While\nMarkdown's syntax has been influenced by several existing text-to-HTML\nfilters -- including [Setext] [1], [atx] [2], [Textile] [3], [reStructuredText] [4],\n[Grutatext] [5], and [EtText] [6] -- the single biggest source of\ninspiration for Markdown's syntax is the format of plain text email.\n\n  [1]: http://docutils.sourceforge.net/mirror/setext.html\n  [2]: http://www.aaronsw.com/2002/atx/\n  [3]: http://textism.com/tools/textile/\n  [4]: http://docutils.sourceforge.net/rst.html\n  [5]: http://www.triptico.com/software/grutatxt.html\n  [6]: http://ettext.taint.org/doc/\n\nTo this end, Markdown's syntax is comprised entirely of punctuation\ncharacters, which punctuation characters have been carefully chosen so\nas to look like what they mean. E.g., asterisks around a word actually\nlook like \\*emphasis\\*. Markdown lists look like, well, lists. Even\nblockquotes look like quoted passages of text, assuming you've ever\nused email.\n\n\n\n<h3 id=\"html\">Inline HTML</h3>\n\nMarkdown's syntax is intended for one purpose: to be used as a\nformat for *writing* for the web.\n\nMarkdown is not a replacement for HTML, or even close to it. Its\nsyntax is very small, corresponding only to a very small subset of\nHTML tags. The idea is *not* to create a syntax that makes it easier\nto insert HTML tags. In my opinion, HTML tags are already easy to\ninsert. The idea for Markdown is to make it easy to read, write, and\nedit prose. HTML is a *publishing* format; Markdown is a *writing*\nformat. Thus, Markdown's formatting syntax only addresses issues that\ncan be conveyed in plain text.\n\nFor any markup that is not covered by Markdown's syntax, you simply\nuse HTML itself. There's no need to preface it or delimit it to\nindicate that you're switching from Markdown to HTML; you just use\nthe tags.\n\nThe only restrictions are that block-level HTML elements -- e.g. `<div>`,\n`<table>`, `<pre>`, `<p>`, etc. -- must be separated from surrounding\ncontent by blank lines, and the start and end tags of the block should\nnot be indented with tabs or spaces. Markdown is smart enough not\nto add extra (unwanted) `<p>` tags around HTML block-level tags.\n\nFor example, to add an HTML table to a Markdown article:\n\n    This is a regular paragraph.\n\n    <table>\n        <tr>\n            <td>Foo</td>\n        </tr>\n    </table>\n\n    This is another regular paragraph.\n\nNote that Markdown formatting syntax is not processed within block-level\nHTML tags. E.g., you can't use Markdown-style `*emphasis*` inside an\nHTML block.\n\nSpan-level HTML tags -- e.g. `<span>`, `<cite>`, or `<del>` -- can be\nused anywhere in a Markdown paragraph, list item, or header. If you\nwant, you can even use HTML tags instead of Markdown formatting; e.g. if\nyou'd prefer to use HTML `<a>` or `<img>` tags instead of Markdown's\nlink or image syntax, go right ahead.\n\nUnlike block-level HTML tags, Markdown syntax *is* processed within\nspan-level tags.\n\n\n<h3 id=\"autoescape\">Automatic Escaping for Special Characters</h3>\n\nIn HTML, there are two characters that demand special treatment: `<`\nand `&`. Left angle brackets are used to start tags; ampersands are\nused to denote HTML entities. If you want to use them as literal\ncharacters, you must escape them as entities, e.g. `&lt;`, and\n`&amp;`.\n\nAmpersands in particular are bedeviling for web writers. If you want to\nwrite about 'AT&T', you need to write '`AT&amp;T`'. You even need to\nescape ampersands within URLs. Thus, if you want to link to:\n\n    http://images.google.com/images?num=30&q=larry+bird\n\nyou need to encode the URL as:\n\n    http://images.google.com/images?num=30&amp;q=larry+bird\n\nin your anchor tag `href` attribute. Needless to say, this is easy to\nforget, and is probably the single most common source of HTML validation\nerrors in otherwise well-marked-up web sites.\n\nMarkdown allows you to use these characters naturally, taking care of\nall the necessary escaping for you. If you use an ampersand as part of\nan HTML entity, it remains unchanged; otherwise it will be translated\ninto `&amp;`.\n\nSo, if you want to include a copyright symbol in your article, you can write:\n\n    &copy;\n\nand Markdown will leave it alone. But if you write:\n\n    AT&T\n\nMarkdown will translate it to:\n\n    AT&amp;T\n\nSimilarly, because Markdown supports [inline HTML](#html), if you use\nangle brackets as delimiters for HTML tags, Markdown will treat them as\nsuch. But if you write:\n\n    4 < 5\n\nMarkdown will translate it to:\n\n    4 &lt; 5\n\nHowever, inside Markdown code spans and blocks, angle brackets and\nampersands are *always* encoded automatically. This makes it easy to use\nMarkdown to write about HTML code. (As opposed to raw HTML, which is a\nterrible format for writing about HTML syntax, because every single `<`\nand `&` in your example code needs to be escaped.)\n\n\n* * *\n\n\n<h2 id=\"block\">Block Elements</h2>\n\n<h3 id=\"p\">Paragraphs and Line Breaks</h3>\n\nA paragraph is simply one or more consecutive lines of text, separated\nby one or more blank lines. (A blank line is any line that looks like a\nblank line -- a line containing nothing but spaces or tabs is considered\nblank.) Normal paragraphs should not be intended with spaces or tabs.\n\nThe implication of the \"one or more consecutive lines of text\" rule is\nthat Markdown supports \"hard-wrapped\" text paragraphs. This differs\nsignificantly from most other text-to-HTML formatters (including Movable\nType's \"Convert Line Breaks\" option) which translate every line break\ncharacter in a paragraph into a `<br />` tag.\n\nWhen you *do* want to insert a `<br />` break tag using Markdown, you\nend a line with two or more spaces, then type return.\n\nYes, this takes a tad more effort to create a `<br />`, but a simplistic\n\"every line break is a `<br />`\" rule wouldn't work for Markdown.\nMarkdown's email-style [blockquoting][bq] and multi-paragraph [list items][l]\nwork best -- and look better -- when you format them with hard breaks.\n\n  [bq]: #blockquote\n  [l]:  #list\n\n\n\n<h3 id=\"header\">Headers</h3>\n\nMarkdown supports two styles of headers, [Setext] [1] and [atx] [2].\n\nSetext-style headers are \"underlined\" using equal signs (for first-level\nheaders) and dashes (for second-level headers). For example:\n\n    This is an H1\n    =============\n\n    This is an H2\n    -------------\n\nAny number of underlining `=`'s or `-`'s will work.\n\nAtx-style headers use 1-6 hash characters at the start of the line,\ncorresponding to header levels 1-6. For example:\n\n    # This is an H1\n\n    ## This is an H2\n\n    ###### This is an H6\n\nOptionally, you may \"close\" atx-style headers. This is purely\ncosmetic -- you can use this if you think it looks better. The\nclosing hashes don't even need to match the number of hashes\nused to open the header. (The number of opening hashes\ndetermines the header level.) :\n\n    # This is an H1 #\n\n    ## This is an H2 ##\n\n    ### This is an H3 ######\n\n\n<h3 id=\"blockquote\">Blockquotes</h3>\n\nMarkdown uses email-style `>` characters for blockquoting. If you're\nfamiliar with quoting passages of text in an email message, then you\nknow how to create a blockquote in Markdown. It looks best if you hard\nwrap the text and put a `>` before every line:\n\n    > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n    > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n    > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n    > \n    > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n    > id sem consectetuer libero luctus adipiscing.\n\nMarkdown allows you to be lazy and only put the `>` before the first\nline of a hard-wrapped paragraph:\n\n    > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,\n    consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.\n    Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.\n\n    > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse\n    id sem consectetuer libero luctus adipiscing.\n\nBlockquotes can be nested (i.e. a blockquote-in-a-blockquote) by\nadding additional levels of `>`:\n\n    > This is the first level of quoting.\n    >\n    > > This is nested blockquote.\n    >\n    > Back to the first level.\n\nBlockquotes can contain other Markdown elements, including headers, lists,\nand code blocks:\n\n\t> ## This is a header.\n\t> \n\t> 1.   This is the first list item.\n\t> 2.   This is the second list item.\n\t> \n\t> Here's some example code:\n\t> \n\t>     return shell_exec(\"echo $input | $markdown_script\");\n\nAny decent text editor should make email-style quoting easy. For\nexample, with BBEdit, you can make a selection and choose Increase\nQuote Level from the Text menu.\n\n\n<h3 id=\"list\">Lists</h3>\n\nMarkdown supports ordered (numbered) and unordered (bulleted) lists.\n\nUnordered lists use asterisks, pluses, and hyphens -- interchangably\n-- as list markers:\n\n    *   Red\n    *   Green\n    *   Blue\n\nis equivalent to:\n\n    +   Red\n    +   Green\n    +   Blue\n\nand:\n\n    -   Red\n    -   Green\n    -   Blue\n\nOrdered lists use numbers followed by periods:\n\n    1.  Bird\n    2.  McHale\n    3.  Parish\n\nIt's important to note that the actual numbers you use to mark the\nlist have no effect on the HTML output Markdown produces. The HTML\nMarkdown produces from the above list is:\n\n    <ol>\n    <li>Bird</li>\n    <li>McHale</li>\n    <li>Parish</li>\n    </ol>\n\nIf you instead wrote the list in Markdown like this:\n\n    1.  Bird\n    1.  McHale\n    1.  Parish\n\nor even:\n\n    3. Bird\n    1. McHale\n    8. Parish\n\nyou'd get the exact same HTML output. The point is, if you want to,\nyou can use ordinal numbers in your ordered Markdown lists, so that\nthe numbers in your source match the numbers in your published HTML.\nBut if you want to be lazy, you don't have to.\n\nIf you do use lazy list numbering, however, you should still start the\nlist with the number 1. At some point in the future, Markdown may support\nstarting ordered lists at an arbitrary number.\n\nList markers typically start at the left margin, but may be indented by\nup to three spaces. List markers must be followed by one or more spaces\nor a tab.\n\nTo make lists look nice, you can wrap items with hanging indents:\n\n    *   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n        Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\n        viverra nec, fringilla in, laoreet vitae, risus.\n    *   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n        Suspendisse id sem consectetuer libero luctus adipiscing.\n\nBut if you want to be lazy, you don't have to:\n\n    *   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n    Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,\n    viverra nec, fringilla in, laoreet vitae, risus.\n    *   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.\n    Suspendisse id sem consectetuer libero luctus adipiscing.\n\nIf list items are separated by blank lines, Markdown will wrap the\nitems in `<p>` tags in the HTML output. For example, this input:\n\n    *   Bird\n    *   Magic\n\nwill turn into:\n\n    <ul>\n    <li>Bird</li>\n    <li>Magic</li>\n    </ul>\n\nBut this:\n\n    *   Bird\n\n    *   Magic\n\nwill turn into:\n\n    <ul>\n    <li><p>Bird</p></li>\n    <li><p>Magic</p></li>\n    </ul>\n\nList items may consist of multiple paragraphs. Each subsequent\nparagraph in a list item must be intended by either 4 spaces\nor one tab:\n\n    1.  This is a list item with two paragraphs. Lorem ipsum dolor\n        sit amet, consectetuer adipiscing elit. Aliquam hendrerit\n        mi posuere lectus.\n\n        Vestibulum enim wisi, viverra nec, fringilla in, laoreet\n        vitae, risus. Donec sit amet nisl. Aliquam semper ipsum\n        sit amet velit.\n\n    2.  Suspendisse id sem consectetuer libero luctus adipiscing.\n\nIt looks nice if you indent every line of the subsequent\nparagraphs, but here again, Markdown will allow you to be\nlazy:\n\n    *   This is a list item with two paragraphs.\n\n        This is the second paragraph in the list item. You're\n    only required to indent the first line. Lorem ipsum dolor\n    sit amet, consectetuer adipiscing elit.\n\n    *   Another item in the same list.\n\nTo put a blockquote within a list item, the blockquote's `>`\ndelimiters need to be indented:\n\n    *   A list item with a blockquote:\n\n        > This is a blockquote\n        > inside a list item.\n\nTo put a code block within a list item, the code block needs\nto be indented *twice* -- 8 spaces or two tabs:\n\n    *   A list item with a code block:\n\n            <code goes here>\n\n\nIt's worth noting that it's possible to trigger an ordered list by\naccident, by writing something like this:\n\n    1986. What a great season.\n\nIn other words, a *number-period-space* sequence at the beginning of a\nline. To avoid this, you can backslash-escape the period:\n\n    1986\\. What a great season.\n\n\n\n<h3 id=\"precode\">Code Blocks</h3>\n\nPre-formatted code blocks are used for writing about programming or\nmarkup source code. Rather than forming normal paragraphs, the lines\nof a code block are interpreted literally. Markdown wraps a code block\nin both `<pre>` and `<code>` tags.\n\nTo produce a code block in Markdown, simply indent every line of the\nblock by at least 4 spaces or 1 tab. For example, given this input:\n\n    This is a normal paragraph:\n\n        This is a code block.\n\nMarkdown will generate:\n\n    <p>This is a normal paragraph:</p>\n\n    <pre><code>This is a code block.\n    </code></pre>\n\nOne level of indentation -- 4 spaces or 1 tab -- is removed from each\nline of the code block. For example, this:\n\n    Here is an example of AppleScript:\n\n        tell application \"Foo\"\n            beep\n        end tell\n\nwill turn into:\n\n    <p>Here is an example of AppleScript:</p>\n\n    <pre><code>tell application \"Foo\"\n        beep\n    end tell\n    </code></pre>\n\nA code block continues until it reaches a line that is not indented\n(or the end of the article).\n\nWithin a code block, ampersands (`&`) and angle brackets (`<` and `>`)\nare automatically converted into HTML entities. This makes it very\neasy to include example HTML source code using Markdown -- just paste\nit and indent it, and Markdown will handle the hassle of encoding the\nampersands and angle brackets. For example, this:\n\n        <div class=\"footer\">\n            &copy; 2004 Foo Corporation\n        </div>\n\nwill turn into:\n\n    <pre><code>&lt;div class=\"footer\"&gt;\n        &amp;copy; 2004 Foo Corporation\n    &lt;/div&gt;\n    </code></pre>\n\nRegular Markdown syntax is not processed within code blocks. E.g.,\nasterisks are just literal asterisks within a code block. This means\nit's also easy to use Markdown to write about Markdown's own syntax.\n\n\n\n<h3 id=\"hr\">Horizontal Rules</h3>\n\nYou can produce a horizontal rule tag (`<hr>`) by placing three or\nmore hyphens, asterisks, or underscores on a line by themselves. If you\nwish, you may use spaces between the hyphens or asterisks. Each of the\nfollowing lines will produce a horizontal rule:\n\n    * * *\n\n    ***\n\n    *****\n\t\n    - - -\n\n    ---------------------------------------\n\n\t_ _ _\n\n\n* * *\n\n<h2 id=\"span\">Span Elements</h2>\n\n<h3 id=\"link\">Links</h3>\n\nMarkdown supports two style of links: *inline* and *reference*.\n\nIn both styles, the link text is delimited by [square brackets].\n\nTo create an inline link, use a set of regular parentheses immediately\nafter the link text's closing square bracket. Inside the parentheses,\nput the URL where you want the link to point, along with an *optional*\ntitle for the link, surrounded in quotes. For example:\n\n    This is [an example](http://example.com/ \"Title\") inline link.\n\n    [This link](http://example.net/) has no title attribute.\n\nWill produce:\n\n    <p>This is <a href=\"http://example.com/\" title=\"Title\">\n    an example</a> inline link.</p>\n\n    <p><a href=\"http://example.net/\">This link</a> has no\n    title attribute.</p>\n\nIf you're referring to a local resource on the same server, you can\nuse relative paths:\n\n    See my [About](/about/) page for details.\n\nReference-style links use a second set of square brackets, inside\nwhich you place a label of your choosing to identify the link:\n\n    This is [an example][id] reference-style link.\n\nYou can optionally use a space to separate the sets of brackets:\n\n    This is [an example] [id] reference-style link.\n\nThen, anywhere in the document, you define your link label like this,\non a line by itself:\n\n    [id]: http://example.com/  \"Optional Title Here\"\n\nThat is:\n\n*   Square brackets containing the link identifier (optionally\n    indented from the left margin using up to three spaces);\n*   followed by a colon;\n*   followed by one or more spaces (or tabs);\n*   followed by the URL for the link;\n*   optionally followed by a title attribute for the link, enclosed\n    in double or single quotes.\n\nThe link URL may, optionally, be surrounded by angle brackets:\n\n    [id]: <http://example.com/>  \"Optional Title Here\"\n\nYou can put the title attribute on the next line and use extra spaces\nor tabs for padding, which tends to look better with longer URLs:\n\n    [id]: http://example.com/longish/path/to/resource/here\n        \"Optional Title Here\"\n\nLink definitions are only used for creating links during Markdown\nprocessing, and are stripped from your document in the HTML output.\n\nLink definition names may constist of letters, numbers, spaces, and punctuation -- but they are *not* case sensitive. E.g. these two links:\n\n\t[link text][a]\n\t[link text][A]\n\nare equivalent.\n\nThe *implicit link name* shortcut allows you to omit the name of the\nlink, in which case the link text itself is used as the name.\nJust use an empty set of square brackets -- e.g., to link the word\n\"Google\" to the google.com web site, you could simply write:\n\n\t[Google][]\n\nAnd then define the link:\n\n\t[Google]: http://google.com/\n\nBecause link names may contain spaces, this shortcut even works for\nmultiple words in the link text:\n\n\tVisit [Daring Fireball][] for more information.\n\nAnd then define the link:\n\t\n\t[Daring Fireball]: http://daringfireball.net/\n\nLink definitions can be placed anywhere in your Markdown document. I\ntend to put them immediately after each paragraph in which they're\nused, but if you want, you can put them all at the end of your\ndocument, sort of like footnotes.\n\nHere's an example of reference links in action:\n\n    I get 10 times more traffic from [Google] [1] than from\n    [Yahoo] [2] or [MSN] [3].\n\n      [1]: http://google.com/        \"Google\"\n      [2]: http://search.yahoo.com/  \"Yahoo Search\"\n      [3]: http://search.msn.com/    \"MSN Search\"\n\nUsing the implicit link name shortcut, you could instead write:\n\n    I get 10 times more traffic from [Google][] than from\n    [Yahoo][] or [MSN][].\n\n      [google]: http://google.com/        \"Google\"\n      [yahoo]:  http://search.yahoo.com/  \"Yahoo Search\"\n      [msn]:    http://search.msn.com/    \"MSN Search\"\n\nBoth of the above examples will produce the following HTML output:\n\n    <p>I get 10 times more traffic from <a href=\"http://google.com/\"\n    title=\"Google\">Google</a> than from\n    <a href=\"http://search.yahoo.com/\" title=\"Yahoo Search\">Yahoo</a>\n    or <a href=\"http://search.msn.com/\" title=\"MSN Search\">MSN</a>.</p>\n\nFor comparison, here is the same paragraph written using\nMarkdown's inline link style:\n\n    I get 10 times more traffic from [Google](http://google.com/ \"Google\")\n    than from [Yahoo](http://search.yahoo.com/ \"Yahoo Search\") or\n    [MSN](http://search.msn.com/ \"MSN Search\").\n\nThe point of reference-style links is not that they're easier to\nwrite. The point is that with reference-style links, your document\nsource is vastly more readable. Compare the above examples: using\nreference-style links, the paragraph itself is only 81 characters\nlong; with inline-style links, it's 176 characters; and as raw HTML,\nit's 234 characters. In the raw HTML, there's more markup than there\nis text.\n\nWith Markdown's reference-style links, a source document much more\nclosely resembles the final output, as rendered in a browser. By\nallowing you to move the markup-related metadata out of the paragraph,\nyou can add links without interrupting the narrative flow of your\nprose.\n\n\n<h3 id=\"em\">Emphasis</h3>\n\nMarkdown treats asterisks (`*`) and underscores (`_`) as indicators of\nemphasis. Text wrapped with one `*` or `_` will be wrapped with an\nHTML `<em>` tag; double `*`'s or `_`'s will be wrapped with an HTML\n`<strong>` tag. E.g., this input:\n\n    *single asterisks*\n\n    _single underscores_\n\n    **double asterisks**\n\n    __double underscores__\n\nwill produce:\n\n    <em>single asterisks</em>\n\n    <em>single underscores</em>\n\n    <strong>double asterisks</strong>\n\n    <strong>double underscores</strong>\n\nYou can use whichever style you prefer; the lone restriction is that\nthe same character must be used to open and close an emphasis span.\n\nEmphasis can be used in the middle of a word:\n\n    un*fucking*believable\n\nBut if you surround an `*` or `_` with spaces, it'll be treated as a\nliteral asterisk or underscore.\n\nTo produce a literal asterisk or underscore at a position where it\nwould otherwise be used as an emphasis delimiter, you can backslash\nescape it:\n\n    \\*this text is surrounded by literal asterisks\\*\n\n\n\n<h3 id=\"code\">Code</h3>\n\nTo indicate a span of code, wrap it with backtick quotes (`` ` ``).\nUnlike a pre-formatted code block, a code span indicates code within a\nnormal paragraph. For example:\n\n    Use the `printf()` function.\n\nwill produce:\n\n    <p>Use the <code>printf()</code> function.</p>\n\nTo include a literal backtick character within a code span, you can use\nmultiple backticks as the opening and closing delimiters:\n\n    ``There is a literal backtick (`) here.``\n\nwhich will produce this:\n\n    <p><code>There is a literal backtick (`) here.</code></p>\n\nThe backtick delimiters surrounding a code span may include spaces --\none after the opening, one before the closing. This allows you to place\nliteral backtick characters at the beginning or end of a code span:\n\n\tA single backtick in a code span: `` ` ``\n\t\n\tA backtick-delimited string in a code span: `` `foo` ``\n\nwill produce:\n\n\t<p>A single backtick in a code span: <code>`</code></p>\n\t\n\t<p>A backtick-delimited string in a code span: <code>`foo`</code></p>\n\nWith a code span, ampersands and angle brackets are encoded as HTML\nentities automatically, which makes it easy to include example HTML\ntags. Markdown will turn this:\n\n    Please don't use any `<blink>` tags.\n\ninto:\n\n    <p>Please don't use any <code>&lt;blink&gt;</code> tags.</p>\n\nYou can write this:\n\n    `&#8212;` is the decimal-encoded equivalent of `&mdash;`.\n\nto produce:\n\n    <p><code>&amp;#8212;</code> is the decimal-encoded\n    equivalent of <code>&amp;mdash;</code>.</p>\n\n\n\n<h3 id=\"img\">Images</h3>\n\nAdmittedly, it's fairly difficult to devise a \"natural\" syntax for\nplacing images into a plain text document format.\n\nMarkdown uses an image syntax that is intended to resemble the syntax\nfor links, allowing for two styles: *inline* and *reference*.\n\nInline image syntax looks like this:\n\n    ![Alt text](/path/to/img.jpg)\n\n    ![Alt text](/path/to/img.jpg \"Optional title\")\n\nThat is:\n\n*   An exclamation mark: `!`;\n*   followed by a set of square brackets, containing the `alt`\n    attribute text for the image;\n*   followed by a set of parentheses, containing the URL or path to\n    the image, and an optional `title` attribute enclosed in double\n    or single quotes.\n\nReference-style image syntax looks like this:\n\n    ![Alt text][id]\n\nWhere \"id\" is the name of a defined image reference. Image references\nare defined using syntax identical to link references:\n\n    [id]: url/to/image  \"Optional title attribute\"\n\nAs of this writing, Markdown has no syntax for specifying the\ndimensions of an image; if this is important to you, you can simply\nuse regular HTML `<img>` tags.\n\n\n* * *\n\n\n<h2 id=\"misc\">Miscellaneous</h2>\n\n<h3 id=\"autolink\">Automatic Links</h3>\n\nMarkdown supports a shortcut style for creating \"automatic\" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:\n\n    <http://example.com/>\n    \nMarkdown will turn this into:\n\n    <a href=\"http://example.com/\">http://example.com/</a>\n\nAutomatic links for email addresses work similarly, except that\nMarkdown will also perform a bit of randomized decimal and hex\nentity-encoding to help obscure your address from address-harvesting\nspambots. For example, Markdown will turn this:\n\n    <address@example.com>\n\ninto something like this:\n\n    <a href=\"&#x6D;&#x61;i&#x6C;&#x74;&#x6F;:&#x61;&#x64;&#x64;&#x72;&#x65;\n    &#115;&#115;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;\n    &#109;\">&#x61;&#x64;&#x64;&#x72;&#x65;&#115;&#115;&#64;&#101;&#120;&#x61;\n    &#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a>\n\nwhich will render in a browser as a clickable link to \"address@example.com\".\n\n(This sort of entity-encoding trick will indeed fool many, if not\nmost, address-harvesting bots, but it definitely won't fool all of\nthem. It's better than nothing, but an address published in this way\nwill probably eventually start receiving spam.)\n\n\n\n<h3 id=\"backslash\">Backslash Escapes</h3>\n\nMarkdown allows you to use backslash escapes to generate literal\ncharacters which would otherwise have special meaning in Markdown's\nformatting syntax. For example, if you wanted to surround a word with\nliteral asterisks (instead of an HTML `<em>` tag), you can backslashes\nbefore the asterisks, like this:\n\n    \\*literal asterisks\\*\n\nMarkdown provides backslash escapes for the following characters:\n\n    \\   backslash\n    `   backtick\n    *   asterisk\n    _   underscore\n    {}  curly braces\n    []  square brackets\n    ()  parentheses\n    #   hash mark\n\t+\tplus sign\n\t-\tminus sign (hyphen)\n    .   dot\n    !   exclamation mark\n\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/mixed-indentation.text",
    "content": "# Mixed spaces and tabs\n\n- Very long\n\t\tparagraph\n\n1. Very long\n\t\tparagraph\n\n-\tVery long\n\t\tparagraph\n\n1.\tVery long\n\t\tparagraph\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/nested-blockquotes.text",
    "content": "> foo\n>\n> > bar\n>\n> foo\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/nested-code.text",
    "content": "````` hi ther `` ok ``` `````\n\n`` `hi ther` ``\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/nested-em.nooutput.text",
    "content": "*test **test** test*\n\n_test __test__ test_\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/nested-references.text",
    "content": "This nested image should work:\n\n[![Foo][bar]][baz]\n\nThis nested link should not work:\n\n[[Foo][bar]][baz]\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/nested-square-link.text",
    "content": "[the `]` character](/url)\n\n[the `` [ `` character](/url)\n\n[the `` [ ``` character](/url)\n\n[the `` ` `` character](/url)\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/no-positionals.nooutput.text",
    "content": "This document tests for the working of `position: false` as a parse\noption.\n\n>   Block-quotes\n>\n>   *   With list items.\n\nAnother block-quote:\n\n>   1.  And another list.\n\nSome [deeply **nested _elements_**](http://example.com)\n\nAn entity: &copy;, and an warning entity: &copy.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/not-a-link.text",
    "content": "\\[test](not a link)\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/ordered-and-unordered-lists.text",
    "content": "## Unordered\n\nAsterisks tight:\n\n*\tasterisk 1\n*\tasterisk 2\n*\tasterisk 3\n\n\nAsterisks loose:\n\n*\tasterisk 1\n\n*\tasterisk 2\n\n*\tasterisk 3\n\n* * *\n\nPluses tight:\n\n+\tPlus 1\n+\tPlus 2\n+\tPlus 3\n\n\nPluses loose:\n\n+\tPlus 1\n\n+\tPlus 2\n\n+\tPlus 3\n\n* * *\n\n\nMinuses tight:\n\n-\tMinus 1\n-\tMinus 2\n-\tMinus 3\n\n\nMinuses loose:\n\n-\tMinus 1\n\n-\tMinus 2\n\n-\tMinus 3\n\n\n## Ordered\n\nTight:\n\n1.\tFirst\n2.\tSecond\n3.\tThird\n\nand:\n\n1. One\n2. Two\n3. Three\n\n\nLoose using tabs:\n\n1.\tFirst\n\n2.\tSecond\n\n3.\tThird\n\nand using spaces:\n\n1. One\n\n2. Two\n\n3. Three\n\nMultiple paragraphs:\n\n1.\tItem 1, graf one.\n\n\tItem 2. graf two. The quick brown fox jumped over the lazy dog's\n\tback.\n\t\n2.\tItem 2.\n\n3.\tItem 3.\n\n\n\n## Nested\n\n*\tTab\n\t*\tTab\n\t\t*\tTab\n\nHere's another:\n\n1. First\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n3. Third\n\nSame thing but with paragraphs:\n\n1. First\n\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n\n3. Third\n\n\nThis was an error in Markdown 1.0.1:\n\n*\tthis\n\n\t*\tsub\n\n\tthat\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/ordered-different-types.text",
    "content": "1. foo\n2. bar\n3) baz\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/ordered-with-parentheses.text",
    "content": "## Ordered\n\nTight:\n\n1)\tFirst\n2)\tSecond\n3)\tThird\n\nand:\n\n1) One\n2) Two\n3) Three\n\nLoose using tabs:\n\n1)\tFirst\n\n2)\tSecond\n\n3)\tThird\n\nand using spaces:\n\n1) One\n\n2) Two\n\n3) Three\n\nMultiple paragraphs:\n\n1)\tItem 1, graf one.\n\n\tItem 2. graf two. The quick brown fox jumped over the lazy dog's\n\tback.\n\t\n2)\tItem 2.\n\n3)\tItem 3.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/paragraphs-and-indentation.text",
    "content": "# Without lines.\n\nThis is a paragraph\n    and this is further text\n\nThis is a paragraph\n   and this is further text\n\nThis is a paragraph with some asterisks\n    ***\n\nThis is a paragraph followed by a horizontal rule\n   ***\n\n# With lines.\n\nThis is a paragraph\n\n    and this is code\n\nThis is a paragraph\n\n   and this is a new paragraph\n\nThis is a paragraph with some asterisks in a code block\n\n    ***\n\nThis is a paragraph followed by a horizontal rule\n\n   ***\n\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/paragraphs-empty.text",
    "content": "  \n\naaa\n  \n\n# aaa\n\n  \n\nbbb\n  \nccc"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/ref-paren.text",
    "content": "[hi]\n\n[hi]: /url (there)\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/reference-image-empty-alt.text",
    "content": "![][1]\n\n[1]: /xyz.png\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/reference-link-escape.nooutput.text",
    "content": "[b\\*r*][b\\-r], [b\\*r*][], [b\\*r*].\n\n![foo][b\\*r*], ![b\\*r*][], ![b\\*r*].\n\n[b\\*r*]: http://google.com\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/reference-link-not-closed.text",
    "content": "[bar][bar\n\n[bar][\n\n[bar]\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/reference-link-with-angle-brackets.text",
    "content": "[foo]\n\n[foo]: <./url with spaces>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/reference-link-with-multiple-definitions.text",
    "content": "[foo]\n\n[foo]: first\n[foo]: second\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/same-bullet.text",
    "content": "* test\n+ test\n- test\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/stringify-escape.output.commonmark.text",
    "content": "Characters that should be escaped in general:\n\n\\\\ \\` \\* \\[\n\nCharacters that shouldn't:\n\n{}]()#+-.!>\"$%',/:;=?@^~\n\nUnderscores are \\_escaped\\_ unless they appear in_the_middle_of_a_word.\n\nAmpersands are escaped only when they would otherwise start an entity:\n\n-   \\&copycat \\&amp; \\&#x26\n-   But: ©cat; `&between;` &foo; & AT&T &c\n\nOpen parenthesis should be escaped after a shortcut reference:\n\n[ref]\\(text)\n\nAnd after a shortcut reference and a space (for GitHub):\n\n[ref] \\(text)\n\nHyphen should be escaped at the beginning of a line:\n\n\\- not a list item\n\\- not a list item\n  \\+ not a list item\n\nSame for angle brackets:\n\n\\> not a block quote\n\nAnd hash signs:\n\n\\# not a heading\n  \\## not a subheading\n\nText under a shortcut reference should be preserved verbatim:\n\n-   [two*three]\n-   [two\\*three]\n-   [a\\a]\n-   [a\\\\a]\n-   [a\\\\\\a]\n-   [a_a\\_a]\n\n**GFM:**\n\nColon should be escaped in URLs:\n\n-   http\\://user:password@host:port/path?key=value#fragment\n-   https\\://user:password@host:port/path?key=value#fragment\n\nDouble tildes should be \\~~escaped\\~~.\nAnd here: foo\\~~.\n\nPipes should not be escaped here: |\n\n| here   | they     |\n| ------ | -------- |\n| should | tho\\|ugh |\n\nAnd here:\n\n| here   | they   |\n\\| ---- \\| ----- \\|\n| should | though |\n\nAnd here:\n\nhere   | they\n\\---- \\| ------\nshould | though\n\n**Commonmark:**\n\nOpen angle bracket should be escaped:\n\n-   \\<div>\\</div>\n-   \\<http\\:google.com>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/stringify-escape.output.nogfm.commonmark.text",
    "content": "Characters that should be escaped in general:\n\n\\\\ \\` \\* \\[\n\nCharacters that shouldn't:\n\n{}]()#+-.!>\"$%',/:;=?@^~\n\nUnderscores are \\_escaped\\_ unless they appear in_the_middle_of_a_word.\n\nAmpersands are escaped only when they would otherwise start an entity:\n\n-   \\&copycat \\&amp; \\&#x26\n-   But: ©cat; `&between;` &foo; & AT&T &c\n\nOpen parenthesis should be escaped after a shortcut reference:\n\n[ref]\\(text)\n\nAnd after a shortcut reference and a space (for GitHub):\n\n[ref] \\(text)\n\nHyphen should be escaped at the beginning of a line:\n\n\\- not a list item\n\\- not a list item\n  \\+ not a list item\n\nSame for angle brackets:\n\n\\> not a block quote\n\nAnd hash signs:\n\n\\# not a heading\n  \\## not a subheading\n\nText under a shortcut reference should be preserved verbatim:\n\n-   [two*three]\n-   [two\\*three]\n-   [a\\a]\n-   [a\\\\a]\n-   [a\\\\\\a]\n-   [a_a\\_a]\n\n**GFM:**\n\nColon should not be escaped in URLs:\n\n-   http://user:password@host:port/path?key=value#fragment\n-   https://user:password@host:port/path?key=value#fragment\n\nDouble tildes should not be ~~escaped~~.\nNor here: foo~~.\n\nPipes should not be escaped here: |\n\n| here   | they     |\n| ------ | -------- |\n| should | nei|ther |\n\nNor here:\n\n| here   | they   |\n| ------ | ------ |\n| should | though |\n\nNor here:\n\nhere   | they\n\\----- | ------\nshould | though\n\n**Commonmark:**\n\nOpen angle bracket should be escaped:\n\n-   \\<div>\\</div>\n-   \\<http:google.com>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/stringify-escape.output.nogfm.text",
    "content": "Characters that should be escaped in general:\n\n\\\\ \\` \\* \\[\n\nCharacters that shouldn't:\n\n{}]()#+-.!>\"$%',/:;=?@^~\n\nUnderscores are \\_escaped\\_ unless they appear in_the_middle_of_a_word.\n\nAmpersands are escaped only when they would otherwise start an entity:\n\n-   &amp;copycat &amp;amp; &amp;#x26\n-   But: ©cat; `&between;` &foo; & AT&T &c\n\nOpen parenthesis should be escaped after a shortcut reference:\n\n[ref]\\(text)\n\nAnd after a shortcut reference and a space (for GitHub):\n\n[ref] \\(text)\n\nHyphen should be escaped at the beginning of a line:\n\n\\- not a list item\n\\- not a list item\n  \\+ not a list item\n\nSame for angle brackets:\n\n\\> not a block quote\n\nAnd hash signs:\n\n\\# not a heading\n  \\## not a subheading\n\nText under a shortcut reference should be preserved verbatim:\n\n-   [two*three]\n-   [two\\*three]\n-   [a\\a]\n-   [a\\\\a]\n-   [a\\\\\\a]\n-   [a_a\\_a]\n\n**GFM:**\n\nColon should not be escaped in URLs:\n\n-   http://user:password@host:port/path?key=value#fragment\n-   https://user:password@host:port/path?key=value#fragment\n\nDouble tildes should not be ~~escaped~~.\nNor here: foo~~.\n\nPipes should not be escaped here: |\n\n| here   | they     |\n| ------ | -------- |\n| should | nei|ther |\n\nNor here:\n\n| here   | they   |\n| ------ | ------ |\n| should | though |\n\nNor here:\n\nhere   | they\n\\----- | ------\nshould | though\n\n**Commonmark:**\n\nOpen angle bracket should be escaped:\n\n-   &lt;div>&lt;/div>\n-   &lt;http:google.com>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/stringify-escape.output.noposition.pedantic.text",
    "content": "Characters that should be escaped in general:\n\n\\\\ \\` \\* \\[ \\_\n\nCharacters that shouldn't:\n\n{}]()#+-.!>\"$%',/:;=?@^~\n\nUnderscores are always \\_escaped\\_, even when they appear in\\_the\\_middle\\_of\\_a\\_word.\n\nAmpersands are escaped only when they would otherwise start an entity:\n\n-   &amp;copycat &amp;amp; &amp;#x26\n-   But: ©cat; `&between;` &foo; & AT&T &c\n\nOpen parenthesis should be escaped after a shortcut reference:\n\n[ref]\\(text)\n\nAnd after a shortcut reference and a space (for GitHub):\n\n[ref] \\(text)\n\nHyphen should be escaped at the beginning of a line:\n\n\\- not a list item\n\\- not a list item\n  \\+ not a list item\n\nSame for angle brackets:\n\n\\> not a block quote\n\nAnd hash signs:\n\n\\# not a heading\n  \\## not a subheading\n\nText under a shortcut reference should be preserved verbatim:\n\n-   [two*three]\n-   [two\\*three]\n-   [a\\a]\n-   [a\\\\a]\n-   [a\\\\\\a]\n-   [a_a\\_a]\n\n**GFM:**\n\nColon should be escaped in URLs:\n\n-   http&#x3A;//user:password@host:port/path?key=value#fragment\n-   https&#x3A;//user:password@host:port/path?key=value#fragment\n\nDouble tildes should be \\~~escaped\\~~.\nAnd here: foo\\~~.\n\nPipes should not be escaped here: |\n\n| here   | they     |\n| ------ | -------- |\n| should | tho\\|ugh |\n\nAnd here:\n\n| here   | they   |\n\\| ---- \\| ----- \\|\n| should | though |\n\nAnd here:\n\nhere   | they\n\\---- \\| ------\nshould | though\n\n**Commonmark:**\n\nOpen angle bracket should be escaped:\n\n-   &lt;div>&lt;/div>\n-   &lt;http&#x3A;google.com>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/stringify-escape.output.pedantic.text",
    "content": "Characters that should be escaped in general:\n\n\\\\ \\` \\* \\[ \\_\n\nCharacters that shouldn't:\n\n{}]()#+-.!>\"$%',/:;=?@^~\n\nUnderscores are always \\_escaped\\_, even when they appear in\\_the\\_middle\\_of\\_a\\_word.\n\nAmpersands are escaped only when they would otherwise start an entity:\n\n-   &amp;copycat &amp;amp; &amp;#x26\n-   But: ©cat; `&between;` &foo; & AT&T &c\n\nOpen parenthesis should be escaped after a shortcut reference:\n\n[ref]\\(text)\n\nAnd after a shortcut reference and a space (for GitHub):\n\n[ref] \\(text)\n\nHyphen should be escaped at the beginning of a line:\n\n\\- not a list item\n\\- not a list item\n  \\+ not a list item\n\nSame for angle brackets:\n\n\\> not a block quote\n\nAnd hash signs:\n\n\\# not a heading\n  \\## not a subheading\n\nText under a shortcut reference should be preserved verbatim:\n\n-   [two*three]\n-   [two\\*three]\n-   [a\\a]\n-   [a\\\\a]\n-   [a\\\\\\a]\n-   [a_a\\_a]\n\n**GFM:**\n\nColon should be escaped in URLs:\n\n-   http&#x3A;//user:password@host:port/path?key=value#fragment\n-   https&#x3A;//user:password@host:port/path?key=value#fragment\n\nDouble tildes should be \\~~escaped\\~~.\nAnd here: foo\\~~.\n\nPipes should not be escaped here: |\n\n| here   | they     |\n| ------ | -------- |\n| should | tho\\|ugh |\n\nAnd here:\n\n| here   | they   |\n\\| ---- \\| ----- \\|\n| should | though |\n\nAnd here:\n\nhere   | they\n\\---- \\| ------\nshould | though\n\n**Commonmark:**\n\nOpen angle bracket should be escaped:\n\n-   &lt;div>&lt;/div>\n-   &lt;http&#x3A;google.com>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/stringify-escape.output.text",
    "content": "Characters that should be escaped in general:\n\n\\\\ \\` \\* \\[\n\nCharacters that shouldn't:\n\n{}]()#+-.!>\"$%',/:;=?@^~\n\nUnderscores are \\_escaped\\_ unless they appear in_the_middle_of_a_word.\n\nAmpersands are escaped only when they would otherwise start an entity:\n\n-   &amp;copycat &amp;amp; &amp;#x26\n-   But: ©cat; `&between;` &foo; & AT&T &c\n\nOpen parenthesis should be escaped after a shortcut reference:\n\n[ref]\\(text)\n\nAnd after a shortcut reference and a space (for GitHub):\n\n[ref] \\(text)\n\nHyphen should be escaped at the beginning of a line:\n\n\\- not a list item\n\\- not a list item\n  \\+ not a list item\n\nSame for angle brackets:\n\n\\> not a block quote\n\nAnd hash signs:\n\n\\# not a heading\n  \\## not a subheading\n\nText under a shortcut reference should be preserved verbatim:\n\n-   [two*three]\n-   [two\\*three]\n-   [a\\a]\n-   [a\\\\a]\n-   [a\\\\\\a]\n-   [a_a\\_a]\n\n**GFM:**\n\nColon should be escaped in URLs:\n\n-   http&#x3A;//user:password@host:port/path?key=value#fragment\n-   https&#x3A;//user:password@host:port/path?key=value#fragment\n\nDouble tildes should be \\~~escaped\\~~.\nAnd here: foo\\~~.\n\nPipes should not be escaped here: |\n\n| here   | they     |\n| ------ | -------- |\n| should | tho\\|ugh |\n\nAnd here:\n\n| here   | they   |\n\\| ---- \\| ----- \\|\n| should | though |\n\nAnd here:\n\nhere   | they\n\\---- \\| ------\nshould | though\n\n**Commonmark:**\n\nOpen angle bracket should be escaped:\n\n-   &lt;div>&lt;/div>\n-   &lt;http&#x3A;google.com>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/stringify-escape.text",
    "content": "Characters that should be escaped in general:\n\n\\\\ \\` \\* \\[\n\nCharacters that shouldn't:\n\n{}]()#+-.!>\"$%',/:;=?@^~\n\nUnderscores are \\_escaped\\_ unless they appear in_the_middle_of_a_word.\nor **_here**, or here__\n\nAmpersands are escaped only when they would otherwise start an entity:\n\n-   \\&copycat \\&amp; \\&#x26\n-   &amp;copycat &amp;amp; &amp;#x26\n-   But: ©cat; `&between;` &foo; & AT&T &c\n\nOpen parenthesis should be escaped after a shortcut reference:\n\n[ref]\\(text)\n\nAnd after a shortcut reference and a space (for GitHub):\n\n[ref] \\(text)\n\nHyphen should be escaped at the beginning of a line:\n\n\\- not a list item\n\\- not a list item\n  \\+ not a list item\n\nSame for angle brackets:\n\n\\> not a block quote\n\nAnd hash signs:\n\n\\# not a heading\n  \\## not a subheading\n\nText under a shortcut reference should be preserved verbatim:\n\n-   [two*three]\n-   [two\\*three]\n-   [a\\a]\n-   [a\\\\a]\n-   [a\\\\\\a]\n-   [a_a\\_a]\n\n**GFM:**\n\nColon should be escaped in URLs:\n\n-   http\\://user:password@host:port/path?key=value#fragment\n-   https\\://user:password@host:port/path?key=value#fragment\n-   http&colon;//user:password@host:port/path?key=value#fragment\n-   https&colon;//user:password@host:port/path?key=value#fragment\n\nDouble tildes should be \\~~escaped\\~~.\nAnd here: foo~~.\n\nPipes should not be escaped here: |\n\n| here   | they     |\n| ------ | -------- |\n| should | tho\\|ugh |\n\nAnd here:\n\n| here   | they   |\n\\| ---- \\| ----- \\|\n| should | though |\n\nAnd here:\n\nhere   | they\n\\---- \\| ------\nshould | though\n\n**Commonmark:**\n\nOpen angle bracket should be escaped:\n\n-   \\<div>\\</div>\n-   \\<http\\:google.com>\n-   &lt;div>&lt;/div>\n-   &lt;http&colon;google.com>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/strong-and-em-together-one.text",
    "content": "***This is strong and em.***\n\nSo is ***this*** word.\n\n___This is strong and em.___\n\nSo is ___this___ word.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/strong-and-em-together-two.nooutput.text",
    "content": "perform_complicated_task\n\ndo_this_and_do_that_and_another_thing\n\nperform*complicated*task\n\ndo*this*and*do*that*and*another*thing\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/strong-emphasis.text",
    "content": "Foo **bar** __baz__.\n\nFoo __bar__ **baz**."
  },
  {
    "path": "packages/rebber/__tests__/fixtures/strong-initial-white-space.text",
    "content": "** bar **.\n\n\n__ bar __."
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-empty-initial-cell.text",
    "content": "| | a|c|\n|--|:----:|:---|\n|a|b|c|\n|a|b|c|\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-escaped-pipes.nooutput.text",
    "content": "| First | Second | third |\n| ----- | ------ | ----- |\n| first | second | third |\n| first | second \\| second | third \\|\n| first | second \\\\| third \\\\|\n| first | second \\\\\\| second | third \\\\\\|\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-in-list.text",
    "content": "*   Unordered:\n\n    | A | B |\n    | - | - |\n    | 1 | 2 |\n\n*   Ordered:\n\n    | A | B |\n    | - | - |\n    | 1 | 2 |\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-invalid-alignment.text",
    "content": "Missing alignment characters:\n\n| a | b | c |\n|   |---|---|\n| d | e | f |\n\n* * *\n\n| a | b | c |\n|---|---|   |\n| d | e | f |\n\nInvalid characters:\n\n| a | b | c |\n|---|-*-|---|\n| d | e | f |\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-loose.output.loose-table.text",
    "content": "Header 1 | Header 2\n-------- | --------\nCell 1   | Cell 2  \nCell 3   | Cell 4  \n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-loose.output.text",
    "content": "| Header 1 | Header 2 |\n| -------- | -------- |\n| Cell 1   | Cell 2   |\n| Cell 3   | Cell 4   |\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-no-body.text",
    "content": "# Foo\n\n| Name | GitHub | Twitter |\n| ---- | ------ | ------- |\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-no-end-of-line.text",
    "content": "|foo|bar|\n|-|-|\n|1|2|"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-one-column.text",
    "content": "This is a table:\n\n| a |\n| - |\n| b |\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-one-row.text",
    "content": "This is a table:\n\n| a | b | c |\n| - | - | - |\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-padded.output.nopadded-table.text",
    "content": "| Header 1 | Header 2 |\n| -------- | -------- |\n| Cell 1 | Cell 2 |\n| Cell 3 | Cell 4 |\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-padded.output.text",
    "content": "| Header 1 | Header 2 |\n| -------- | -------- |\n| Cell 1   | Cell 2   |\n| Cell 3   | Cell 4   |\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-pipes-in-code.text",
    "content": "| abc |   head2 |\n| --- | ------: |\n| x   |   `|||` |\n| x   |       ` |\n| x   |     `|` |\n| x   | `` f `` |\n| x   |    ```` |\n| x   |    ``f` |\n\n| abc |   head2\n| --- | ------:\n| x   |       `\n| x   |     `|`\n| x   | `` f ``\n| x   |    ````\n| x   |   ``f`\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-spaced.output.nospaced-table.text",
    "content": "|Header 1|Header 2|\n|--------|-------:|\n|Cell 1  |  Cell 2|\n|Cell 3  |  Cell 4|\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-spaced.output.text",
    "content": "| Header 1 | Header 2 |\n| -------- | -------: |\n| Cell 1   |   Cell 2 |\n| Cell 3   |   Cell 4 |\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table-with-image.text",
    "content": "Someone wanted to do this, let's implement it!\n\nc1 | c2\n---|--\nc3 | ![image](https://zestedesavoir.com/media/galleries/426/56dc4a1e-416b-4a9d-830d-95b45d58a17a.png)\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/table.text",
    "content": "| Heading 1 | **H**eading 2\n| --------- | ---------\n| Cell 1    | Cell 2\n| Cell 3    | Cell 4\n\n| Header 1 | Header 2 | Header 3 | Header 4 |\n| :------: | -------: | :------- | -------- |\n| Cell 1   | Cell 2   | Cell 3   | Cell 4   |\n| Cell 5   | Cell 6   | Cell 7   | Cell 8   |\n\n    Test code\n\nHeader 1 | Header 2\n-------- | --------\nCell 1   | Cell 2\nCell 3   | Cell 4\n\nHeader 1|Header 2|Header 3|Header 4\n:-------|:------:|-------:|--------\nCell 1  |Cell 2  |Cell 3  |Cell 4\n*Cell 5*|Cell 6  |Cell 7  |Cell 8\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/tabs-and-spaces.text",
    "content": "+\tthis is a list item\n\tindented with tabs\n\n+   this is a list item\n    indented with spaces\n\nCode:\n\n\tthis code block is indented by one tab\n\nAnd:\n\n\t\tthis code block is indented by two tabs\n\nAnd:\n\n\t+\tthis is an example list item\n\t\tindented with tabs\n\t\n\t+   this is an example list item\n\t    indented with spaces\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/tabs.text",
    "content": "+\tthis is a list item\n\tindented with tabs\n\n+   this is a list item\n    indented with spaces\n\nCode:\n\n\tthis code block is indented by one tab\n\nAnd:\n\n\t\tthis code block is indented by two tabs\n\nAnd:\n\n\t+\tthis is an example list item\n\t\tindented with tabs\n\t\n\t+   this is an example list item\n\t    indented with spaces\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/task-list-ordered.text",
    "content": "1. [ ] Mercury;\n2. [] Venus (this one’s invalid);\n3. [x] Earth:\n    1. [x] Moon.\n4. [ ] Mars;\n8. [] Neptune (this one’s also invalid).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/task-list-unordered-asterisk.text",
    "content": "* [ ] Mercury;\n* [] Venus (this one’s invalid);\n* [x] Earth:\n    * [x] Moon.\n* [ ] Mars;\n* [] Neptune (this one’s also invalid).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/task-list-unordered-dash.text",
    "content": "- [ ] Mercury;\n- [] Venus (this one’s invalid);\n- [x] Earth:\n    - [x] Moon.\n- [ ] Mars;\n- [] Neptune (this one’s also invalid).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/task-list-unordered-plus.text",
    "content": "+ [ ] Mercury;\n+ [] Venus (this one’s invalid);\n+ [x] Earth:\n    + [x] Moon.\n+ [ ] Mars;\n+ [] Neptune (this one’s also invalid).\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/task-list.text",
    "content": "Empty items\n===========\n\n* [ ]\n* [\t]\n\n1. [x]\n2. [X]\n\nSingle space\n============\n\n* [ ] \n* [\t] \n\n1. [x] \n2. [X] \n\nTab\n===\n\n* [ ]\t\n* [\t]\t\n\n1. [x]\t\n2. [X]\t\n\nNo white space with content\n===========================\n\n* [ ]Hello;\n* [\t]World;\n\n1. [x]Foo.\n2. [X]Bar\n\nSingle space with content\n=========================\n\n* [ ] Hello;\n* [\t] World;\n\n1. [x] Foo.\n2. [X] World :D\n\nSingle tab with content\n=======================\n\n* [ ]\tHello;\n* [\t]\tWorld;\n\n1. [x]\tFoo.\n2. [X]\tHello.\n\nMultiple spaces with content\n============================\n\n* [ ]     Hello;\n* [\t]     World;\n\n1. [x]    Foo.\n3. [X]    Bar.\n\nMultiple tabs with content\n==========================\n\n* [ ]\t\tHello;\n* [\t]\t\tWorld;\n\n1. [x]\t\tFoo.\n2. [X]\t\tBar.\n\nMixed tabs and spaces\n=====================\n\n* [ ] \t    Hello;\n\n1. [x]\t    World;\n\n* [\t]     \tHello;\n* [ ]\t   \tWorld.\n\n2. [X]\t \tBar.\n\nLine breaks\n===========\n\n* [\n] Hello;\n\n1. [\n] Hello;\n\nMultiple unfinished characters\n==============================\n\n* [  ] Hello;\n\n1. [ \n ] World;\n2. [\t\t] Hello;\n3. [ \t ] World.\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/tidyness.text",
    "content": "> A list within a blockquote:\n> \n> *\tasterisk 1\n> *\tasterisk 2\n> *\tasterisk 3\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/title-attributes.text",
    "content": "# Links\n\n| Implementation | Characters | Nested | Mismatched | Escaped | Named Entities | Numbered Entities |\n| -------------- | ---------- |------- | ---------- | ------- | -------------- | ----------------- |\n| Markdown.pl    | `\"`        | Yes    | Yes        | No      | Yes            | Yes               |\n| GitHub         | `\"`        | Yes    | Yes        | No      | No             | No                |\n| CommonMark     | `\"`        | No     | No         | Yes     | Yes            | Yes               |\n| Markdown.pl    | `'`        | Yes    | Yes        | No      | Yes            | Yes               |\n| GitHub         | `'`        | Yes    | Yes        | No      | No             | No                |\n| CommonMark     | `'`        | No     | No         | Yes     | Yes            | Yes               |\n| Markdown.pl    | `()`       | -      | -          | -       | -              | -                 |\n| GitHub         | `()`       | -      | -          | -       | -              | -                 |\n| CommonMark     | `()`       | No     | Yes        | Yes     | Yes            | Yes               |\n\n## Double quotes\n\n[Hello](./world.html \"and text\")\n\n[Hello](./world.html \"and \"matching delimiters\"\")\n\n[Hello](./world.html \"and \"mismatched delimiters\")\n\n[Hello](./world.html \"and \\\"escapes\\\"\")\n\n[Hello](./world.html \"and &quot;named entities&quot;\")\n\n[Hello](./world.html \"and &#x22;numbered entities&#x22;\")\n\n## Single quotes\n\n[Hello](./world.html 'and text')\n\n[Hello](./world.html 'and 'matching delimiters'')\n\n[Hello](./world.html 'and 'mismatched delimiters')\n\n[Hello](./world.html 'and \\'escapes\\'')\n\n[Hello](./world.html 'and &apos;named entities&apos;')\n\n[Hello](./world.html 'and &#x27;numbered entities&#x27;')\n\n# Images\n\n## Double quotes\n\n![Hello](./world.png \"and text\")\n\n![Hello](./world.png \"and \"matching delimiters\"\")\n\n![Hello](./world.png \"and \"mismatched delimiters\")\n\n![Hello](./world.png \"and \\\"escapes\\\"\")\n\n![Hello](./world.png \"and &quot;named entities&quot;\")\n\n![Hello](./world.png \"and &#x22;numbered entities&#x22;\")\n\n## Single quotes\n\n![Hello](./world.png 'and text')\n\n![Hello](./world.png 'and 'matching delimiters'')\n\n![Hello](./world.png 'and 'mismatched delimiters')\n\n![Hello](./world.png 'and \\'escapes\\'')\n\n![Hello](./world.png 'and &apos;named entities&apos;')\n\n![Hello](./world.png 'and &#x27;numbered entities&#x27;')\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/toplevel-paragraphs.text",
    "content": "hello world\n    how are you\n    how are you\n\nhello world\n```\nhow are you\n```\n\nhello world\n* * *\n\nhello world\n# how are you\n\nhello world\nhow are you\n===========\n\nhello world\n> how are you\n\nhello world\n* how are you\n\nhello world\n<div>how are you</div>\n\nhello world\n<span>how are you</span>\n\nhello [world][how]\n[how]: /are/you\n\n<div>hello</div>\n\n<span>hello</span>\n"
  },
  {
    "path": "packages/rebber/__tests__/fixtures/tricky-list.text",
    "content": "**hello** _world_\n\n* hello world\n\n**hello** _world_\n\n* hello world\n\n**hello** _world_\n\n* Hello world\n\n**hello** _world_\n\n* hello world\n"
  },
  {
    "path": "packages/rebber/__tests__/mdast.tests.js",
    "content": "import {readdirSync as directory, readFileSync as file, lstatSync as stat} from 'fs'\nimport {join} from 'path'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport footnotes from 'remark-footnotes'\nimport rebber from '../src'\n\nconst rebberConfig = {\n  blockquote: (text) =>\n    `[blockquote(${text})]`,\n  break: () =>\n    `[break(---)]`,\n  code: (text, lang) =>\n    `[code${lang ? lang[0].toUpperCase() + lang.slice(1) : ''}(${text})]`,\n  // comment: () =>\n  //   `break(`,\n  definition: (ctx, identifier, url, title) =>\n    `[definition(identifier=${identifier}, url=${url}, title=${title})]`,\n  // delete: (text) =>\n  //   `delete(${text})`,\n  // emphasis: (text) =>\n  //   `emphasis(${text})`,\n  headings: [\n    (text) => `heading1(${text})`,\n    (text) => `heading2(${text})`,\n    (text) => `heading3(${text})`,\n    (text) => `heading4(${text})`,\n    (text) => `heading5(${text})`,\n    (text) => `heading6(${text})`,\n    (text) => `heading7(${text})`,\n  ],\n  // html: (text) =>\n  //   `html(${text})`,\n  image: (node) =>\n    `[image(${node.url})]`,\n  // inlinecode: (text) =>\n  //   `inlinecode(${text})`,\n  link: (displayText, url, title) =>\n    `[link(displayText=${displayText}, url=${url}, title=${title})]`,\n  linkReference: (reference, content) =>\n    `[linkReference(reference=${reference}, content=${content})]`,\n  list: (content, isOrdered) =>\n    `[${isOrdered ? '' : 'un'}orderedList(${content})]`,\n  listItem: (content) =>\n    `[listItem(${content})]`,\n  // paragraph: (text) =>\n  //   `paragraph(${text})`,\n  // raw: (text) =>\n  //   `raw(${text})`,\n  // strong: (text) =>\n  //   `strong(${text})`,\n  // table: (ctx, node) => {\n  //   return node.children.map(n => `row(${one(n)})`).join('\\n')\n  // },\n  // tableCell: (ctx, node) =>\n  //   `tableCell(${one(node)})`,\n  // tableRow: (ctx, node) =>\n  //   `tableRow(${one(node)})`,\n  text: (text) =>\n    `[text(${text})]`,\n  thematicBreak: () =>\n    `[thematicBreak(---)]`,\n}\n\nconst specs = hydrateFixtures()\n\ndescribe('rebber: remark specs', () => {\n  Object.keys(specs).filter(Boolean).forEach(name => {\n    const spec = specs[name]\n\n    test(name, () => {\n      const {contents} = unified()\n        .use(reParse)\n        .use(footnotes, {inlineNotes: true})\n        .use(rebber)\n        .processSync(spec)\n\n      expect(contents.trim()).toMatchSnapshot(name)\n    })\n  })\n})\n\ndescribe('rebber: remark specs with config: custom macros', () => {\n  Object.keys(specs).filter(Boolean).forEach(name => {\n    const spec = specs[name]\n\n    test(name, () => {\n      const {contents} = unified()\n        .use(reParse)\n        .use(footnotes, {inlineNotes: true})\n        .use(rebber, rebberConfig)\n        .processSync(spec)\n\n      expect(contents.trim()).toMatchSnapshot()\n    })\n  })\n})\n\ndescribe('toLaTeX: remark specs', () => {\n  Object.keys(specs).filter(Boolean).forEach(name => {\n    const spec = specs[name]\n\n    test(name, () => {\n      const mdast = unified()\n        .use(reParse)\n        .use(footnotes, {inlineNotes: true})\n        .parse(spec)\n\n      const latex = rebber.toLaTeX(mdast)\n\n      expect(latex).toMatchSnapshot(name)\n    })\n  })\n})\n\n/* helpers */\nfunction hydrateFixtures () {\n  const base = join(__dirname, `fixtures/`)\n  return directory(base)\n    .reduce((tests, filename) => {\n      const parts = filename.split('.')\n      if (stat(join(base, filename)).isFile()) {\n        tests[parts[0]] = file(join(base, filename), 'utf-8').trim()\n      }\n      return tests\n    }, {})\n}\n"
  },
  {
    "path": "packages/rebber/dist/all.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst one = require('./one');\n\n/* Expose. */\nmodule.exports = all;\n\n/* Stringify all children of `parent`. */\nfunction all(ctx, parent) {\n  const children = parent && parent.children;\n  if (!children) return '';\n  return children.map((child, index) => one(ctx, child, index, parent)).join('');\n}"
  },
  {
    "path": "packages/rebber/dist/escaper.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst has = require('has');\nconst xtend = require('xtend');\n\n/* Expose. */\nmodule.exports = encode;\nencode.escape = escape;\n\n/* List of enforced escapes. */\nconst defaultEscapes = {\n  '#': '\\\\#',\n  $: '\\\\$',\n  '%': '\\\\%',\n  '&': '\\\\&',\n  '\\\\': '\\\\textbackslash{}',\n  '^': '\\\\textasciicircum{}',\n  _: '\\\\_',\n  '{': '\\\\{',\n  '}': '\\\\}',\n  '~': '\\\\textasciitilde{}'\n};\n\n/* Encode special characters in `value`. */\nfunction encode(value, opts = {}) {\n  const escapes = xtend(defaultEscapes, opts);\n  const set = toExpression(Object.keys(escapes));\n  value = value.replace(set, function (char, pos, val) {\n    return one(char, val.charAt(pos + 1), escapes);\n  });\n  return value;\n}\n\n/* Encode `char` according to `options`. */\nfunction one(char, next, escapes) {\n  if (has(escapes, char)) {\n    return escapes[char];\n  }\n  return char;\n}\n\n/* Create an expression for `characters`. */\nfunction toExpression(characters) {\n  const pattern = characters.map(escapeRegExp).join('|');\n  return new RegExp(`[${pattern}]`, 'g');\n}\nfunction escapeRegExp(str) {\n  return str.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&');\n}"
  },
  {
    "path": "packages/rebber/dist/index.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst xtend = require('xtend');\nconst definitions = require('mdast-util-definitions');\nconst one = require('./one');\nconst preprocess = require('./preprocessors');\n\n/* Expose. */\nmodule.exports = stringify;\nmodule.exports.toLaTeX = toLaTeX;\nfunction toLaTeX(tree, options = {}) {\n  /* Stringify the given MDAST node. */\n  preprocess(options, tree);\n  // resolve definition after preprocess because this step can create new identifiers\n  options.definitions = definitions(tree, options);\n  return one(options, tree, undefined, undefined);\n}\n\n/* Compile MDAST tree using toLaTeX */\nfunction stringify(config) {\n  const settings = xtend(config, this.data('settings'));\n  this.Compiler = compiler;\n  function compiler(tree) {\n    return toLaTeX(tree, settings, tree);\n  }\n}"
  },
  {
    "path": "packages/rebber/dist/one.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst has = require('has');\nconst xtend = require('xtend');\n\n/* Expose. */\nmodule.exports = one;\n\n/* Handlers. */\nconst handlers = {};\nhandlers.blockquote = require('./types/blockquote');\nhandlers.break = require('./types/break');\nhandlers.code = require('./types/code');\nhandlers.definition = require('./types/definition');\nhandlers.delete = require('./types/delete');\nhandlers.emphasis = require('./types/emphasis');\nhandlers.heading = require('./types/heading');\nhandlers.html = require('./types/html');\nhandlers.image = require('./types/image');\nhandlers.inlineCode = require('./types/inlinecode');\nhandlers.link = require('./types/link');\nhandlers.linkReference = require('./types/linkReference');\nhandlers.list = require('./types/list');\nhandlers.listItem = require('./types/listItem');\nhandlers.paragraph = require('./types/paragraph');\nhandlers.root = require('./types/root');\nhandlers.strong = require('./types/strong');\nhandlers.table = require('./types/table');\nhandlers.tableCell = require('./types/tableCell');\nhandlers.tableRow = require('./types/tableRow');\nhandlers.text = require('./types/text');\nhandlers.thematicBreak = require('./types/thematic-break');\n\n/* Stringify `node`. */\nfunction one(ctx, node, index, parent) {\n  const handlersOverrides = has(ctx, 'overrides') ? ctx.overrides : {};\n  const h = xtend(handlers, handlersOverrides);\n  const type = node && node.type;\n  if (!type) {\n    throw new Error(`Received node '${node}' does not have a type.`);\n  }\n  if (!has(h, type) || typeof h[type] !== 'function') {\n    throw new Error(`Cannot compile unknown node \\`${type}\\``);\n  }\n  return h[type](ctx, node, index, parent);\n}"
  },
  {
    "path": "packages/rebber/dist/preprocessors/index.js",
    "content": "\"use strict\";\n\nconst xtend = require('xtend');\nconst visit = require('unist-util-visit');\nconst referenceVisitors = require('./referenceVisitors');\nmodule.exports = preprocess;\nfunction preprocess(ctx, tree) {\n  const {\n    definitionVisitor,\n    imageReferenceVisitor\n  } = referenceVisitors();\n  const defaultVisitors = {\n    definition: [definitionVisitor],\n    imageReference: [imageReferenceVisitor]\n  };\n  const visitors = xtend(defaultVisitors, ctx.preprocessors || {});\n  Object.keys(visitors).forEach(nodeType => {\n    if (Array.isArray(visitors[nodeType])) {\n      visitors[nodeType].forEach(visitor => visit(tree, nodeType, visitor(ctx, tree)));\n    } else {\n      visit(tree, nodeType, visitors[nodeType](ctx, tree));\n    }\n  });\n}"
  },
  {
    "path": "packages/rebber/dist/preprocessors/referenceVisitors.js",
    "content": "\"use strict\";\n\nmodule.exports = () => {\n  const state = {};\n  return {\n    definitionVisitor() {\n      return (node, index, parent) => {\n        let identifier = node.identifier;\n        while (Object.keys(state).includes(identifier)) {\n          identifier += '-1';\n        }\n        state[identifier] = node.url;\n        node.identifier = identifier; // force to remove twice so that latex compiles\n\n        if (node.referenceType === 'shortcut') {\n          // remark for abbr\n          parent.children.splice(index, 1);\n        }\n      };\n    },\n    imageReferenceVisitor() {\n      return node => {\n        node.type = 'image';\n        node.title = '';\n        node.url = state[node.identifier];\n      };\n    },\n    addIdentifier(identifier, content) {\n      state[identifier] = content;\n    }\n  };\n};"
  },
  {
    "path": "packages/rebber/dist/types/blockquote.js",
    "content": "\"use strict\";\n\n/* Expose. */\nmodule.exports = blockquote;\nconst defaultMacro = innerText => `\\\\begin{Quotation}\\n${innerText}\\n\\\\end{Quotation}\\n\\n`;\n\n/* Stringify a Blockquote `node`. */\nfunction blockquote(ctx, node) {\n  const macro = ctx.blockquote || defaultMacro;\n  const innerText = require('../all')(ctx, node);\n  return macro(innerText.trim());\n}"
  },
  {
    "path": "packages/rebber/dist/types/break.js",
    "content": "\"use strict\";\n\n/* Expose. */\nmodule.exports = br;\nconst defaultMacro = () => ' \\\\\\\\\\n';\n\n/* Stringify a break `node`. */\nfunction br(ctx, node) {\n  const macro = ctx.break ? ctx.break : defaultMacro;\n  return macro(node);\n}"
  },
  {
    "path": "packages/rebber/dist/types/code.js",
    "content": "\"use strict\";\n\n/* Expose. */\nmodule.exports = code;\nconst defaultMacro = (content, lang) => {\n  // Escape CodeBlocks\n  let escaped = content;\n  const escapeRegex = /\\\\end\\s*{CodeBlock}/g;\n  while (escapeRegex.test(escaped)) {\n    escaped = escaped.replace(escapeRegex, '');\n  }\n\n  // Default language is \"text\"\n  if (!lang) lang = 'text';\n  return `\\\\begin{CodeBlock}{${lang}}\\n${escaped}\\n\\\\end{CodeBlock}\\n\\n`;\n};\n\n/* Stringify a code `node`. */\nfunction code(ctx, node) {\n  const macro = ctx.code || defaultMacro;\n  return `${macro(node.value, node.lang, node.meta)}`;\n}\ncode.macro = defaultMacro;"
  },
  {
    "path": "packages/rebber/dist/types/definition.js",
    "content": "\"use strict\";\n\nmodule.exports = definition;\nconst defaultMacro = (ctx, identifier, url, title) => {\n  const node = {\n    children: [{\n      type: 'link',\n      title,\n      url,\n      children: [{\n        type: 'text',\n        value: url\n      }]\n    }]\n  };\n  const link = require('../all')(ctx, node);\n  return `\\\\footnote{\\\\label{${identifier}}${link}}`;\n};\nfunction definition(ctx, node) {\n  const macro = ctx.definition ? ctx.definition : defaultMacro;\n  return macro(ctx, node.identifier, node.url, node.title);\n}"
  },
  {
    "path": "packages/rebber/dist/types/delete.js",
    "content": "\"use strict\";\n\n// TODO: make it customizable\n/* Expose. */\nmodule.exports = deleteNode;\n\n/* Stringify a delete `node`. */\nfunction deleteNode(ctx, node, index, parent) {\n  const contents = require('../all')(ctx, node);\n  return `\\\\sout{${contents}}`;\n}"
  },
  {
    "path": "packages/rebber/dist/types/emphasis.js",
    "content": "\"use strict\";\n\n// TODO: make it customizable\n/* Expose. */\nmodule.exports = emphasis;\n\n/* Stringify an emphasis `node`. */\nfunction emphasis(ctx, node, index, parent) {\n  const contents = require('../all')(ctx, node);\n  return `\\\\textit{${contents}}`;\n}"
  },
  {
    "path": "packages/rebber/dist/types/heading.js",
    "content": "\"use strict\";\n\n/* Expose. */\nmodule.exports = heading;\nconst defaultHeadings = [val => `\\\\part{${val}}\\n`, val => `\\\\chapter{${val}}\\n`, val => `\\\\section{${val}}\\n`, val => `\\\\subsection{${val}}\\n`, val => `\\\\subsubsection{${val}}\\n`, val => `\\\\paragraph{${val}}\\n`, val => `\\\\subparagaph{${val}}\\n`];\n\n/* Stringify a heading `node`.\n */\nfunction heading(ctx, node) {\n  const depth = node.depth;\n  const content = require('../all')(ctx, node);\n  const headings = ctx.headings || defaultHeadings;\n  const fn = headings[node.depth - 1];\n  if (typeof fn !== 'function') {\n    throw new Error(`Cannot compile heading of depth ${depth}: not a function`);\n  }\n  return fn(content);\n}"
  },
  {
    "path": "packages/rebber/dist/types/html.js",
    "content": "\"use strict\";\n\n// TODO: make it customizable\n/* Expose. */\nmodule.exports = html;\n\n/* Stringify a html `node`. */\nfunction html(ctx, node, index, parent) {\n  return node.value;\n}"
  },
  {
    "path": "packages/rebber/dist/types/image.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst path = require('path');\n\n/* Expose. */\nmodule.exports = image;\nconst defaultInlineMatcher = (node, parent) => {\n  return parent.type === 'paragraph' && parent.children.length - 1 || parent.type === 'heading';\n};\nconst defaultMacro = node => {\n  /*\n  Note that MDAST `Image` nodes don't have a `width` property.\n  You might still want to specify a width since \\includegraphics handles it.\n  */\n  const width = node.width ? `[width=${node.width}]` : '';\n  return `\\\\includegraphics${width}{${node.url}}`;\n};\nconst defaultInline = defaultMacro;\nfunction image(ctx, node, _, parent) {\n  const options = ctx.image || {};\n  if (node.url) {\n    // Avoid a security flaw: trying to escape image paths\n    node.url = node.url.replace(/}/g, '');\n    try {\n      const {\n        root,\n        dir,\n        base,\n        ext,\n        name\n      } = path.parse(node.url);\n\n      // \\includegraphics crashes with filenames that contain more than one `.`,\n      // the workaround is \\includegraphics{/path/to/{image.foo}.jpg}\n      if (base.includes('.')) {\n        const safeName = name.includes('.') ? `{${name}}${ext}` : `${name}${ext}`;\n        node.url = `${path.format({\n          root,\n          dir\n        })}${safeName}`;\n      }\n    } catch (e) {\n      node.url = '';\n    }\n  }\n  let macro = options.image ? options.image : defaultMacro;\n  const inlineMatcher = options.inlineMatcher ? options.inlineMatcher : defaultInlineMatcher;\n  if (inlineMatcher(node, parent)) {\n    macro = options.inlineImage ? options.inlineImage : defaultInline;\n  }\n  return macro(node);\n}"
  },
  {
    "path": "packages/rebber/dist/types/inlinecode.js",
    "content": "\"use strict\";\n\nconst collapse = require('collapse-white-space');\nconst escape = require('../escaper');\nmodule.exports = function inlineCode(ctx, node) {\n  const finalCode = escape(collapse(node.value));\n  return `\\\\texttt{${finalCode}}`;\n};"
  },
  {
    "path": "packages/rebber/dist/types/link.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst has = require('has');\nconst escape = require('../escaper');\n\n/* Expose. */\nmodule.exports = link;\nconst defaultMacro = (displayText, url, title) => `\\\\externalLink{${displayText}}{${url}}`;\n\n/* Stringify a link `node`.\n*/\nfunction link(ctx, node) {\n  if (!node.url) return '';\n  const config = ctx.link || {};\n  const macro = has(config, 'macro') ? config.macro : defaultMacro;\n  const prefix = has(config, 'prefix') ? config.prefix : '';\n  const url = escape(node.url.startsWith('/') ? prefix + node.url : node.url);\n  return macro(require('../all')(ctx, node), url, node.title);\n}"
  },
  {
    "path": "packages/rebber/dist/types/linkReference.js",
    "content": "\"use strict\";\n\nmodule.exports = linkReference;\nconst defaultMacro = (reference, inner) => `\\\\hyperref[${reference}]{${inner}}`;\nfunction linkReference(ctx, node) {\n  const macro = ctx.linkReference ? ctx.linkReference : defaultMacro;\n  const innerText = require('../all')(ctx, node);\n  if (!ctx.definitions(node.identifier)) return `[${innerText}]`;\n  return macro(node.identifier, innerText);\n}"
  },
  {
    "path": "packages/rebber/dist/types/list.js",
    "content": "\"use strict\";\n\nconst has = require('has');\nmodule.exports = list;\nconst defaultMacro = (innerText, isOrdered) => {\n  if (isOrdered) {\n    return `\\\\begin{enumerate}\\n${innerText}\\\\end{enumerate}\\n`;\n  } else {\n    return `\\\\begin{itemize}\\n${innerText}\\\\end{itemize}\\n`;\n  }\n};\nfunction list(ctx, node) {\n  const rebberList = has(ctx, 'list') ? ctx.list : defaultMacro;\n  const itemized = require('../all')(ctx, node);\n  return rebberList(itemized, node.ordered);\n}"
  },
  {
    "path": "packages/rebber/dist/types/listItem.js",
    "content": "\"use strict\";\n\nconst has = require('has');\nconst defaultMacro = innerText => `\\\\item\\\\relax ${innerText}\\n`;\nconst defaultCheckedMacro = innerText => `\\\\item[$\\\\boxtimes$]\\\\relax ${innerText}\\n`;\nconst defaultUncheckedMacro = innerText => `\\\\item[$\\\\square$]\\\\relax ${innerText}\\n`;\nmodule.exports = listItem;\nfunction listItem(ctx, node) {\n  let rebberListItem = has(ctx, 'listItem') ? ctx.listItem : defaultMacro;\n  if (node.checked === true) {\n    rebberListItem = has(ctx, 'checkedListItem') ? ctx.checkedListItem : defaultCheckedMacro;\n  } else if (node.checked === false) {\n    rebberListItem = has(ctx, 'uncheckedListItem') ? ctx.uncheckedListItem : defaultUncheckedMacro;\n  }\n  return rebberListItem(require('../all')(ctx, node).trim());\n}"
  },
  {
    "path": "packages/rebber/dist/types/paragraph.js",
    "content": "\"use strict\";\n\n/* Expose. */\nmodule.exports = paragraph;\n\n/* Stringify a paragraph `node`.\n */\nfunction paragraph(ctx, node) {\n  const contents = require('../all')(ctx, node);\n  return `${contents.trim()}\\n\\n`;\n}"
  },
  {
    "path": "packages/rebber/dist/types/raw.js",
    "content": "\"use strict\";\n\n// TODO: make it customizable\n/* Dependencies. */\nconst text = require('./text');\n\n/* Expose. */\nmodule.exports = raw;\n\n/* Stringify `raw`. */\nfunction raw(ctx, node) {\n  return ctx.dangerous ? node.value : text(ctx, node);\n}"
  },
  {
    "path": "packages/rebber/dist/types/root.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst one = require('../one');\n\n/* Expose. */\nmodule.exports = root;\n\n/* Stringify a text `node`. */\nfunction root(ctx, node, _, parent) {\n  const children = node.children;\n  if (!children) return '';\n  let previous;\n  return children.reduce((output, child, index) => {\n    if (previous) {\n      if (child.type === previous.type && previous.type === 'list') {\n        output += previous.ordered === child.ordered ? '\\n\\n\\n' : '\\n\\n';\n      } else if (previous.type === 'list' && child.type === 'code' && !child.lang) {\n        output += '\\n\\n\\n';\n      } else {\n        output += '\\n\\n';\n      }\n    }\n    output += one(ctx, child, index, node, node);\n    previous = child;\n    return output;\n  }, '');\n}"
  },
  {
    "path": "packages/rebber/dist/types/strong.js",
    "content": "\"use strict\";\n\n// TODO: make it customizable\n/* Expose. */\nmodule.exports = strong;\n\n/* Stringify a strong `node`. */\nfunction strong(ctx, node, index, parent) {\n  const contents = require('../all')(ctx, node);\n  return `\\\\textbf{${contents}}`;\n}"
  },
  {
    "path": "packages/rebber/dist/types/table.js",
    "content": "\"use strict\";\n\nconst clone = require('clone');\nconst one = require('../one');\n\n/* Expose. */\nmodule.exports = table;\nconst defaultHeaderParse = rows => {\n  const columns = Math.max(...rows.map(l => l.split('&').length));\n  return ' X[-1]'.repeat(columns).substring(1);\n};\n\n// Retrocompatibility: first row is always header on default tables\nconst defaultheaderCounter = () => {\n  return 1;\n};\nconst defaultMacro = (ctx, node) => {\n  const headerParse = ctx.headerParse ? ctx.headerParse : defaultHeaderParse;\n  const headerCounter = ctx.headerCounter ? ctx.headerCounter : defaultheaderCounter;\n  const parsed = node.children.map((n, index) => one(ctx, n, index, node));\n  const headerCount = headerCounter(node);\n  const colHeader = headerParse(parsed);\n  const envName = typeof ctx.tableEnvName === 'string' ? ctx.tableEnvName : 'longtblr';\n  const caption = node.caption ? `\\n\\\\captionof{table}{${node.caption}}\\n` : '';\n  // eslint-disable-next-line max-len\n  const headerProperties = typeof ctx.headerProperties === 'string' ? ctx.headerProperties : 'font=\\\\bfseries';\n  let extraProps = '';\n  if (headerCount && headerCount > 0) {\n    const tableHeaderEnum = new Array(headerCount).fill(0).map((_, i) => i + 1).join(',');\n    extraProps += `,rowhead=${headerCount},row{${tableHeaderEnum}}={${headerProperties}}`;\n  }\n\n  // eslint-disable-next-line max-len\n  return `\\\\begin{${envName}}{colspec={${colHeader}}${extraProps}}\\n${parsed.join('')}\\\\end{${envName}}${caption}\\n`;\n};\n\n/* Stringify a table `node`. */\nfunction table(ctx, node) {\n  const macro = ctx.table || defaultMacro;\n  const overriddenCtx = clone(ctx);\n  overriddenCtx.image = overriddenCtx.image ? overriddenCtx.image : {};\n  overriddenCtx.image.inlineMatcher = () => true;\n  return macro(overriddenCtx, node);\n}"
  },
  {
    "path": "packages/rebber/dist/types/tableCell.js",
    "content": "\"use strict\";\n\n/* Expose. */\nmodule.exports = tableCell;\nconst defaultMacro = (ctx, node) => {\n  return require('../all')(ctx, node);\n};\n\n/* Stringify a tableCell `node`. */\nfunction tableCell(ctx, node) {\n  const macro = ctx.tableCell || defaultMacro;\n  return macro(ctx, node);\n}"
  },
  {
    "path": "packages/rebber/dist/types/tableRow.js",
    "content": "\"use strict\";\n\n/* Expose. */\nconst one = require('../one');\nmodule.exports = tableRow;\nconst defaultMacro = (ctx, node) => {\n  const parsed = [];\n  node.children.map((n, index) => parsed.push(one(ctx, n, index, node)));\n  const line = parsed.join(' & ');\n  return `${line} \\\\\\\\\\n`;\n};\n\n/* Stringify a tableRow `node`. */\nfunction tableRow(ctx, node, index) {\n  const macro = ctx.tableRow || defaultMacro;\n  return macro(ctx, node);\n}"
  },
  {
    "path": "packages/rebber/dist/types/text.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst trimLines = require('trim-lines');\nconst escaper = require('../escaper');\n\n/* Stringify a text `node`. */\nmodule.exports = function text(ctx, node, index, parent) {\n  const value = trimLines(node.value);\n  return isLiteral(parent) ? value : escaper(value, ctx.escapes);\n};\n\n// TODO: `tagName` isn't part of MDAST!\n/* Check if content of `node` should not be escaped. */\nfunction isLiteral(node) {\n  return node && (node.tagName === 'script' || node.tagName === 'style');\n}"
  },
  {
    "path": "packages/rebber/dist/types/thematic-break.js",
    "content": "\"use strict\";\n\n/* Expose. */\nmodule.exports = thematicBreak;\nconst defaultMacro = () => '\\\\horizontalLine\\n\\n';\n\n/* Stringify a delete `node`. */\nfunction thematicBreak(ctx, node, index, parent) {\n  const macro = ctx.thematicBreak || defaultMacro;\n  return macro(node);\n}"
  },
  {
    "path": "packages/rebber/package.json",
    "content": "{\n  \"name\": \"rebber\",\n  \"version\": \"5.5.0\",\n  \"description\": \"Stringifies MDAST to LaTeX\",\n  \"repository\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/rebber\",\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"mdast\",\n    \"latex\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"clone\": \"^2.1.2\",\n    \"collapse-white-space\": \"^1.0.6\",\n    \"has\": \"^1.0.3\",\n    \"mdast-util-definitions\": \"^3.0.1\",\n    \"trim-lines\": \"^1.1.3\",\n    \"xtend\": \"^4.0.2\"\n  }\n}\n"
  },
  {
    "path": "packages/rebber/src/all.js",
    "content": "/* Dependencies. */\nconst one = require('./one')\n\n/* Expose. */\nmodule.exports = all\n\n/* Stringify all children of `parent`. */\nfunction all (ctx, parent) {\n  const children = parent && parent.children\n\n  if (!children) return ''\n\n  return children\n    .map((child, index) => one(ctx, child, index, parent))\n    .join('')\n}\n"
  },
  {
    "path": "packages/rebber/src/escaper.js",
    "content": "/* Dependencies. */\nconst has = require('has')\nconst xtend = require('xtend')\n\n/* Expose. */\nmodule.exports = encode\n\nencode.escape = escape\n\n/* List of enforced escapes. */\nconst defaultEscapes = {\n  '#': '\\\\#',\n  $: '\\\\$',\n  '%': '\\\\%',\n  '&': '\\\\&',\n  '\\\\': '\\\\textbackslash{}',\n  '^': '\\\\textasciicircum{}',\n  _: '\\\\_',\n  '{': '\\\\{',\n  '}': '\\\\}',\n  '~': '\\\\textasciitilde{}'\n}\n\n/* Encode special characters in `value`. */\nfunction encode (value, opts = {}) {\n  const escapes = xtend(defaultEscapes, opts)\n  const set = toExpression(Object.keys(escapes))\n\n  value = value.replace(set, function (char, pos, val) {\n    return one(char, val.charAt(pos + 1), escapes)\n  })\n\n  return value\n}\n\n/* Encode `char` according to `options`. */\nfunction one (char, next, escapes) {\n  if (has(escapes, char)) {\n    return escapes[char]\n  }\n\n  return char\n}\n\n/* Create an expression for `characters`. */\nfunction toExpression (characters) {\n  const pattern = characters.map(escapeRegExp).join('|')\n\n  return new RegExp(`[${pattern}]`, 'g')\n}\n\nfunction escapeRegExp (str) {\n  return str.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&')\n}\n"
  },
  {
    "path": "packages/rebber/src/index.js",
    "content": "/* Dependencies. */\nconst xtend = require('xtend')\nconst definitions = require('mdast-util-definitions')\nconst one = require('./one')\nconst preprocess = require('./preprocessors')\n\n/* Expose. */\nmodule.exports = stringify\nmodule.exports.toLaTeX = toLaTeX\n\nfunction toLaTeX (tree, options = {}) {\n  /* Stringify the given MDAST node. */\n  preprocess(options, tree)\n  // resolve definition after preprocess because this step can create new identifiers\n  options.definitions = definitions(tree, options)\n  return one(options, tree, undefined, undefined)\n}\n\n/* Compile MDAST tree using toLaTeX */\nfunction stringify (config) {\n  const settings = xtend(config, this.data('settings'))\n\n  this.Compiler = compiler\n\n  function compiler (tree) {\n    return toLaTeX(tree, settings, tree)\n  }\n}\n"
  },
  {
    "path": "packages/rebber/src/one.js",
    "content": "/* Dependencies. */\nconst has = require('has')\nconst xtend = require('xtend')\n\n/* Expose. */\nmodule.exports = one\n\n/* Handlers. */\nconst handlers = {}\n\nhandlers.blockquote = require('./types/blockquote')\nhandlers.break = require('./types/break')\nhandlers.code = require('./types/code')\nhandlers.definition = require('./types/definition')\nhandlers.delete = require('./types/delete')\nhandlers.emphasis = require('./types/emphasis')\nhandlers.heading = require('./types/heading')\nhandlers.html = require('./types/html')\nhandlers.image = require('./types/image')\nhandlers.inlineCode = require('./types/inlinecode')\nhandlers.link = require('./types/link')\nhandlers.linkReference = require('./types/linkReference')\nhandlers.list = require('./types/list')\nhandlers.listItem = require('./types/listItem')\nhandlers.paragraph = require('./types/paragraph')\nhandlers.root = require('./types/root')\nhandlers.strong = require('./types/strong')\nhandlers.table = require('./types/table')\nhandlers.tableCell = require('./types/tableCell')\nhandlers.tableRow = require('./types/tableRow')\nhandlers.text = require('./types/text')\nhandlers.thematicBreak = require('./types/thematic-break')\n\n/* Stringify `node`. */\nfunction one (ctx, node, index, parent) {\n  const handlersOverrides = has(ctx, 'overrides') ? ctx.overrides : {}\n  const h = xtend(handlers, handlersOverrides)\n\n  const type = node && node.type\n\n  if (!type) {\n    throw new Error(`Received node '${node}' does not have a type.`)\n  }\n\n  if (!has(h, type) || typeof h[type] !== 'function') {\n    throw new Error(`Cannot compile unknown node \\`${type}\\``)\n  }\n\n  return h[type](ctx, node, index, parent)\n}\n"
  },
  {
    "path": "packages/rebber/src/preprocessors/index.js",
    "content": "const xtend = require('xtend')\nconst visit = require('unist-util-visit')\n\nconst referenceVisitors = require('./referenceVisitors')\n\nmodule.exports = preprocess\n\nfunction preprocess (ctx, tree) {\n  const { definitionVisitor, imageReferenceVisitor } = referenceVisitors()\n\n  const defaultVisitors = {\n    definition: [definitionVisitor],\n    imageReference: [imageReferenceVisitor]\n  }\n\n  const visitors = xtend(defaultVisitors, ctx.preprocessors || {})\n\n  Object.keys(visitors).forEach((nodeType) => {\n    if (Array.isArray(visitors[nodeType])) {\n      visitors[nodeType].forEach(visitor => visit(tree, nodeType, visitor(ctx, tree)))\n    } else {\n      visit(tree, nodeType, visitors[nodeType](ctx, tree))\n    }\n  })\n}\n"
  },
  {
    "path": "packages/rebber/src/preprocessors/referenceVisitors.js",
    "content": "module.exports = () => {\n  const state = {}\n\n  return {\n    definitionVisitor () {\n      return (node, index, parent) => {\n        let identifier = node.identifier\n        while (Object.keys(state).includes(identifier)) {\n          identifier += '-1'\n        }\n\n        state[identifier] = node.url\n        node.identifier = identifier // force to remove twice so that latex compiles\n\n        if (node.referenceType === 'shortcut') { // remark for abbr\n          parent.children.splice(index, 1)\n        }\n      }\n    },\n\n    imageReferenceVisitor () {\n      return (node) => {\n        node.type = 'image'\n        node.title = ''\n        node.url = state[node.identifier]\n      }\n    },\n    addIdentifier (identifier, content) {\n      state[identifier] = content\n    }\n  }\n}\n"
  },
  {
    "path": "packages/rebber/src/types/blockquote.js",
    "content": "/* Expose. */\nmodule.exports = blockquote\n\nconst defaultMacro = (innerText) =>\n  `\\\\begin{Quotation}\\n${innerText}\\n\\\\end{Quotation}\\n\\n`\n\n/* Stringify a Blockquote `node`. */\nfunction blockquote (ctx, node) {\n  const macro = ctx.blockquote || defaultMacro\n  const innerText = require('../all')(ctx, node)\n  return macro(innerText.trim())\n}\n"
  },
  {
    "path": "packages/rebber/src/types/break.js",
    "content": "/* Expose. */\nmodule.exports = br\n\nconst defaultMacro = () => ' \\\\\\\\\\n'\n\n/* Stringify a break `node`. */\nfunction br (ctx, node) {\n  const macro = ctx.break ? ctx.break : defaultMacro\n  return macro(node)\n}\n"
  },
  {
    "path": "packages/rebber/src/types/code.js",
    "content": "/* Expose. */\nmodule.exports = code\n\nconst defaultMacro = (content, lang) => {\n  // Escape CodeBlocks\n  let escaped = content\n\n  const escapeRegex = /\\\\end\\s*{CodeBlock}/g\n\n  while (escapeRegex.test(escaped)) {\n    escaped = escaped.replace(escapeRegex, '')\n  }\n\n  // Default language is \"text\"\n  if (!lang) lang = 'text'\n\n  return `\\\\begin{CodeBlock}{${lang}}\\n${escaped}\\n\\\\end{CodeBlock}\\n\\n`\n}\n\n/* Stringify a code `node`. */\nfunction code (ctx, node) {\n  const macro = ctx.code || defaultMacro\n  return `${macro(node.value, node.lang, node.meta)}`\n}\n\ncode.macro = defaultMacro\n"
  },
  {
    "path": "packages/rebber/src/types/definition.js",
    "content": "module.exports = definition\n\nconst defaultMacro = (ctx, identifier, url, title) => {\n  const node = {\n    children: [{\n      type: 'link',\n      title,\n      url,\n      children: [{\n        type: 'text',\n        value: url\n      }]\n    }]\n  }\n\n  const link = require('../all')(ctx, node)\n\n  return `\\\\footnote{\\\\label{${identifier}}${link}}`\n}\n\nfunction definition (ctx, node) {\n  const macro = ctx.definition ? ctx.definition : defaultMacro\n  return macro(ctx, node.identifier, node.url, node.title)\n}\n"
  },
  {
    "path": "packages/rebber/src/types/delete.js",
    "content": "// TODO: make it customizable\n/* Expose. */\nmodule.exports = deleteNode\n\n/* Stringify a delete `node`. */\nfunction deleteNode (ctx, node, index, parent) {\n  const contents = require('../all')(ctx, node)\n\n  return `\\\\sout{${contents}}`\n}\n"
  },
  {
    "path": "packages/rebber/src/types/emphasis.js",
    "content": "// TODO: make it customizable\n/* Expose. */\nmodule.exports = emphasis\n\n/* Stringify an emphasis `node`. */\nfunction emphasis (ctx, node, index, parent) {\n  const contents = require('../all')(ctx, node)\n\n  return `\\\\textit{${contents}}`\n}\n"
  },
  {
    "path": "packages/rebber/src/types/heading.js",
    "content": "/* Expose. */\nmodule.exports = heading\n\nconst defaultHeadings = [\n  (val) => `\\\\part{${val}}\\n`,\n  (val) => `\\\\chapter{${val}}\\n`,\n  (val) => `\\\\section{${val}}\\n`,\n  (val) => `\\\\subsection{${val}}\\n`,\n  (val) => `\\\\subsubsection{${val}}\\n`,\n  (val) => `\\\\paragraph{${val}}\\n`,\n  (val) => `\\\\subparagaph{${val}}\\n`\n]\n\n/* Stringify a heading `node`.\n */\nfunction heading (ctx, node) {\n  const depth = node.depth\n  const content = require('../all')(ctx, node)\n\n  const headings = ctx.headings || defaultHeadings\n  const fn = headings[node.depth - 1]\n\n  if (typeof fn !== 'function') {\n    throw new Error(`Cannot compile heading of depth ${depth}: not a function`)\n  }\n\n  return fn(content)\n}\n"
  },
  {
    "path": "packages/rebber/src/types/html.js",
    "content": "// TODO: make it customizable\n/* Expose. */\nmodule.exports = html\n\n/* Stringify a html `node`. */\nfunction html (ctx, node, index, parent) {\n  return node.value\n}\n"
  },
  {
    "path": "packages/rebber/src/types/image.js",
    "content": "/* Dependencies. */\nconst path = require('path')\n\n/* Expose. */\nmodule.exports = image\n\nconst defaultInlineMatcher = (node, parent) => {\n  return (parent.type === 'paragraph' && parent.children.length - 1) ||\n    parent.type === 'heading'\n}\n\nconst defaultMacro = (node) => {\n  /*\n  Note that MDAST `Image` nodes don't have a `width` property.\n  You might still want to specify a width since \\includegraphics handles it.\n  */\n  const width = node.width ? `[width=${node.width}]` : ''\n  return `\\\\includegraphics${width}{${node.url}}`\n}\n\nconst defaultInline = defaultMacro\n\nfunction image (ctx, node, _, parent) {\n  const options = ctx.image || {}\n\n  if (node.url) {\n    // Avoid a security flaw: trying to escape image paths\n    node.url = node.url.replace(/}/g, '')\n\n    try {\n      const { root, dir, base, ext, name } = path.parse(node.url)\n\n      // \\includegraphics crashes with filenames that contain more than one `.`,\n      // the workaround is \\includegraphics{/path/to/{image.foo}.jpg}\n      if (base.includes('.')) {\n        const safeName = name.includes('.')\n          ? `{${name}}${ext}`\n          : `${name}${ext}`\n\n        node.url = `${path.format({ root, dir })}${safeName}`\n      }\n    } catch (e) {\n      node.url = ''\n    }\n  }\n\n  let macro = options.image ? options.image : defaultMacro\n  const inlineMatcher = options.inlineMatcher ? options.inlineMatcher : defaultInlineMatcher\n\n  if (inlineMatcher(node, parent)) {\n    macro = options.inlineImage ? options.inlineImage : defaultInline\n  }\n\n  return macro(node)\n}\n"
  },
  {
    "path": "packages/rebber/src/types/inlinecode.js",
    "content": "const collapse = require('collapse-white-space')\nconst escape = require('../escaper')\n\nmodule.exports = function inlineCode (ctx, node) {\n  const finalCode = escape(collapse(node.value))\n  return `\\\\texttt{${finalCode}}`\n}\n"
  },
  {
    "path": "packages/rebber/src/types/link.js",
    "content": "/* Dependencies. */\nconst has = require('has')\nconst escape = require('../escaper')\n\n/* Expose. */\nmodule.exports = link\n\nconst defaultMacro = (displayText, url, title) => `\\\\externalLink{${displayText}}{${url}}`\n\n/* Stringify a link `node`.\n*/\nfunction link (ctx, node) {\n  if (!node.url) return ''\n  const config = ctx.link || {}\n  const macro = has(config, 'macro') ? config.macro : defaultMacro\n  const prefix = has(config, 'prefix') ? config.prefix : ''\n  const url = escape(node.url.startsWith('/') ? prefix + node.url : node.url)\n  return macro(require('../all')(ctx, node), url, node.title)\n}\n"
  },
  {
    "path": "packages/rebber/src/types/linkReference.js",
    "content": "module.exports = linkReference\n\nconst defaultMacro = (reference, inner) => `\\\\hyperref[${reference}]{${inner}}`\n\nfunction linkReference (ctx, node) {\n  const macro = ctx.linkReference ? ctx.linkReference : defaultMacro\n  const innerText = require('../all')(ctx, node)\n\n  if (!ctx.definitions(node.identifier)) return `[${innerText}]`\n  return macro(node.identifier, innerText)\n}\n"
  },
  {
    "path": "packages/rebber/src/types/list.js",
    "content": "const has = require('has')\n\nmodule.exports = list\n\nconst defaultMacro = (innerText, isOrdered) => {\n  if (isOrdered) {\n    return `\\\\begin{enumerate}\\n${innerText}\\\\end{enumerate}\\n`\n  } else {\n    return `\\\\begin{itemize}\\n${innerText}\\\\end{itemize}\\n`\n  }\n}\n\nfunction list (ctx, node) {\n  const rebberList = has(ctx, 'list') ? ctx.list : defaultMacro\n  const itemized = require('../all')(ctx, node)\n  return rebberList(itemized, node.ordered)\n}\n"
  },
  {
    "path": "packages/rebber/src/types/listItem.js",
    "content": "const has = require('has')\n\nconst defaultMacro = (innerText) => `\\\\item\\\\relax ${innerText}\\n`\nconst defaultCheckedMacro = (innerText) => `\\\\item[$\\\\boxtimes$]\\\\relax ${innerText}\\n`\nconst defaultUncheckedMacro = (innerText) => `\\\\item[$\\\\square$]\\\\relax ${innerText}\\n`\n\nmodule.exports = listItem\n\nfunction listItem (ctx, node) {\n  let rebberListItem = has(ctx, 'listItem') ? ctx.listItem : defaultMacro\n  if (node.checked === true) {\n    rebberListItem = has(ctx, 'checkedListItem') ? ctx.checkedListItem : defaultCheckedMacro\n  } else if (node.checked === false) {\n    rebberListItem = has(ctx, 'uncheckedListItem') ? ctx.uncheckedListItem : defaultUncheckedMacro\n  }\n  return rebberListItem(require('../all')(ctx, node).trim())\n}\n"
  },
  {
    "path": "packages/rebber/src/types/paragraph.js",
    "content": "/* Expose. */\nmodule.exports = paragraph\n\n/* Stringify a paragraph `node`.\n */\nfunction paragraph (ctx, node) {\n  const contents = require('../all')(ctx, node)\n  return `${contents.trim()}\\n\\n`\n}\n"
  },
  {
    "path": "packages/rebber/src/types/raw.js",
    "content": "// TODO: make it customizable\n/* Dependencies. */\nconst text = require('./text')\n\n/* Expose. */\nmodule.exports = raw\n\n/* Stringify `raw`. */\nfunction raw (ctx, node) {\n  return ctx.dangerous ? node.value : text(ctx, node)\n}\n"
  },
  {
    "path": "packages/rebber/src/types/root.js",
    "content": "/* Dependencies. */\nconst one = require('../one')\n\n/* Expose. */\nmodule.exports = root\n\n/* Stringify a text `node`. */\nfunction root (ctx, node, _, parent) {\n  const children = node.children\n  if (!children) return ''\n\n  let previous\n\n  return children.reduce((output, child, index) => {\n    if (previous) {\n      if (child.type === previous.type && previous.type === 'list') {\n        output += previous.ordered === child.ordered ? '\\n\\n\\n' : '\\n\\n'\n      } else if (previous.type === 'list' && child.type === 'code' && !child.lang) {\n        output += '\\n\\n\\n'\n      } else {\n        output += '\\n\\n'\n      }\n    }\n\n    output += one(ctx, child, index, node, node)\n    previous = child\n    return output\n  }, '')\n}\n"
  },
  {
    "path": "packages/rebber/src/types/strong.js",
    "content": "// TODO: make it customizable\n/* Expose. */\nmodule.exports = strong\n\n/* Stringify a strong `node`. */\nfunction strong (ctx, node, index, parent) {\n  const contents = require('../all')(ctx, node)\n\n  return `\\\\textbf{${contents}}`\n}\n"
  },
  {
    "path": "packages/rebber/src/types/table.js",
    "content": "const clone = require('clone')\n\nconst one = require('../one')\n\n/* Expose. */\nmodule.exports = table\n\nconst defaultHeaderParse = rows => {\n  const columns = Math.max(...rows.map(l => l.split('&').length))\n  return ' X[-1]'.repeat(columns).substring(1)\n}\n\n// Retrocompatibility: first row is always header on default tables\nconst defaultheaderCounter = () => {\n  return 1\n}\n\nconst defaultMacro = (ctx, node) => {\n  const headerParse = ctx.headerParse ? ctx.headerParse : defaultHeaderParse\n  const headerCounter = ctx.headerCounter ? ctx.headerCounter : defaultheaderCounter\n\n  const parsed = node.children.map((n, index) => one(ctx, n, index, node))\n  const headerCount = headerCounter(node)\n  const colHeader = headerParse(parsed)\n\n  const envName = typeof ctx.tableEnvName === 'string' ? ctx.tableEnvName : 'longtblr'\n  const caption = node.caption\n    ? `\\n\\\\captionof{table}{${node.caption}}\\n`\n    : ''\n  // eslint-disable-next-line max-len\n  const headerProperties = typeof ctx.headerProperties === 'string' ? ctx.headerProperties : 'font=\\\\bfseries'\n  let extraProps = ''\n\n  if (headerCount && headerCount > 0) {\n    const tableHeaderEnum = new Array(headerCount)\n      .fill(0)\n      .map((_, i) => i + 1)\n      .join(',')\n    extraProps += `,rowhead=${headerCount},row{${tableHeaderEnum}}={${headerProperties}}`\n  }\n\n  // eslint-disable-next-line max-len\n  return `\\\\begin{${envName}}{colspec={${colHeader}}${extraProps}}\\n${parsed.join('')}\\\\end{${envName}}${caption}\\n`\n}\n\n/* Stringify a table `node`. */\nfunction table (ctx, node) {\n  const macro = ctx.table || defaultMacro\n  const overriddenCtx = clone(ctx)\n\n  overriddenCtx.image = overriddenCtx.image ? overriddenCtx.image : {}\n  overriddenCtx.image.inlineMatcher = () => true\n\n  return macro(overriddenCtx, node)\n}\n"
  },
  {
    "path": "packages/rebber/src/types/tableCell.js",
    "content": "/* Expose. */\nmodule.exports = tableCell\n\nconst defaultMacro = (ctx, node) => {\n  return require('../all')(ctx, node)\n}\n\n/* Stringify a tableCell `node`. */\nfunction tableCell (ctx, node) {\n  const macro = ctx.tableCell || defaultMacro\n  return macro(ctx, node)\n}\n"
  },
  {
    "path": "packages/rebber/src/types/tableRow.js",
    "content": "/* Expose. */\nconst one = require('../one')\nmodule.exports = tableRow\n\nconst defaultMacro = (ctx, node) => {\n  const parsed = []\n  node.children.map((n, index) => parsed.push(one(ctx, n, index, node)))\n  const line = parsed.join(' & ')\n  return `${line} \\\\\\\\\\n`\n}\n\n/* Stringify a tableRow `node`. */\nfunction tableRow (ctx, node, index) {\n  const macro = ctx.tableRow || defaultMacro\n  return macro(ctx, node)\n}\n"
  },
  {
    "path": "packages/rebber/src/types/text.js",
    "content": "/* Dependencies. */\nconst trimLines = require('trim-lines')\nconst escaper = require('../escaper')\n\n/* Stringify a text `node`. */\nmodule.exports = function text (ctx, node, index, parent) {\n  const value = trimLines(node.value)\n\n  return isLiteral(parent) ? value : escaper(value, ctx.escapes)\n}\n\n// TODO: `tagName` isn't part of MDAST!\n/* Check if content of `node` should not be escaped. */\nfunction isLiteral (node) {\n  return node && (node.tagName === 'script' || node.tagName === 'style')\n}\n"
  },
  {
    "path": "packages/rebber/src/types/thematic-break.js",
    "content": "/* Expose. */\nmodule.exports = thematicBreak\n\nconst defaultMacro = () => '\\\\horizontalLine\\n\\n'\n\n/* Stringify a delete `node`. */\nfunction thematicBreak (ctx, node, index, parent) {\n  const macro = ctx.thematicBreak || defaultMacro\n\n  return macro(node)\n}\n"
  },
  {
    "path": "packages/rebber-plugins/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/rebber-plugins/README.md",
    "content": "# rebber-plugins [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\n\n**rebber-plugins** is a collection of LaTeX stringifiers for custom [mdast][] nodes. These plugins are intended to be used with [rebber][].\n\nIt currently supports:\n\n* [remark-abbr][]\n* [remark-align][]\n* [remark-custom-blocks][]\n* [remark-emoticons][]\n* [remark-footnotes][]\n* [remark-grid-tables][]\n* [remark-iframes][]\n* [remark-kbd][]\n* [remark-ping][]\n* [remark-sub-super][]\n\n## Installation\n\n[npm][]:\n\n```bash\nnpm install rebber-plugins\n```\n\n## Usage\n\n```javascript\nconst unified = require('unified')\nconst remarkParser = require('remark-parse')\nconst rebber = require('rebber')\n\nconst {contents} = unified()\n  .use(remarkParser, remarkConfig)\n  .use(rebber, rebberConfig)\n  .processSync('### foo')\n\nconsole.log(contents);\n```\n\n## Supported remark plugins\n\n###### [remark-abbr][]\n\n* `remarkConfig` needs to be configured for `remark-abbr`\n* `rebberConfig.overrides.abbr = require('rebber-plugins/dist/type/abbr')`\n* `rebberConfig.abbr = (displayText, definition) => ''`\n\n\n###### [remark-align][]\n\n* `remarkConfig` needs to be configured for `remark-align`\n* `rebberConfig.overrides.centerAligned = require('rebber-plugins/dist/type/align')`\n* `rebberConfig.overrides.leftAligned = require('rebber-plugins/dist/type/align')`\n* `rebberConfig.overrides.rightAligned = require('rebber-plugins/dist/type/align')`\n* `rebberConfig.leftAligned = (innerText) => ''`\n* `rebberConfig.centerAligned = (innerText) => ''`\n* `rebberConfig.rightAligned = (innerText) => ''`\n* `rebberConfig.defaultType = (innerText, type) => ''`\n\n\n###### [remark-custom-blocks][]\n\n* `remarkConfig` needs to be configured for `remark-custom-blocks`\n* `rebberConfig.overrides.errorCustomBlock = require('rebber-plugins/dist/type/customBlocks')`\n* `rebberConfig.errorCustomBlock = (innerText, environmentName) => ''`\n\n\n###### [remark-emoticons][]\n\n* `remarkConfig` needs to be configured for `remark-emoticons`\n* `rebberConfig.overrides.emoticon = require('rebber-plugins/dist/type/emoticon')`\n* `rebberConfig.emoticons = remarkConfig.emoticons`\n\n\n###### [remark-grid-tables][]\n\n* `remarkConfig` needs to be configured for `remark-grid-tables`\n* `rebberConfig.overrides.gridTable = require('rebber-plugins/dist/type/gridTable')`\n\nProper handling of fenced code blocks in grid tables being hard to achieve in LaTeX, you can use the following preprocessor to automatically move the code blocks to an appendix section and replace the original location with a reference to the appendix section:\n\n```js\n  .use(rebber, {\n    preprocessors: {\n      iframe: require('rebber-plugins/dist/preprocessors/iframe')\n    }\n  })\n```\n\n\n###### [remark-iframes][]\n\n* `remarkConfig` needs to be configured for `remark-iframes`\n\n`iframe` nodes require some preprocessing before getting compiled to LaTeX:\n\n```javascript\nconst unified = require('unified')\nconst remarkParser = require('remark-parse')\nconst rebber = require('rebber')\n\nconst {contents} = unified()\n  .use(remarkParser, {\n    // see config options in the remark-iframes package\n    iframes: {\n      'www.dailymotion.com': {\n        tag: 'iframe',\n        width: 480,\n        height: 270,\n        disabled: false,\n        replace: [\n          ['video/', 'embed/video/'],\n        ],\n        thumbnail: {\n          format: 'http://www.dailymotion.com/thumbnail/video/{id}',\n          id: '.+/(.+)$'\n        }\n      },\n    }\n  })\n  .use(rebber, {\n    preprocessors: {\n      iframe: require('rebber-plugins/dist/preprocessors/iframe')\n    }\n  })\n  .processSync('some markdown')\n\nconsole.log(contents);\n```\n\n\n###### [remark-kbd][]\n\n* `remarkConfig` needs to be configured for `remark-kbd`\n* `rebberConfig.overrides.kbd = require('rebber-plugins/dist/type/kbd')`\n\n###### [remark-ping][]\n\n* `remarkConfig` needs to be configured for `remark-ping`\n* `rebberConfig.overrides.ping = require('rebber-plugins/dist/type/ping')`\n\n\n###### [remark-sub-super][]\n\n* `remarkConfig` needs to be configured for `remark-sub-super`\n* `rebberConfig.overrides.sub = require('rebber-plugins/dist/type/sub')`\n* `rebberConfig.overrides.sup = require('rebber-plugins/dist/type/sup')`\n\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/rebber-plugins/LICENSE-MIT\n\n[rebber]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/rebber\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/rebber-plugins\n\n[mdast]: https://github.com/syntax-tree/mdast/blob/master/readme.md\n\n[remark-abbr]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-abbr#remark-abbr--\n\n[remark-align]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-align#remark-align--\n\n[remark-custom-blocks]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-custom-blocks#remark-custom-blocks--\n\n[remark-emoticons]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-emoticons#remark-emoticons--\n\n[remark-footnotes]: https://github.com/remarkjs/remark-footnotes\n\n[remark-grid-tables]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-grid-tables#remark-grid-tables--\n\n[remark-iframes]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-iframes#remark-iframes--\n\n[remark-kbd]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-kbd#remark-kbd--\n\n[remark-ping]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-ping#remark-ping--\n\n[remark-sub-super]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-sub-super#remark-sub-super--\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/__snapshots__/rebber.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`abbr 1`] = `\n\"HELO to you\n\n\n\nCan I INJECT something in \\\\\\\\textbackslash{}LaTeX ?\n\n\n\n*[HELO]: In SMTP, the client initiates the dialog with a HELO command identifying itself\n\n\n\n*[INJECT]: discard\\\\\\\\}\\\\\\\\textbackslash{}LaTeX\\\\\\\\textbackslash{}abbr\\\\\\\\{INJECTED\\\\\\\\}\\\\\\\\{discard\n\n\"\n`;\n\nexports[`abbr 2`] = `\n\"\\\\\\\\abbr{FOO}{bar}\n\n\"\n`;\n\nexports[`abbr with custom config 1`] = `\n\"->FOO<-\n\n\"\n`;\n\nexports[`blockquote 1`] = `\n\"\\\\\\\\begin{Quotation}\na quote\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\na\nmultiline\nquote\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\na quote\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\na\nmultiline\nquote\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`blockquote 2`] = `\n\"\\\\\\\\begin{Quotation}\na quote\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\na\nmultiline\nquote\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\na quote\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\na\nmultiline\nquote\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`blockquote with custom config 1`] = `\n\"\\\\\\\\begin{Foo}\na quote\n\\\\\\\\end{Foo}\n\n\n\n\\\\\\\\begin{Foo}\na\nmultiline\nquote\n\\\\\\\\end{Foo}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Foo}\na quote\n\\\\\\\\end{Foo}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Foo}\na\nmultiline\nquote\n\\\\\\\\end{Foo}\"\n`;\n\nexports[`code 1`] = `\n\"\\\\\\\\begin{CodeBlock}{python}\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\na code without lang\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`code+caption 1`] = `\n\"\\\\\\\\begin{CodeBlock}{python}\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\\\\\\\\captionof{listing}{With Source}\"\n`;\n\nexports[`comments blocks 1`] = `\n\"Foo<--COMMENTS I am a comment COMMENTS-->bar\n\n\"\n`;\n\nexports[`custom-blocks 1`] = `\n\"\\\\\\\\begin{Information}\ninfo\n\\\\\\\\end{Information}\n\n\n\\\\\\\\begin{Warning}\nwarning\n\\\\\\\\end{Warning}\n\n\n\\\\\\\\begin{FooBar}\nsecret\n\\\\\\\\end{FooBar}\n\n\n\\\\\\\\begin{FooBar}\nimbricated spoilers\n\nand another\n\nand that's it\n\\\\\\\\end{FooBar}\n\n\n\\\\\\\\begin{FooBar}\nimbricated spoilers\n\nsecond level\n\nsecond level too\n\\\\\\\\end{FooBar}\n\n\n\\\\\\\\begin{FooBar}\nimbricated spoilers\n\nsecond level\n\nwith text in between\n\nsecond level too\n\\\\\\\\end{FooBar}\n\n\n\\\\\\\\begin{FooBar}\nimbricated spoilers\n\n\\\\\\\\begin{CodeBlock}{markdown}\nand here is some code\n\\\\\\\\end{CodeBlock}\n\nsecond level\n\\\\\\\\end{FooBar}\n\n\n\\\\\\\\begin{FooBar}\ndo not over-flattenize\n\nexpected to be flattened\n\nfirst level\n\n\\\\\\\\begin{Question}\nthis remains a question\n\\\\\\\\end{Question}\n\\\\\\\\end{FooBar}\n\n\n\\\\\\\\begin{FooBar}\nflattenize children of children\n\n\\\\\\\\begin{Question}\nthis remains a question\n\nbut the content in it is flattened to the question\n\\\\\\\\end{Question}\n\\\\\\\\end{FooBar}\n\n\n\\\\\\\\begin{Question}\nquestion \\\\\\\\texttt{coded}\n\\\\\\\\end{Question}\n\n\n\\\\\\\\begin{Error}\n\\\\\\\\textbf{error}\nfoo bar \\\\\\\\\\\\\\\\\nbaz\n\\\\\\\\end{Error}\n\n\n\\\\\\\\begin{Error}[{{a bad error}}]\n\\\\\\\\textbf{error}\nfoo bar \\\\\\\\\\\\\\\\\nbaz\n\\\\\\\\end{Error}\n\n\n\\\\\\\\begin{Neutre}[{{\\\\\\\\textbf{title}}}]\nfoo\n\\\\\\\\end{Neutre}\"\n`;\n\nexports[`emoticon 1`] = `\n\"foo :p bar \\\\\\\\smiley{/path/to/smile.png}\n\n\n\n\\\\\\\\smiley{/path/to/wink.png}\"\n`;\n\nexports[`figure+caption 1`] = `\n\"\\\\\\\\begin{Quotation}[With Source]\na\nmultiline\nquote\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nNom & Age \\\\\\\\\\\\\\\\\nFred & 39 \\\\\\\\\\\\\\\\\nSam & 38 \\\\\\\\\\\\\\\\\nAlice & 35 \\\\\\\\\\\\\\\\\nMathilde & 35 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nNom & Age \\\\\\\\\\\\\\\\\nFred & 39 \\\\\\\\\\\\\\\\\nSam & 38 \\\\\\\\\\\\\\\\\nAlice & 35 \\\\\\\\\\\\\\\\\nMathilde & 35 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\\\\\\\\captionof{table}{Coucou}\"\n`;\n\nexports[`footnotes 1`] = `\n\"\\\\\\\\part{International Radiotelephony Spelling Alphabet\\\\\\\\textsuperscript{\\\\\\\\protect\\\\\\\\footnotemark[wiki]}}\n\n\nHere's the NATO phonetic alphabet\\\\\\\\textsuperscript{\\\\\\\\footnotemark[wiki]}: Alfa, Bravo, Charlie, Delta, Echo, Foxtrot, Golf, Hotel, India, Juliet, Kilo, Lima, Mike, November, Oscar, Papa, Quebec, Romeo, Sierra, Tango, Uniform, Victor\\\\\\\\textsuperscript{\\\\\\\\footnotemark[name]}\\\\\\\\textsuperscript{\\\\\\\\footnotemark[consecutive]}, Whiskey, X-ray, Yankee, and Zulu.\n\n\n\nAnd here's some more text.\n\n\n\n\\\\\\\\footnotetext[wiki]{Read more about it here.}\n\n\\\\\\\\footnotetext[wiki]{And here.}\n\n\\\\\\\\footnotetext[wiki2]{Here's another good article on the subject.}\n\n\\\\\\\\footnotetext[name]{A great first name.}\n\n\\\\\\\\footnotetext[consecutive]{I know.}\n\nThe NATO phonetic alphabet\\\\\\\\textsuperscript{\\\\\\\\footnotemark[wi\\\\\\\\-ki]}.\n\n\n\n\\\\\\\\footnotetext[wi\\\\\\\\-ki]{Read more about it somewhere else.}\n\nThis example checks that \\\\\\\\footnote[l17c26o614]{the generated} IDs do not overwrite the user's IDs\\\\\\\\textsuperscript{\\\\\\\\footnotemark[1]}.\n\n\n\n\\\\\\\\footnotetext[1]{Old behavior would, for \\\\\"generated\\\\\", generate a footnote with an ID set to \\\\\\\\texttt{1}, thus overwriting this footnote.}\n\nThe NATO phonetic alphabet\\\\\\\\textsuperscript{\\\\\\\\footnotemark[wiki3]}.\n\n\n\n\\\\\\\\footnotetext[wiki3]{Read more about it somewhere else.}\n\nThis is an example of an inline footnote.\\\\\\\\footnote[l25c42o918]{This is the \\\\\\\\textit{actual} footnote.}\n\n\n\nThis one isn't even [defined].\n\n\n\n\\\\\\\\textsuperscript{\\\\\\\\footnotemark[both]}[invalid], \\\\\\\\footnote[l29c19o1015]{this too}[].\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\hyperref[bar]{foo}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textsuperscript{\\\\\\\\footnotemark[foo]}\\\\\\\\hyperref[bar]{bar}\n\\\\\\\\item\\\\\\\\relax [foo]\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textsuperscript{\\\\\\\\footnotemark[foo]}\\\\\\\\textsuperscript{\\\\\\\\footnotemark[bar]}\n\\\\\\\\end{enumerate}\n\n\nA footnote\\\\\\\\textsuperscript{\\\\\\\\footnotemark[2]}.\n\n\n\n\\\\\\\\footnotetext[2]{Including \\\\\\\\footnote[l38c17o1125]{another \\\\\\\\textbf{footnote}}}\n\nA footnote\\\\\\\\textsuperscript{\\\\\\\\footnotemark[tostring]} and \\\\\\\\textsuperscript{\\\\\\\\footnotemark[__proto__]} and \\\\\\\\textsuperscript{\\\\\\\\footnotemark[constructor]}.\n\n\n\n\\\\\\\\footnotetext[tostring]{See \\\\\\\\texttt{Object.prototype.toString()}.}\n\n\\\\\\\\footnotetext[constructor]{See \\\\\\\\texttt{Object.prototype.valueOf()}.}\n\n\\\\\\\\footnotetext[__proto__]{See \\\\\\\\texttt{Object.prototype.\\\\\\\\_\\\\\\\\_proto\\\\\\\\_\\\\\\\\_()}.}\n\nfoo\\\\\\\\textsuperscript{\\\\\\\\footnotemark[abc]} bar. foo\\\\\\\\textsuperscript{\\\\\\\\footnotemark[xyz]} bar\n\n\n\n\\\\\\\\footnotetext[abc]{Baz baz}\n\n\\\\\\\\footnotetext[xyz]{Baz}\n\nLorem ipsum dolor sit amet\\\\\\\\textsuperscript{\\\\\\\\footnotemark[3]}.\n\n\n\nNulla finibus\\\\\\\\textsuperscript{\\\\\\\\footnotemark[4]} neque et diam rhoncus convallis.\n\n\n\n\\\\\\\\footnotetext[3]{Consectetur \\\\\\\\textbf{adipiscing} elit. Praesent dictum purus ullamcorper ligula semper pellentesque\\\\\\\\textsuperscript{\\\\\\\\footnotemark[3]}.\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Containing a list.\n\\\\\\\\end{itemize}}\n\n\\\\\\\\footnotetext[4]{Nam dictum sapien nec sem ultrices fermentum. Nulla \\\\\\\\textbf{facilisi}. In et feugiat massa.}\n\n\\\\\\\\footnotetext[5]{Nunc dapibus ipsum ut mi \\\\\\\\textit{ultrices}, non euismod velit pretium.}\n\nHere is some text containing a footnote\\\\\\\\textsuperscript{\\\\\\\\footnotemark[somesamplefootnote]}. You can then continue your thought...\n\n\n\n\\\\\\\\footnotetext[somesamplefootnote]{Here is the text of the footnote itself.}\n\nEven go to a new \\\\\\\\hyperref[paragraph]{paragraph} and the footnotes will go to the bottom of the document\\\\\\\\textsuperscript{\\\\\\\\footnotemark[documentdetails]}.\n\n\n\n\\\\\\\\footnotetext[documentdetails]{Depending on the \\\\\\\\textbf{final} form of your document, of course. See the documentation and experiment.\n\nThis footnote has a second \\\\\\\\hyperref[paragraph]{paragraph}.}\n\n\\\\\\\\footnote{\\\\\\\\label{paragraph}\\\\\\\\externalLink{http://example.com}{http://example.com}}\n\n\\\\\\\\part{my heading\\\\\\\\protect\\\\\\\\footnote[l76c13o2284]{ref def}}\n\n\nor\n\n\n\n\\\\\\\\part{my heading\\\\\\\\textsuperscript{\\\\\\\\protect\\\\\\\\footnotemark[ref]}}\n\n\n\\\\\\\\footnotetext[ref]{def}\n\nFirst\\\\\\\\footnote[l84c6o2338]{the generated} and then a manual numbered def\\\\\\\\textsuperscript{\\\\\\\\footnotemark[def]}.\n\n\n\n\\\\\\\\footnotetext[def]{hello}\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax one\\\\\\\\footnote[l89c6o2415]{the first}\n\\\\\\\\item\\\\\\\\relax two\\\\\\\\textsuperscript{\\\\\\\\footnotemark[2nd]}\n\\\\\\\\item\\\\\\\\relax three\\\\\\\\textsuperscript{\\\\\\\\footnotemark[3rd]}\n\\\\\\\\item\\\\\\\\relax four\\\\\\\\footnote[l92c7o2460]{the last}\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\footnotetext[2nd]{second}\n\n\\\\\\\\footnotetext[3rd]{third}\n\nThis nested footnote would not work:\n\n\n\n\\\\\\\\hyperref[baz]{\\\\\\\\textsuperscript{\\\\\\\\footnotemark[foo2]}}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{bar}\\\\\\\\externalLink{https://bar.com}{https://bar.com}}\n\n\\\\\\\\footnote{\\\\\\\\label{baz}\\\\\\\\externalLink{https://baz.com}{https://baz.com}}\n\n\\\\\\\\footnotetext[foo2]{A footnote.}\n\n\\\\\\\\chapter{New list continuation}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textsuperscript{\\\\\\\\footnotemark[foo]}\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\footnotetext[foo]{bar baz.}\n\n\\\\\\\\part{mytitle A\\\\\\\\textsuperscript{\\\\\\\\protect\\\\\\\\footnotemark[footnoteref]}}\n\n\n\\\\\\\\footnotetext[footnoteref]{reference in title}\n\n\\\\\\\\part{mytitle B\\\\\\\\protect\\\\\\\\footnote[l117c12o2768]{footnoterawhead inner}}\n\n\n\\\\\\\\part{myti\\\\\\\\textit{tle C\\\\\\\\protect\\\\\\\\footnote[l119c13o2806]{foo inner}}}\n\n\na paragraph\\\\\\\\footnote[l121c12o2832]{footnoteRawPar inner}\n\n\n\n\\\\\\\\inlineImage{undefined}(an image)\nFigure: with an \\\\\\\\footnote[l124c17o2894]{inline footnote} in caption\n\n\"\n`;\n\nexports[`gridTable 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nSub & Headings & ABBR \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} cell \\\\\\\\endgraf spans \\\\\\\\endgraf rows & \\\\\\\\SetCell[c=2]{l} ABBR   spanning &  \\\\\\\\\\\\\\\\\n & normal & cell \\\\\\\\\\\\\\\\\nmulti \\\\\\\\endgraf line \\\\\\\\endgraf \\\\\\\\endgraf cells \\\\\\\\endgraf too & \\\\\\\\SetCell[c=2]{l} cells can be \\\\\\\\endgraf \\\\\\\\textit{formatted} \\\\\\\\endgraf \\\\\\\\textbf{paragraphs} &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\\\\\\\\captionof{table}{The new table ABBR [\\\\\\\\textasciicircum{}foot] with ||CTRL|| + ||S||}\n\n\n\n*[ABBR]: abbreviation\n\n\n\n[\\\\\\\\textasciicircum{}foot]: a foot\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\ntitle & image \\\\\\\\\\\\\\\\\nspace & \\\\\\\\inlineImage{https://i.ytimg.com/vi/lt0WQ8JzLz4/maxresdefault.jpg} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\ntitle & code \\\\\\\\\\\\\\\\\ninline & \\\\\\\\texttt{inline} br \\\\\\\\endgraf \\\\\\\\texttt{inline} \\\\\\\\\\\\\\\\\nblock & \\\\\\\\hyperref[appendix-1]{Code appendice 1} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B & C \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} D & \\\\\\\\SetCell[c=2]{l} E &  \\\\\\\\\\\\\\\\\n & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B & C & D \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} D & \\\\\\\\SetCell[c=2]{l} E &  &  \\\\\\\\\\\\\\\\\n & F & \\\\\\\\SetCell[c=2]{l} G &  \\\\\\\\\\\\\\\\\na & b & \\\\\\\\SetCell[r=2]{l} c   d \\\\\\\\endgraf \\\\\\\\endgraf g &  \\\\\\\\\\\\\\\\\ne & f &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=2,row{1,2}={font=\\\\\\\\bfseries}}\n\\\\\\\\SetCell[c=2]{l} Table Headings &  & Here \\\\\\\\\\\\\\\\\nSub & Headings & Too \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} cell \\\\\\\\endgraf spans \\\\\\\\endgraf rows & \\\\\\\\SetCell[c=2]{l} column[\\\\\\\\textasciicircum{}foot] &  \\\\\\\\\\\\\\\\\n & normal & cell \\\\\\\\\\\\\\\\\nmulti \\\\\\\\endgraf line \\\\\\\\endgraf \\\\\\\\endgraf cells \\\\\\\\endgraf too & \\\\\\\\SetCell[c=2]{l} cells can be \\\\\\\\endgraf \\\\\\\\textit{formatted} \\\\\\\\endgraf \\\\\\\\textbf{paragraphs} &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B & C \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} D & \\\\\\\\SetCell[c=2]{l} E &  \\\\\\\\\\\\\\\\\n & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]}}\n\\\\\\\\SetCell[r=3]{l} A & \\\\\\\\SetCell[c=2]{l} B &  \\\\\\\\\\\\\\\\\n & C & D \\\\\\\\\\\\\\\\\n & \\\\\\\\SetCell[c=2]{l} E &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\nA & B & C & D \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=2]{l} E &  & \\\\\\\\SetCell[c=2]{l} F &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=4]{l} G &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\n\\\\\\\\SetCell[c=4]{l} A &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=2]{l} B &  & \\\\\\\\SetCell[c=2]{l} C &  \\\\\\\\\\\\\\\\\nD & E & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\nH & \\\\\\\\SetCell[c=16]{l}  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  & He \\\\\\\\\\\\\\\\\nLi & Be & \\\\\\\\SetCell[r=2]{l}  &  &  &  &  &  &  &  &  &  & B & C & N & O & F & Ne \\\\\\\\\\\\\\\\\nNa & Mg &  &  &  &  &  &  &  &  &  &  & Al & Si & P & S & Cl & Ar \\\\\\\\\\\\\\\\\nK & Ca & Sc & Ti & V & Cr & Mn & Fe & Co & Ni & Cu & Zn & Ga & Ge & As & Se & Br & Kr \\\\\\\\\\\\\\\\\nRb & Sr & Y & Zr & Nb & Mo & Tc & Ru & Rh & Pd & Ag & Cd & In & Sn & Sb & Te & I & Xe \\\\\\\\\\\\\\\\\nCs & Ba & LAN & Hf & Ta & W & Re & Os & Ir & Pt & Au & Hg & Tl & Pb & Bi & Po & At & Rn \\\\\\\\\\\\\\\\\nFr & Ra & ACT & \\\\\\\\SetCell[c=15]{l}  &  &  &  &  &  &  &  &  &  &  &  &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=18]{l}  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=3]{l} Lanthanide &  &  & La & Ce & Pr & Nd & Pm & Sm & Eu & Gd & Tb & Dy & Ho & Er & Tm & Yb & Lu \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=3]{l} Actinide &  &  & Ac & Th & Pa & U & Np & Pu & Am & Cm & Bk & Cf & Es & Fm & Md & No & Lw \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1]}}\nA \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\nText at the end\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1]}}\nA \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\nText at the\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1]}}\na & \\\\\\\\SetCell[r=2]{l}  &  &  \\\\\\\\\\\\\\\\\nb &  &  & c \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\\\\\\\\captionof{table}{multirow}\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\n\\\\\\\\SetCell[c=2]{l} span &  & header & \\\\\\\\SetCell[c=2]{l} span &  \\\\\\\\\\\\\\\\\nelem & \\\\\\\\SetCell[c=2]{l} span middle &  & \\\\\\\\SetCell[c=2]{l}  &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{appendices}\n\\\\\\\\part{\\\\\\\\label{appendix-1}Annexes 1}\n\n\\\\\\\\begin{CodeBlock}{python}\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{appendices}\"\n`;\n\nexports[`heading 1`] = `\n\"\\\\\\\\part{first level title}\n\n\n\\\\\\\\chapter{second level title}\n\n\n\\\\\\\\section{third level title}\n\n\n\\\\\\\\subsection{fourth level title}\n\n\n\\\\\\\\subsubsection{fifth level title}\n\n\n\\\\\\\\paragraph{sixth level title}\n\n\n\\\\\\\\part{a \\\\\\\\textbackslash{} b}\n\n\n\\\\\\\\part{a \\\\\\\\} b}\n\n\n\\\\\\\\part{a \\\\\\\\} \\\\\\\\textbackslash{} b}\n\n\n\\\\\\\\part{a \\\\\\\\} b}\n\n\n\\\\\\\\part{\\\\\\\\includegraphics{https://www.johnfdoherty.com/wp-content/uploads/2011/07/Titles1.jpg}}\n\n\n\\\\\\\\part{a title with \\\\\\\\includegraphics{https://www.johnfdoherty.com/wp-content/uploads/2011/07/Titles1.jpg} and text}\n\"\n`;\n\nexports[`heading with custom config 1`] = `\n\"\\\\\\\\LevelOneTitle{first level title}\n\n\n\\\\\\\\LevelTwoTitle{second level title}\n\n\n\\\\\\\\LevelThreeTitle{third level title}\n\n\n\\\\\\\\LevelFourTitle{fourth level title}\n\n\n\\\\\\\\LevelFiveTitle{fifth level title}\n\n\n\\\\\\\\LevelSixTitle{sixth level title}\n\n\n\\\\\\\\LevelOneTitle{a \\\\\\\\textbackslash{} b}\n\n\n\\\\\\\\LevelOneTitle{a \\\\\\\\} b}\n\n\n\\\\\\\\LevelOneTitle{a \\\\\\\\} \\\\\\\\textbackslash{} b}\n\n\n\\\\\\\\LevelOneTitle{a \\\\\\\\} b}\n\n\n\\\\\\\\LevelOneTitle{\\\\\\\\inlineImage{https://www.johnfdoherty.com/wp-content/uploads/2011/07/Titles1.jpg}}\n\n\n\\\\\\\\LevelOneTitle{a title with \\\\\\\\inlineImage{https://www.johnfdoherty.com/wp-content/uploads/2011/07/Titles1.jpg} and text}\n\"\n`;\n\nexports[`html nodes 1`] = `\n\"\\\\\\\\part{foo}\n\n\n\\\\\\\\textbf{something <a> else}\n\n\"\n`;\n\nexports[`inline-code 1`] = `\n\"a paragraph \\\\\\\\texttt{with inline code}.\n\n\n\n\\\\\\\\texttt{a multiline inlinecode}\n\n\n\n\\\\\\\\texttt{a code with \\\\\\\\textbackslash{}}\n\n\n\n\\\\\\\\texttt{a \\\\\\\\textbackslash{}text in \\\\\\\\textbackslash{}LaTeX \\\\\\\\textbackslash{}\\\\\\\\textbackslash{}}\"\n`;\n\nexports[`link 1`] = `\n\"\\\\\\\\externalLink{an external link}{https://wikipedia.com}\n\n\n\n\\\\\\\\externalLink{an internal link}{/forums}\n\n\n\n\\\\\\\\externalLink{an \\\\\\\\texttt{external} link}{https://wikipedia.com}\"\n`;\n\nexports[`link with special characters 1`] = `\"\\\\\\\\externalLink{foo}{http://example.com?a=b\\\\\\\\%c\\\\\\\\textasciicircum{}\\\\\\\\{\\\\\\\\}\\\\\\\\#foo}\"`;\n\nexports[`link-prepend 1`] = `\n\"\\\\\\\\externalLink{an external link}{https://wikipedia.com}\n\n\n\n\\\\\\\\externalLink{an internal link}{http://zestedesavoir.com/forums}\n\n\n\n\\\\\\\\externalLink{an \\\\\\\\texttt{external} link}{https://wikipedia.com}\"\n`;\n\nexports[`list 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax an\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textbf{unordered}\n\\\\\\\\item\\\\\\\\relax list\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax an\n\\\\\\\\item\\\\\\\\relax \\\\\\\\texttt{ordered}\n\\\\\\\\item\\\\\\\\relax list\n\\\\\\\\end{enumerate}\"\n`;\n\nexports[`math 1`] = `\n\"A sentence ($S$) with \\\\\\\\textit{italic} and inline math ($C_L$) and $b$ another.\n\n\n\n\\\\\\\\[ L = \\\\\\\\frac{1}{2} \\\\\\\\rho v^2 S C_L \\\\\\\\]\n\n\n\nhehe\n\n\n\nWe also want escaping like so: $$ or like so:\n\n\n\n$\\\\\\\\frac{1}{2}$\n\n\"\n`;\n\nexports[`math-extra-command 1`] = `\n\"\\\\\\\\[ \\\\\\\\nabla^2 E(\\\\\\\\vec x) + [n(\\\\\\\\vec{x})\\\\\\\\,k]^2\\\\\\\\,E(\\\\\\\\vec x) = -s(\\\\\\\\vec x), \\\\\\\\]\n\n\"\n`;\n\nexports[`math-left-right 1`] = `\n\"\\\\\\\\[ \\\\\\\\boxed{\\\\\\\\nabla^2 E(\\\\\\\\vec x) + \\\\\\\\left\\\\\\\\{[n(\\\\\\\\vec{x})\\\\\\\\,k]^2-i\\\\\\\\,k\\\\\\\\,\\\\\\\\sigma(\\\\\\\\vec x)\\\\\\\\right\\\\\\\\}\\\\\\\\,E(\\\\\\\\vec x)} \\\\\\\\]\n\n\"\n`;\n\nexports[`mix-1 1`] = `\n\"(for convenience,   are replaced with simple single spaces in the tests)\n\n\n\n\\\\\\\\part{first 1}\n\n\nfoo \\\\\\\\\\\\\\\\\nbar\n\n\n\nDisrupt \\\\\\\\sout{asymmetrical} unicorn, pok pok kale chips umami selfies gastropub food truck flannel. Blue \\\\\\\\textbf{bottle craft} beer hexagon artisan. Chia gochujang crucifix, \\\\\\\\textsuperscript{ready} \\\\\\\\textsuperscript{made} hammock \\\\\\\\textit{blog succulents} sriracha raw denim scenester cray typewriter fashion axe \\\\\\\\textsubscript{art} \\\\\\\\textit{party}. Schlitz tacos tilde intelligentsia, unicorn fixie adaptogen beard 8-bit street \\\\\\\\textsubscript{art} typewriter.\n\n\n\n\\\\\\\\chapter{\\\\\\\\textit{second} 1}\n\n\n\\\\\\\\textbf{Literally selfies tbh lo-fi. Actually health goth ennui, brooklyn retro polaroid sriracha. Kogi live-edge mixtape marfa street \\\\\\\\textsubscript{art} synth. Godard synth truffaut selfies, vape fanny \\\\\\\\sout{pack} subway tile. Stumptown af pabst, try-hard fam ethical actually four dollar toast. Microdosing kogi brooklyn, locavore jianbing etsy sartorial \\\\\\\\textit{YOLO}. Williamsburg salvia photo booth \\\\\\\\textsuperscript{readymade} listicle man braid.}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}[Guru]\nMarfa pickled helvetica put a bird on it hot chicken williamsburg.\nEdison bulb asymmetrical \\\\\\\\texttt{keffiyeh} schlitz iceland put a bird on it hoodie affogato.\n\nTofu tote bag distillery viral knausgaard, health goth asymmetrical.\n\\\\\\\\end{Quotation}\n\n\n\nAsymmetrical pug scenester sustainable enamel pin distillery quinoa keffiyeh. Flannel humblebrag PBR\\\\\\\\&B polaroid banh mi wolf. Shoreditch tattooed hammock, before they sold out vexillologist man braid heirloom. Activated charcoal craft beer cloud bread meh biodiesel pabst.\n\n\n\n\\\\\\\\section{\\\\\\\\sout{third} 1}\n\n\nArt party keytar godard iceland neutra cronut. Austin \\\\\\\\textsuperscript{readymade} semiotics, edison bulb cloud bread adaptogen blue bottle jean shorts DIY. Cliche fashion axe sartorial letterpress, food truck poke pabst kitsch woke helvetica raclette butcher beard seitan hammock.\n\n\n\n\\\\\\\\texttt{foo bar}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\texttt{fo\\\\\\\\textbackslash{}o bar}\n\\\\\\\\end{Quotation}\n\n\n\nHexagon lo-fi seitan you probably haven't heard of them, bicycle rights small batch meditation try-hard green juice banh mi keffiyeh. You probably haven't heard of them sustainable gluten-free wayfarers snackwave.\n\n\n\n\\\\\\\\section{third 2}\n\n\n\\\\\\\\subsection{\\\\\\\\sout{fo}u\\\\\\\\textbf{r}t\\\\\\\\textit{h} \\\\\\\\textit{1}}\n\n\nMumblecore kombucha offal, health goth next level before they sold out gluten-free chicharrones keffiyeh. Mumblecore kickstarter hoodie fixie keffiyeh. Microdosing lo-fi taiyaki irony pok pok. Banjo brooklyn umami succulents flexitarian. Swag sartorial scenester synth viral.\n\n\n\n\\\\\\\\subsubsection{fifth 1}\n\n\nBanjo bespoke subway tile, street \\\\\\\\textsubscript{a\\\\\\\\textit{r}}\\\\\\\\textsuperscript{t} drinking vinegar offal franzen. Pour-over green juice vaporware kale chips. Meggings cronut affogato PBR\\\\\\\\&B, \\\\\\\\textsubscript{art} party unicorn dreamcatcher schlitz yuccie mixtape 90's thundercats air plant. Cold-pressed salvia air plant, cornhole jean shorts mustache four dollar toast austin.\n\n\n\n\\\\\\\\section{third 3}\n\n\nMeditation heirloom chicharrones, sartorial man braid hot chicken sustainable. Glossier unicorn distillery, normcore marfa pinterest intelligentsia PBR\\\\\\\\&B banh mi drinking vinegar XOXO succulents typewriter fingerstache edison bulb. Meditation ethical cronut glossier cliche kickstarter.\n\n\n\n\\\\\\\\subsection{fourth 2}\n\n\nVenmo bushwick food truck chartreuse fam. Everyday carry gastropub glossier, cold-pressed salvia migas keytar. Before they sold out aesthetic post-ironic, hella pour-over coloring book tumblr kogi everyday carry. Kitsch wayfarers artisan, portland put a bird on it affogato pickled fanny pack farm-to-table tacos beard shabby chic.\n\n\n\n\\\\\\\\subsection{fourth 3}\n\n\nChambray intelligentsia vape listicle. Pok pok snackwave cronut retro hot chicken, trust fund master cleanse keytar forage dreamcatcher. Taiyaki actually deep v, godard small batch irony lumbersexual unicorn cardigan af. Irony lumbersexual salvia, pitchfork fam snackwave man bun. Kitsch jianbing intelligentsia freegan, waistcoat raw denim cloud bread vice cray etsy listicle skateboard jean shorts.\n\n\n\n\\\\\\\\subsubsection{fifth 2}\n\n\nAsymmetrical normcore portland, vaporware viral tote bag DIY slow-carb kogi fanny pack. Keffiyeh ennui church-key, irony VHS man bun edison bulb listicle cloud bread try-hard cred lumbersexual lo-fi glossier.\n\n\n\n\\\\\\\\part{first 2}\n\n\n\\\\\\\\chapter{second 2}\n\n\n\\\\\\\\subsubsection{fifth 3}\n\n\nMessenger bag locavore swag raclette brunch whatever, portland food truck. PBR\\\\\\\\&B cred mlkshk, poke letterpress waistcoat celiac. La croix letterpress forage keffiyeh.\"\n`;\n\nexports[`mix-2 1`] = `\n\"(for convenience,   are replaced with simple single spaces in the tests)\n\n\n\n\\\\\\\\part{first 1}\n\n\n\\\\\\\\begin{Quotation}[Quotation Source]\nCode inside quote\n\n\\\\\\\\begin{CodeBlock}{python}\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\\\\\\\\captionof{listing}{code source}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{CodeBlock}{python}\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\\\\\\\\captionof{listing}{First \\\\\\\\keys{CTRL}+\\\\\\\\keys{S}}\n\n\n\nCode: Second\n\n\n\n\\\\\\\\begin{CodeBlock}{python}\nprint('code without caption')\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`mix-3 1`] = `\n\"\\\\\\\\part{right-aligned list}\n\n\n\n{\\\\\\\\raggedleft\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{itemize}\n}\n\n\n\\\\\\\\part{centered list}\n\n\n\n{\\\\\\\\centering \\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{itemize}\n}\n\n\n\\\\\\\\part{left list}\n\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`mix-4 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nSub & Headings & \\\\\\\\abbr{ABBR}{abbreviation} \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} cell \\\\\\\\endgraf spans \\\\\\\\endgraf rows & \\\\\\\\SetCell[c=2]{l} column spanning &  \\\\\\\\\\\\\\\\\n & normal & cell \\\\\\\\\\\\\\\\\nmulti \\\\\\\\endgraf line \\\\\\\\endgraf \\\\\\\\endgraf cells \\\\\\\\endgraf too & \\\\\\\\SetCell[c=2]{l} cells can be \\\\\\\\endgraf \\\\\\\\textit{formatted} \\\\\\\\endgraf \\\\\\\\textbf{paragraphs} &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\\\\\\\\captionof{table}{The new table \\\\\\\\abbr{ABBR}{abbreviation} \\\\\\\\textsuperscript{\\\\\\\\protect\\\\\\\\footnotemark[foot]} with \\\\\\\\keys{CTRL} + \\\\\\\\keys{S}}\n\n\n\n\\\\\\\\footnotetext[foot]{a foot}\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\ntitle & image \\\\\\\\\\\\\\\\\nspace & \\\\\\\\inlineImage{https://i.ytimg.com/vi/lt0WQ8JzLz4/maxresdefault.jpg} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\ntitle & code \\\\\\\\\\\\\\\\\ninline & \\\\\\\\texttt{inline} br \\\\\\\\endgraf \\\\\\\\texttt{inline} \\\\\\\\\\\\\\\\\nblock & \\\\\\\\hyperref[appendix-1]{Code appendice 1} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B & C \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} D & \\\\\\\\SetCell[c=2]{l} E &  \\\\\\\\\\\\\\\\\n & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B & C & D \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} D & \\\\\\\\SetCell[c=2]{l} E &  &  \\\\\\\\\\\\\\\\\n & F & \\\\\\\\SetCell[c=2]{l} G &  \\\\\\\\\\\\\\\\\na & b & \\\\\\\\SetCell[r=2]{l} c   d \\\\\\\\endgraf \\\\\\\\endgraf g &  \\\\\\\\\\\\\\\\\ne & f &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=2,row{1,2}={font=\\\\\\\\bfseries}}\n\\\\\\\\SetCell[c=2]{l} Table Headings &  & Here \\\\\\\\\\\\\\\\\nSub & Headings & Too \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} cell \\\\\\\\endgraf spans \\\\\\\\endgraf rows & \\\\\\\\SetCell[c=2]{l} column spanning &  \\\\\\\\\\\\\\\\\n & normal & cell \\\\\\\\\\\\\\\\\nmulti \\\\\\\\endgraf line \\\\\\\\endgraf \\\\\\\\endgraf cells \\\\\\\\endgraf too & \\\\\\\\SetCell[c=2]{l} cells can be \\\\\\\\endgraf \\\\\\\\textit{formatted} \\\\\\\\endgraf \\\\\\\\textbf{paragraphs} &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B & C \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} D & \\\\\\\\SetCell[c=2]{l} E &  \\\\\\\\\\\\\\\\\n & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1]}}\n\\\\\\\\SetCell[r=3]{l} A & \\\\\\\\SetCell[c=2]{l} B &  \\\\\\\\\\\\\\\\\n & C & D \\\\\\\\\\\\\\\\\n & \\\\\\\\SetCell[c=2]{l} E &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\nA & B & C & D \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=2]{l} E &  & \\\\\\\\SetCell[c=2]{l} F &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=4]{l} G &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\n\\\\\\\\SetCell[c=4]{l} A &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=2]{l} B &  & \\\\\\\\SetCell[c=2]{l} C &  \\\\\\\\\\\\\\\\\nD & E & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\nH & \\\\\\\\SetCell[c=16]{l}  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  & He \\\\\\\\\\\\\\\\\nLi & Be & \\\\\\\\SetCell[r=2]{l}  &  &  &  &  &  &  &  &  &  & B & C & N & O & F & Ne \\\\\\\\\\\\\\\\\nNa & Mg &  &  &  &  &  &  &  &  &  &  & Al & Si & P & S & Cl & Ar \\\\\\\\\\\\\\\\\nK & Ca & Sc & Ti & V & Cr & Mn & Fe & Co & Ni & Cu & Zn & Ga & Ge & As & Se & Br & Kr \\\\\\\\\\\\\\\\\nRb & Sr & Y & Zr & Nb & Mo & Tc & Ru & Rh & Pd & Ag & Cd & In & Sn & Sb & Te & I & Xe \\\\\\\\\\\\\\\\\nCs & Ba & LAN & Hf & Ta & W & Re & Os & Ir & Pt & Au & Hg & Tl & Pb & Bi & Po & At & Rn \\\\\\\\\\\\\\\\\nFr & Ra & ACT & \\\\\\\\SetCell[c=15]{l}  &  &  &  &  &  &  &  &  &  &  &  &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=18]{l}  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=3]{l} Lanthanide &  &  & La & Ce & Pr & Nd & Pm & Sm & Eu & Gd & Tb & Dy & Ho & Er & Tm & Yb & Lu \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=3]{l} Actinide &  &  & Ac & Th & Pa & U & Np & Pu & Am & Cm & Bk & Cf & Es & Fm & Md & No & Lw \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1]}}\nA \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\nText at the end\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1]}}\nA \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\nText at the\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1]}}\na & \\\\\\\\SetCell[r=2]{l}  &  &  \\\\\\\\\\\\\\\\\nb &  &  & c \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\\\\\\\\captionof{table}{multirow}\n\n\n\n\\\\\\\\begin{appendices}\n\\\\\\\\part{\\\\\\\\label{appendix-1}Annexes 1}\n\n\\\\\\\\begin{CodeBlock}{python}\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{appendices}\"\n`;\n\nexports[`mix-5 1`] = `\n\"\\\\\\\\image{http://www.numerama.com/content/uploads/2016/07/espace.jpg}[espace\\\\\\\\textsuperscript{\\\\\\\\protect\\\\\\\\footnotemark[node]}]\n\n\n\\\\\\\\footnotetext[node]{Two things are infinite: the universe and human stupidity.}\"\n`;\n\nexports[`mix-6 1`] = `\n\"\\\\\\\\image{http://img.youtube.com/vi/8TQIvdFl4aU/0.jpg}[\\\\\\\\externalLink{https://www.youtube.com/embed/8TQIvdFl4aU}{https://www.youtube.com/embed/8TQIvdFl4aU}]\n\n\nVideo: a caption\n\n\n\n\\\\\\\\image{http://img.youtube.com/vi/8TQIvdFl4aU/0.jpg}[\\\\\\\\externalLink{https://www.youtube.com/embed/8TQIvdFl4aU}{https://www.youtube.com/embed/8TQIvdFl4aU}]\n\n\nno caption\"\n`;\n\nexports[`mix-7 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]}}\ncell & \\\\\\\\texttt{code with line break} \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=2]{l} \\\\\\\\hyperref[appendix-1]{Code appendice 1} &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{appendices}\n\\\\\\\\part{\\\\\\\\label{appendix-1}Annexes 1}\n\n\\\\\\\\begin{CodeBlock}{text}\nline 1\nline2\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{appendices}\"\n`;\n\nexports[`mix-math-escape 1`] = `\n\"$\\\\\\\\Delta \\\\\\\\varphi = 2 \\\\\\\\pi f \\\\\\\\Delta t_{orange/bleu} = -\\\\\\\\frac{\\\\\\\\pi}{4}$\n\n\n\n\\\\\\\\[ \\\\\\\\begin{array}{l r}\n  & 45 \\\\\\\\\\\\\\\\\n+ & 218 \\\\\\\\\\\\\\\\\n+ & 800 \\\\\\\\\\\\\\\\\n\\\\\\\\hline\n= & 1063\n\\\\\\\\end{array} \\\\\\\\]\n\n\n\n\\\\\\\\[ \\\\\\\\left( \\\\\\\\frac{(4 + 5)\\\\\\\\times(2 + 3) + 6}{8 + 7} \\\\\\\\right) ^9 \\\\\\\\]\n\n\n\n$42\\\\\\\\%$\n\n\n\nThis should be escaped: $\\\\\\\\pink{\t {I love \\\\\\\\LaTeX}   {ls / > outputrce}  {outputrce}}$\"\n`;\n\nexports[`paragraph 1`] = `\n\"\\\\\\\\part{first 1}\n\n\nDisrupt asymmetrical unicorn, pok pok kale chips umami selfies gastropub food truck flannel. Blue bottle craft beer hexagon artisan. Chia gochujang crucifix, readymade hammock blog succulents sriracha raw denim scenester cray typewriter fashion axe art party. Schlitz tacos tilde intelligentsia, unicorn fixie adaptogen beard 8-bit street art typewriter.\n\n\n\n\\\\\\\\chapter{second 1}\n\n\nLiterally selfies tbh lo-fi. Actually health goth ennui, brooklyn retro polaroid sriracha. Kogi live-edge mixtape marfa street art synth. Godard synth truffaut selfies, vape fanny pack subway tile. Stumptown af pabst, try-hard fam ethical actually four dollar toast. Microdosing kogi brooklyn, locavore jianbing etsy sartorial YOLO. Williamsburg salvia photo booth readymade listicle man braid.\n\n\n\nMarfa pickled helvetica put a bird on it hot chicken williamsburg. Edison bulb asymmetrical keffiyeh schlitz iceland put a bird on it hoodie affogato. Tofu tote bag distillery viral knausgaard, health goth asymmetrical.\n\n\n\nAsymmetrical pug scenester sustainable enamel pin distillery quinoa keffiyeh. Flannel humblebrag PBR\\\\\\\\&B polaroid banh mi wolf. Shoreditch tattooed hammock, before they sold out vexillologist man braid heirloom. Activated charcoal craft beer cloud bread meh biodiesel pabst.\n\n\n\n\\\\\\\\section{third 1}\n\n\nArt party keytar godard iceland neutra cronut. Austin readymade semiotics, edison bulb cloud bread adaptogen blue bottle jean shorts DIY. Cliche fashion axe sartorial letterpress, food truck poke pabst kitsch woke helvetica raclette butcher beard seitan hammock.\n\n\n\nHexagon lo-fi seitan you probably haven't heard of them, bicycle rights small batch meditation try-hard green juice banh mi keffiyeh. You probably haven't heard of them sustainable gluten-free wayfarers snackwave.\n\n\n\n\\\\\\\\section{third 2}\n\n\n\\\\\\\\subsection{fourth 1}\n\n\nMumblecore kombucha offal, health goth next level before they sold out gluten-free chicharrones keffiyeh. Mumblecore kickstarter hoodie fixie keffiyeh. Microdosing lo-fi taiyaki irony pok pok. Banjo brooklyn umami succulents flexitarian. Swag sartorial scenester synth viral.\n\n\n\n\\\\\\\\subsubsection{fifth 1}\n\n\nBanjo bespoke subway tile, street art drinking vinegar offal franzen. Pour-over green juice vaporware kale chips. Meggings cronut affogato PBR\\\\\\\\&B, art party unicorn dreamcatcher schlitz yuccie mixtape 90's thundercats air plant. Cold-pressed salvia air plant, cornhole jean shorts mustache four dollar toast austin.\n\n\n\n\\\\\\\\section{third 3}\n\n\nMeditation heirloom chicharrones, sartorial man braid hot chicken sustainable. Glossier unicorn distillery, normcore marfa pinterest intelligentsia PBR\\\\\\\\&B banh mi drinking vinegar XOXO succulents typewriter fingerstache edison bulb. Meditation ethical cronut glossier cliche kickstarter.\n\n\n\n\\\\\\\\subsection{fourth 2}\n\n\nVenmo bushwick food truck chartreuse fam. Everyday carry gastropub glossier, cold-pressed salvia migas keytar. Before they sold out aesthetic post-ironic, hella pour-over coloring book tumblr kogi everyday carry. Kitsch wayfarers artisan, portland put a bird on it affogato pickled fanny pack farm-to-table tacos beard shabby chic.\n\n\n\n\\\\\\\\subsection{fourth 3}\n\n\nChambray intelligentsia vape listicle. Pok pok snackwave cronut retro hot chicken, trust fund master cleanse keytar forage dreamcatcher. Taiyaki actually deep v, godard small batch irony lumbersexual unicorn cardigan af. Irony lumbersexual salvia, pitchfork fam snackwave man bun. Kitsch jianbing intelligentsia freegan, waistcoat raw denim cloud bread vice cray etsy listicle skateboard jean shorts.\n\n\n\n\\\\\\\\subsubsection{fifth 2}\n\n\nAsymmetrical normcore portland, vaporware viral tote bag DIY slow-carb kogi fanny pack. Keffiyeh ennui church-key, irony VHS man bun edison bulb listicle cloud bread try-hard cred lumbersexual lo-fi glossier.\n\n\n\n\\\\\\\\part{first 2}\n\n\n\\\\\\\\chapter{second 2}\n\n\n\\\\\\\\subsubsection{fifth 3}\n\n\nMessenger bag locavore swag raclette brunch whatever, portland food truck. PBR\\\\\\\\&B cred mlkshk, poke letterpress waistcoat celiac. La croix letterpress forage keffiyeh.\"\n`;\n\nexports[`ping 1`] = `\n\"Hello \\\\\\\\ping{you} and \\\\\\\\ping{you_too}, and \\\\\\\\ping{also you}\n\n\"\n`;\n\nexports[`regression: code block without language 1`] = `\n\"\\\\\\\\begin{CodeBlock}{text}\na\n\\\\\\\\end{CodeBlock}\n\n\"\n`;\n\nexports[`table 1`] = `\n\"\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\n1 & 2 \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\n1 & 2 & 3 \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n1 & 2  & 3 \\\\\\\\\\\\\\\\\n1 & 2  & 3 \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\n\n\nAnother test for inline image with overridden configuration:\n\n\n\n\\\\\\\\begin{longtblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nc1 & c2 \\\\\\\\\\\\\\\\\nc3 & \\\\\\\\inlineImage{https://zestedesavoir.com/media/galleries/426/56dc4a1e-416b-4a9d-830d-95b45d58a17a.png} \\\\\\\\\\\\\\\\\n\\\\\\\\end{longtblr}\"\n`;\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/abbr.fixture.md",
    "content": "HELO to you\n\nCan I INJECT something in \\LaTeX ?\n\n*[HELO]: In SMTP, the client initiates the dialog with a HELO command identifying itself\n\n*[INJECT]: discard}\\LaTeX\\abbr{INJECTED}{discard"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/blockquote.fixture.md",
    "content": "> a quote\n\n> a\n> multiline\n> quote\n\n---\n\n> a quote\n\n---\n\n> a\n> multiline\n> quote\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/blocks.fixture.md",
    "content": "[[i]]\n| info\n\n[[a]]\n| warning\n\n[[s]]\n| secret\n\n[[s]]\n| imbricated spoilers\n| [[s]]\n| | and another\n| | [[s]]\n| | | and that's it\n\n[[s]]\n| imbricated spoilers\n| [[s]]\n| | second level\n| [[s]]\n| | second level too\n\n[[s]]\n| imbricated spoilers\n| [[s]]\n| | second level\n|\n| with text in between\n|\n| [[s]]\n| | second level too\n\n[[s]]\n| imbricated spoilers\n|\n| ```markdown\n| and here is some code\n| ```\n|\n| [[s]]\n| | second level\n\n[[s]]\n| do not over-flattenize\n| [[s]]\n| | expected to be flattened\n| \n| first level\n| \n| [[q]]\n| | this remains a question\n\n[[s]]\n| flattenize children of children\n| [[q]]\n| | this remains a question\n| | [[s]]\n| | | but the content in it is flattened to the question\n\n[[q]]\n| question `coded`\n\n[[e]]\n| **error**\n| foo bar··\n| baz\n\n[[e | a bad error]]\n| **error**\n| foo bar··\n| baz\n\n[[neutre | **title**]]\n| foo\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/code.fixture.md",
    "content": "```python\nprint('bla')\n```\n\n```\na code without lang\n```\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/emoticon.fixture.md",
    "content": "foo :p bar :)\n\n;)\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/figure-code.fixture.md",
    "content": "```python\nprint('bla')\n```\nCode: With Source\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/figure.fixture.md",
    "content": "> a\n> multiline\n> quote\nSource: With Source\n\n\nNom     |   Age\n------|-----\nFred |   39\nSam |   38\nAlice  |   35\nMathilde  | 35\n\n\nNom     |   Age\n------|-----\nFred |   39\nSam |   38\nAlice  |   35\nMathilde  | 35\nTable: Coucou\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/footnote.fixture.md",
    "content": "# International Radiotelephony Spelling Alphabet[^wiki]\n\nHere's the NATO phonetic alphabet[^wiki]: Alfa, Bravo, Charlie, Delta, Echo, Foxtrot, Golf, Hotel, India, Juliet, Kilo, Lima, Mike, November, Oscar, Papa, Quebec, Romeo, Sierra, Tango, Uniform, Victor[^name][^consecutive], Whiskey, X-ray, Yankee, and Zulu.\n\nAnd here's some more text.\n\n[^wiki]: Read more about it here.\n[^wiki]: And here.\n[^wiki2]: Here's another good article on the subject.\n[^name]: A great first name.\n[^consecutive]: I know.\n\nThe NATO phonetic alphabet[^wi\\-ki].\n\n[^wi\\-ki]: Read more about it somewhere else.\n\nThis example checks that ^[the generated] IDs do not overwrite the user's IDs[^1].\n\n[^1]: Old behavior would, for \"generated\", generate a footnote with an ID set to `1`, thus overwriting this footnote.\n\nThe NATO phonetic alphabet[^wiki3].\n\n  [^wiki3]: Read more about it somewhere else.\n\nThis is an example of an inline footnote.^[This is the _actual_ footnote.]\n\nThis one isn't even [defined][^foofoofoo].\n\n[^both][invalid], ^[this too][].\n\n1. [foo][bar]\n2. [^foo][bar]\n3. [foo][^bar]\n4. [^foo][^bar]\n\nA footnote[^2].\n\n[^2]: Including ^[another **footnote**]\n\nA footnote[^toString] and [^__proto__] and [^constructor].\n\n[^toString]: See `Object.prototype.toString()`.\n[^constructor]: See `Object.prototype.valueOf()`.\n[^__proto__]: See `Object.prototype.__proto__()`.\n\nfoo[^abc] bar. foo[^xyz] bar\n\n[^abc]: Baz baz\n\n[^xyz]: Baz\n\nLorem ipsum dolor sit amet[^3].\n\nNulla finibus[^4] neque et diam rhoncus convallis.\n\n[^3]: Consectetur **adipiscing** elit. Praesent dictum purus ullamcorper ligula semper pellentesque[^3].\n\n    -   Containing a list.\n\n[^4]: Nam dictum sapien nec sem ultrices fermentum. Nulla **facilisi**. In et feugiat massa.\n\n[^5]: Nunc dapibus ipsum ut mi _ultrices_, non euismod velit pretium.\n\nHere is some text containing a footnote[^somesamplefootnote]. You can then continue your thought...\n\n[^somesamplefootnote]: Here is the text of the footnote itself.\n\nEven go to a new [paragraph] and the footnotes will go to the bottom of the document[^documentdetails].\n\n[^documentdetails]: Depending on the **final** form of your document, of course. See the documentation and experiment.\n\n    This footnote has a second [paragraph].\n\n[paragraph]: http://example.com\n\n# my heading^[ref def]\n\nor\n\n# my heading[^ref]\n\n[^ref]: def\n\nFirst^[the generated] and then a manual numbered def[^def].\n\n\n[^def]: hello\n\n* one^[the first]\n* two[^2nd]\n* three[^3rd]\n* four^[the last]\n\n[^2nd]: second\n[^3rd]: third\n\nThis nested footnote would not work:\n\n[[^foo2]][baz]\n\n[bar]: https://bar.com \"bar\"\n[baz]: https://baz.com \"baz\"\n\n[^foo2]: A footnote.\n\n## New list continuation\n\n1. [^foo]\n\n[^foo]: bar baz.\n\n\n# mytitle A[^footnoteRef]\n\n[^footnoteRef]: reference in title\n\n# mytitle B^[footnoterawhead inner]\n\n# myti*tle C^[foo inner]*\n\na paragraph^[footnoteRawPar inner]\n\n![img.png](an image)\nFigure: with an ^[inline footnote] in caption"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/gridTable.fixture.md",
    "content": "+-------+----------+------+\n| Sub   | Headings | ABBR |\n+=======+==========+======+\n| cell  | ABBR   spanning |\n| spans +----------+------+\n| rows  | normal   | cell |\n+-------+----------+------+\n| multi | cells can be    |\n| line  | *formatted*     |\n|       | **paragraphs**  |\n| cells |                 |\n| too   |                 |\n+-------+-----------------+\nTable: The new table ABBR [^foot] with ||CTRL|| + ||S||\n\n*[ABBR]: abbreviation\n\n[^foot]: a foot\n\n+-----------+---------------------------------------------------------------+\n| title     |  image                                                        |\n+===========+===============================================================+\n| space     | ![space](https://i.ytimg.com/vi/lt0WQ8JzLz4/maxresdefault.jpg)|\n+-----------+---------------------------------------------------------------+\n\n+-----------+--------------------+\n| title     | code               |\n+===========+====================+\n| inline    | `inline` br        |\n|           | `inline`           |\n+-----------+--------------------+\n| block     | ```python          |\n|           | print('bla')       |\n|           | ```                |\n+-----------+--------------------+\n\n+---+---+---+\n| A | B | C |\n+===+===+===+\n| D | E     |\n|   +---+---+\n|   | F | G |\n+---+---+---+\n\n\n+---+---+---+---+\n| A | B | C | D |\n+===+===+===+===+\n| D | E     |   |\n|   +---+---+---+\n|   | F | G     |\n+---+---+---+---+\n| a | b | c   d |\n+---+---+       |\n| e | f |   g   |\n+---+---+---+---+\n\n\n+-------+----------+------+\n| Table Headings   | Here |\n+-------+----------+------+\n| Sub   | Headings | Too  |\n+=======+==========+======+\n| cell  | column[^foot]   |\n+ spans +----------+------+\n| rows  | normal   | cell |\n+-------+----------+------+\n| multi | cells can be    |\n| line  | *formatted*     |\n|       | **paragraphs**  |\n| cells |                 |\n| too   |                 |\n+-------+-----------------+\n\n+---+---+---+\n| A | B | C |\n+===+===+===+\n| D | E     |\n|   +---+---+\n|   | F | G |\n+---+---+---+\n\n+---+-------+\n| A | B     |\n|   +---+---+\n|   | C | D |\n|   +---+---+\n|   | E     |\n+---+-------+\n\n+---+---+---+---+\n| A | B | C | D |\n+---+---+---+---+\n| E     | F     |\n+-------+-------+\n| G             |\n+---------------+\n\n+---------------+\n| A             |\n+-------+-------+\n| B     | C     |\n+---+---+---+---+\n| D | E | F | G |\n+---+---+---+---+\n\n+---+---------------------------------------------------------------+---+\n| H |                                                               |He |\n+---+---+---------------------------------------+---+---+---+---+---+---+\n|Li |Be |                                       | B | C | N | O | F |Ne |\n+---+---+                                       +---+---+---+---+---+---+\n|Na |Mg |                                       |Al |Si | P | S |Cl |Ar |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n| K |Ca |Sc |Ti | V |Cr |Mn |Fe |Co |Ni |Cu |Zn |Ga |Ge |As |Se |Br |Kr |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Rb |Sr | Y |Zr |Nb |Mo |Tc |Ru |Rh |Pd |Ag |Cd |In |Sn |Sb |Te | I |Xe |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Cs |Ba |LAN|Hf |Ta | W |Re |Os |Ir |Pt |Au |Hg |Tl |Pb |Bi |Po |At |Rn |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Fr |Ra |ACT|                                                           |\n+---+---+---+-----------------------------------------------------------+\n|                                                                       |\n+-----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Lanthanide |La |Ce |Pr |Nd |Pm |Sm |Eu |Gd |Tb |Dy |Ho |Er |Tm |Yb |Lu |\n+-----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Actinide   |Ac |Th |Pa | U |Np |Pu |Am |Cm |Bk |Cf |Es |Fm |Md |No |Lw |\n+-----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n\n+---------+\n| A       |\n+---------+\nText at the end\n\n+---------+\n| A       |\n+---------+\nText at the\n\n+----+------+------+------+\n| a  |             |      |\n+----+             +------+\n| b  |             |  c   |\n+----+-------------+------+\nTable: multirow\n\n+------+--------+------+------+------+\n|span           |header| span        |\n+======+========+======+======+======+\n|elem  |span middle    |             |\n+------+--------+------+------+------+\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/heading.fixture.md",
    "content": "# first level title\n## second level title\n### third level title\n#### fourth level title\n##### fifth level title\n###### sixth level title\n\n# a \\ b\n# a } b\n# a } \\ b\n# a \\} b\n\n# ![searching for bugs](https://www.johnfdoherty.com/wp-content/uploads/2011/07/Titles1.jpg)\n# a title with ![image](https://www.johnfdoherty.com/wp-content/uploads/2011/07/Titles1.jpg) and text\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/inline-code.fixture.md",
    "content": "a paragraph `with inline code`.\n\n`a\nmultiline\ninlinecode`\n\n`a code with \\`\n\n`a \\text in \\LaTeX \\\\`\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/link-prepend.fixture.md",
    "content": "[an external link](https://wikipedia.com)\n\n\n[an internal link](/forums)\n\n\n[an `external` link](https://wikipedia.com)\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/link.fixture.md",
    "content": "[an external link](https://wikipedia.com)\n\n\n[an internal link](/forums)\n\n\n[an `external` link](https://wikipedia.com)\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/list.fixture.md",
    "content": "- an \n- **unordered**\n- list\n\n\n1. an\n1. `ordered`\n1. list\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/mix-1.fixture.md",
    "content": "(for convenience, · are replaced with simple single spaces in the tests)\n# first 1\n\nfoo··\nbar\n\nDisrupt ~~asymmetrical~~ unicorn, pok pok kale chips umami selfies gastropub food truck flannel. Blue **bottle craft** beer hexagon artisan. Chia gochujang crucifix, ^ready^ ^made^ hammock _blog succulents_ sriracha raw denim scenester cray typewriter fashion axe ~art~ *party*. Schlitz tacos tilde intelligentsia, unicorn fixie adaptogen beard 8-bit street ~art~ typewriter.\n\n## *second* 1\n\n**Literally selfies tbh lo-fi. Actually health goth ennui, brooklyn retro polaroid sriracha. Kogi live-edge mixtape marfa street ~art~ synth. Godard synth truffaut selfies, vape fanny ~~pack~~ subway tile. Stumptown af pabst, try-hard fam ethical actually four dollar toast. Microdosing kogi brooklyn, locavore jianbing etsy sartorial _YOLO_. Williamsburg salvia photo booth ^readymade^ listicle man braid.**\n\n---\n\n> Marfa pickled helvetica put a bird on it hot chicken williamsburg.\n> Edison bulb asymmetrical `keffiyeh` schlitz iceland put a bird on it hoodie affogato.\n>\n> Tofu tote bag distillery viral knausgaard, health goth asymmetrical.\nSource: Guru\n\nAsymmetrical pug scenester sustainable enamel pin distillery quinoa keffiyeh. Flannel humblebrag PBR&B polaroid banh mi wolf. Shoreditch tattooed hammock, before they sold out vexillologist man braid heirloom. Activated charcoal craft beer cloud bread meh biodiesel pabst.\n\n### ~~third~~ 1\n\nArt party keytar godard iceland neutra cronut. Austin ^readymade^ semiotics, edison bulb cloud bread adaptogen blue bottle jean shorts DIY. Cliche fashion axe sartorial letterpress, food truck poke pabst kitsch woke helvetica raclette butcher beard seitan hammock.\n\n`foo\nbar`\n\n> `fo\\o\n> bar`\n\nHexagon lo-fi seitan you probably haven't heard of them, bicycle rights small batch meditation try-hard green juice banh mi keffiyeh. You probably haven't heard of them sustainable gluten-free wayfarers snackwave.\n\n### third 2\n#### ~~fo~~u**r**t*h* _1_\n\nMumblecore kombucha offal, health goth next level before they sold out gluten-free chicharrones keffiyeh. Mumblecore kickstarter hoodie fixie keffiyeh. Microdosing lo-fi taiyaki irony pok pok. Banjo brooklyn umami succulents flexitarian. Swag sartorial scenester synth viral.\n\n##### fifth 1\n\nBanjo bespoke subway tile, street ~a*r*~^t^ drinking vinegar offal franzen. Pour-over green juice vaporware kale chips. Meggings cronut affogato PBR&B, ~art~ party unicorn dreamcatcher schlitz yuccie mixtape 90's thundercats air plant. Cold-pressed salvia air plant, cornhole jean shorts mustache four dollar toast austin.\n\n### third 3\n\nMeditation heirloom chicharrones, sartorial man braid hot chicken sustainable. Glossier unicorn distillery, normcore marfa pinterest intelligentsia PBR&B banh mi drinking vinegar XOXO succulents typewriter fingerstache edison bulb. Meditation ethical cronut glossier cliche kickstarter.\n\n#### fourth 2\n\nVenmo bushwick food truck chartreuse fam. Everyday carry gastropub glossier, cold-pressed salvia migas keytar. Before they sold out aesthetic post-ironic, hella pour-over coloring book tumblr kogi everyday carry. Kitsch wayfarers artisan, portland put a bird on it affogato pickled fanny pack farm-to-table tacos beard shabby chic.\n\n#### fourth 3\n\nChambray intelligentsia vape listicle. Pok pok snackwave cronut retro hot chicken, trust fund master cleanse keytar forage dreamcatcher. Taiyaki actually deep v, godard small batch irony lumbersexual unicorn cardigan af. Irony lumbersexual salvia, pitchfork fam snackwave man bun. Kitsch jianbing intelligentsia freegan, waistcoat raw denim cloud bread vice cray etsy listicle skateboard jean shorts.\n\n##### fifth 2\n\nAsymmetrical normcore portland, vaporware viral tote bag DIY slow-carb kogi fanny pack. Keffiyeh ennui church-key, irony VHS man bun edison bulb listicle cloud bread try-hard cred lumbersexual lo-fi glossier.\n\n# first 2\n## second 2\n##### fifth 3\n\nMessenger bag locavore swag raclette brunch whatever, portland food truck. PBR&B cred mlkshk, poke letterpress waistcoat celiac. La croix letterpress forage keffiyeh.\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/mix-2.fixture.md",
    "content": "(for convenience, · are replaced with simple single spaces in the tests)\n# first 1\n\n> Code inside quote\n> ```python\n> print('bla')\n> ```\n> Code: code source\nSource: Quotation Source\n\n```python\nprint('bla')\n```\nCode: First ||CTRL||+||S||\nCode: Second\n\n```python\nprint('code without caption')\n```"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/mix-3.fixture.md",
    "content": "\n# right-aligned list\n\n->\n- item\n- item\n->\n\n# centered list\n\n->\n- item\n- item\n- item\n<-\n\n\n# left list\n\n<-\n- item\n- item\n- item\n<-\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/mix-4.fixture.md",
    "content": "+-------+----------+------+\n| Sub   | Headings | ABBR |\n+=======+==========+======+\n| cell  | column spanning |\n| spans +----------+------+\n| rows  | normal   | cell |\n+-------+----------+------+\n| multi | cells can be    |\n| line  | *formatted*     |\n|       | **paragraphs**  |\n| cells |                 |\n| too   |                 |\n+-------+-----------------+\nTable: The new table ABBR [^foot] with ||CTRL|| + ||S||\n\n*[ABBR]: abbreviation\n\n[^foot]: a foot\n\n+-----------+---------------------------------------------------------------+\n| title     |  image                                                        |\n+===========+===============================================================+\n| space     | ![space](https://i.ytimg.com/vi/lt0WQ8JzLz4/maxresdefault.jpg)|\n+-----------+---------------------------------------------------------------+\n\n+-----------+--------------------+\n| title     | code               |\n+===========+====================+\n| inline    | `inline` br        |\n|           | `inline`           |\n+-----------+--------------------+\n| block     | ```python          |\n|           | print('bla')       |\n|           | ```                |\n+-----------+--------------------+\n\n+---+---+---+\n| A | B | C |\n+===+===+===+\n| D | E     |\n|   +---+---+\n|   | F | G |\n+---+---+---+\n\n\n+---+---+---+---+\n| A | B | C | D |\n+===+===+===+===+\n| D | E     |   |\n|   +---+---+---+\n|   | F | G     |\n+---+---+---+---+\n| a | b | c   d |\n+---+---+       |\n| e | f |   g   |\n+---+---+---+---+\n\n\n+-------+----------+------+\n| Table Headings   | Here |\n+-------+----------+------+\n| Sub   | Headings | Too  |\n+=======+==========+======+\n| cell  | column spanning |\n+ spans +----------+------+\n| rows  | normal   | cell |\n+-------+----------+------+\n| multi | cells can be    |\n| line  | *formatted*     |\n|       | **paragraphs**  |\n| cells |                 |\n| too   |                 |\n+-------+-----------------+\n\n+---+---+---+\n| A | B | C |\n+===+===+===+\n| D | E     |\n|   +---+---+\n|   | F | G |\n+---+---+---+\n\n+---+-------+\n| A | B     |\n|   +---+---+\n|   | C | D |\n|   +---+---+\n|   | E     |\n+---+-------+\n\n+---+---+---+---+\n| A | B | C | D |\n+---+---+---+---+\n| E     | F     |\n+-------+-------+\n| G             |\n+---------------+\n\n+---------------+\n| A             |\n+-------+-------+\n| B     | C     |\n+---+---+---+---+\n| D | E | F | G |\n+---+---+---+---+\n\n+---+---------------------------------------------------------------+---+\n| H |                                                               |He |\n+---+---+---------------------------------------+---+---+---+---+---+---+\n|Li |Be |                                       | B | C | N | O | F |Ne |\n+---+---+                                       +---+---+---+---+---+---+\n|Na |Mg |                                       |Al |Si | P | S |Cl |Ar |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n| K |Ca |Sc |Ti | V |Cr |Mn |Fe |Co |Ni |Cu |Zn |Ga |Ge |As |Se |Br |Kr |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Rb |Sr | Y |Zr |Nb |Mo |Tc |Ru |Rh |Pd |Ag |Cd |In |Sn |Sb |Te | I |Xe |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Cs |Ba |LAN|Hf |Ta | W |Re |Os |Ir |Pt |Au |Hg |Tl |Pb |Bi |Po |At |Rn |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Fr |Ra |ACT|                                                           |\n+---+---+---+-----------------------------------------------------------+\n|                                                                       |\n+-----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Lanthanide |La |Ce |Pr |Nd |Pm |Sm |Eu |Gd |Tb |Dy |Ho |Er |Tm |Yb |Lu |\n+-----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Actinide   |Ac |Th |Pa | U |Np |Pu |Am |Cm |Bk |Cf |Es |Fm |Md |No |Lw |\n+-----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n\n+---------+\n| A       |\n+---------+\nText at the end\n\n+---------+\n| A       |\n+---------+\nText at the\n\n+----+------+------+------+\n| a  |             |      |\n+----+             +------+\n| b  |             |  c   |\n+----+-------------+------+\nTable: multirow"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/mix-5.fixture.md",
    "content": "![](http://www.numerama.com/content/uploads/2016/07/espace.jpg)\nFigure: espace[^node]\n\n[^node]: Two things are infinite: the universe and human stupidity.\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/mix-6.fixture.md",
    "content": "!(https://www.youtube.com/watch?v=8TQIvdFl4aU)\nVideo: a caption\n\n!(https://www.youtube.com/watch?v=8TQIvdFl4aU)\n\nno caption"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/mix-7.fixture.md",
    "content": "+------+----------------------+\n| cell | `code                |\n|      | with line break`     |\n+------+----------------------+\n|  ```text                    |\n| line 1                      |\n| line2                       |\n|```                          |\n+------+----------------------+\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/mix-math-escape.fixture.md",
    "content": "$$\\Delta \\varphi = 2 \\pi f \\Delta t_{orange/bleu} = -\\frac{\\pi}{4}$$\n\n$$\n\\begin{array}{l r}\n  & 45 \\\\\n+ & 218 \\\\\n+ & 800 \\\\\n\\hline\n= & 1063\n\\end{array}\n$$\n\n$$\n\\left( \\frac{(4 + 5)\\times(2 + 3) + 6}{8 + 7} \\right) ^9\n$$\n\n$$42\\%$$\n\nThis should be escaped: $\\pink{\t\\ext{I love \\LaTeX} \\immediate\\write18{ls / > outputrce} \\input{outputrce}}$"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/paragraph.fixture.md",
    "content": "# first 1\n\nDisrupt asymmetrical unicorn, pok pok kale chips umami selfies gastropub food truck flannel. Blue bottle craft beer hexagon artisan. Chia gochujang crucifix, readymade hammock blog succulents sriracha raw denim scenester cray typewriter fashion axe art party. Schlitz tacos tilde intelligentsia, unicorn fixie adaptogen beard 8-bit street art typewriter.\n\n## second 1\n\nLiterally selfies tbh lo-fi. Actually health goth ennui, brooklyn retro polaroid sriracha. Kogi live-edge mixtape marfa street art synth. Godard synth truffaut selfies, vape fanny pack subway tile. Stumptown af pabst, try-hard fam ethical actually four dollar toast. Microdosing kogi brooklyn, locavore jianbing etsy sartorial YOLO. Williamsburg salvia photo booth readymade listicle man braid.\n\nMarfa pickled helvetica put a bird on it hot chicken williamsburg. Edison bulb asymmetrical keffiyeh schlitz iceland put a bird on it hoodie affogato. Tofu tote bag distillery viral knausgaard, health goth asymmetrical.\n\nAsymmetrical pug scenester sustainable enamel pin distillery quinoa keffiyeh. Flannel humblebrag PBR&B polaroid banh mi wolf. Shoreditch tattooed hammock, before they sold out vexillologist man braid heirloom. Activated charcoal craft beer cloud bread meh biodiesel pabst.\n\n### third 1\n\nArt party keytar godard iceland neutra cronut. Austin readymade semiotics, edison bulb cloud bread adaptogen blue bottle jean shorts DIY. Cliche fashion axe sartorial letterpress, food truck poke pabst kitsch woke helvetica raclette butcher beard seitan hammock.\n\nHexagon lo-fi seitan you probably haven't heard of them, bicycle rights small batch meditation try-hard green juice banh mi keffiyeh. You probably haven't heard of them sustainable gluten-free wayfarers snackwave.\n\n### third 2\n#### fourth 1\n\nMumblecore kombucha offal, health goth next level before they sold out gluten-free chicharrones keffiyeh. Mumblecore kickstarter hoodie fixie keffiyeh. Microdosing lo-fi taiyaki irony pok pok. Banjo brooklyn umami succulents flexitarian. Swag sartorial scenester synth viral.\n\n##### fifth 1\n\nBanjo bespoke subway tile, street art drinking vinegar offal franzen. Pour-over green juice vaporware kale chips. Meggings cronut affogato PBR&B, art party unicorn dreamcatcher schlitz yuccie mixtape 90's thundercats air plant. Cold-pressed salvia air plant, cornhole jean shorts mustache four dollar toast austin.\n\n### third 3\n\nMeditation heirloom chicharrones, sartorial man braid hot chicken sustainable. Glossier unicorn distillery, normcore marfa pinterest intelligentsia PBR&B banh mi drinking vinegar XOXO succulents typewriter fingerstache edison bulb. Meditation ethical cronut glossier cliche kickstarter.\n\n#### fourth 2\n\nVenmo bushwick food truck chartreuse fam. Everyday carry gastropub glossier, cold-pressed salvia migas keytar. Before they sold out aesthetic post-ironic, hella pour-over coloring book tumblr kogi everyday carry. Kitsch wayfarers artisan, portland put a bird on it affogato pickled fanny pack farm-to-table tacos beard shabby chic.\n\n#### fourth 3\n\nChambray intelligentsia vape listicle. Pok pok snackwave cronut retro hot chicken, trust fund master cleanse keytar forage dreamcatcher. Taiyaki actually deep v, godard small batch irony lumbersexual unicorn cardigan af. Irony lumbersexual salvia, pitchfork fam snackwave man bun. Kitsch jianbing intelligentsia freegan, waistcoat raw denim cloud bread vice cray etsy listicle skateboard jean shorts.\n\n##### fifth 2\n\nAsymmetrical normcore portland, vaporware viral tote bag DIY slow-carb kogi fanny pack. Keffiyeh ennui church-key, irony VHS man bun edison bulb listicle cloud bread try-hard cred lumbersexual lo-fi glossier.\n\n# first 2\n## second 2\n##### fifth 3\n\nMessenger bag locavore swag raclette brunch whatever, portland food truck. PBR&B cred mlkshk, poke letterpress waistcoat celiac. La croix letterpress forage keffiyeh.\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/fixtures/table.fixture.md",
    "content": "1 | 2\n--|--\n1|2\n1|2\n1|2\n\n\n1 | 2 | 3\n--|---|--\n1 | 2\n1 | 2 | 3\n1 | 2 | 3\n\n\nAnother test for inline image with overridden configuration:\n\nc1 | c2\n---|--\nc3 | ![image](https://zestedesavoir.com/media/galleries/426/56dc4a1e-416b-4a9d-830d-95b45d58a17a.png)\n"
  },
  {
    "path": "packages/rebber-plugins/__tests__/rebber.test.js",
    "content": "import {readdirSync as directory, readFileSync as file, lstatSync as stat} from 'fs'\nimport {join} from 'path'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport footnotes from 'remark-footnotes'\nimport remarkMath from 'remark-math'\nimport remarkPing from 'remark-ping'\nimport rebber from 'rebber'\nimport dedent from 'dedent'\n\nconst base = join(__dirname, 'fixtures')\nconst fixtures = directory(base).reduce((tests, contents) => {\n  const parts = contents.split('.')\n  if (!tests[parts[0]]) {\n    tests[parts[0]] = {}\n  }\n  if (stat(join(base, contents)).isFile()) {\n    tests[parts[0]] = file(join(base, contents), 'utf-8')\n  }\n  return tests\n}, {})\n\nconst emoticonsConfig = {\n  emoticons: {\n    ':)': '/path/to/smile.png',\n    ';)': '/path/to/wink.png',\n  },\n}\n\nconst mathEscape = require('../src/preprocessors/mathEscape')\nconst footnoteProtect = require('../src/preprocessors/footnoteProtect')\n\nconst integrationConfig = {\n  preprocessors: {\n    tableCell: require('../src/preprocessors/codeVisitor'),\n    iframe: require('../src/preprocessors/iframe'),\n    spoilerFlatten: require('../src/preprocessors/spoilerFlatten')([\n      'sCustomBlock',\n      'secretCustomBlock',\n    ]),\n    heading: footnoteProtect,\n    figcaption: footnoteProtect,\n    inlineMath: mathEscape,\n    math: mathEscape,\n  },\n  overrides: {\n    abbr: require('../src/type/abbr'),\n    centerAligned: require('../src/type/align'),\n    emoticon: require('../src/type/emoticon'),\n    errorCustomBlock: require('../src/type/customBlocks'),\n    figure: require('../src/type/figure'),\n    footnote: require('../src/type/footnote'),\n    footnoteDefinition: require('../src/type/footnoteDefinition'),\n    footnoteReference: require('../src/type/footnoteReference'),\n    gridTable: require('../src/type/gridTable'),\n    informationCustomBlock: require('../src/type/customBlocks'),\n    inlineMath: require('../src/type/math'),\n    kbd: require('../src/type/kbd'),\n    leftAligned: require('../src/type/align'),\n    math: require('../src/type/math'),\n    neutreCustomBlock: require('../src/type/customBlocks'),\n    ping: require('../src/type/ping'),\n    questionCustomBlock: require('../src/type/customBlocks'),\n    rightAligned: require('../src/type/align'),\n    secretCustomBlock: require('../src/type/customBlocks'),\n    sub: require('../src/type/sub'),\n    sup: require('../src/type/sup'),\n    tableHeader: require('../src/type/tableHeader'),\n    warningCustomBlock: require('../src/type/customBlocks'),\n  },\n  emoticons: emoticonsConfig,\n  codeAppendiceTitle: 'Annexes',\n  customBlocks: {\n    map: {\n      secret: 'FooBar',\n    },\n  },\n  image: {\n    inlineImage: (node) => `\\\\inlineImage{${node.url}}`,\n    image: (node) => `\\\\image{${node.url}}`,\n  },\n  figure: {\n    image: (_1, _2, caption, extra) => `\\\\image{${extra.url}}${caption ? `[${caption}]` : ''}\\n`,\n  },\n}\n\nintegrationConfig.overrides.eCustomBlock = (ctx, node) => {\n  node.type = 'errorCustomBlock'\n  return integrationConfig.overrides.warningCustomBlock(ctx, node)\n}\nintegrationConfig.overrides.iCustomBlock = (ctx, node) => {\n  node.type = 'informationCustomBlock'\n  return integrationConfig.overrides.informationCustomBlock(ctx, node)\n}\nintegrationConfig.overrides.qCustomBlock = (ctx, node) => {\n  node.type = 'questionCustomBlock'\n  return integrationConfig.overrides.questionCustomBlock(ctx, node)\n}\nintegrationConfig.overrides.sCustomBlock = (ctx, node) => {\n  node.type = 'secretCustomBlock'\n  return integrationConfig.overrides.secretCustomBlock(ctx, node)\n}\nintegrationConfig.overrides.aCustomBlock = (ctx, node) => {\n  node.type = 'warningCustomBlock'\n  return integrationConfig.overrides.warningCustomBlock(ctx, node)\n}\n\ntest('abbr', () => {\n  const fixture = fixtures['abbr']\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber)\n    .processSync(fixture)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('heading', () => {\n  const fixture = fixtures['heading']\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber)\n    .processSync(fixture)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('html nodes', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber)\n    .processSync(dedent`\n      # foo\n      **something <a> else**\n    `)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('heading with custom config', () => {\n  const fixture = fixtures['heading']\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber, {\n      headings: [\n        (val) => `\\\\LevelOneTitle{${val}}\\n`,\n        (val) => `\\\\LevelTwoTitle{${val}}\\n`,\n        (val) => `\\\\LevelThreeTitle{${val}}\\n`,\n        (val) => `\\\\LevelFourTitle{${val}}\\n`,\n        (val) => `\\\\LevelFiveTitle{${val}}\\n`,\n        (val) => `\\\\LevelSixTitle{${val}}\\n`,\n        (val) => `\\\\LevelSevenTitle{${val}}\\n`,\n      ],\n      image: {\n        inlineImage: (node) => `\\\\inlineImage{${node.url}}`,\n        image: (node) => `\\\\image{${node.url}}`,\n      },\n    })\n    .processSync(fixture)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('paragraph', () => {\n  const fixture = fixtures['paragraph']\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber)\n    .processSync(fixture)\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\ntest('inline-code', () => {\n  const fixture = fixtures['inline-code']\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber)\n    .processSync(fixture)\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\ntest('emoticon', () => {\n  const fixture = fixtures['emoticon']\n  const {contents} = unified()\n    .use(reParse)\n    .use(require('remark-emoticons/src'), emoticonsConfig)\n    .use(rebber, {\n      overrides: {\n        emoticon: require('../src/type/emoticon'),\n      },\n      emoticons: emoticonsConfig,\n    })\n    .processSync(fixture)\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\ntest('table', () => {\n  const fixture = fixtures['table']\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber, {\n      image: {\n        inlineImage: (node) => `\\\\inlineImage{${node.url}}`,\n        image: (node) => `\\\\image{${node.url}}`,\n      },\n    })\n    .processSync(fixture)\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\ntest('gridTable', () => {\n  const fixture = fixtures['gridTable']\n  const {contents} = unified()\n    .use(reParse)\n    .use(require('remark-captions/src'), {external: {gridTable: 'Table:', math: 'Equation'}})\n    .use(require('remark-grid-tables/src'))\n    .use(rebber, integrationConfig)\n    .processSync(fixture)\n\n  expect(contents.trim()).toMatchSnapshot()\n  expect(contents.trim()).not.toContain('\\\\number-of-column')\n})\n\ntest('blockquote', () => {\n  const fixture = fixtures['blockquote']\n  let compiled = unified()\n    .use(reParse)\n    .use(rebber)\n    .processSync(fixture)\n\n  expect(compiled.contents.trim()).toMatchSnapshot()\n\n  compiled = unified()\n    .use(reParse)\n    .use(rebber, {\n      blockquote: undefined,\n    })\n    .processSync(fixture)\n\n  expect(compiled.contents.trim()).toMatchSnapshot()\n})\n\ntest('blockquote with custom config', () => {\n  const fixture = fixtures['blockquote']\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber, {\n      blockquote: (val) => `\\\\begin{Foo}\\n${val}\\n\\\\end{Foo}\\n\\n`,\n    })\n    .processSync(fixture)\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\ntest('figure+caption', () => {\n  const fixture = fixtures['figure']\n  const {contents} = unified()\n    .use(reParse)\n    .use(require('remark-captions/src'))\n    .use(rebber, {\n      overrides: {\n        figure: require('../src/type/figure'),\n      },\n    })\n    .processSync(fixture)\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\ntest('code', () => {\n  const fixture = fixtures['code']\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber)\n    .processSync(fixture)\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\ntest('code+caption', () => {\n  const fixture = fixtures['figure-code']\n\n  const {contents} = unified()\n    .use(reParse)\n    .use(require('remark-captions/src'))\n    .use(rebber, {\n      overrides: {\n        figure: require('../src/type/figure'),\n      },\n    })\n    .processSync(fixture)\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\ntest('list', () => {\n  const fixture = fixtures['list']\n\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber)\n    .processSync(fixture)\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\ntest('link', () => {\n  const fixture = fixtures['link']\n\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber)\n    .processSync(fixture)\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\ntest('link with special characters', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber)\n    .processSync(dedent`\n      [foo](http://example.com?a=b%c^{}#foo)\n    `)\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\ntest('link-prepend', () => {\n  const fixture = fixtures['link-prepend']\n\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber, {\n      link: {\n        prefix: 'http://zestedesavoir.com',\n      },\n    })\n    .processSync(fixture)\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\nObject.keys(fixtures).filter(Boolean).filter(name => name.startsWith('mix-')).forEach(name => {\n  const fixture = fixtures[name]\n\n  test(name, () => {\n    const {contents} = unified()\n      .use(reParse)\n      .use(footnotes, {inlineNotes: true})\n      .use(require('remark-emoticons/src'), emoticonsConfig)\n      .use(require('remark-captions/src'), {\n        external: {gridTable: 'Table:', math: 'Equation'},\n        internal: {iframe: 'Video:'},\n      })\n      .use(require('remark-grid-tables/src'))\n      .use(require('remark-sub-super/src'))\n      .use(require('remark-iframes/src'), {\n        'www.youtube.com': {\n          tag: 'iframe',\n          width: 560,\n          height: 315,\n          disabled: false,\n          replace: [\n            ['watch?v=', 'embed/'],\n            ['http://', 'https://'],\n          ],\n          thumbnail: {\n            format: 'http://img.youtube.com/vi/{id}/0.jpg',\n            id: '.+/(.+)$',\n          },\n          removeAfter: '&',\n        },\n      })\n      .use(require('remark-kbd/src'))\n      .use(require('remark-abbr/src'))\n      .use(require('remark-align/src'), {\n        right: 'custom-right',\n        center: 'custom-center',\n      })\n      .use(remarkMath)\n      .use(rebber, integrationConfig)\n      .processSync(fixture.replace(/·/g, ' '))\n\n    expect(contents.trim()).toMatchSnapshot()\n  })\n})\n\ntest('footnotes', () => {\n  const fixture = fixtures['footnote']\n\n  const {contents} = unified()\n    .use(reParse)\n    .use(footnotes, {inlineNotes: true})\n    .use(rebber, integrationConfig)\n    .processSync(fixture)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('abbr', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(require('remark-abbr/src'))\n    .use(rebber, {\n      overrides: {\n        abbr: require('../src/type/abbr'),\n      },\n    })\n    .processSync(dedent`\n      FOO\n\n      *[FOO]: bar\n    `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('abbr with custom config', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(require('remark-abbr/src'))\n    .use(rebber, {\n      overrides: {\n        abbr: require('../src/type/abbr'),\n      },\n      abbr: (x) => `->${x}<-`,\n    })\n    .processSync(dedent`\n      FOO\n\n      *[FOO]: bar\n    `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('math', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(remarkMath)\n    .use(rebber, integrationConfig)\n    .processSync(dedent`\n      A sentence ($S$) with *italic* and inline math ($C_L$) and $$b$$ another.\n\n      $$\n      L = \\frac{1}{2} \\rho v^2 S C_L\n      $$\n\n      hehe\n\n      We also want escaping like so: $\\alphb$ or like so:\n\n      $$\\ve\\frac{1}{2}$$\n    `)\n  expect(contents).toMatchSnapshot()\n})\ntest('math-extra-command', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(remarkMath)\n    .use(rebber, integrationConfig)\n    .processSync(dedent`\n      $$\n      xnabla^2 E(\\vec x) + [n(\\vec{x})\\,k]^2\\,E(\\vec x) = -s(\\vec x),\n      $$\n    `.replace('xn', '\\\\n'))\n  expect(contents).toMatchSnapshot()\n})\n\ntest('math-left-right', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(remarkMath)\n    .use(rebber, integrationConfig)\n    .processSync(dedent`\n      $$\n      \\boxed{xnabla^2 E(\\vec x) + \\left\\{[n(\\vec{x})\\,k]^2-i\\,k\\,\\sigma(\\vec x)\\right\\}\\,E(\\vec x)}\n      $$\n    `.replace('xn', '\\\\n'))\n  expect(contents).toMatchSnapshot()\n})\n\ntest('ping', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(remarkPing, {\n      pingUsername: username => true,\n      userURL: username => `/membres/voir/${username}/`,\n    })\n    .use(rebber, integrationConfig)\n    .processSync(dedent`\n      Hello @you and @you_too, and @**also you**\n    `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('custom-blocks', () => {\n  const fixture = fixtures['blocks']\n\n  const {contents} = unified()\n    .use(reParse)\n    .use(require('remark-custom-blocks'), {\n      secret: {\n        classes: 'spoiler',\n      },\n      s: {\n        classes: 'spoiler',\n      },\n      information: {\n        classes: 'information ico-after',\n      },\n      i: {\n        classes: 'information ico-after',\n      },\n      question: {\n        classes: 'question ico-after',\n      },\n      q: {\n        classes: 'question ico-after',\n      },\n      attention: {\n        classes: 'warning ico-after',\n      },\n      a: {\n        classes: 'warning ico-after',\n      },\n      erreur: {\n        classes: 'error ico-after',\n      },\n      e: {\n        classes: 'error ico-after',\n        title: 'optional',\n      },\n      neutre: {\n        classes: 'custom-block-neutre',\n        title: 'required',\n      },\n    }, true)\n    .use(rebber, integrationConfig)\n    .processSync(fixture.replace(/·/g, ' '))\n\n  expect(contents.trim()).toMatchSnapshot()\n})\n\ntest('regression: code block without language', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber, integrationConfig)\n    .processSync(dedent`\n      \\`\\`\\`\n      a\n      \\`\\`\\`\n    `)\n\n  expect(contents).toMatchSnapshot()\n})\n\n// TODO: fix this?\ntest.skip('comments blocks', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(rebber, integrationConfig)\n    .processSync(dedent`\n      Foo<--COMMENTS I am a comment COMMENTS-->bar\n    `)\n\n  expect(contents).toMatch('begin{comment}')\n})\n"
  },
  {
    "path": "packages/rebber-plugins/dist/preprocessors/codeVisitor.js",
    "content": "\"use strict\";\n\nconst visit = require('unist-util-visit');\nconst appendix = require('../type/appendix');\nconst defaultReferenceGenerator = appendixIndex => `Code appendice ${appendixIndex}`;\nmodule.exports = (ctx, tree) => {\n  ctx.overrides.appendix = appendix;\n  return node => {\n    let appendix = tree.children[tree.children.length - 1];\n    if (!appendix || appendix.type !== 'appendix') {\n      appendix = {\n        type: 'appendix',\n        children: []\n      };\n      tree.children.push(appendix);\n    }\n    let appendixIndex = appendix.children.length + 1;\n    visit(node, 'code', (innerNode, index, _parent) => {\n      appendix.children.push({\n        type: 'paragraph',\n        children: [{\n          type: 'heading',\n          children: [{\n            type: 'definition',\n            identifier: `appendix-${appendixIndex}`,\n            url: `${ctx.codeAppendiceTitle || 'Appendix'} ${appendixIndex}`,\n            referenceType: 'full'\n          }],\n          depth: 1\n        }]\n      });\n      appendix.children.push(innerNode);\n      const generator = ctx.appendiceReferenceGenerator || defaultReferenceGenerator;\n      const referenceNode = {\n        type: 'linkReference',\n        identifier: `appendix-${appendixIndex}`,\n        children: [{\n          type: 'text',\n          value: generator(appendixIndex)\n        }]\n      };\n      _parent.children.splice(index, 1, referenceNode);\n      appendixIndex++;\n    });\n  };\n};"
  },
  {
    "path": "packages/rebber-plugins/dist/preprocessors/footnoteProtect.js",
    "content": "\"use strict\";\n\nmodule.exports = plugin;\n\n/*\nLaTeX requires special handlings of footnotes placed in headings such as \\section{}\nWe therefore mark each footnote placed in heading for later handling.\n*/\n\nconst nodeTypes = ['footnote', 'footnoteDefinition', 'footnoteReference'];\nfunction plugin() {\n  return function footnoteProtect(node, index, parent) {\n    if (nodeTypes.includes(node.type) && node.commandProtect !== true) {\n      node.commandProtect = true;\n    }\n    if (node.children) {\n      node.children.forEach((n, i) => footnoteProtect(n, i, node));\n    }\n  };\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/preprocessors/iframe.js",
    "content": "\"use strict\";\n\nmodule.exports = () => (node, index, parent) => {\n  const linkNode = {\n    type: 'link',\n    url: node.data.hProperties.src,\n    children: [{\n      type: 'text',\n      value: node.data.hProperties.src\n    }]\n  };\n  const thumbnailNode = {\n    type: 'image',\n    url: node.data.thumbnail\n  };\n  if (parent.type !== 'figure') {\n    const figureNode = {\n      type: 'figure',\n      children: [thumbnailNode, {\n        type: 'figcaption',\n        children: [linkNode]\n      }]\n    };\n    parent.children[index] = figureNode;\n  } else {\n    parent.children[index] = thumbnailNode;\n    parent.children[parent.children.length - 1].children.push(linkNode);\n  }\n};"
  },
  {
    "path": "packages/rebber-plugins/dist/preprocessors/mathEscape.js",
    "content": "\"use strict\";\n\nconst katexConstants = require('../../src/preprocessors/katexConstants.json');\nconst endOfCommandChars = ['\\\\', '[', ']', '{', '}', ' ', '(', ')', '\\t', '\\n', '^', '_', ','];\nfunction isEndOfCommand(nodeLine, index) {\n  if (index >= nodeLine.length) {\n    return true;\n  }\n  return endOfCommandChars.includes(nodeLine.charAt(index));\n}\nmodule.exports = () => node => {\n  let commandStart = node.value.indexOf('\\\\');\n  while (commandStart !== -1) {\n    // Eat leading backslashes (at most two)\n    let leadSlashes = 1;\n    let isSlash = node.value.charAt(commandStart + leadSlashes) === '\\\\';\n    while (isSlash && leadSlashes < 2) {\n      isSlash = node.value.charAt(commandStart + leadSlashes) === '\\\\';\n      leadSlashes++;\n    }\n    let currentCommand = '';\n    // Find end of command\n    let potentialEnd = leadSlashes + commandStart;\n    while (!isEndOfCommand(node.value, potentialEnd)) {\n      currentCommand += node.value.charAt(potentialEnd);\n      potentialEnd++;\n    }\n    // if we just had a \\{ or \\, for example\n    if (currentCommand === '' && potentialEnd < node.value.length && katexConstants.includes(`\\\\${node.value.charAt(potentialEnd)}`)) {\n      currentCommand = node.value.charAt(potentialEnd);\n    }\n\n    // Check for unknown commands\n    const slashedCommand = '\\\\'.repeat(leadSlashes).concat(currentCommand);\n    const commandLength = slashedCommand.length;\n    if (!katexConstants.includes(slashedCommand)) {\n      const beforeCommand = node.value.substring(0, commandStart);\n      const afterCommand = node.value.substring(commandStart + commandLength, node.value.length);\n      node.value = `${beforeCommand} ${afterCommand}`;\n      // As we changed the command we need to restart from the beginning\n      potentialEnd = 1;\n    }\n    commandStart = node.value.indexOf('\\\\', potentialEnd);\n  }\n\n  // Check count of brackets\n  const openingBracesCount = (node.value.match(/(?<!\\\\){/g) || []).length;\n  const closingBracesCount = (node.value.match(/(?<!\\\\)}/g) || []).length;\n  const bracesDelta = closingBracesCount - openingBracesCount;\n  if (bracesDelta < 0) {\n    node.value += '}'.repeat(-bracesDelta);\n  } else if (bracesDelta > 0) {\n    node.value = '{'.repeat(bracesDelta) + node.value;\n  }\n};"
  },
  {
    "path": "packages/rebber-plugins/dist/preprocessors/prepareQuizz.js",
    "content": "\"use strict\";\n\nconst clone = require('clone');\nconst visit = require('unist-util-visit');\nmodule.exports = processQuizzFactory;\nfunction processQuizzFactory(ctx) {\n  const correctionTitle = ctx.correctionTitle || 'Correction';\n  return (node, index, parent) => {\n    if (node.children.length < 2 || !node.children[0].children || !node.children[1].children) {\n      return;\n    }\n    node.type = 'neutralCustomBlock';\n    const correction = clone(node);\n    correction.type = 'sCustomBlock';\n    correction.children[0].children[0].value = correctionTitle;\n    parent.children.splice(index + 1, 0, correction);\n    const bodyChildren = node.children[1].children;\n    while (bodyChildren.length > 0 && bodyChildren[bodyChildren.length - 1].type !== 'list') {\n      bodyChildren.splice(bodyChildren.length - 1, 1);\n    }\n    visit(node, 'listItem', itemNode => {\n      itemNode.checked = null;\n    });\n  };\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/preprocessors/spoilerFlatten.js",
    "content": "\"use strict\";\n\nconst visit = require('unist-util-visit');\nmodule.exports = elemNames => (_, tree) => {\n  // This should contain something like ['sCustomBlockBody', 'secretCustomBlockBody']\n  const elemNamesBody = elemNames.map(v => v.concat('Body'));\n\n  // Iterate over the elements to be flattened\n  for (const elemNameBody of elemNamesBody) {\n    visit(tree, elemNameBody, node => {\n      // Recursive function that flattens all matching elements and keeps the others\n      function flattenTree(blockTree) {\n        return blockTree.map(v => {\n          if (elemNames.includes(v.type)) {\n            // Get sCustomBlock > sCustomBlockBody > *\n            const newTree = v.children.filter(v => elemNamesBody.includes(v.type))\n            // This is sub-optimal, but flatMap doesn't have good support by now\n            .reduce((acc, e) => acc.concat(e.children), []);\n\n            // First level of recursion: on direct descendents\n            return flattenTree(newTree);\n          } else {\n            // Second level of recursion: on indirect descendents\n            if (v.children) {\n              v.children = flattenTree(v.children);\n            }\n            return v;\n          }\n        }).reduce((acc, e) => acc.concat(e), []);\n      }\n\n      // First round on direct children\n      node.children = flattenTree(node.children);\n    });\n  }\n};"
  },
  {
    "path": "packages/rebber-plugins/dist/type/abbr.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\nconst escape = require('rebber/dist/escaper');\n\n/* Expose. */\nmodule.exports = abbrPlugin;\nfunction abbrPlugin(ctx, node) {\n  const abbr = all(ctx, node);\n  const reference = escape(node.reference);\n  if (ctx.abbr && typeof ctx.abbr === 'function') {\n    return ctx.abbr(abbr, reference);\n  }\n  return `\\\\abbr{${abbr}}{${reference}}`;\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/align.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\n\n/* Expose. */\nmodule.exports = align;\nconst defaultMacros = {\n  leftAligned: innerText => `\\n\\n${innerText}\\n\\n`,\n  centerAligned: innerText => `\\n{\\\\centering ${innerText}}\\n`,\n  rightAligned: innerText => `\\n{\\\\raggedleft\\n${innerText}}\\n`,\n  defaultType: (innerText, type) => `\\n\\\\begin{${type}}\\n${innerText}\\n\\\\end{${type}}\\n`\n};\nfunction align(ctx, node) {\n  const macro = ctx[node.type] || defaultMacros[node.type] || defaultMacros.defaultType;\n  const innerText = all(ctx, node);\n  return macro(innerText, node.type);\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/appendix.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\nconst clone = require('clone');\n\n/* Expose. */\nmodule.exports = appendixPlugin;\nfunction definitionMacro(ctx, identifier, url) {\n  return `\\\\label{${identifier}}${url}`;\n}\nfunction appendixPlugin(ctx, node) {\n  if (node.children.length === 0) {\n    return '';\n  }\n  const overriddenCtx = clone(ctx);\n  overriddenCtx.definition = definitionMacro;\n  const innerText = all(overriddenCtx, node);\n  return `\\\\begin{appendices}\\n${innerText.trimEnd()}\\n\\\\end{appendices}`;\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/comments.js",
    "content": "\"use strict\";\n\n/* Expose. */\nmodule.exports = comments;\n\n/* Stringify a comments `node`. */\nfunction comments(ctx, node) {\n  return `\\\\begin{comment}\\n${node.data.comment}\\n\\\\end{comment}\\n`;\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/conclusion.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\n\n/* Expose. */\nmodule.exports = conclusion;\nconst conclusionMacros = [content => `\\\\begin{LevelOneConclusion}\\n${content}\\n\\\\end{LevelOneConclusion}`, content => `\\\\begin{LevelTwoConclusion}\\n${content}\\n\\\\end{LevelTwoConclusion}`, content => `\\\\begin{LevelThreeConclusion}\\n${content}\\n\\\\end{LevelThreeConclusion}`];\n\n/* Stringify an conclusion `node`. */\nfunction conclusion(ctx, node) {\n  const level = node.data.level || 0;\n  const macro = ctx[node.type] || conclusionMacros[level];\n  const innerText = all(ctx, node);\n  return `${macro(innerText.trim())}\\n\\n`;\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/customBlocks.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\n\n/* Expose. */\nmodule.exports = customBlock;\nconst defaultMacros = {\n  defaultBlock: (environmentName, blockTitle, blockContent) => {\n    return `\\\\begin{${environmentName}}${blockTitle ? `[{{${blockTitle}}}]` : ''}` + `\\n${blockContent}` + `\\n\\\\end{${environmentName}}\\n`;\n  }\n};\nfunction customBlock(ctx, node) {\n  const blockMacro = ctx[node.type] || defaultMacros[node.type] || defaultMacros.defaultBlock;\n  let blockTitle = '';\n  if (node.children && node.children.length) {\n    if (node.children[0].type.endsWith('CustomBlockHeading')) {\n      const titleNode = node.children.splice(0, 1)[0];\n      blockTitle = all(ctx, titleNode).trim();\n    }\n  }\n  node.children[0].type = 'paragraph';\n  const blockContent = all(ctx, node).trim();\n  const options = ctx.customBlocks || {};\n  let environmentName;\n  const type = node.type.replace('CustomBlock', '');\n  if (options.map && options.map[type]) {\n    environmentName = options.map[type];\n  } else {\n    environmentName = type[0].toUpperCase() + type.substring(1);\n  }\n  return blockMacro(environmentName, blockTitle, blockContent);\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/emoticon.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst has = require('has');\n\n/* Expose. */\nmodule.exports = emoticon;\n\n/* Stringify an emoticon `node`. */\nfunction emoticon(ctx, node) {\n  const code = node.value;\n  if (!ctx.emoticons.emoticons || !has(ctx.emoticons.emoticons, code)) return;\n  return `\\\\smiley{${ctx.emoticons.emoticons[code]}}`;\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/figure.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\nconst one = require('rebber/dist/one');\nconst defaultCodeStringifier = require('rebber/dist/types/code').macro;\nconst has = require('has');\n\n/* Expose. */\nmodule.exports = figure;\nconst defaultMacros = {\n  blockquote: (_, innerText, caption = 'Anonymous') => `\\\\begin{Quotation}[${caption}]\\n${innerText}\\n\\\\end{Quotation}\\n\\n`,\n  code: (ctx, code, caption, extra) => {\n    const codeStringifier = has(ctx, 'code') && ctx.code || defaultCodeStringifier;\n\n    // Remove the two last line feed\n    const rebberCode = codeStringifier(code, extra.language, extra.others).slice(0, -2);\n    return `${rebberCode}\\n\\\\captionof{listing}{${caption}}\\n\\n`;\n  },\n  image: (_1, _2, caption, extra) => '\\\\begin{center}\\n' + `\\\\includegraphics${extra.width ? `[${extra.width}]` : ''}{${extra.url}}\\n` + `\\\\captionof{figure}{${caption}}\\n` + '\\\\end{center}\\n'\n};\nconst makeExtra = {\n  blockquote: node => {},\n  code: node => {\n    return {\n      language: node.lang || 'text',\n      others: node.meta\n    };\n  },\n  image: node => ({\n    url: node.url,\n    width: '\\\\linewidth'\n  })\n};\n\n/* Stringify a Figure `node`. */\nfunction figure(ctx, node, index, parent) {\n  const type = node.children[0].type;\n  const macro = has(ctx, 'figure') && has(ctx.figure, type) && ctx.figure[type] || has(defaultMacros, type) && defaultMacros[type];\n  let caption = '';\n  if (node.children.length) {\n    caption = node.children.filter(captionNode => captionNode.type === 'figcaption').map(captionNode => all(ctx, captionNode)).join('');\n  }\n  node.caption = caption; // allows to add caption to the default processing\n  if (!macro) {\n    node.children[0].caption = caption;\n    return one(ctx, node.children[0], 0, node);\n  }\n  const wrappedNode = node.children[0];\n  wrappedNode.caption = node.caption;\n  node.children = node.children.filter(node => node.type !== 'figcaption');\n  if (node.children.length === 1) {\n    node.children = node.children[0].children;\n  }\n  const extra = has(makeExtra, type) ? makeExtra[type](wrappedNode) : undefined;\n  const innerText = all(ctx, node) || node.value || '';\n  return macro(ctx, innerText.trim(), caption, extra);\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/footnote.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\n\n/* Expose. */\nmodule.exports = notes;\nconst defaultMacro = (identifier, text, protect) => {\n  const footnote = `${protect ? '\\\\protect' : ''}\\\\footnote[${identifier}]{${text}}`;\n  return footnote;\n};\nfunction autoId(node) {\n  const {\n    line,\n    column,\n    offset\n  } = node.position.start;\n  return `l${line}c${column}o${offset}`;\n}\n\n/* Stringify a footnote `node`. */\nfunction notes(ctx, node) {\n  const macro = ctx.footnote || defaultMacro;\n  const protect = Boolean(node.commandProtect);\n  const identifier = autoId(node);\n  return macro(identifier, all(ctx, node).trim(), protect);\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/footnoteDefinition.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\n\n/* Expose. */\nmodule.exports = notes;\nconst defaultMacro = (identifier, text, protect) => `${protect ? '\\\\protect' : ''}\\\\footnotetext[${identifier}]{${text}}`;\nfunction notes(ctx, node) {\n  const macro = ctx.footnoteDefinition || defaultMacro;\n  const protect = Boolean(node.commandProtect);\n  return macro(node.identifier, all(ctx, node).trim(), protect);\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/footnoteReference.js",
    "content": "\"use strict\";\n\n/* Expose. */\nmodule.exports = notes;\nconst defaultMacro = (identifier, protect) => `\\\\textsuperscript{${protect ? '\\\\protect' : ''}\\\\footnotemark[${identifier}]}`;\nfunction notes(ctx, node) {\n  const macro = ctx.footnoteReference || defaultMacro;\n  const protect = Boolean(node.commandProtect);\n  return macro(node.identifier, protect);\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/gridTable.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst clone = require('clone');\nconst tableCell = require('rebber/dist/types/tableCell');\nconst tableRow = require('rebber/dist/types/tableRow');\nconst table = require('rebber/dist/types/table');\nconst text = require('rebber/dist/types/text');\nconst paragraph = require('rebber/dist/types/paragraph');\n\n/* Expose. */\nmodule.exports = gridTable;\nclass MultiRowLine {\n  constructor(startRow, endRow, startCell, endCell, colSpan, endOfLine) {\n    this.multilineCounter = endRow - startRow;\n    this.startCell = startCell;\n    this.endCell = endCell;\n    this.colSpan = colSpan;\n    this.endOfLine = endOfLine;\n  }\n  getCLine() {\n    let startCLine = 1;\n    let endCLine = this.startCell - 1;\n    // case where the multi row line is at the start of the table\n    if (this.startCell === 1) {\n      startCLine = this.startCell + this.colSpan;\n      endCLine = this.endOfLine;\n    } else if (this.startCell > 1 && this.startCell + this.colSpan < this.endOfLine) {\n      // case where the multi row line is in the middle of the table\n      const clineBefore = `\\\\cline{1-${this.startCell - 1}}`;\n      const clineAfter = `\\\\cline{${this.startCell + this.colSpan}-${this.endOfLine}}`;\n      return `${clineBefore} ${clineAfter}`;\n    }\n    return `\\\\cline{${startCLine}-${endCLine}}`;\n  }\n}\nclass GridTableStringifier {\n  constructor() {\n    this.lastMultiRowLine = null;\n    this.currentSpan = 0;\n    this.rowIndex = 0;\n    this.colIndex = 0;\n    this.multiLineCellIndex = 0;\n    this.colSpan = 1;\n    this.nbOfColumns = 0;\n  }\n  gridTableCell(ctx, node) {\n    const overriddenCtx = clone(ctx);\n    this.colIndex++;\n    overriddenCtx.tableCell = undefined;\n    // we have to replace \\n by \\endgraf only in text node, not in other\n    // see #352\n    overriddenCtx.overrides.text = (c, n, index, parent) => text(c, n, index, parent).replace(/\\n/g, ' \\\\endgraf ');\n    overriddenCtx.overrides.paragraph = (c, n) => `${paragraph(c, n).trim()} \\\\endgraf \\\\endgraf `;\n    let baseText = tableCell(overriddenCtx, node).trim();\n    while (baseText.substring(baseText.length - '\\\\endgraf'.length) === '\\\\endgraf') {\n      baseText = baseText.substring(0, baseText.length - '\\\\endgraf'.length).trim();\n    }\n    if (node.data && node.data.hProperties.rowSpan > 1) {\n      this.currentSpan = node.data.hProperties.rowSpan;\n      this.multiLineCellIndex = this.colIndex;\n      baseText = `\\\\SetCell[r=${this.currentSpan}]{l} ${baseText}`;\n      this.colSpan = node.data.hProperties.colSpan > 1 ? node.data.hProperties.colSpan : 1;\n    } else if (node.data && node.data.hProperties.colSpan > 1) {\n      const colSpan = node.data.hProperties.colSpan;\n      baseText = `\\\\SetCell[c=${colSpan}]{l} ${baseText}`;\n    }\n    if (node.data && node.data.hProperties.colSpan > 1) {\n      this.colIndex -= 1;\n      this.colIndex += node.data.hProperties.colSpan;\n    }\n    return baseText;\n  }\n  gridTableRow(ctx, node, index) {\n    const overriddenCtx = clone(ctx);\n    overriddenCtx.tableRow = undefined;\n    this.rowIndex++;\n    const extraCell = {\n      type: 'tableCell',\n      children: [{\n        type: 'paragraph',\n        children: [{\n          type: 'text',\n          value: ' '\n        }]\n      }]\n    };\n\n    // Duplicate cells with colSpan greater than one\n    for (let i = 0; i < node.children.length; i++) {\n      if (!node.children[i].data) continue;\n      const colSpan = node.children[i].data.hProperties.colSpan;\n      if (!colSpan || colSpan <= 1) continue;\n      for (let j = 0; j < colSpan - 1; j++) {\n        node.children.splice(i + 1, 0, extraCell);\n      }\n    }\n    if (this.previousRowWasMulti()) {\n      const lastMultiRowline = this.flushMultiRowLineIfNeeded();\n      for (let i = 0; i < lastMultiRowline.colSpan; i++) {\n        node.children.splice(lastMultiRowline.startCell - 1, 0, extraCell);\n      }\n      this.colIndex = 0;\n      let rowStr = tableRow(overriddenCtx, node, index);\n      if (lastMultiRowline.multilineCounter > 0) {\n        rowStr = rowStr.replace(/\\\\hline/, lastMultiRowline.getCLine());\n      }\n      this.colIndex = 0;\n      return rowStr;\n    }\n    let rowText = tableRow(overriddenCtx, node, index);\n    if (this.currentSpan !== 0) {\n      this.lastMultiRowLine = new MultiRowLine(this.rowIndex, this.rowIndex + this.currentSpan + -1, this.multiLineCellIndex, this.colIndex + this.colSpan, this.colSpan, this.colIndex);\n      rowText = rowText.replace(/\\\\hline/, this.lastMultiRowLine.getCLine());\n    }\n    this.currentSpan = 0;\n    if (this.colIndex >= this.nbOfColumns) {\n      this.nbOfColumns = this.colIndex;\n    }\n    this.colIndex = 0;\n    return rowText;\n  }\n  flushMultiRowLineIfNeeded() {\n    if (!this.lastMultiRowLine) {\n      return null;\n    }\n    const row = this.lastMultiRowLine;\n    if (row.multilineCounter >= 1) {\n      row.multilineCounter--;\n    }\n    if (row.multilineCounter === 0) {\n      this.lastMultiRowLine = null;\n    }\n    return row;\n  }\n  gridTableheaderCounter(node) {\n    const tableHeaders = node.children.filter(n => n.data && n.data.hName === 'thead');\n    return tableHeaders.length >= 1 ? tableHeaders[0].children.length : 0;\n  }\n  gridTableHeaderParse() {\n    return ' X[-1]'.repeat(this.nbOfColumns).substring(1);\n  }\n  previousRowWasMulti() {\n    return this.lastMultiRowLine !== null;\n  }\n}\nfunction gridTable(ctx, node) {\n  const overriddenCtx = clone(ctx);\n  const stringifier = new GridTableStringifier();\n  // Inside tables, `\\\\\\\\` won't work\n  overriddenCtx.break = () => ' \\\\endgraf';\n  overriddenCtx.tableCell = stringifier.gridTableCell.bind(stringifier);\n  overriddenCtx.tableRow = stringifier.gridTableRow.bind(stringifier);\n  overriddenCtx.headerCounter = stringifier.gridTableheaderCounter.bind(stringifier);\n  overriddenCtx.headerParse = stringifier.gridTableHeaderParse.bind(stringifier);\n  overriddenCtx.image = overriddenCtx.image ? overriddenCtx.image : {};\n  overriddenCtx.image.inlineMatcher = () => true;\n  return table(overriddenCtx, node).replace(/\\\\number-of-column/gm, stringifier.nbOfColumns);\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/introduction.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\n\n/* Expose. */\nmodule.exports = introduction;\nconst introductionMacros = [content => `\\\\begin{LevelOneIntroduction}\\n${content}\\n\\\\end{LevelOneIntroduction}`, content => `\\\\begin{LevelTwoIntroduction}\\n${content}\\n\\\\end{LevelTwoIntroduction}`, content => `\\\\begin{LevelThreeIntroduction}\\n${content}\\n\\\\end{LevelThreeIntroduction}`];\n\n/* Stringify an introduction `node`. */\nfunction introduction(ctx, node) {\n  const level = node.data.level || 0;\n  const macro = ctx[node.type] || introductionMacros[level];\n  const innerText = all(ctx, node);\n  return `${macro(innerText.trim())}\\n\\n`;\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/kbd.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\n\n/* Expose. */\nmodule.exports = kbd;\n\n/* Stringify a kbd `node`. */\nfunction kbd(ctx, node) {\n  const contents = all(ctx, node);\n  return `\\\\keys{${contents}}`;\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/math.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\nconst has = require('has');\n\n/* Expose. */\nmodule.exports = math;\nconst defaultMacros = {\n  inlineMath: content => `$${content}$`,\n  inlineMathDouble: content => `$$${content}$$`,\n  math: content => `\\\\[ ${content} \\\\]\\n\\n`\n};\n\n/* Stringify a Figure `node`. */\nfunction math(ctx, node, index, parent) {\n  let type = 'math';\n  if (node.type === 'inlineMath') {\n    try {\n      const classes = node.data.hProperties.className;\n      type = classes.includes('math-display') ? 'inlineMathDouble' : 'inlineMath';\n    } catch (e) {\n      console.error(e, 'This rebber math plugin is only compatible with remark-math.');\n    }\n  }\n  const macro = has(ctx, 'math') && has(ctx.math, type) && ctx.math[type] || has(defaultMacros, type) && defaultMacros[type];\n  const content = all(ctx, node) || node.value || '';\n  return macro(content.trim());\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/ping.js",
    "content": "\"use strict\";\n\n/* Expose. */\nmodule.exports = ping;\n\n/* Stringify a `ping` node. */\nfunction ping(_, node) {\n  return `\\\\ping{${node.username}}`;\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/sub.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\n\n/* Expose. */\nmodule.exports = sub;\n\n/* Stringify a sub `node`. */\nfunction sub(ctx, node, index, parent) {\n  const contents = all(ctx, node);\n  return `\\\\textsubscript{${contents}}`;\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/sup.js",
    "content": "\"use strict\";\n\n/* Dependencies. */\nconst all = require('rebber/dist/all');\n\n/* Expose. */\nmodule.exports = sup;\n\n/* Stringify a sup `node`. */\nfunction sup(ctx, node, index, parent) {\n  const contents = all(ctx, node);\n  return `\\\\textsuperscript{${contents}}`;\n}"
  },
  {
    "path": "packages/rebber-plugins/dist/type/tableHeader.js",
    "content": "\"use strict\";\n\nmodule.exports = (ctx, node, index, parent) => {\n  const one = require('rebber/dist/one');\n  if (ctx.tableHeader) {\n    return ctx.tableHeader(node.value);\n  }\n  if (index === 0 && parent.children.length > 1) {\n    // if we are on first header row we do not want to switch back to\n    // font of normal serie\n    return node.children.map((n, childIndex) => one(ctx, n, childIndex === 0 ? 0 : 2, node)).join('');\n  }\n  const parsed = node.children.map((n, childIndex) => one(ctx, n, index + childIndex, node));\n  return parsed.join('');\n};"
  },
  {
    "path": "packages/rebber-plugins/package.json",
    "content": "{\n  \"name\": \"rebber-plugins\",\n  \"version\": \"4.4.0\",\n  \"description\": \"Stringifies custom MDAST nodes to LaTeX\",\n  \"repository\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/rebber-plugins\",\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"mdast\",\n    \"latex\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"has\": \"^1.0.3\",\n    \"xtend\": \"^4.0.2\"\n  },\n  \"devDependencies\": {\n    \"rebber\": \"file:../rebber\",\n    \"remark-abbr\": \"file:../remark-abbr\",\n    \"remark-align\": \"file:../remark-align\",\n    \"remark-captions\": \"file:../remark-captions\",\n    \"remark-emoticons\": \"file:../remark-emoticons\",\n    \"remark-grid-tables\": \"file:../remark-grid-tables\",\n    \"remark-numbered-footnotes\": \"file:../remark-numbered-footnotes\",\n    \"remark-sub-super\": \"file:../remark-sub-super\"\n  }\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/preprocessors/codeVisitor.js",
    "content": "const visit = require('unist-util-visit')\nconst appendix = require('../type/appendix')\n\nconst defaultReferenceGenerator = (appendixIndex) => `Code appendice ${appendixIndex}`\n\nmodule.exports = (ctx, tree) => {\n  ctx.overrides.appendix = appendix\n  return (node) => {\n    let appendix = tree.children[tree.children.length - 1]\n    if (!appendix || appendix.type !== 'appendix') {\n      appendix = {\n        type: 'appendix',\n        children: []\n      }\n      tree.children.push(appendix)\n    }\n    let appendixIndex = appendix.children.length + 1\n    visit(node, 'code', (innerNode, index, _parent) => {\n      appendix.children.push({\n        type: 'paragraph',\n        children: [\n          {\n            type: 'heading',\n            children: [\n              {\n                type: 'definition',\n                identifier: `appendix-${appendixIndex}`,\n                url: `${ctx.codeAppendiceTitle || 'Appendix'} ${appendixIndex}`,\n                referenceType: 'full'\n              }\n            ],\n            depth: 1\n          }\n        ]\n      })\n\n      appendix.children.push(innerNode)\n\n      const generator = ctx.appendiceReferenceGenerator || defaultReferenceGenerator\n\n      const referenceNode = {\n        type: 'linkReference',\n        identifier: `appendix-${appendixIndex}`,\n        children: [\n          {\n            type: 'text',\n            value: generator(appendixIndex)\n          }\n        ]\n      }\n      _parent.children.splice(index, 1, referenceNode)\n      appendixIndex++\n    })\n  }\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/preprocessors/footnoteProtect.js",
    "content": "module.exports = plugin\n\n/*\nLaTeX requires special handlings of footnotes placed in headings such as \\section{}\nWe therefore mark each footnote placed in heading for later handling.\n*/\n\nconst nodeTypes = ['footnote', 'footnoteDefinition', 'footnoteReference']\n\nfunction plugin () {\n  return function footnoteProtect (node, index, parent) {\n    if (nodeTypes.includes(node.type) && node.commandProtect !== true) {\n      node.commandProtect = true\n    }\n\n    if (node.children) {\n      node.children.forEach((n, i) => footnoteProtect(n, i, node))\n    }\n  }\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/preprocessors/iframe.js",
    "content": "module.exports = () => (node, index, parent) => {\n  const linkNode = {\n    type: 'link',\n    url: node.data.hProperties.src,\n    children: [\n      { type: 'text', value: node.data.hProperties.src }\n    ]\n  }\n\n  const thumbnailNode = {\n    type: 'image',\n    url: node.data.thumbnail\n  }\n\n  if (parent.type !== 'figure') {\n    const figureNode = {\n      type: 'figure',\n      children: [thumbnailNode, {\n        type: 'figcaption',\n        children: [linkNode]\n      }]\n    }\n    parent.children[index] = figureNode\n  } else {\n    parent.children[index] = thumbnailNode\n    parent.children[parent.children.length - 1].children.push(linkNode)\n  }\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/preprocessors/katexConstants.json",
    "content": "[\"\\\\acute\",\"\\\\grave\",\"\\\\ddot\",\"\\\\tilde\",\"\\\\bar\",\"\\\\breve\",\"\\\\check\",\"\\\\hat\",\"\\\\vec\",\"\\\\dot\",\"\\\\mathring\",\"\\\\widecheck\",\"\\\\widehat\",\"\\\\widetilde\",\"\\\\overrightarrow\",\"\\\\overleftarrow\",\"\\\\Overrightarrow\",\"\\\\overleftrightarrow\",\"\\\\overgroup\",\"\\\\overlinesegment\",\"\\\\overleftharpoon\",\"\\\\overrightharpoon\",\"\\\\'\",\"\\\\`\",\"\\\\^\",\"\\\\~\",\"\\\\=\",\"\\\\u\",\"\\\\.\",\"\\\\\\\"\",\"\\\\c\",\"\\\\r\",\"\\\\H\",\"\\\\v\",\"\\\\textcircled\",\"\\\\underleftarrow\",\"\\\\underrightarrow\",\"\\\\underleftrightarrow\",\"\\\\undergroup\",\"\\\\underlinesegment\",\"\\\\utilde\",\"\\\\xleftarrow\",\"\\\\xrightarrow\",\"\\\\xLeftarrow\",\"\\\\xRightarrow\",\"\\\\xleftrightarrow\",\"\\\\xLeftrightarrow\",\"\\\\xhookleftarrow\",\"\\\\xhookrightarrow\",\"\\\\xmapsto\",\"\\\\xrightharpoondown\",\"\\\\xrightharpoonup\",\"\\\\xleftharpoondown\",\"\\\\xleftharpoonup\",\"\\\\xrightleftharpoons\",\"\\\\xleftrightharpoons\",\"\\\\xlongequal\",\"\\\\xtwoheadrightarrow\",\"\\\\xtwoheadleftarrow\",\"\\\\xtofrom\",\"\\\\xrightleftarrows\",\"\\\\xrightequilibrium\",\"\\\\xleftequilibrium\",\"\\\\\\\\cdrightarrow\",\"\\\\\\\\cdleftarrow\",\"\\\\\\\\cdlongequal\",\"\\\\\\\\cdleft\",\"\\\\\\\\cdright\",\"\\\\\\\\cdparent\",\"\\\\@char\",\"\\\\textcolor\",\"\\\\color\",\"\\\\\\\\\",\"\\\\global\",\"\\\\long\",\"\\\\\\\\globallong\",\"\\\\def\",\"\\\\gdef\",\"\\\\edef\",\"\\\\xdef\",\"\\\\let\",\"\\\\\\\\globallet\",\"\\\\futurelet\",\"\\\\\\\\globalfuture\",\"\\\\bigl\",\"\\\\Bigl\",\"\\\\biggl\",\"\\\\Biggl\",\"\\\\bigr\",\"\\\\Bigr\",\"\\\\biggr\",\"\\\\Biggr\",\"\\\\bigm\",\"\\\\Bigm\",\"\\\\biggm\",\"\\\\Biggm\",\"\\\\big\",\"\\\\Big\",\"\\\\bigg\",\"\\\\Bigg\",\"\\\\right\",\"\\\\right.\",\"\\\\left\",\"\\\\left.\",\"\\\\middle\",\"\\\\colorbox\",\"\\\\fcolorbox\",\"\\\\fbox\",\"\\\\cancel\",\"\\\\bcancel\",\"\\\\xcancel\",\"\\\\sout\",\"\\\\phase\",\"\\\\angl\",\"\\\\hline\",\"\\\\hdashline\",\"\\\\begin\",\"\\\\end\",\"\\\\mathord\",\"\\\\mathbin\",\"\\\\mathrel\",\"\\\\mathopen\",\"\\\\mathclose\",\"\\\\mathpunct\",\"\\\\mathinner\",\"\\\\@binrel\",\"\\\\stackrel\",\"\\\\overset\",\"\\\\underset\",\"\\\\mathrm\",\"\\\\mathit\",\"\\\\mathbf\",\"\\\\mathnormal\",\"\\\\mathbb\",\"\\\\mathcal\",\"\\\\mathfrak\",\"\\\\mathscr\",\"\\\\mathsf\",\"\\\\mathtt\",\"\\\\Bbb\",\"\\\\bold\",\"\\\\frak\",\"\\\\boldsymbol\",\"\\\\bm\",\"\\\\rm\",\"\\\\sf\",\"\\\\tt\",\"\\\\bf\",\"\\\\it\",\"\\\\cal\",\"\\\\dfrac\",\"\\\\frac\",\"\\\\tfrac\",\"\\\\dbinom\",\"\\\\binom\",\"\\\\tbinom\",\"\\\\\\\\atopfrac\",\"\\\\\\\\bracefrac\",\"\\\\\\\\brackfrac\",\"\\\\cfrac\",\"\\\\over\",\"\\\\choose\",\"\\\\atop\",\"\\\\brace\",\"\\\\brack\",\"\\\\genfrac\",\"\\\\above\",\"\\\\\\\\abovefrac\",\"\\\\overbrace\",\"\\\\underbrace\",\"\\\\href\",\"\\\\url\",\"\\\\hbox\",\"\\\\htmlClass\",\"\\\\htmlId\",\"\\\\htmlStyle\",\"\\\\htmlData\",\"\\\\html@mathml\",\"\\\\includegraphics\",\"\\\\kern\",\"\\\\mkern\",\"\\\\hskip\",\"\\\\mskip\",\"\\\\mathllap\",\"\\\\mathrlap\",\"\\\\mathclap\",\"\\\\(\",\"\\\\)\",\"\\\\]\",\"\\\\mathchoice\",\"\\\\coprod\",\"\\\\bigvee\",\"\\\\bigwedge\",\"\\\\biguplus\",\"\\\\bigcap\",\"\\\\bigcup\",\"\\\\intop\",\"\\\\prod\",\"\\\\sum\",\"\\\\bigotimes\",\"\\\\bigoplus\",\"\\\\bigodot\",\"\\\\bigsqcup\",\"\\\\smallint\",\"\\\\mathop\",\"\\\\arcsin\",\"\\\\arccos\",\"\\\\arctan\",\"\\\\arctg\",\"\\\\arcctg\",\"\\\\arg\",\"\\\\ch\",\"\\\\cos\",\"\\\\cosec\",\"\\\\cosh\",\"\\\\cot\",\"\\\\cotg\",\"\\\\coth\",\"\\\\csc\",\"\\\\ctg\",\"\\\\cth\",\"\\\\deg\",\"\\\\dim\",\"\\\\exp\",\"\\\\hom\",\"\\\\ker\",\"\\\\lg\",\"\\\\ln\",\"\\\\log\",\"\\\\sec\",\"\\\\sin\",\"\\\\sinh\",\"\\\\sh\",\"\\\\tan\",\"\\\\tanh\",\"\\\\tg\",\"\\\\th\",\"\\\\det\",\"\\\\gcd\",\"\\\\inf\",\"\\\\lim\",\"\\\\max\",\"\\\\min\",\"\\\\Pr\",\"\\\\sup\",\"\\\\int\",\"\\\\iint\",\"\\\\iiint\",\"\\\\oint\",\"\\\\oiint\",\"\\\\oiiint\",\"\\\\operatorname@\",\"\\\\operatornamewithlimits\",\"\\\\overline\",\"\\\\phantom\",\"\\\\hphantom\",\"\\\\vphantom\",\"\\\\raisebox\",\"\\\\rule\",\"\\\\tiny\",\"\\\\sixptsize\",\"\\\\scriptsize\",\"\\\\footnotesize\",\"\\\\small\",\"\\\\normalsize\",\"\\\\large\",\"\\\\Large\",\"\\\\LARGE\",\"\\\\huge\",\"\\\\Huge\",\"\\\\smash\",\"\\\\sqrt\",\"\\\\displaystyle\",\"\\\\textstyle\",\"\\\\scriptstyle\",\"\\\\scriptscriptstyle\",\"\\\\text\",\"\\\\textrm\",\"\\\\textsf\",\"\\\\texttt\",\"\\\\textnormal\",\"\\\\textbf\",\"\\\\textmd\",\"\\\\textit\",\"\\\\textup\",\"\\\\underline\",\"\\\\vcenter\",\"\\\\verb\",\"\\\\equiv\",\"\\\\prec\",\"\\\\succ\",\"\\\\sim\",\"\\\\perp\",\"\\\\preceq\",\"\\\\succeq\",\"\\\\simeq\",\"\\\\mid\",\"\\\\ll\",\"\\\\gg\",\"\\\\asymp\",\"\\\\parallel\",\"\\\\bowtie\",\"\\\\smile\",\"\\\\sqsubseteq\",\"\\\\sqsupseteq\",\"\\\\doteq\",\"\\\\frown\",\"\\\\ni\",\"\\\\propto\",\"\\\\vdash\",\"\\\\dashv\",\"\\\\owns\",\"\\\\ldotp\",\"\\\\cdotp\",\"\\\\#\",\"\\\\&\",\"\\\\aleph\",\"\\\\forall\",\"\\\\hbar\",\"\\\\exists\",\"\\\\nabla\",\"\\\\flat\",\"\\\\ell\",\"\\\\natural\",\"\\\\clubsuit\",\"\\\\wp\",\"\\\\sharp\",\"\\\\diamondsuit\",\"\\\\Re\",\"\\\\heartsuit\",\"\\\\Im\",\"\\\\spadesuit\",\"\\\\S\",\"\\\\P\",\"\\\\dag\",\"\\\\ddag\",\"\\\\rmoustache\",\"\\\\lmoustache\",\"\\\\rgroup\",\"\\\\lgroup\",\"\\\\mp\",\"\\\\ominus\",\"\\\\uplus\",\"\\\\sqcap\",\"\\\\ast\",\"\\\\sqcup\",\"\\\\bigcirc\",\"\\\\bullet\",\"\\\\ddagger\",\"\\\\wr\",\"\\\\amalg\",\"\\\\And\",\"\\\\longleftarrow\",\"\\\\Leftarrow\",\"\\\\Longleftarrow\",\"\\\\longrightarrow\",\"\\\\Rightarrow\",\"\\\\Longrightarrow\",\"\\\\leftrightarrow\",\"\\\\longleftrightarrow\",\"\\\\Leftrightarrow\",\"\\\\Longleftrightarrow\",\"\\\\mapsto\",\"\\\\longmapsto\",\"\\\\nearrow\",\"\\\\hookleftarrow\",\"\\\\hookrightarrow\",\"\\\\searrow\",\"\\\\leftharpoonup\",\"\\\\rightharpoonup\",\"\\\\swarrow\",\"\\\\leftharpoondown\",\"\\\\rightharpoondown\",\"\\\\nwarrow\",\"\\\\rightleftharpoons\",\"\\\\nless\",\"\\\\@nleqslant\",\"\\\\@nleqq\",\"\\\\lneq\",\"\\\\lneqq\",\"\\\\@lvertneqq\",\"\\\\lnsim\",\"\\\\lnapprox\",\"\\\\nprec\",\"\\\\npreceq\",\"\\\\precnsim\",\"\\\\precnapprox\",\"\\\\nsim\",\"\\\\@nshortmid\",\"\\\\nmid\",\"\\\\nvdash\",\"\\\\nvDash\",\"\\\\ntriangleleft\",\"\\\\ntrianglelefteq\",\"\\\\subsetneq\",\"\\\\@varsubsetneq\",\"\\\\subsetneqq\",\"\\\\@varsubsetneqq\",\"\\\\ngtr\",\"\\\\@ngeqslant\",\"\\\\@ngeqq\",\"\\\\gneq\",\"\\\\gneqq\",\"\\\\@gvertneqq\",\"\\\\gnsim\",\"\\\\gnapprox\",\"\\\\nsucc\",\"\\\\nsucceq\",\"\\\\succnsim\",\"\\\\succnapprox\",\"\\\\ncong\",\"\\\\@nshortparallel\",\"\\\\nparallel\",\"\\\\nVDash\",\"\\\\ntriangleright\",\"\\\\ntrianglerighteq\",\"\\\\@nsupseteqq\",\"\\\\supsetneq\",\"\\\\@varsupsetneq\",\"\\\\supsetneqq\",\"\\\\@varsupsetneqq\",\"\\\\nVdash\",\"\\\\precneqq\",\"\\\\succneqq\",\"\\\\@nsubseteqq\",\"\\\\unlhd\",\"\\\\unrhd\",\"\\\\nleftarrow\",\"\\\\nrightarrow\",\"\\\\nLeftarrow\",\"\\\\nRightarrow\",\"\\\\nleftrightarrow\",\"\\\\nLeftrightarrow\",\"\\\\vartriangle\",\"\\\\hslash\",\"\\\\triangledown\",\"\\\\lozenge\",\"\\\\circledS\",\"\\\\circledR\",\"\\\\measuredangle\",\"\\\\nexists\",\"\\\\mho\",\"\\\\Finv\",\"\\\\Game\",\"\\\\backprime\",\"\\\\blacktriangle\",\"\\\\blacktriangledown\",\"\\\\blacksquare\",\"\\\\blacklozenge\",\"\\\\bigstar\",\"\\\\sphericalangle\",\"\\\\complement\",\"\\\\eth\",\"\\\\diagup\",\"\\\\diagdown\",\"\\\\square\",\"\\\\Box\",\"\\\\Diamond\",\"\\\\yen\",\"\\\\checkmark\",\"\\\\beth\",\"\\\\daleth\",\"\\\\gimel\",\"\\\\digamma\",\"\\\\varkappa\",\"\\\\@ulcorner\",\"\\\\@urcorner\",\"\\\\@llcorner\",\"\\\\@lrcorner\",\"\\\\leqq\",\"\\\\leqslant\",\"\\\\eqslantless\",\"\\\\lesssim\",\"\\\\lessapprox\",\"\\\\approxeq\",\"\\\\lessdot\",\"\\\\lll\",\"\\\\lessgtr\",\"\\\\lesseqgtr\",\"\\\\lesseqqgtr\",\"\\\\doteqdot\",\"\\\\risingdotseq\",\"\\\\fallingdotseq\",\"\\\\backsim\",\"\\\\backsimeq\",\"\\\\subseteqq\",\"\\\\Subset\",\"\\\\sqsubset\",\"\\\\preccurlyeq\",\"\\\\curlyeqprec\",\"\\\\precsim\",\"\\\\precapprox\",\"\\\\vartriangleleft\",\"\\\\trianglelefteq\",\"\\\\vDash\",\"\\\\Vvdash\",\"\\\\smallsmile\",\"\\\\smallfrown\",\"\\\\bumpeq\",\"\\\\Bumpeq\",\"\\\\geqq\",\"\\\\geqslant\",\"\\\\eqslantgtr\",\"\\\\gtrsim\",\"\\\\gtrapprox\",\"\\\\gtrdot\",\"\\\\ggg\",\"\\\\gtrless\",\"\\\\gtreqless\",\"\\\\gtreqqless\",\"\\\\eqcirc\",\"\\\\circeq\",\"\\\\triangleq\",\"\\\\thicksim\",\"\\\\thickapprox\",\"\\\\supseteqq\",\"\\\\Supset\",\"\\\\sqsupset\",\"\\\\succcurlyeq\",\"\\\\curlyeqsucc\",\"\\\\succsim\",\"\\\\succapprox\",\"\\\\vartriangleright\",\"\\\\trianglerighteq\",\"\\\\Vdash\",\"\\\\shortmid\",\"\\\\shortparallel\",\"\\\\between\",\"\\\\pitchfork\",\"\\\\varpropto\",\"\\\\blacktriangleleft\",\"\\\\therefore\",\"\\\\backepsilon\",\"\\\\blacktriangleright\",\"\\\\because\",\"\\\\llless\",\"\\\\gggtr\",\"\\\\lhd\",\"\\\\rhd\",\"\\\\eqsim\",\"\\\\Join\",\"\\\\Doteq\",\"\\\\dotplus\",\"\\\\smallsetminus\",\"\\\\Cap\",\"\\\\Cup\",\"\\\\doublebarwedge\",\"\\\\boxminus\",\"\\\\boxplus\",\"\\\\divideontimes\",\"\\\\ltimes\",\"\\\\rtimes\",\"\\\\leftthreetimes\",\"\\\\rightthreetimes\",\"\\\\curlywedge\",\"\\\\curlyvee\",\"\\\\circleddash\",\"\\\\circledast\",\"\\\\centerdot\",\"\\\\intercal\",\"\\\\doublecap\",\"\\\\doublecup\",\"\\\\boxtimes\",\"\\\\dashrightarrow\",\"\\\\dashleftarrow\",\"\\\\leftleftarrows\",\"\\\\leftrightarrows\",\"\\\\Lleftarrow\",\"\\\\twoheadleftarrow\",\"\\\\leftarrowtail\",\"\\\\looparrowleft\",\"\\\\leftrightharpoons\",\"\\\\curvearrowleft\",\"\\\\circlearrowleft\",\"\\\\Lsh\",\"\\\\upuparrows\",\"\\\\upharpoonleft\",\"\\\\downharpoonleft\",\"\\\\origof\",\"\\\\imageof\",\"\\\\multimap\",\"\\\\leftrightsquigarrow\",\"\\\\rightrightarrows\",\"\\\\rightleftarrows\",\"\\\\twoheadrightarrow\",\"\\\\rightarrowtail\",\"\\\\looparrowright\",\"\\\\curvearrowright\",\"\\\\circlearrowright\",\"\\\\Rsh\",\"\\\\downdownarrows\",\"\\\\upharpoonright\",\"\\\\downharpoonright\",\"\\\\rightsquigarrow\",\"\\\\leadsto\",\"\\\\Rrightarrow\",\"\\\\restriction\",\"\\\\$\",\"\\\\%\",\"\\\\_\",\"\\\\angle\",\"\\\\infty\",\"\\\\prime\",\"\\\\triangle\",\"\\\\Gamma\",\"\\\\Delta\",\"\\\\Theta\",\"\\\\Lambda\",\"\\\\Xi\",\"\\\\Pi\",\"\\\\Sigma\",\"\\\\Upsilon\",\"\\\\Phi\",\"\\\\Psi\",\"\\\\Omega\",\"\\\\neg\",\"\\\\lnot\",\"\\\\top\",\"\\\\bot\",\"\\\\emptyset\",\"\\\\varnothing\",\"\\\\alpha\",\"\\\\beta\",\"\\\\gamma\",\"\\\\delta\",\"\\\\epsilon\",\"\\\\zeta\",\"\\\\eta\",\"\\\\theta\",\"\\\\iota\",\"\\\\kappa\",\"\\\\lambda\",\"\\\\mu\",\"\\\\nu\",\"\\\\xi\",\"\\\\omicron\",\"\\\\pi\",\"\\\\rho\",\"\\\\sigma\",\"\\\\tau\",\"\\\\upsilon\",\"\\\\phi\",\"\\\\chi\",\"\\\\psi\",\"\\\\omega\",\"\\\\varepsilon\",\"\\\\vartheta\",\"\\\\varpi\",\"\\\\varrho\",\"\\\\varsigma\",\"\\\\varphi\",\"\\\\cdot\",\"\\\\circ\",\"\\\\div\",\"\\\\pm\",\"\\\\times\",\"\\\\cap\",\"\\\\cup\",\"\\\\setminus\",\"\\\\land\",\"\\\\lor\",\"\\\\wedge\",\"\\\\vee\",\"\\\\surd\",\"\\\\langle\",\"\\\\lvert\",\"\\\\lVert\",\"\\\\rangle\",\"\\\\rvert\",\"\\\\rVert\",\"\\\\approx\",\"\\\\cong\",\"\\\\ge\",\"\\\\geq\",\"\\\\gets\",\"\\\\gt\",\"\\\\in\",\"\\\\@not\",\"\\\\subset\",\"\\\\supset\",\"\\\\subseteq\",\"\\\\supseteq\",\"\\\\nsubseteq\",\"\\\\nsupseteq\",\"\\\\models\",\"\\\\leftarrow\",\"\\\\le\",\"\\\\leq\",\"\\\\lt\",\"\\\\rightarrow\",\"\\\\to\",\"\\\\ngeq\",\"\\\\nleq\",\"\\\\ \",\"\\\\space\",\"\\\\nobreakspace\",\"\\\\nobreak\",\"\\\\allowbreak\",\"\\\\barwedge\",\"\\\\veebar\",\"\\\\odot\",\"\\\\oplus\",\"\\\\otimes\",\"\\\\partial\",\"\\\\oslash\",\"\\\\circledcirc\",\"\\\\boxdot\",\"\\\\bigtriangleup\",\"\\\\bigtriangledown\",\"\\\\dagger\",\"\\\\diamond\",\"\\\\star\",\"\\\\triangleleft\",\"\\\\triangleright\",\"\\\\{\",\"\\\\}\",\"\\\\lbrace\",\"\\\\rbrace\",\"\\\\lbrack\",\"\\\\rbrack\",\"\\\\lparen\",\"\\\\rparen\",\"\\\\lfloor\",\"\\\\rfloor\",\"\\\\lceil\",\"\\\\rceil\",\"\\\\backslash\",\"\\\\vert\",\"\\\\|\",\"\\\\Vert\",\"\\\\uparrow\",\"\\\\Uparrow\",\"\\\\downarrow\",\"\\\\Downarrow\",\"\\\\updownarrow\",\"\\\\Updownarrow\",\"\\\\mathellipsis\",\"\\\\ldots\",\"\\\\@cdots\",\"\\\\ddots\",\"\\\\varvdots\",\"\\\\@imath\",\"\\\\@jmath\",\"\\\\degree\",\"\\\\pounds\",\"\\\\mathsterling\",\"\\\\maltese\",\"\\\\textdagger\",\"\\\\textdaggerdbl\",\"\\\\textdollar\",\"\\\\textunderscore\",\"\\\\textbraceleft\",\"\\\\textbraceright\",\"\\\\textless\",\"\\\\textgreater\",\"\\\\textbar\",\"\\\\textbardbl\",\"\\\\textasciitilde\",\"\\\\textbackslash\",\"\\\\textasciicircum\",\"\\\\textellipsis\",\"\\\\i\",\"\\\\j\",\"\\\\ss\",\"\\\\ae\",\"\\\\oe\",\"\\\\o\",\"\\\\AE\",\"\\\\OE\",\"\\\\O\",\"\\\\textendash\",\"\\\\textemdash\",\"\\\\textquoteleft\",\"\\\\textquoteright\",\"\\\\textquotedblleft\",\"\\\\textquotedblright\",\"\\\\textdegree\",\"\\\\textsterling\",\"\\\\operatorname\",\"\\\\noexpand\",\"\\\\expandafter\",\"\\\\@firstoftwo\",\"\\\\@secondoftwo\",\"\\\\@ifnextchar\",\"\\\\@ifstar\",\"\\\\TextOrMath\",\"\\\\char\",\"\\\\newcommand\",\"\\\\renewcommand\",\"\\\\providecommand\",\"\\\\message\",\"\\\\errmessage\",\"\\\\show\",\"\\\\bgroup\",\"\\\\egroup\",\"\\\\lq\",\"\\\\rq\",\"\\\\aa\",\"\\\\AA\",\"\\\\textcopyright\",\"\\\\copyright\",\"\\\\textregistered\",\"\\\\Bbbk\",\"\\\\llap\",\"\\\\rlap\",\"\\\\clap\",\"\\\\mathstrut\",\"\\\\underbar\",\"\\\\not\",\"\\\\neq\",\"\\\\ne\",\"\\\\notin\",\"\\\\ulcorner\",\"\\\\urcorner\",\"\\\\llcorner\",\"\\\\lrcorner\",\"\\\\vdots\",\"\\\\varGamma\",\"\\\\varDelta\",\"\\\\varTheta\",\"\\\\varLambda\",\"\\\\varXi\",\"\\\\varPi\",\"\\\\varSigma\",\"\\\\varUpsilon\",\"\\\\varPhi\",\"\\\\varPsi\",\"\\\\varOmega\",\"\\\\substack\",\"\\\\colon\",\"\\\\boxed\",\"\\\\iff\",\"\\\\implies\",\"\\\\impliedby\",\"\\\\dots\",\"\\\\dotso\",\"\\\\dotsc\",\"\\\\cdots\",\"\\\\dotsb\",\"\\\\dotsm\",\"\\\\dotsi\",\"\\\\dotsx\",\"\\\\DOTSI\",\"\\\\DOTSB\",\"\\\\DOTSX\",\"\\\\tmspace\",\"\\\\,\",\"\\\\thinspace\",\"\\\\>\",\"\\\\:\",\"\\\\medspace\",\"\\\\;\",\"\\\\thickspace\",\"\\\\!\",\"\\\\negthinspace\",\"\\\\negmedspace\",\"\\\\negthickspace\",\"\\\\enspace\",\"\\\\enskip\",\"\\\\quad\",\"\\\\qquad\",\"\\\\tag\",\"\\\\tag@paren\",\"\\\\tag@literal\",\"\\\\bmod\",\"\\\\pod\",\"\\\\pmod\",\"\\\\mod\",\"\\\\pmb\",\"\\\\newline\",\"\\\\TeX\",\"\\\\LaTeX\",\"\\\\KaTeX\",\"\\\\hspace\",\"\\\\@hspace\",\"\\\\@hspacer\",\"\\\\ordinarycolon\",\"\\\\vcentcolon\",\"\\\\dblcolon\",\"\\\\coloneqq\",\"\\\\Coloneqq\",\"\\\\coloneq\",\"\\\\Coloneq\",\"\\\\eqqcolon\",\"\\\\Eqqcolon\",\"\\\\eqcolon\",\"\\\\Eqcolon\",\"\\\\colonapprox\",\"\\\\Colonapprox\",\"\\\\colonsim\",\"\\\\Colonsim\",\"\\\\ratio\",\"\\\\coloncolon\",\"\\\\colonequals\",\"\\\\coloncolonequals\",\"\\\\equalscolon\",\"\\\\equalscoloncolon\",\"\\\\colonminus\",\"\\\\coloncolonminus\",\"\\\\minuscolon\",\"\\\\minuscoloncolon\",\"\\\\coloncolonapprox\",\"\\\\coloncolonsim\",\"\\\\simcolon\",\"\\\\simcoloncolon\",\"\\\\approxcolon\",\"\\\\approxcoloncolon\",\"\\\\notni\",\"\\\\limsup\",\"\\\\liminf\",\"\\\\injlim\",\"\\\\projlim\",\"\\\\varlimsup\",\"\\\\varliminf\",\"\\\\varinjlim\",\"\\\\varprojlim\",\"\\\\gvertneqq\",\"\\\\lvertneqq\",\"\\\\ngeqq\",\"\\\\ngeqslant\",\"\\\\nleqq\",\"\\\\nleqslant\",\"\\\\nshortmid\",\"\\\\nshortparallel\",\"\\\\nsubseteqq\",\"\\\\nsupseteqq\",\"\\\\varsubsetneq\",\"\\\\varsubsetneqq\",\"\\\\varsupsetneq\",\"\\\\varsupsetneqq\",\"\\\\imath\",\"\\\\jmath\",\"\\\\llbracket\",\"\\\\rrbracket\",\"\\\\lBrace\",\"\\\\rBrace\",\"\\\\minuso\",\"\\\\darr\",\"\\\\dArr\",\"\\\\Darr\",\"\\\\lang\",\"\\\\rang\",\"\\\\uarr\",\"\\\\uArr\",\"\\\\Uarr\",\"\\\\N\",\"\\\\R\",\"\\\\Z\",\"\\\\alef\",\"\\\\alefsym\",\"\\\\Alpha\",\"\\\\Beta\",\"\\\\bull\",\"\\\\Chi\",\"\\\\clubs\",\"\\\\cnums\",\"\\\\Complex\",\"\\\\Dagger\",\"\\\\diamonds\",\"\\\\empty\",\"\\\\Epsilon\",\"\\\\Eta\",\"\\\\exist\",\"\\\\harr\",\"\\\\hArr\",\"\\\\Harr\",\"\\\\hearts\",\"\\\\image\",\"\\\\infin\",\"\\\\Iota\",\"\\\\isin\",\"\\\\Kappa\",\"\\\\larr\",\"\\\\lArr\",\"\\\\Larr\",\"\\\\lrarr\",\"\\\\lrArr\",\"\\\\Lrarr\",\"\\\\Mu\",\"\\\\natnums\",\"\\\\Nu\",\"\\\\Omicron\",\"\\\\plusmn\",\"\\\\rarr\",\"\\\\rArr\",\"\\\\Rarr\",\"\\\\real\",\"\\\\reals\",\"\\\\Reals\",\"\\\\Rho\",\"\\\\sdot\",\"\\\\sect\",\"\\\\spades\",\"\\\\sub\",\"\\\\sube\",\"\\\\supe\",\"\\\\Tau\",\"\\\\thetasym\",\"\\\\weierp\",\"\\\\Zeta\",\"\\\\argmin\",\"\\\\argmax\",\"\\\\plim\",\"\\\\bra\",\"\\\\ket\",\"\\\\braket\",\"\\\\Bra\",\"\\\\Ket\",\"\\\\angln\",\"\\\\blue\",\"\\\\orange\",\"\\\\pink\",\"\\\\red\",\"\\\\green\",\"\\\\gray\",\"\\\\purple\",\"\\\\blueA\",\"\\\\blueB\",\"\\\\blueC\",\"\\\\blueD\",\"\\\\blueE\",\"\\\\tealA\",\"\\\\tealB\",\"\\\\tealC\",\"\\\\tealD\",\"\\\\tealE\",\"\\\\greenA\",\"\\\\greenB\",\"\\\\greenC\",\"\\\\greenD\",\"\\\\greenE\",\"\\\\goldA\",\"\\\\goldB\",\"\\\\goldC\",\"\\\\goldD\",\"\\\\goldE\",\"\\\\redA\",\"\\\\redB\",\"\\\\redC\",\"\\\\redD\",\"\\\\redE\",\"\\\\maroonA\",\"\\\\maroonB\",\"\\\\maroonC\",\"\\\\maroonD\",\"\\\\maroonE\",\"\\\\purpleA\",\"\\\\purpleB\",\"\\\\purpleC\",\"\\\\purpleD\",\"\\\\purpleE\",\"\\\\mintA\",\"\\\\mintB\",\"\\\\mintC\",\"\\\\grayA\",\"\\\\grayB\",\"\\\\grayC\",\"\\\\grayD\",\"\\\\grayE\",\"\\\\grayF\",\"\\\\grayG\",\"\\\\grayH\",\"\\\\grayI\",\"\\\\kaBlue\",\"\\\\kaGreen\",\"\\\\ce\"]\n"
  },
  {
    "path": "packages/rebber-plugins/src/preprocessors/mathEscape.js",
    "content": "const katexConstants = require('../../src/preprocessors/katexConstants.json')\n\nconst endOfCommandChars = ['\\\\', '[', ']', '{', '}', ' ', '(', ')', '\\t', '\\n', '^', '_', ',']\n\nfunction isEndOfCommand (nodeLine, index) {\n  if (index >= nodeLine.length) {\n    return true\n  }\n\n  return endOfCommandChars.includes(nodeLine.charAt(index))\n}\n\nmodule.exports = () => node => {\n  let commandStart = node.value.indexOf('\\\\')\n\n  while (commandStart !== -1) {\n    // Eat leading backslashes (at most two)\n    let leadSlashes = 1\n    let isSlash = (node.value.charAt(commandStart + leadSlashes) === '\\\\')\n\n    while (isSlash && leadSlashes < 2) {\n      isSlash = (node.value.charAt(commandStart + leadSlashes) === '\\\\')\n      leadSlashes++\n    }\n\n    let currentCommand = ''\n    // Find end of command\n    let potentialEnd = leadSlashes + commandStart\n\n    while (!isEndOfCommand(node.value, potentialEnd)) {\n      currentCommand += node.value.charAt(potentialEnd)\n      potentialEnd++\n    }\n    // if we just had a \\{ or \\, for example\n    if (currentCommand === '' && potentialEnd < node.value.length &&\n      katexConstants.includes(`\\\\${node.value.charAt(potentialEnd)}`)) {\n      currentCommand = node.value.charAt(potentialEnd)\n    }\n\n    // Check for unknown commands\n    const slashedCommand = '\\\\'.repeat(leadSlashes).concat(currentCommand)\n    const commandLength = slashedCommand.length\n\n    if (!katexConstants.includes(slashedCommand)) {\n      const beforeCommand = node.value.substring(0, commandStart)\n      const afterCommand = node.value.substring(commandStart + commandLength, node.value.length)\n\n      node.value = `${beforeCommand} ${afterCommand}`\n      // As we changed the command we need to restart from the beginning\n      potentialEnd = 1\n    }\n\n    commandStart = node.value.indexOf('\\\\', potentialEnd)\n  }\n\n  // Check count of brackets\n  const openingBracesCount = (node.value.match(/(?<!\\\\){/g) || []).length\n  const closingBracesCount = (node.value.match(/(?<!\\\\)}/g) || []).length\n  const bracesDelta = closingBracesCount - openingBracesCount\n\n  if (bracesDelta < 0) {\n    node.value += '}'.repeat(-bracesDelta)\n  } else if (bracesDelta > 0) {\n    node.value = '{'.repeat(bracesDelta) + node.value\n  }\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/preprocessors/prepareQuizz.js",
    "content": "const clone = require('clone')\nconst visit = require('unist-util-visit')\n\nmodule.exports = processQuizzFactory\n\nfunction processQuizzFactory (ctx) {\n  const correctionTitle = ctx.correctionTitle || 'Correction'\n\n  return (node, index, parent) => {\n    if (node.children.length < 2 ||\n        !node.children[0].children ||\n        !node.children[1].children) {\n      return\n    }\n\n    node.type = 'neutralCustomBlock'\n\n    const correction = clone(node)\n    correction.type = 'sCustomBlock'\n    correction.children[0].children[0].value = correctionTitle\n\n    parent.children.splice(index + 1, 0, correction)\n    const bodyChildren = node.children[1].children\n\n    while (bodyChildren.length > 0 &&\n           bodyChildren[bodyChildren.length - 1].type !== 'list') {\n      bodyChildren.splice(bodyChildren.length - 1, 1)\n    }\n\n    visit(node, 'listItem', (itemNode) => {\n      itemNode.checked = null\n    })\n  }\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/preprocessors/spoilerFlatten.js",
    "content": "const visit = require('unist-util-visit')\n\nmodule.exports = (elemNames) =>\n  (_, tree) => {\n    // This should contain something like ['sCustomBlockBody', 'secretCustomBlockBody']\n    const elemNamesBody = elemNames.map(v => v.concat('Body'))\n\n    // Iterate over the elements to be flattened\n    for (const elemNameBody of elemNamesBody) {\n      visit(tree, elemNameBody, node => {\n        // Recursive function that flattens all matching elements and keeps the others\n        function flattenTree (blockTree) {\n          return blockTree.map(v => {\n            if (elemNames.includes(v.type)) {\n              // Get sCustomBlock > sCustomBlockBody > *\n              const newTree = v.children\n                .filter(v => elemNamesBody.includes(v.type))\n                // This is sub-optimal, but flatMap doesn't have good support by now\n                .reduce((acc, e) => acc.concat(e.children), [])\n\n              // First level of recursion: on direct descendents\n              return flattenTree(newTree)\n            } else {\n              // Second level of recursion: on indirect descendents\n              if (v.children) {\n                v.children = flattenTree(v.children)\n              }\n\n              return v\n            }\n          }).reduce((acc, e) => acc.concat(e), [])\n        }\n\n        // First round on direct children\n        node.children = flattenTree(node.children)\n      })\n    }\n  }\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/abbr.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\nconst escape = require('rebber/dist/escaper')\n\n/* Expose. */\nmodule.exports = abbrPlugin\n\nfunction abbrPlugin (ctx, node) {\n  const abbr = all(ctx, node)\n  const reference = escape(node.reference)\n\n  if (ctx.abbr && typeof ctx.abbr === 'function') {\n    return ctx.abbr(abbr, reference)\n  }\n\n  return `\\\\abbr{${abbr}}{${reference}}`\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/align.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\n\n/* Expose. */\nmodule.exports = align\n\nconst defaultMacros = {\n  leftAligned: (innerText) => `\\n\\n${innerText}\\n\\n`,\n  centerAligned: (innerText) => `\\n{\\\\centering ${innerText}}\\n`,\n  rightAligned: (innerText) => `\\n{\\\\raggedleft\\n${innerText}}\\n`,\n  defaultType: (innerText, type) => `\\n\\\\begin{${type}}\\n${innerText}\\n\\\\end{${type}}\\n`\n}\n\nfunction align (ctx, node) {\n  const macro = ctx[node.type] || defaultMacros[node.type] || defaultMacros.defaultType\n  const innerText = all(ctx, node)\n  return macro(innerText, node.type)\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/appendix.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\nconst clone = require('clone')\n\n/* Expose. */\nmodule.exports = appendixPlugin\n\nfunction definitionMacro (ctx, identifier, url) {\n  return `\\\\label{${identifier}}${url}`\n}\n\nfunction appendixPlugin (ctx, node) {\n  if (node.children.length === 0) {\n    return ''\n  }\n  const overriddenCtx = clone(ctx)\n  overriddenCtx.definition = definitionMacro\n  const innerText = all(overriddenCtx, node)\n  return `\\\\begin{appendices}\\n${innerText.trimEnd()}\\n\\\\end{appendices}`\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/comments.js",
    "content": "/* Expose. */\nmodule.exports = comments\n\n/* Stringify a comments `node`. */\nfunction comments (ctx, node) {\n  return `\\\\begin{comment}\\n${node.data.comment}\\n\\\\end{comment}\\n`\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/conclusion.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\n\n/* Expose. */\nmodule.exports = conclusion\n\nconst conclusionMacros = [\n  content => `\\\\begin{LevelOneConclusion}\\n${content}\\n\\\\end{LevelOneConclusion}`,\n  content => `\\\\begin{LevelTwoConclusion}\\n${content}\\n\\\\end{LevelTwoConclusion}`,\n  content => `\\\\begin{LevelThreeConclusion}\\n${content}\\n\\\\end{LevelThreeConclusion}`\n]\n\n/* Stringify an conclusion `node`. */\nfunction conclusion (ctx, node) {\n  const level = node.data.level || 0\n  const macro = ctx[node.type] || conclusionMacros[level]\n  const innerText = all(ctx, node)\n\n  return `${macro(innerText.trim())}\\n\\n`\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/customBlocks.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\n\n/* Expose. */\nmodule.exports = customBlock\n\nconst defaultMacros = {\n  defaultBlock: (environmentName, blockTitle, blockContent) => {\n    return `\\\\begin{${environmentName}}${blockTitle ? `[{{${blockTitle}}}]` : ''}` +\n      `\\n${blockContent}` +\n      `\\n\\\\end{${environmentName}}\\n`\n  }\n}\n\nfunction customBlock (ctx, node) {\n  const blockMacro = ctx[node.type] || defaultMacros[node.type] || defaultMacros.defaultBlock\n\n  let blockTitle = ''\n  if (node.children && node.children.length) {\n    if (node.children[0].type.endsWith('CustomBlockHeading')) {\n      const titleNode = node.children.splice(0, 1)[0]\n      blockTitle = all(ctx, titleNode).trim()\n    }\n  }\n\n  node.children[0].type = 'paragraph'\n\n  const blockContent = all(ctx, node).trim()\n  const options = ctx.customBlocks || {}\n\n  let environmentName\n  const type = node.type.replace('CustomBlock', '')\n\n  if (options.map && options.map[type]) {\n    environmentName = options.map[type]\n  } else {\n    environmentName = type[0].toUpperCase() + type.substring(1)\n  }\n\n  return blockMacro(environmentName, blockTitle, blockContent)\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/emoticon.js",
    "content": "/* Dependencies. */\nconst has = require('has')\n\n/* Expose. */\nmodule.exports = emoticon\n\n/* Stringify an emoticon `node`. */\nfunction emoticon (ctx, node) {\n  const code = node.value\n  if (!ctx.emoticons.emoticons || !has(ctx.emoticons.emoticons, code)) return\n\n  return `\\\\smiley{${ctx.emoticons.emoticons[code]}}`\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/figure.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\nconst one = require('rebber/dist/one')\nconst defaultCodeStringifier = require('rebber/dist/types/code').macro\nconst has = require('has')\n\n/* Expose. */\nmodule.exports = figure\n\nconst defaultMacros = {\n  blockquote: (_, innerText, caption = 'Anonymous') =>\n    `\\\\begin{Quotation}[${caption}]\\n${innerText}\\n\\\\end{Quotation}\\n\\n`,\n  code: (ctx, code, caption, extra) => {\n    const codeStringifier = (has(ctx, 'code') && ctx.code) || defaultCodeStringifier\n\n    // Remove the two last line feed\n    const rebberCode = codeStringifier(code, extra.language, extra.others).slice(0, -2)\n    return `${rebberCode}\\n\\\\captionof{listing}{${caption}}\\n\\n`\n  },\n  image: (_1, _2, caption, extra) =>\n    '\\\\begin{center}\\n' +\n    `\\\\includegraphics${extra.width ? `[${extra.width}]` : ''}{${extra.url}}\\n` +\n    `\\\\captionof{figure}{${caption}}\\n` +\n    '\\\\end{center}\\n'\n}\n\nconst makeExtra = {\n  blockquote: node => {},\n  code: (node) => {\n    return {\n      language: node.lang || 'text',\n      others: node.meta\n    }\n  },\n  image: node => ({ url: node.url, width: '\\\\linewidth' })\n}\n\n/* Stringify a Figure `node`. */\nfunction figure (ctx, node, index, parent) {\n  const type = node.children[0].type\n  const macro = (has(ctx, 'figure') && has(ctx.figure, type) && ctx.figure[type]) ||\n    (has(defaultMacros, type) && defaultMacros[type])\n\n  let caption = ''\n  if (node.children.length) {\n    caption = node.children\n      .filter(captionNode => captionNode.type === 'figcaption')\n      .map(captionNode => all(ctx, captionNode))\n      .join('')\n  }\n\n  node.caption = caption // allows to add caption to the default processing\n  if (!macro) {\n    node.children[0].caption = caption\n    return one(ctx, node.children[0], 0, node)\n  }\n\n  const wrappedNode = node.children[0]\n  wrappedNode.caption = node.caption\n\n  node.children = node.children.filter(node => node.type !== 'figcaption')\n  if (node.children.length === 1) {\n    node.children = node.children[0].children\n  }\n\n  const extra = has(makeExtra, type) ? makeExtra[type](wrappedNode) : undefined\n  const innerText = all(ctx, node) || node.value || ''\n\n  return macro(ctx, innerText.trim(), caption, extra)\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/footnote.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\n\n/* Expose. */\nmodule.exports = notes\n\nconst defaultMacro = (identifier, text, protect) => {\n  const footnote = `${protect ? '\\\\protect' : ''}\\\\footnote[${identifier}]{${text}}`\n\n  return footnote\n}\n\nfunction autoId (node) {\n  const { line, column, offset } = node.position.start\n  return `l${line}c${column}o${offset}`\n}\n\n/* Stringify a footnote `node`. */\nfunction notes (ctx, node) {\n  const macro = ctx.footnote || defaultMacro\n  const protect = Boolean(node.commandProtect)\n\n  const identifier = autoId(node)\n\n  return macro(identifier, all(ctx, node).trim(), protect)\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/footnoteDefinition.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\n\n/* Expose. */\nmodule.exports = notes\n\nconst defaultMacro = (identifier, text, protect) =>\n  `${protect ? '\\\\protect' : ''}\\\\footnotetext[${identifier}]{${text}}`\n\nfunction notes (ctx, node) {\n  const macro = ctx.footnoteDefinition || defaultMacro\n  const protect = Boolean(node.commandProtect)\n\n  return macro(node.identifier, all(ctx, node).trim(), protect)\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/footnoteReference.js",
    "content": "/* Expose. */\nmodule.exports = notes\n\nconst defaultMacro = (identifier, protect) =>\n  `\\\\textsuperscript{${protect ? '\\\\protect' : ''}\\\\footnotemark[${identifier}]}`\n\nfunction notes (ctx, node) {\n  const macro = ctx.footnoteReference || defaultMacro\n  const protect = Boolean(node.commandProtect)\n\n  return macro(node.identifier, protect)\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/gridTable.js",
    "content": "/* Dependencies. */\nconst clone = require('clone')\n\nconst tableCell = require('rebber/dist/types/tableCell')\nconst tableRow = require('rebber/dist/types/tableRow')\nconst table = require('rebber/dist/types/table')\nconst text = require('rebber/dist/types/text')\nconst paragraph = require('rebber/dist/types/paragraph')\n\n/* Expose. */\nmodule.exports = gridTable\n\nclass MultiRowLine {\n  constructor (startRow, endRow, startCell, endCell, colSpan, endOfLine) {\n    this.multilineCounter = endRow - startRow\n    this.startCell = startCell\n    this.endCell = endCell\n    this.colSpan = colSpan\n    this.endOfLine = endOfLine\n  }\n\n  getCLine () {\n    let startCLine = 1\n    let endCLine = this.startCell - 1\n    // case where the multi row line is at the start of the table\n    if (this.startCell === 1) {\n      startCLine = this.startCell + this.colSpan\n      endCLine = this.endOfLine\n    } else if (this.startCell > 1 && (this.startCell + this.colSpan) < this.endOfLine) {\n      // case where the multi row line is in the middle of the table\n      const clineBefore = `\\\\cline{1-${this.startCell - 1}}`\n      const clineAfter = `\\\\cline{${this.startCell + this.colSpan}-${this.endOfLine}}`\n      return `${clineBefore} ${clineAfter}`\n    }\n    return `\\\\cline{${startCLine}-${endCLine}}`\n  }\n}\n\nclass GridTableStringifier {\n  constructor () {\n    this.lastMultiRowLine = null\n    this.currentSpan = 0\n    this.rowIndex = 0\n    this.colIndex = 0\n    this.multiLineCellIndex = 0\n    this.colSpan = 1\n    this.nbOfColumns = 0\n  }\n\n  gridTableCell (ctx, node) {\n    const overriddenCtx = clone(ctx)\n    this.colIndex++\n    overriddenCtx.tableCell = undefined\n    // we have to replace \\n by \\endgraf only in text node, not in other\n    // see #352\n    overriddenCtx.overrides.text = (c, n, index, parent) => text(c, n, index, parent)\n      .replace(/\\n/g, ' \\\\endgraf ')\n    overriddenCtx.overrides.paragraph = (c, n) => `${paragraph(c, n).trim()} \\\\endgraf \\\\endgraf `\n    let baseText = tableCell(overriddenCtx, node).trim()\n    while (baseText.substring(baseText.length - '\\\\endgraf'.length) === '\\\\endgraf') {\n      baseText = baseText.substring(0, baseText.length - '\\\\endgraf'.length).trim()\n    }\n    if (node.data && node.data.hProperties.rowSpan > 1) {\n      this.currentSpan = node.data.hProperties.rowSpan\n      this.multiLineCellIndex = this.colIndex\n      baseText = `\\\\SetCell[r=${this.currentSpan}]{l} ${baseText}`\n      this.colSpan = node.data.hProperties.colSpan > 1 ? node.data.hProperties.colSpan : 1\n    } else if (node.data && node.data.hProperties.colSpan > 1) {\n      const colSpan = node.data.hProperties.colSpan\n      baseText = `\\\\SetCell[c=${colSpan}]{l} ${baseText}`\n    }\n\n    if (node.data && node.data.hProperties.colSpan > 1) {\n      this.colIndex -= 1\n      this.colIndex += node.data.hProperties.colSpan\n    }\n\n    return baseText\n  }\n\n  gridTableRow (ctx, node, index) {\n    const overriddenCtx = clone(ctx)\n    overriddenCtx.tableRow = undefined\n\n    this.rowIndex++\n\n    const extraCell = {\n      type: 'tableCell',\n      children: [{\n        type: 'paragraph',\n        children: [{\n          type: 'text',\n          value: ' '\n        }]\n      }]\n    }\n\n    // Duplicate cells with colSpan greater than one\n    for (let i = 0; i < node.children.length; i++) {\n      if (!node.children[i].data) continue\n\n      const colSpan = node.children[i].data.hProperties.colSpan\n      if (!colSpan || colSpan <= 1) continue\n\n      for (let j = 0; j < colSpan - 1; j++) {\n        node.children.splice(i + 1, 0, extraCell)\n      }\n    }\n\n    if (this.previousRowWasMulti()) {\n      const lastMultiRowline = this.flushMultiRowLineIfNeeded()\n\n      for (let i = 0; i < lastMultiRowline.colSpan; i++) {\n        node.children.splice(lastMultiRowline.startCell - 1, 0, extraCell)\n      }\n\n      this.colIndex = 0\n      let rowStr = tableRow(overriddenCtx, node, index)\n      if (lastMultiRowline.multilineCounter > 0) {\n        rowStr = rowStr.replace(/\\\\hline/, lastMultiRowline.getCLine())\n      }\n      this.colIndex = 0\n      return rowStr\n    }\n\n    let rowText = tableRow(overriddenCtx, node, index)\n    if (this.currentSpan !== 0) {\n      this.lastMultiRowLine = new MultiRowLine(\n        this.rowIndex,\n        this.rowIndex + this.currentSpan + (-1),\n        this.multiLineCellIndex,\n        this.colIndex + this.colSpan,\n        this.colSpan,\n        this.colIndex\n      )\n      rowText = rowText.replace(/\\\\hline/, this.lastMultiRowLine.getCLine())\n    }\n    this.currentSpan = 0\n    if (this.colIndex >= this.nbOfColumns) {\n      this.nbOfColumns = this.colIndex\n    }\n    this.colIndex = 0\n    return rowText\n  }\n\n  flushMultiRowLineIfNeeded () {\n    if (!this.lastMultiRowLine) {\n      return null\n    }\n    const row = this.lastMultiRowLine\n    if (row.multilineCounter >= 1) {\n      row.multilineCounter--\n    }\n    if (row.multilineCounter === 0) {\n      this.lastMultiRowLine = null\n    }\n    return row\n  }\n\n  gridTableheaderCounter (node) {\n    const tableHeaders = node.children\n      .filter(n => n.data && n.data.hName === 'thead')\n\n    return tableHeaders.length >= 1 ? tableHeaders[0].children.length : 0\n  }\n\n  gridTableHeaderParse () {\n    return ' X[-1]'.repeat(this.nbOfColumns).substring(1)\n  }\n\n  previousRowWasMulti () {\n    return this.lastMultiRowLine !== null\n  }\n}\n\nfunction gridTable (ctx, node) {\n  const overriddenCtx = clone(ctx)\n  const stringifier = new GridTableStringifier()\n  // Inside tables, `\\\\\\\\` won't work\n  overriddenCtx.break = () => ' \\\\endgraf'\n  overriddenCtx.tableCell = stringifier.gridTableCell.bind(stringifier)\n  overriddenCtx.tableRow = stringifier.gridTableRow.bind(stringifier)\n  overriddenCtx.headerCounter = stringifier.gridTableheaderCounter.bind(stringifier)\n  overriddenCtx.headerParse = stringifier.gridTableHeaderParse.bind(stringifier)\n\n  overriddenCtx.image = overriddenCtx.image ? overriddenCtx.image : {}\n  overriddenCtx.image.inlineMatcher = () => true\n\n  return table(overriddenCtx, node).replace(/\\\\number-of-column/gm, stringifier.nbOfColumns)\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/introduction.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\n\n/* Expose. */\nmodule.exports = introduction\n\nconst introductionMacros = [\n  content => `\\\\begin{LevelOneIntroduction}\\n${content}\\n\\\\end{LevelOneIntroduction}`,\n  content => `\\\\begin{LevelTwoIntroduction}\\n${content}\\n\\\\end{LevelTwoIntroduction}`,\n  content => `\\\\begin{LevelThreeIntroduction}\\n${content}\\n\\\\end{LevelThreeIntroduction}`\n]\n\n/* Stringify an introduction `node`. */\nfunction introduction (ctx, node) {\n  const level = node.data.level || 0\n  const macro = ctx[node.type] || introductionMacros[level]\n  const innerText = all(ctx, node)\n\n  return `${macro(innerText.trim())}\\n\\n`\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/kbd.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\n\n/* Expose. */\nmodule.exports = kbd\n\n/* Stringify a kbd `node`. */\nfunction kbd (ctx, node) {\n  const contents = all(ctx, node)\n\n  return `\\\\keys{${contents}}`\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/math.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\nconst has = require('has')\n\n/* Expose. */\nmodule.exports = math\n\nconst defaultMacros = {\n  inlineMath: (content) => `$${content}$`,\n  inlineMathDouble: (content) => `$$${content}$$`,\n  math: (content) => `\\\\[ ${content} \\\\]\\n\\n`\n}\n\n/* Stringify a Figure `node`. */\nfunction math (ctx, node, index, parent) {\n  let type = 'math'\n  if (node.type === 'inlineMath') {\n    try {\n      const classes = node.data.hProperties.className\n      type = classes.includes('math-display') ? 'inlineMathDouble' : 'inlineMath'\n    } catch (e) {\n      console.error(e, 'This rebber math plugin is only compatible with remark-math.')\n    }\n  }\n\n  const macro = (has(ctx, 'math') && has(ctx.math, type) && ctx.math[type]) ||\n    (has(defaultMacros, type) && defaultMacros[type])\n\n  const content = all(ctx, node) || node.value || ''\n  return macro(content.trim())\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/ping.js",
    "content": "/* Expose. */\nmodule.exports = ping\n\n/* Stringify a `ping` node. */\nfunction ping (_, node) {\n  return `\\\\ping{${node.username}}`\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/sub.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\n\n/* Expose. */\nmodule.exports = sub\n\n/* Stringify a sub `node`. */\nfunction sub (ctx, node, index, parent) {\n  const contents = all(ctx, node)\n\n  return `\\\\textsubscript{${contents}}`\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/sup.js",
    "content": "/* Dependencies. */\nconst all = require('rebber/dist/all')\n\n/* Expose. */\nmodule.exports = sup\n\n/* Stringify a sup `node`. */\nfunction sup (ctx, node, index, parent) {\n  const contents = all(ctx, node)\n\n  return `\\\\textsuperscript{${contents}}`\n}\n"
  },
  {
    "path": "packages/rebber-plugins/src/type/tableHeader.js",
    "content": "module.exports = (ctx, node, index, parent) => {\n  const one = require('rebber/dist/one')\n  if (ctx.tableHeader) {\n    return ctx.tableHeader(node.value)\n  }\n  if (index === 0 && parent.children.length > 1) {\n    // if we are on first header row we do not want to switch back to\n    // font of normal serie\n    return node.children.map((n, childIndex) => one(ctx, n, childIndex === 0 ? 0 : 2, node))\n      .join('')\n  }\n  const parsed = node.children.map((n, childIndex) => one(ctx, n, index + childIndex, node))\n  return parsed.join('')\n}\n"
  },
  {
    "path": "packages/rehype-footnotes-title/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/rehype-footnotes-title/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/rehype-footnotes-title/README.md",
    "content": "This plugin adds a `title` attribute to the footnote links, mainly for accessibility purpose.\n\n```diff\n <div class=\"footnotes\">\n   <hr>\n   <ol>\n     <li id=\"fn-1\">\n       <p>Some clever joke</p>\n-       <a href=\"#fnref-1\" class=\"footnote-backref\">↩</a>\n+       <a href=\"#fnref-1\" class=\"footnote-backref\" title=\"Jump to reference\">↩</a>\n     </li>\n   </ol>\n </div>\n```\n\nUsage:\n\n* `.use(footnotesTitles, 'Jump to reference')`\n* `.use(footnotesTitles, 'Going back to footnote with id $id')`\n* If `$id` is found in the string, it gets replaced with the footnote identifier.\n"
  },
  {
    "path": "packages/rehype-footnotes-title/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`renders correctly with first config 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more<sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>.</p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<p>Second line of first paragraph.\nAnd then third...</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Foo bar 1\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Foo bar 2\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Foo bar 3\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Foo bar 4\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of the footnote : nice!<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Foo bar 5\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`renders correctly with second config 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more<sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>.</p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<p>Second line of first paragraph.\nAnd then third...</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Baz 1 qux?\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Baz 2 qux?\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Baz 3 qux?\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Baz 4 qux?\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of the footnote : nice!<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Baz 5 qux?\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`renders correctly without config 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more<sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>.</p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<p>Second line of first paragraph.\nAnd then third...</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"1\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"2\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"3\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"4\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of the footnote : nice!<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"5\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n"
  },
  {
    "path": "packages/rehype-footnotes-title/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport footnotes from 'remark-footnotes'\nimport stringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\nimport footnotesTitle from '../src/'\n\nconst render = config => unified()\n  .use(reParse)\n  .use(remark2rehype)\n  .use(footnotes, {inlineNotes: true})\n  .use(footnotesTitle, config)\n  .use(stringify)\n  .processSync(dedent`\n    This is the body with a footnote[^1] or two[^2] or more[^3] [^4] [^5].\n\n    Also a reference that does not exist[^6].\n\n    [^1]: Footnote that ends with a list:\n\n        * item 1\n        * item 2\n\n    [^2]: > This footnote is a blockquote.\n\n    [^3]: A simple oneliner.\n\n    [^4]: A footnote with multiple paragraphs.\n\n        Paragraph two.\n\n    [^5]: First line of first paragraph.\n    Second line of the footnote : nice!\n\n    Second line of first paragraph.\n    And then third...\n  `)\n\nit('renders correctly with first config', () => {\n  const {contents} = render('Foo bar $id')\n  expect(contents).toMatchSnapshot()\n})\n\nit('renders correctly with second config', () => {\n  const {contents} = render('Baz $id qux?')\n  expect(contents).toMatchSnapshot()\n})\n\nit('renders correctly without config', () => {\n  const {contents} = render()\n  expect(contents).toMatchSnapshot()\n})\n"
  },
  {
    "path": "packages/rehype-footnotes-title/dist/index.js",
    "content": "\"use strict\";\n\nconst visit = require('unist-util-visit');\nfunction findLastTag(node, tag = 'p') {\n  if (!node.children || !node.children.length) return;\n  const links = node.children.filter(e => e.tagName === tag);\n  if (!links.length) return;\n  return links[links.length - 1];\n}\nfunction findLastLink(node, className) {\n  if (!node.children || !node.children.length) return;\n  const links = node.children.filter(e => e.tagName === 'a');\n  if (!links.length) return;\n  const aTag = links[links.length - 1];\n  if (!aTag.properties || !aTag.properties.className || !aTag.properties.className.includes(className)) return;\n  return aTag;\n}\nfunction plugin(title = '') {\n  function transformer(tree) {\n    visit(tree, 'element', visitor);\n  }\n  function visitor(node, index, parent) {\n    if (node.tagName === 'li' && node.properties.id) {\n      if (!node.children || !node.children.length) return;\n      let aTag = findLastLink(node, 'footnote-backref');\n      if (!aTag) {\n        const pTag = findLastTag(node, 'p');\n        aTag = findLastLink(pTag, 'footnote-backref');\n      }\n      if (!aTag) return;\n      const identifier = node.properties.id.slice(3);\n      const placeholderIndex = title.indexOf('$id');\n      let thisTitle;\n      if (placeholderIndex !== -1) {\n        thisTitle = title.split('');\n        thisTitle.splice(placeholderIndex, 3, identifier);\n        thisTitle = thisTitle.join('');\n      }\n      if (!thisTitle) thisTitle = identifier;\n      aTag.properties.title = thisTitle;\n    }\n  }\n  return transformer;\n}\nmodule.exports = plugin;"
  },
  {
    "path": "packages/rehype-footnotes-title/package.json",
    "content": "{\n  \"name\": \"rehype-footnotes-title\",\n  \"version\": \"2.0.1\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/rehype-footnotes-title\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"unist-util-visit\": \"^2.0.3\"\n  }\n}\n"
  },
  {
    "path": "packages/rehype-footnotes-title/src/index.js",
    "content": "const visit = require('unist-util-visit')\n\nfunction findLastTag (node, tag = 'p') {\n  if (!node.children || !node.children.length) return\n  const links = node.children.filter(e => e.tagName === tag)\n  if (!links.length) return\n  return links[links.length - 1]\n}\nfunction findLastLink (node, className) {\n  if (!node.children || !node.children.length) return\n  const links = node.children.filter(e => e.tagName === 'a')\n  if (!links.length) return\n  const aTag = links[links.length - 1]\n  if (!aTag.properties || !aTag.properties.className ||\n    !aTag.properties.className.includes(className)) return\n  return aTag\n}\n\nfunction plugin (title = '') {\n  function transformer (tree) {\n    visit(tree, 'element', visitor)\n  }\n\n  function visitor (node, index, parent) {\n    if (node.tagName === 'li' && node.properties.id) {\n      if (!node.children || !node.children.length) return\n      let aTag = findLastLink(node, 'footnote-backref')\n\n      if (!aTag) {\n        const pTag = findLastTag(node, 'p')\n        aTag = findLastLink(pTag, 'footnote-backref')\n      }\n\n      if (!aTag) return\n\n      const identifier = node.properties.id.slice(3)\n      const placeholderIndex = title.indexOf('$id')\n      let thisTitle\n\n      if (placeholderIndex !== -1) {\n        thisTitle = title.split('')\n        thisTitle.splice(placeholderIndex, 3, identifier)\n        thisTitle = thisTitle.join('')\n      }\n      if (!thisTitle) thisTitle = identifier\n      aTag.properties.title = thisTitle\n    }\n  }\n  return transformer\n}\n\nmodule.exports = plugin\n"
  },
  {
    "path": "packages/rehype-html-blocks/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/rehype-html-blocks/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/rehype-html-blocks/README.md",
    "content": "This plugin wraps (multi-line) raw HTML in `p`. See fixtures for example behavior.\n"
  },
  {
    "path": "packages/rehype-html-blocks/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should process inline html with rehype-html-blocks 1`] = `\n\"<p>Here's a simple block:</p>\n<p>&#x3C;div>\n  foo\n&#x3C;/div></p>\n<p>This should be a code block, though:</p>\n<p>  &#x3C;div>\n    foo\n  &#x3C;/div></p>\n<p>As should this:</p>\n<p>  &#x3C;div>foo&#x3C;/div></p>\n<p>Now, nested:</p>\n<p>&#x3C;div>\n  &#x3C;div>\n    &#x3C;div>\n      foo\n    &#x3C;/div>\n  &#x3C;/div>\n&#x3C;/div></p>\n<p>This should just be an HTML comment:</p>\n<p>&#x3C;!-- Comment --></p>\n<p>Multiline:</p>\n<p>&#x3C;!--\nBlah\nBlah\n--></p>\n<p>Code block:</p>\n<p>  &#x3C;!-- Comment --></p>\n<p>Just plain comment, with trailing spaces on the line:</p>\n<p>&#x3C;!-- foo --></p>\n<p>Code:</p>\n<p>  &#x3C;hr /></p>\n<p>Hr's:</p>\n<p>&#x3C;hr></p>\n<p>&#x3C;hr/></p>\n<p>&#x3C;hr /></p>\n<p>&#x3C;hr></p>\n<p>&#x3C;hr/></p>\n<p>&#x3C;hr /></p>\n<p>&#x3C;hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" /></p>\n<p>&#x3C;hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\"/></p>\n<p>&#x3C;hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" ></p>\n<p>&#x3C;some <a href=\\\\\"http://example.com\\\\\">weird</a> stuff></p>\"\n`;\n\nexports[`should process inline html without rehype-html-blocks 1`] = `\n\"<p>Here's a simple block:</p>\n&#x3C;div>\n  foo\n&#x3C;/div>\n<p>This should be a code block, though:</p>\n  &#x3C;div>\n    foo\n  &#x3C;/div>\n<p>As should this:</p>\n<p>  &#x3C;div>foo&#x3C;/div></p>\n<p>Now, nested:</p>\n&#x3C;div>\n  &#x3C;div>\n    &#x3C;div>\n      foo\n    &#x3C;/div>\n  &#x3C;/div>\n&#x3C;/div>\n<p>This should just be an HTML comment:</p>\n&#x3C;!-- Comment -->\n<p>Multiline:</p>\n&#x3C;!--\nBlah\nBlah\n-->\n<p>Code block:</p>\n  &#x3C;!-- Comment -->\n<p>Just plain comment, with trailing spaces on the line:</p>\n&#x3C;!-- foo -->\n<p>Code:</p>\n  &#x3C;hr />\n<p>Hr's:</p>\n&#x3C;hr>\n&#x3C;hr/>\n&#x3C;hr />\n&#x3C;hr>\n&#x3C;hr/>\n&#x3C;hr />\n&#x3C;hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" />\n&#x3C;hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\"/>\n&#x3C;hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" >\n<p>&#x3C;some <a href=\\\\\"http://example.com\\\\\">weird</a> stuff></p>\"\n`;\n\nexports[`should process multi-line tags with rehype-html-blocks 1`] = `\n\"<p>&#x3C;div></p>\n<p>asdf asdfasd</p>\n<p>&#x3C;/div></p>\n<p>&#x3C;div></p>\n<p>foo bar</p>\n<p>&#x3C;/div>\nNo blank line.</p>\"\n`;\n\nexports[`should process multi-line tags without rehype-html-blocks 1`] = `\n\"&#x3C;div>\n<p>asdf asdfasd</p>\n&#x3C;/div>\n&#x3C;div>\n<p>foo bar</p>\n&#x3C;/div>\nNo blank line.\"\n`;\n\nexports[`should process simple div with rehype-html-blocks 1`] = `\n\"<p>&#x3C;div id=\\\\\"sidebar\\\\\"></p>\n<p>   <em>foo</em></p>\n<p>&#x3C;/div></p>\n<p>And now in uppercase:</p>\n<p>&#x3C;DIV>\nfoo\n&#x3C;/DIV></p>\"\n`;\n\nexports[`should process simple div without rehype-html-blocks 1`] = `\n\"&#x3C;div id=\\\\\"sidebar\\\\\">\n<p>   <em>foo</em></p>\n&#x3C;/div>\n<p>And now in uppercase:</p>\n&#x3C;DIV>\nfoo\n&#x3C;/DIV>\"\n`;\n\nexports[`should render the same with rehype-html-blocks 1`] = `\n\"<p><strong>&#x3C;DIV>\nfoo\n&#x3C;/DIV></strong></p>\"\n`;\n\nexports[`should render the same without rehype-html-blocks 1`] = `\n\"<p><strong>&#x3C;DIV>\nfoo\n&#x3C;/DIV></strong></p>\"\n`;\n"
  },
  {
    "path": "packages/rehype-html-blocks/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport rehypeStringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\n\nimport htmlBlocks from '../src/'\n\nconst render = (use, text) => unified()\n  .use(reParse, {\n    gfm: true,\n    commonmark: false,\n    footnotes: true,\n    /* sets list of known blocks to nothing, otherwise <h3>hey</h3> would become\n    &#x3C;h3>hey&#x3C;/h3> instead of <p>&#x3C;h3>hey&#x3C;/h3></p> */\n    blocks: [],\n  })\n  .use(remark2rehype, {allowDangerousHtml: true})\n  .use(use ? htmlBlocks : () => {})\n  .use(rehypeStringify)\n  .processSync(text)\n\nArray.from([[true, 'with'], [false, 'without']]).forEach(([use, str]) => {\n  it(`should process simple div ${str} rehype-html-blocks`, () => {\n    const {contents} = render(use, dedent`\n    <div id=\"sidebar\">\n\n       _foo_\n\n    </div>\n\n    And now in uppercase:\n\n    <DIV>\n    foo\n    </DIV>\n  `)\n\n    expect(contents).toMatchSnapshot()\n  })\n\n  it(`should process inline html ${str} rehype-html-blocks`, () => {\n    const {contents} = render(use, dedent`\n      Here's a simple block:\n\n      <div>\n        foo\n      </div>\n\n      This should be a code block, though:\n\n        <div>\n          foo\n        </div>\n\n      As should this:\n\n        <div>foo</div>\n\n      Now, nested:\n\n      <div>\n        <div>\n          <div>\n            foo\n          </div>\n        </div>\n      </div>\n\n      This should just be an HTML comment:\n\n      <!-- Comment -->\n\n      Multiline:\n\n      <!--\n      Blah\n      Blah\n      -->\n\n      Code block:\n\n        <!-- Comment -->\n\n      Just plain comment, with trailing spaces on the line:\n\n      <!-- foo -->\n\n      Code:\n\n        <hr />\n\n      Hr's:\n\n      <hr>\n\n      <hr/>\n\n      <hr />\n\n      <hr>\n\n      <hr/>\n\n      <hr />\n\n      <hr class=\"foo\" id=\"bar\" />\n\n      <hr class=\"foo\" id=\"bar\"/>\n\n      <hr class=\"foo\" id=\"bar\" >\n\n      <some [weird](http://example.com) stuff>\n    `)\n    expect(contents).toMatchSnapshot()\n  })\n\n  it(`should process multi-line tags ${str} rehype-html-blocks`, () => {\n    const {contents} = render(use, dedent`\n\n      <div>\n\n      asdf asdfasd\n\n      </div>\n\n      <div>\n\n      foo bar\n\n      </div>\n      No blank line.\n    `)\n    expect(contents).toMatchSnapshot()\n  })\n\n  it(`should render the same ${str} rehype-html-blocks`, () => {\n    const {contents} = render(use, dedent`\n      **<DIV>\n      foo\n      </DIV>**\n    `)\n    expect(contents).toMatchSnapshot()\n  })\n})\n"
  },
  {
    "path": "packages/rehype-html-blocks/dist/index.js",
    "content": "\"use strict\";\n\nconst visit = require('unist-util-visit');\nconst inline = ['a', 'b', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'cite', 'code', 'dfn', 'em', 'kbd', 'strong', 'samp', 'time', 'var', 'bdo', 'br', 'img', 'map', 'object', 'p', 'q', 'script', 'span', 'sub', 'sup', 'button', 'input', 'label', 'select', 'textarea'];\nfunction plugin() {\n  return transformer;\n}\nfunction transformer(tree) {\n  visit(tree, 'raw', visitor);\n}\nfunction visitor(node, index, parent) {\n  let replacement = {\n    type: 'text',\n    value: node.value\n  };\n  if (!inline.includes(parent.tagName)) {\n    replacement = {\n      type: 'element',\n      tagName: 'p',\n      properties: {},\n      children: [{\n        type: 'text',\n        value: node.value\n      }]\n    };\n  }\n  parent.children[index] = replacement;\n}\nmodule.exports = plugin;"
  },
  {
    "path": "packages/rehype-html-blocks/package.json",
    "content": "{\n  \"name\": \"rehype-html-blocks\",\n  \"version\": \"0.1.2\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/rehype-html-blocks\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"rehype\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"unist-util-visit\": \"^2.0.3\"\n  }\n}\n"
  },
  {
    "path": "packages/rehype-html-blocks/src/index.js",
    "content": "const visit = require('unist-util-visit')\n\nconst inline = [\n  'a',\n  'b',\n  'big',\n  'i',\n  'small',\n  'tt',\n  'abbr',\n  'acronym',\n  'cite',\n  'code',\n  'dfn',\n  'em',\n  'kbd',\n  'strong',\n  'samp',\n  'time',\n  'var',\n  'bdo',\n  'br',\n  'img',\n  'map',\n  'object',\n  'p',\n  'q',\n  'script',\n  'span',\n  'sub',\n  'sup',\n  'button',\n  'input',\n  'label',\n  'select',\n  'textarea'\n]\n\nfunction plugin () {\n  return transformer\n}\n\nfunction transformer (tree) {\n  visit(tree, 'raw', visitor)\n}\n\nfunction visitor (node, index, parent) {\n  let replacement = {\n    type: 'text',\n    value: node.value\n  }\n\n  if (!inline.includes(parent.tagName)) {\n    replacement = {\n      type: 'element',\n      tagName: 'p',\n      properties: {},\n      children: [{\n        type: 'text',\n        value: node.value\n      }]\n    }\n  }\n\n  parent.children[index] = replacement\n}\n\nmodule.exports = plugin\n"
  },
  {
    "path": "packages/rehype-postfix-footnote-anchors/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/rehype-postfix-footnote-anchors/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/rehype-postfix-footnote-anchors/README.md",
    "content": "# rehype-postfix-footnote-anchors [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\n\nThis [rehype][rehype] plugin appends a custom postfix to footnotes, or changes the anchors/IDs to/from footnotes.\n\nWhen you render several pieces of Markdown to HTML in a same webpage you might want to make sure that footnotes will not conflict between each piece of rendered HTML.\n\nFor instance:\n\n*\n    ```md\n    foo[^foo]\n\n    [^foo]: Footnote :)\n    ```\n*\n    ```md\n    bar[^foo]\n\n    [^foo]: Conflict?\n    ```\n\nRendering both of these will have the note next to `bar` link to `Footnote :)` instead of `Conflict?`, and `Conflict?` will have a link to go back to `foo` instead of `bar`.\n\nThis plugin plays well with [remark-numbered-footnotes](https://www.npmjs.com/package/remark-numbered-footnotes). Using `remark-numbered-footnotes` increases the risks of conflicts, hence the interest of postfixing footnote anchors.\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install rehype-postfix-footnote-anchors\n```\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst rehypePostfixFoonotes = require('rehype-postfix-footnote-anchors')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(reParse, {footnotes: true})\n  .use(remark2rehype)\n  .use(rehypePostfixFoonotes, postfix)\n  .use(stringify)\n```\n\n## Configuration\n\nIn the above **Usage** example, postfix can be one of two things:\n\n* a string: `postfix = '-my-postfix'`\n\n    `postfix` will be appended to the existing footnotes identifiers\n\n* a function: `postfix = (identifier: string): string => 'foo' + identifier + 'bar'`\n\n    `postfix` will be called with the footnote identifier and should return a string\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/rehype-postfix-footnote-anchors/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/rehype-postfix-footnote-anchors\n\n[rehype]: https://github.com/rehypejs/rehype\n"
  },
  {
    "path": "packages/rehype-postfix-footnote-anchors/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`{\"gfm\":false,\"commonmark\":false} footnote-split 1`] = `\n\"<p>a<sup id=\\\\\"fnref-first-postfix\\\\\"><a href=\\\\\"#fn-first-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">first</a></sup>b<sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>c<sup id=\\\\\"fnref-third-postfix\\\\\"><a href=\\\\\"#fn-third-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">third</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-first-postfix\\\\\">first def<a href=\\\\\"#fnref-first-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-1-postfix\\\\\">second def<a href=\\\\\"#fnref-1-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-third-postfix\\\\\">third def<a href=\\\\\"#fnref-third-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":false} footnotes 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup> or two<sup id=\\\\\"fnref-bar-postfix\\\\\"><a href=\\\\\"#fn-bar-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">bar</a></sup> or more <sup id=\\\\\"fnref-baz-postfix\\\\\"><a href=\\\\\"#fn-baz-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">baz</a></sup> <sup id=\\\\\"fnref-qux-postfix\\\\\"><a href=\\\\\"#fn-qux-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">qux</a></sup> <sup id=\\\\\"fnref-fiji-postfix\\\\\"><a href=\\\\\"#fn-fiji-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">fiji</a></sup>. One again: <sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-nope-postfix\\\\\"><a href=\\\\\"#fn-nope-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">nope</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-foo-postfix\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-foo-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-bar-postfix\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-bar-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-baz-postfix\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-baz-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-qux-postfix\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-qux-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-fiji-postfix\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-fiji-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":false} given postfix 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1-bar\\\\\"><a href=\\\\\"#fn-1-bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2-bar\\\\\"><a href=\\\\\"#fn-2-bar\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"fnref-3-bar\\\\\"><a href=\\\\\"#fn-3-bar\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4-bar\\\\\"><a href=\\\\\"#fn-4-bar\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5-bar\\\\\"><a href=\\\\\"#fn-5-bar\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"fnref-1-bar\\\\\"><a href=\\\\\"#fn-1-bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6-bar\\\\\"><a href=\\\\\"#fn-6-bar\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-bar\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2-bar\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3-bar\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4-bar\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5-bar\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":false} numbered footnotes 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2-postfix\\\\\"><a href=\\\\\"#fn-2-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"fnref-3-postfix\\\\\"><a href=\\\\\"#fn-3-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4-postfix\\\\\"><a href=\\\\\"#fn-4-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5-postfix\\\\\"><a href=\\\\\"#fn-5-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6-postfix\\\\\"><a href=\\\\\"#fn-6-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-postfix\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2-postfix\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3-postfix\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4-postfix\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5-postfix\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":false} postfixing function 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"foo--fnref-1--bar\\\\\"><a href=\\\\\"#foo--fn-1--bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"foo--fnref-2--bar\\\\\"><a href=\\\\\"#foo--fn-2--bar\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"foo--fnref-3--bar\\\\\"><a href=\\\\\"#foo--fn-3--bar\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"foo--fnref-4--bar\\\\\"><a href=\\\\\"#foo--fn-4--bar\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"foo--fnref-5--bar\\\\\"><a href=\\\\\"#foo--fn-5--bar\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"foo--fnref-1--bar\\\\\"><a href=\\\\\"#foo--fn-1--bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"foo--fnref-6--bar\\\\\"><a href=\\\\\"#foo--fn-6--bar\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"foo--fn-1--bar\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#foo--fnref-1--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-2--bar\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#foo--fnref-2--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-3--bar\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#foo--fnref-3--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-4--bar\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#foo--fnref-4--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-5--bar\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#foo--fnref-5--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":false} regression-1 1`] = `\n\"<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-foo-postfix\\\\\">MyNote<a href=\\\\\"#fnref-foo-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":false} regression-2 1`] = `\n\"<p>1 <sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>\n2 <sup id=\\\\\"fnref-2-postfix\\\\\"><a href=\\\\\"#fn-2-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup>\n3 <sup id=\\\\\"fnref-3-postfix\\\\\"><a href=\\\\\"#fn-3-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup>\n4 <sup id=\\\\\"fnref-w-postfix\\\\\"><a href=\\\\\"#fn-w-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">w</a></sup>\n4 <sup id=\\\\\"fnref-w-postfix\\\\\"><a href=\\\\\"#fn-w-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">w</a></sup>\n5 <sup id=\\\\\"fnref-4-postfix\\\\\"><a href=\\\\\"#fn-4-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-postfix\\\\\">alpha bravo one<a href=\\\\\"#fnref-1-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-2-postfix\\\\\">alpha bravo two<a href=\\\\\"#fnref-2-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-3-postfix\\\\\">alpha bravo third<a href=\\\\\"#fnref-3-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-w-postfix\\\\\">foo<a href=\\\\\"#fnref-w-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-4-postfix\\\\\">alpha bravo fourth<a href=\\\\\"#fnref-4-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} footnote-split 1`] = `\n\"<p>a<sup id=\\\\\"fnref-first-postfix\\\\\"><a href=\\\\\"#fn-first-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">first</a></sup>b<sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>c<sup id=\\\\\"fnref-third-postfix\\\\\"><a href=\\\\\"#fn-third-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">third</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-first-postfix\\\\\">first def<a href=\\\\\"#fnref-first-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-1-postfix\\\\\">second def<a href=\\\\\"#fnref-1-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-third-postfix\\\\\">third def<a href=\\\\\"#fnref-third-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} footnotes 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup> or two<sup id=\\\\\"fnref-bar-postfix\\\\\"><a href=\\\\\"#fn-bar-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">bar</a></sup> or more <sup id=\\\\\"fnref-baz-postfix\\\\\"><a href=\\\\\"#fn-baz-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">baz</a></sup> <sup id=\\\\\"fnref-qux-postfix\\\\\"><a href=\\\\\"#fn-qux-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">qux</a></sup> <sup id=\\\\\"fnref-fiji-postfix\\\\\"><a href=\\\\\"#fn-fiji-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">fiji</a></sup>. One again: <sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-nope-postfix\\\\\"><a href=\\\\\"#fn-nope-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">nope</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-foo-postfix\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-foo-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-bar-postfix\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-bar-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-baz-postfix\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-baz-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-qux-postfix\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-qux-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-fiji-postfix\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-fiji-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} given postfix 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1-bar\\\\\"><a href=\\\\\"#fn-1-bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2-bar\\\\\"><a href=\\\\\"#fn-2-bar\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"fnref-3-bar\\\\\"><a href=\\\\\"#fn-3-bar\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4-bar\\\\\"><a href=\\\\\"#fn-4-bar\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5-bar\\\\\"><a href=\\\\\"#fn-5-bar\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"fnref-1-bar\\\\\"><a href=\\\\\"#fn-1-bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6-bar\\\\\"><a href=\\\\\"#fn-6-bar\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-bar\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2-bar\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3-bar\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4-bar\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5-bar\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} numbered footnotes 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2-postfix\\\\\"><a href=\\\\\"#fn-2-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"fnref-3-postfix\\\\\"><a href=\\\\\"#fn-3-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4-postfix\\\\\"><a href=\\\\\"#fn-4-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5-postfix\\\\\"><a href=\\\\\"#fn-5-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6-postfix\\\\\"><a href=\\\\\"#fn-6-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-postfix\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2-postfix\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3-postfix\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4-postfix\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5-postfix\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} postfixing function 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"foo--fnref-1--bar\\\\\"><a href=\\\\\"#foo--fn-1--bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"foo--fnref-2--bar\\\\\"><a href=\\\\\"#foo--fn-2--bar\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"foo--fnref-3--bar\\\\\"><a href=\\\\\"#foo--fn-3--bar\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"foo--fnref-4--bar\\\\\"><a href=\\\\\"#foo--fn-4--bar\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"foo--fnref-5--bar\\\\\"><a href=\\\\\"#foo--fn-5--bar\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"foo--fnref-1--bar\\\\\"><a href=\\\\\"#foo--fn-1--bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"foo--fnref-6--bar\\\\\"><a href=\\\\\"#foo--fn-6--bar\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"foo--fn-1--bar\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#foo--fnref-1--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-2--bar\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#foo--fnref-2--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-3--bar\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#foo--fnref-3--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-4--bar\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#foo--fnref-4--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-5--bar\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#foo--fnref-5--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} regression-1 1`] = `\n\"<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-foo-postfix\\\\\">MyNote<a href=\\\\\"#fnref-foo-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} regression-2 1`] = `\n\"<p>1 <sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>\n2 <sup id=\\\\\"fnref-2-postfix\\\\\"><a href=\\\\\"#fn-2-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup>\n3 <sup id=\\\\\"fnref-3-postfix\\\\\"><a href=\\\\\"#fn-3-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup>\n4 <sup id=\\\\\"fnref-w-postfix\\\\\"><a href=\\\\\"#fn-w-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">w</a></sup>\n4 <sup id=\\\\\"fnref-w-postfix\\\\\"><a href=\\\\\"#fn-w-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">w</a></sup>\n5 <sup id=\\\\\"fnref-4-postfix\\\\\"><a href=\\\\\"#fn-4-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-postfix\\\\\">alpha bravo one<a href=\\\\\"#fnref-1-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-2-postfix\\\\\">alpha bravo two<a href=\\\\\"#fnref-2-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-3-postfix\\\\\">alpha bravo third<a href=\\\\\"#fnref-3-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-w-postfix\\\\\">foo<a href=\\\\\"#fnref-w-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-4-postfix\\\\\">alpha bravo fourth<a href=\\\\\"#fnref-4-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} footnote-split 1`] = `\n\"<p>a<sup id=\\\\\"fnref-first-postfix\\\\\"><a href=\\\\\"#fn-first-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">first</a></sup>b<sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>c<sup id=\\\\\"fnref-third-postfix\\\\\"><a href=\\\\\"#fn-third-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">third</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-first-postfix\\\\\">first def<a href=\\\\\"#fnref-first-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-1-postfix\\\\\">second def<a href=\\\\\"#fnref-1-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-third-postfix\\\\\">third def<a href=\\\\\"#fnref-third-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} footnotes 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup> or two<sup id=\\\\\"fnref-bar-postfix\\\\\"><a href=\\\\\"#fn-bar-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">bar</a></sup> or more <sup id=\\\\\"fnref-baz-postfix\\\\\"><a href=\\\\\"#fn-baz-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">baz</a></sup> <sup id=\\\\\"fnref-qux-postfix\\\\\"><a href=\\\\\"#fn-qux-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">qux</a></sup> <sup id=\\\\\"fnref-fiji-postfix\\\\\"><a href=\\\\\"#fn-fiji-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">fiji</a></sup>. One again: <sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-nope-postfix\\\\\"><a href=\\\\\"#fn-nope-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">nope</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-foo-postfix\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-foo-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-bar-postfix\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-bar-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-baz-postfix\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-baz-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-qux-postfix\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-qux-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-fiji-postfix\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-fiji-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} given postfix 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1-bar\\\\\"><a href=\\\\\"#fn-1-bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2-bar\\\\\"><a href=\\\\\"#fn-2-bar\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"fnref-3-bar\\\\\"><a href=\\\\\"#fn-3-bar\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4-bar\\\\\"><a href=\\\\\"#fn-4-bar\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5-bar\\\\\"><a href=\\\\\"#fn-5-bar\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"fnref-1-bar\\\\\"><a href=\\\\\"#fn-1-bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6-bar\\\\\"><a href=\\\\\"#fn-6-bar\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-bar\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2-bar\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3-bar\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4-bar\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5-bar\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} numbered footnotes 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2-postfix\\\\\"><a href=\\\\\"#fn-2-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"fnref-3-postfix\\\\\"><a href=\\\\\"#fn-3-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4-postfix\\\\\"><a href=\\\\\"#fn-4-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5-postfix\\\\\"><a href=\\\\\"#fn-5-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6-postfix\\\\\"><a href=\\\\\"#fn-6-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-postfix\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2-postfix\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3-postfix\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4-postfix\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5-postfix\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} postfixing function 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"foo--fnref-1--bar\\\\\"><a href=\\\\\"#foo--fn-1--bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"foo--fnref-2--bar\\\\\"><a href=\\\\\"#foo--fn-2--bar\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"foo--fnref-3--bar\\\\\"><a href=\\\\\"#foo--fn-3--bar\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"foo--fnref-4--bar\\\\\"><a href=\\\\\"#foo--fn-4--bar\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"foo--fnref-5--bar\\\\\"><a href=\\\\\"#foo--fn-5--bar\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"foo--fnref-1--bar\\\\\"><a href=\\\\\"#foo--fn-1--bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"foo--fnref-6--bar\\\\\"><a href=\\\\\"#foo--fn-6--bar\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"foo--fn-1--bar\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#foo--fnref-1--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-2--bar\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#foo--fnref-2--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-3--bar\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#foo--fnref-3--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-4--bar\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#foo--fnref-4--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-5--bar\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#foo--fnref-5--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} regression-1 1`] = `\n\"<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-foo-postfix\\\\\">MyNote<a href=\\\\\"#fnref-foo-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} regression-2 1`] = `\n\"<p>1 <sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>\n2 <sup id=\\\\\"fnref-2-postfix\\\\\"><a href=\\\\\"#fn-2-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup>\n3 <sup id=\\\\\"fnref-3-postfix\\\\\"><a href=\\\\\"#fn-3-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup>\n4 <sup id=\\\\\"fnref-w-postfix\\\\\"><a href=\\\\\"#fn-w-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">w</a></sup>\n4 <sup id=\\\\\"fnref-w-postfix\\\\\"><a href=\\\\\"#fn-w-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">w</a></sup>\n5 <sup id=\\\\\"fnref-4-postfix\\\\\"><a href=\\\\\"#fn-4-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-postfix\\\\\">alpha bravo one<a href=\\\\\"#fnref-1-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-2-postfix\\\\\">alpha bravo two<a href=\\\\\"#fnref-2-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-3-postfix\\\\\">alpha bravo third<a href=\\\\\"#fnref-3-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-w-postfix\\\\\">foo<a href=\\\\\"#fnref-w-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-4-postfix\\\\\">alpha bravo fourth<a href=\\\\\"#fnref-4-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} footnote-split 1`] = `\n\"<p>a<sup id=\\\\\"fnref-first-postfix\\\\\"><a href=\\\\\"#fn-first-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">first</a></sup>b<sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>c<sup id=\\\\\"fnref-third-postfix\\\\\"><a href=\\\\\"#fn-third-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">third</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-first-postfix\\\\\">first def<a href=\\\\\"#fnref-first-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-1-postfix\\\\\">second def<a href=\\\\\"#fnref-1-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-third-postfix\\\\\">third def<a href=\\\\\"#fnref-third-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} footnotes 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup> or two<sup id=\\\\\"fnref-bar-postfix\\\\\"><a href=\\\\\"#fn-bar-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">bar</a></sup> or more <sup id=\\\\\"fnref-baz-postfix\\\\\"><a href=\\\\\"#fn-baz-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">baz</a></sup> <sup id=\\\\\"fnref-qux-postfix\\\\\"><a href=\\\\\"#fn-qux-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">qux</a></sup> <sup id=\\\\\"fnref-fiji-postfix\\\\\"><a href=\\\\\"#fn-fiji-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">fiji</a></sup>. One again: <sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-nope-postfix\\\\\"><a href=\\\\\"#fn-nope-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">nope</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-foo-postfix\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-foo-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-bar-postfix\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-bar-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-baz-postfix\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-baz-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-qux-postfix\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-qux-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-fiji-postfix\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-fiji-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} given postfix 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1-bar\\\\\"><a href=\\\\\"#fn-1-bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2-bar\\\\\"><a href=\\\\\"#fn-2-bar\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"fnref-3-bar\\\\\"><a href=\\\\\"#fn-3-bar\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4-bar\\\\\"><a href=\\\\\"#fn-4-bar\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5-bar\\\\\"><a href=\\\\\"#fn-5-bar\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"fnref-1-bar\\\\\"><a href=\\\\\"#fn-1-bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6-bar\\\\\"><a href=\\\\\"#fn-6-bar\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-bar\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2-bar\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3-bar\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4-bar\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5-bar\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5-bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} numbered footnotes 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2-postfix\\\\\"><a href=\\\\\"#fn-2-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"fnref-3-postfix\\\\\"><a href=\\\\\"#fn-3-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4-postfix\\\\\"><a href=\\\\\"#fn-4-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5-postfix\\\\\"><a href=\\\\\"#fn-5-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6-postfix\\\\\"><a href=\\\\\"#fn-6-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-postfix\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2-postfix\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3-postfix\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4-postfix\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5-postfix\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} postfixing function 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"foo--fnref-1--bar\\\\\"><a href=\\\\\"#foo--fn-1--bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"foo--fnref-2--bar\\\\\"><a href=\\\\\"#foo--fn-2--bar\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"foo--fnref-3--bar\\\\\"><a href=\\\\\"#foo--fn-3--bar\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"foo--fnref-4--bar\\\\\"><a href=\\\\\"#foo--fn-4--bar\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"foo--fnref-5--bar\\\\\"><a href=\\\\\"#foo--fn-5--bar\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"foo--fnref-1--bar\\\\\"><a href=\\\\\"#foo--fn-1--bar\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"foo--fnref-6--bar\\\\\"><a href=\\\\\"#foo--fn-6--bar\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"foo--fn-1--bar\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#foo--fnref-1--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-2--bar\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#foo--fnref-2--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-3--bar\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#foo--fnref-3--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-4--bar\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#foo--fnref-4--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"foo--fn-5--bar\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#foo--fnref-5--bar\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} regression-1 1`] = `\n\"<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<p>a<sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup><sup id=\\\\\"fnref-foo-postfix\\\\\"><a href=\\\\\"#fn-foo-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">foo</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-foo-postfix\\\\\">MyNote<a href=\\\\\"#fnref-foo-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} regression-2 1`] = `\n\"<p>1 <sup id=\\\\\"fnref-1-postfix\\\\\"><a href=\\\\\"#fn-1-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>\n2 <sup id=\\\\\"fnref-2-postfix\\\\\"><a href=\\\\\"#fn-2-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup>\n3 <sup id=\\\\\"fnref-3-postfix\\\\\"><a href=\\\\\"#fn-3-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup>\n4 <sup id=\\\\\"fnref-w-postfix\\\\\"><a href=\\\\\"#fn-w-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">w</a></sup>\n4 <sup id=\\\\\"fnref-w-postfix\\\\\"><a href=\\\\\"#fn-w-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">w</a></sup>\n5 <sup id=\\\\\"fnref-4-postfix\\\\\"><a href=\\\\\"#fn-4-postfix\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-postfix\\\\\">alpha bravo one<a href=\\\\\"#fnref-1-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-2-postfix\\\\\">alpha bravo two<a href=\\\\\"#fnref-2-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-3-postfix\\\\\">alpha bravo third<a href=\\\\\"#fnref-3-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-w-postfix\\\\\">foo<a href=\\\\\"#fnref-w-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-4-postfix\\\\\">alpha bravo fourth<a href=\\\\\"#fnref-4-postfix\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n"
  },
  {
    "path": "packages/rehype-postfix-footnote-anchors/__tests__/fixtures/footnote-split.fixture.md",
    "content": "a[^first]b^[second def]c[^third]\n\n[^first]: first def\n[^third]: third def\n"
  },
  {
    "path": "packages/rehype-postfix-footnote-anchors/__tests__/fixtures/footnotes.fixture.md",
    "content": "This is the body with a footnote[^foo] or two[^bar] or more [^baz] [^qux] [^fiji]. One again: [^foo]\n\nAlso a reference that does not exist[^nope].\n\n[^foo]: Footnote that ends with a list:\n\n    * item 1\n    * item 2\n\n[^bar]: > This footnote is a blockquote.\n\n[^baz]: A simple oneliner.\n\n[^qux]: A footnote with multiple paragraphs.\n\n    Paragraph two.\n\n[^fiji]: First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...\n"
  },
  {
    "path": "packages/rehype-postfix-footnote-anchors/__tests__/fixtures/regression-1.fixture.md",
    "content": "a[^foo]\n\na[^foo][^foo]\n\na[^foo][^foo][^foo]\n\na[^foo][^foo][^foo][^foo]\n\na[^foo][^foo][^foo][^foo][^foo]\n\na[^foo][^foo][^foo][^foo][^foo][^foo]\n\n[^foo]: MyNote\n"
  },
  {
    "path": "packages/rehype-postfix-footnote-anchors/__tests__/fixtures/regression-2.fixture.md",
    "content": "1 ^[alpha bravo one]\n2 ^[alpha bravo two]\n3 ^[alpha bravo third]\n4 [^w]\n4 [^w]\n5 ^[alpha bravo fourth]\n\n[^w]: foo\n"
  },
  {
    "path": "packages/rehype-postfix-footnote-anchors/__tests__/index.js",
    "content": "import {readdirSync as directory, readFileSync as file} from 'fs'\nimport {join} from 'path'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport footnotes from 'remark-footnotes'\nimport remarkNumberedFootnotes from 'remark-numbered-footnotes'\nimport stringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\n\nconst base = join(__dirname, 'fixtures')\nconst specs = directory(base).reduce((tests, contents) => {\n  const parts = contents.split('.')\n  if (!tests[parts[0]]) {\n    tests[parts[0]] = {}\n  }\n  tests[parts[0]][parts[1]] = file(join(base, contents), 'utf-8')\n  return tests\n}, {})\n\n\nconst configs = [\n  {\n    gfm: true,\n    commonmark: false,\n  },\n  {\n    gfm: false,\n    commonmark: false,\n  },\n  {\n    gfm: false,\n    commonmark: true,\n  },\n  {\n    gfm: true,\n    commonmark: true,\n  },\n]\n\nconfigs.forEach(config => {\n  describe(JSON.stringify(config), () => {\n    test('footnotes', () => {\n      const {contents} = unified()\n        .use(reParse, config)\n        .use(footnotes, {inlineNotes: true})\n        .use(remark2rehype)\n        .use(require('../src'))\n        .use(stringify)\n        .processSync(specs['footnotes'].fixture)\n\n      expect(contents).toMatchSnapshot()\n    })\n\n    test('numbered footnotes', () => {\n      const {contents} = unified()\n        .use(reParse, config)\n        .use(footnotes, {inlineNotes: true})\n        .use(remarkNumberedFootnotes)\n        .use(remark2rehype)\n        .use(require('../src'))\n        .use(stringify)\n        .processSync(specs['footnotes'].fixture)\n\n      expect(contents).toMatchSnapshot()\n    })\n\n    test('given postfix', () => {\n      const {contents} = unified()\n        .use(reParse, config)\n        .use(footnotes, {inlineNotes: true})\n        .use(remarkNumberedFootnotes)\n        .use(remark2rehype)\n        .use(require('../src'), '-bar')\n        .use(stringify)\n        .processSync(specs['footnotes'].fixture)\n\n      expect(contents).toMatchSnapshot()\n    })\n\n    test('postfixing function', () => {\n      const {contents} = unified()\n        .use(reParse, config)\n        .use(footnotes, {inlineNotes: true})\n        .use(remarkNumberedFootnotes)\n        .use(remark2rehype)\n        .use(require('../src'), (identifier) => `foo--${identifier}--bar`)\n        .use(stringify)\n        .processSync(specs['footnotes'].fixture)\n\n      expect(contents).toMatchSnapshot()\n    })\n\n    test('regression-1', () => {\n      const {contents} = unified()\n        .use(reParse, config)\n        .use(footnotes, {inlineNotes: true})\n        .use(remark2rehype)\n        .use(require('../src'))\n        .use(stringify)\n        .processSync(specs['regression-1'].fixture)\n\n      expect(contents).toMatchSnapshot()\n    })\n\n    test('regression-2', () => {\n      const {contents} = unified()\n        .use(reParse, config)\n        .use(footnotes, {inlineNotes: true})\n        .use(remark2rehype)\n        .use(require('../src'))\n        .use(stringify)\n        .processSync(specs['regression-2'].fixture)\n\n      expect(contents).toMatchSnapshot()\n    })\n\n    test('footnote-split', () => {\n      const {contents} = unified()\n        .use(reParse, config)\n        .use(footnotes, {inlineNotes: true})\n        .use(remark2rehype)\n        .use(require('../src'))\n        .use(stringify)\n        .processSync(specs['footnote-split'].fixture)\n\n      expect(contents).toMatchSnapshot()\n    })\n  })\n})\n"
  },
  {
    "path": "packages/rehype-postfix-footnote-anchors/dist/index.js",
    "content": "\"use strict\";\n\nconst visit = require('unist-util-visit');\nfunction findLastTag(node, tag = 'p') {\n  if (!node.children || !node.children.length) return;\n  const links = node.children.filter(e => e.tagName === tag);\n  if (!links.length) return;\n  return links[links.length - 1];\n}\nfunction findLastLink(node, className) {\n  if (!node.children || !node.children.length) return;\n  const links = node.children.filter(e => e.tagName === 'a');\n  if (!links.length) return;\n  const aTag = links[links.length - 1];\n  if (!aTag.properties || !aTag.properties.className || !aTag.properties.className.includes(className)) return;\n  return aTag;\n}\nfunction setPostfix(node, aTag, postfix) {\n  if (typeof postfix === 'function') {\n    const id = node.properties.id;\n    node.properties.id = postfix(id);\n    const link = aTag.properties.href;\n    aTag.properties.href = `#${postfix(link.substr(1))}`;\n  } else {\n    node.properties.id += postfix;\n    aTag.properties.href += postfix;\n  }\n}\nfunction plugin(postfix = '-postfix') {\n  return tree => {\n    visit(tree, 'element', (node, index, parent) => {\n      if (!['li', 'sup'].includes(node.tagName)) return;\n      if (node.tagName === 'li') {\n        if (!node.properties || !node.properties.id) return;\n        if (!node.properties.id.startsWith('fn-')) return;\n        if (!node.children.length) return;\n        let aTag = findLastLink(node, 'footnote-backref');\n        if (!aTag) {\n          const pTag = findLastTag(node, 'p');\n          aTag = findLastLink(pTag, 'footnote-backref');\n        }\n        if (!aTag) return;\n        setPostfix(node, aTag, postfix);\n      }\n      if (node.tagName === 'sup') {\n        if (!node.properties || !node.properties.id) return;\n        if (!node.properties.id.startsWith('fnref-')) return;\n        if (!node.children.length || node.children[0].tagName !== 'a') return;\n        const aTag = node.children[0];\n        if (!aTag.properties || !aTag.properties.className || !aTag.properties.className.includes('footnote-ref')) return;\n        setPostfix(node, aTag, postfix);\n      }\n    });\n  };\n}\nmodule.exports = plugin;"
  },
  {
    "path": "packages/rehype-postfix-footnote-anchors/package.json",
    "content": "{\n  \"name\": \"rehype-postfix-footnote-anchors\",\n  \"version\": \"2.0.3\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/rehype-postfix-footnote-anchors\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"rehype\",\n    \"footnotes\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"unist-util-visit\": \"^2.0.3\"\n  },\n  \"devDependencies\": {\n    \"remark-numbered-footnotes\": \"file:../remark-numbered-footnotes\"\n  }\n}\n"
  },
  {
    "path": "packages/rehype-postfix-footnote-anchors/src/index.js",
    "content": "const visit = require('unist-util-visit')\n\nfunction findLastTag (node, tag = 'p') {\n  if (!node.children || !node.children.length) return\n  const links = node.children.filter(e => e.tagName === tag)\n  if (!links.length) return\n  return links[links.length - 1]\n}\nfunction findLastLink (node, className) {\n  if (!node.children || !node.children.length) return\n  const links = node.children.filter(e => e.tagName === 'a')\n  if (!links.length) return\n  const aTag = links[links.length - 1]\n  if (!aTag.properties || !aTag.properties.className ||\n    !aTag.properties.className.includes(className)) return\n  return aTag\n}\nfunction setPostfix (node, aTag, postfix) {\n  if (typeof postfix === 'function') {\n    const id = node.properties.id\n    node.properties.id = postfix(id)\n    const link = aTag.properties.href\n    aTag.properties.href = `#${postfix(link.substr(1))}`\n  } else {\n    node.properties.id += postfix\n    aTag.properties.href += postfix\n  }\n}\n\nfunction plugin (postfix = '-postfix') {\n  return (tree) => {\n    visit(tree, 'element', (node, index, parent) => {\n      if (!['li', 'sup'].includes(node.tagName)) return\n      if (node.tagName === 'li') {\n        if (!node.properties || !node.properties.id) return\n        if (!node.properties.id.startsWith('fn-')) return\n\n        if (!node.children.length) return\n\n        let aTag = findLastLink(node, 'footnote-backref')\n        if (!aTag) {\n          const pTag = findLastTag(node, 'p')\n          aTag = findLastLink(pTag, 'footnote-backref')\n        }\n        if (!aTag) return\n\n        setPostfix(node, aTag, postfix)\n      }\n\n      if (node.tagName === 'sup') {\n        if (!node.properties || !node.properties.id) return\n        if (!node.properties.id.startsWith('fnref-')) return\n        if (!node.children.length || node.children[0].tagName !== 'a') return\n\n        const aTag = node.children[0]\n\n        if (!aTag.properties || !aTag.properties.className ||\n            !aTag.properties.className.includes('footnote-ref')) return\n\n        setPostfix(node, aTag, postfix)\n      }\n    })\n  }\n}\n\nmodule.exports = plugin\n"
  },
  {
    "path": "packages/remark-abbr/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-abbr/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-abbr/README.md",
    "content": "# remark-abbr [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis [remark][remark] plugin parses custom Markdown syntax to produce (HTML) abbreviations.\n\nIt introduces a new [MDAST][mdast] node type: \"abbr\".\n\n```javascript\ninterface abbr <: Node {\n  type: \"abbr\";\n  abbr: string;\n  reference: string;\n  data: {\n    hName: \"abbr\";\n    hProperties: {\n      title: string;\n    }\n  }\n}\n```\n\n## Syntax\n\nAbbreviations are defined a bit like footnotes:\n\n```markdown\nThis plugin works on MDAST, a Markdown AST\nimplemented by [remark](https://github.com/remarkjs/remark)\n\n*[MDAST]: Markdown Abstract Syntax Tree.\n*[AST]: Abstract syntax tree\n```\n\nThis would compile to the following HTML:\n\n```html\n<p>This plugin works on <abbr title=\"Markdown Abstract Syntax Tree.\">MDAST</abbr>, a Markdown <abbr title=\"Abstract syntax tree\">AST</abbr>\nimplemented by <a href=\"https://github.com/remarkjs/remark\">remark</a></p>\n```\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-abbr\n```\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst remarkAbbr = require('remark-abbr')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkAbbr)\n  .use(remark2rehype)\n  .use(stringify)\n```\n\n## Options\n\n### options.expandFirst\n\nExpand the first occurrence of each abbreviation in place to introduce the definition and it's definition. Further occurrences are parsed into \"abbr\" [MDAST][mdast] nodes as the plugin would normally do.\n\n**example**\n\n```javascript\n.use(remarkAbbr, { expandFirst: true })\n```\n\n**given**\n\n```markdown\nThis plugin works on MDAST.\n\nMore stuff about MDAST.\n\n*[MDAST]: Markdown Abstract Syntax Tree\n```\n\n**produces**\n\n```html\n<p>This plugin works on Markdown Abstract Syntax Tree (<abbr title=\"Markdown Abstract Syntax Tree\">MDAST</abbr>).</p>\n<p>More stuff about <abbr title=\"Markdown Abstract Syntax Tree\">MDAST</abbr>.</p>\"\n```\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-abbr/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-abbr\n\n[mdast]: https://github.com/syntax-tree/mdast/blob/master/readme.md\n\n[remark]: https://github.com/remarkjs/remark\n"
  },
  {
    "path": "packages/remark-abbr/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`compiles to markdown 1`] = `\n\"_abbr_ HTML\n\n> HTML inside quote\n\n*[abbr]: abbreviation\n*[HTML]: HyperText Markup Language\"\n`;\n\nexports[`compiles to markdown 2`] = `\n\"_abbr_ HTML\n\n> HTML inside quote\n\n*[abbr]: abbreviation\n*[HTML]: HyperText Markup Language\"\n`;\n\nexports[`compiles to markdown 3`] = `\n\"_abbr_ HTML\n\n> HTML inside quote\n\n*[abbr]: abbreviation\n*[HTML]: HyperText Markup Language\"\n`;\n\nexports[`empty object does not break with references in their own paragraphs 1`] = `\"<p>Here is a test featuring <abbr title=\\\\\"A B C\\\\\">abc</abbr> and <abbr title=\\\\\"D E F\\\\\">def</abbr></p>\"`;\n\nexports[`empty object no reference 1`] = `\"<p>No reference!</p>\"`;\n\nexports[`empty object passes the first regression test 1`] = `\n\"<p>The <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr> specification is maintained by the <abbr title=\\\\\"World Wide Web Consortium\\\\\">W3C</abbr>:<a href=\\\\\"https://w3c.github.io/html/\\\\\">link</a>, this line had an abbr before link.</p>\n<p>A line with <a href=\\\\\"http://example.com\\\\\">a link</a> before an abbr: <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr>.</p>\"\n`;\n\nexports[`empty object passes the retro test 1`] = `\n\"<p>An <abbr title=\\\\\"Abbreviation\\\\\">ABBR</abbr>: \\\\\"<abbr title=\\\\\"Reference\\\\\">REF</abbr>\\\\\", ref and REFERENCE should be ignored.</p>\n<p>The <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr> specification is maintained by the <abbr title=\\\\\"World Wide Web Consortium\\\\\">W3C</abbr>.</p>\"\n`;\n\nexports[`empty object passes the retro test 2`] = `\n\"An ABBR: \\\\\"REF\\\\\", ref and REFERENCE should be ignored.\n\nThe HTML specification is maintained by the W3C.\n\n*[ABBR]: Abbreviation\n*[REF]: Reference\n*[HTML]: Hyper Text Markup Language\n*[W3C]: World Wide Web Consortium\"\n`;\n\nexports[`empty object passes the second regression test 1`] = `\n\"<p>The <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr> specification is maintained by the <abbr title=\\\\\"World Wide Web Consortium\\\\\">W3C</abbr>:<a href=\\\\\"https://w3c.github.io/html/\\\\\">link</a>, this line had an abbr before <strong>link</strong> <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr>.</p>\n<p>A line with <a href=\\\\\"http://example.com\\\\\">a link</a> before an abbr: <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr>.</p>\"\n`;\n\nexports[`empty object renders references 1`] = `\n\"<p>This is an abbreviation: <abbr title=\\\\\"Reference\\\\\">REF</abbr>.\nref and REFERENCE should be ignored.</p>\n<p>Here is another one in a link: <a href=\\\\\"http://example.com\\\\\"><abbr title=\\\\\"Reference\\\\\">FOO</abbr></a>.</p>\n<p>Here is the first one in a link: <a href=\\\\\"http://example.com\\\\\"><abbr title=\\\\\"Reference\\\\\">REF</abbr></a>.</p>\"\n`;\n\nexports[`expandFirst does not break with references in their own paragraphs 1`] = `\"<p>Here is a test featuring A B C (<abbr title=\\\\\"A B C\\\\\">abc</abbr>) and D E F (<abbr title=\\\\\"D E F\\\\\">def</abbr>)</p>\"`;\n\nexports[`expandFirst no reference 1`] = `\"<p>No reference!</p>\"`;\n\nexports[`expandFirst passes the first regression test 1`] = `\n\"<p>The Hyper Text Markup Language (<abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr>) specification is maintained by the World Wide Web Consortium (<abbr title=\\\\\"World Wide Web Consortium\\\\\">W3C</abbr>):<a href=\\\\\"https://w3c.github.io/html/\\\\\">link</a>, this line had an abbr before link.</p>\n<p>A line with <a href=\\\\\"http://example.com\\\\\">a link</a> before an abbr: <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr>.</p>\"\n`;\n\nexports[`expandFirst passes the retro test 1`] = `\n\"<p>An <abbr title=\\\\\"Abbreviation\\\\\">ABBR</abbr>: \\\\\"<abbr title=\\\\\"Reference\\\\\">REF</abbr>\\\\\", ref and REFERENCE should be ignored.</p>\n<p>The <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr> specification is maintained by the <abbr title=\\\\\"World Wide Web Consortium\\\\\">W3C</abbr>.</p>\"\n`;\n\nexports[`expandFirst passes the retro test 2`] = `\n\"An ABBR: \\\\\"REF\\\\\", ref and REFERENCE should be ignored.\n\nThe HTML specification is maintained by the W3C.\n\n*[ABBR]: Abbreviation\n*[REF]: Reference\n*[HTML]: Hyper Text Markup Language\n*[W3C]: World Wide Web Consortium\"\n`;\n\nexports[`expandFirst passes the second regression test 1`] = `\n\"<p>The Hyper Text Markup Language (<abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr>) specification is maintained by the World Wide Web Consortium (<abbr title=\\\\\"World Wide Web Consortium\\\\\">W3C</abbr>):<a href=\\\\\"https://w3c.github.io/html/\\\\\">link</a>, this line had an abbr before <strong>link</strong> <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr>.</p>\n<p>A line with <a href=\\\\\"http://example.com\\\\\">a link</a> before an abbr: <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr>.</p>\"\n`;\n\nexports[`expandFirst renders references 1`] = `\n\"<p>This is an abbreviation: Reference (<abbr title=\\\\\"Reference\\\\\">REF</abbr>).\nref and REFERENCE should be ignored.</p>\n<p>Here is another one in a link: <a href=\\\\\"http://example.com\\\\\">Reference (<abbr title=\\\\\"Reference\\\\\">FOO</abbr>)</a>.</p>\n<p>Here is the first one in a link: <a href=\\\\\"http://example.com\\\\\"><abbr title=\\\\\"Reference\\\\\">REF</abbr></a>.</p>\"\n`;\n\nexports[`no-config does not break with references in their own paragraphs 1`] = `\"<p>Here is a test featuring <abbr title=\\\\\"A B C\\\\\">abc</abbr> and <abbr title=\\\\\"D E F\\\\\">def</abbr></p>\"`;\n\nexports[`no-config no reference 1`] = `\"<p>No reference!</p>\"`;\n\nexports[`no-config passes the first regression test 1`] = `\n\"<p>The <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr> specification is maintained by the <abbr title=\\\\\"World Wide Web Consortium\\\\\">W3C</abbr>:<a href=\\\\\"https://w3c.github.io/html/\\\\\">link</a>, this line had an abbr before link.</p>\n<p>A line with <a href=\\\\\"http://example.com\\\\\">a link</a> before an abbr: <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr>.</p>\"\n`;\n\nexports[`no-config passes the retro test 1`] = `\n\"<p>An <abbr title=\\\\\"Abbreviation\\\\\">ABBR</abbr>: \\\\\"<abbr title=\\\\\"Reference\\\\\">REF</abbr>\\\\\", ref and REFERENCE should be ignored.</p>\n<p>The <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr> specification is maintained by the <abbr title=\\\\\"World Wide Web Consortium\\\\\">W3C</abbr>.</p>\"\n`;\n\nexports[`no-config passes the retro test 2`] = `\n\"An ABBR: \\\\\"REF\\\\\", ref and REFERENCE should be ignored.\n\nThe HTML specification is maintained by the W3C.\n\n*[ABBR]: Abbreviation\n*[REF]: Reference\n*[HTML]: Hyper Text Markup Language\n*[W3C]: World Wide Web Consortium\"\n`;\n\nexports[`no-config passes the second regression test 1`] = `\n\"<p>The <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr> specification is maintained by the <abbr title=\\\\\"World Wide Web Consortium\\\\\">W3C</abbr>:<a href=\\\\\"https://w3c.github.io/html/\\\\\">link</a>, this line had an abbr before <strong>link</strong> <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr>.</p>\n<p>A line with <a href=\\\\\"http://example.com\\\\\">a link</a> before an abbr: <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr>.</p>\"\n`;\n\nexports[`no-config renders references 1`] = `\n\"<p>This is an abbreviation: <abbr title=\\\\\"Reference\\\\\">REF</abbr>.\nref and REFERENCE should be ignored.</p>\n<p>Here is another one in a link: <a href=\\\\\"http://example.com\\\\\"><abbr title=\\\\\"Reference\\\\\">FOO</abbr></a>.</p>\n<p>Here is the first one in a link: <a href=\\\\\"http://example.com\\\\\"><abbr title=\\\\\"Reference\\\\\">REF</abbr></a>.</p>\"\n`;\n"
  },
  {
    "path": "packages/remark-abbr/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport stringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\nimport remarkStringify from 'remark-stringify'\n\nimport remarkAbbr from '../src/'\n\nconst render = (text, config) => unified()\n  .use(reParse)\n  .use(remarkAbbr, config)\n  .use(remark2rehype)\n  .use(stringify)\n  .processSync(text)\n\nconst renderToMarkdown = (text, config) => unified()\n  .use(reParse)\n  .use(remarkStringify)\n  .use(remarkAbbr, config)\n  .processSync(text)\n\nconst configToTest = {\n  'no-config': undefined,\n  'empty object': {},\n  expandFirst: {expandFirst: true},\n}\n\nfor (const [configName, config] of Object.entries(configToTest)) {\n  it(`${configName} renders references`, () => {\n    const {contents} = render(dedent`\n      This is an abbreviation: REF.\n      ref and REFERENCE should be ignored.\n\n      Here is another one in a link: [FOO](http://example.com).\n\n      Here is the first one in a link: [REF](http://example.com).\n\n      *[REF]: Reference\n      *[FOO]: Reference\n    `, config)\n\n    expect(contents).toMatchSnapshot()\n  })\n\n\n  it(`${configName} passes the first regression test`, () => {\n    const {contents} = render(dedent`\n      The HTML specification is maintained by the W3C:\\\n      [link](https://w3c.github.io/html/), this line had an abbr before link.\n\n      A line with [a link](http://example.com) before an abbr: HTML.\n\n      *[HTML]: Hyper Text Markup Language\n      *[W3C]:  World Wide Web Consortium\n    `, config)\n\n    expect(contents).toMatchSnapshot()\n  })\n\n  it(`${configName} passes the second regression test`, () => {\n    const {contents} = render(dedent`\n      The HTML specification is maintained by the W3C:\\\n      [link](https://w3c.github.io/html/), this line had an abbr before **link** HTML.\n\n      A line with [a link](http://example.com) before an abbr: HTML.\n\n      *[HTML]: Hyper Text Markup Language\n      *[W3C]:  World Wide Web Consortium\n    `, config)\n\n    expect(contents).toMatchSnapshot()\n  })\n\n  it(`${configName} passes the retro test`, () => {\n    const input = dedent`\n      An ABBR: \"REF\", ref and REFERENCE should be ignored.\n\n      The HTML specification is maintained by the W3C.\n\n      *[REF]: Reference\n      *[ABBR]: This gets overridden by the next one.\n      *[ABBR]: Abbreviation\n      *[HTML]: Hyper Text Markup Language\n      *[W3C]:  World Wide Web Consortium\n    `\n\n    const {contents: html} = render(input)\n    expect(html).toMatchSnapshot()\n\n    const {contents: markdown} = renderToMarkdown(input)\n    expect(markdown).toMatchSnapshot()\n  })\n\n  it(`${configName} no reference`, () => {\n    const {contents} = render(dedent`\n      No reference!\n    `, config)\n\n    expect(contents).toMatchSnapshot()\n  })\n\n  test('compiles to markdown', () => {\n    const md = dedent`\n      *abbr* HTML\n\n      > HTML inside quote\n\n      *[abbr]: abbreviation\n      *[noabbr]: explanation that does not match\n      *[HTML]: HyperText Markup Language\n    `\n    const {contents} = renderToMarkdown(md)\n    expect(contents).toMatchSnapshot()\n\n    const contents1 = renderToMarkdown(md).contents\n    const contents2 = renderToMarkdown(contents1).contents\n\n    expect(contents1).toBe(contents2)\n  })\n\n  it(`${configName} handles abbreviations ending with a period`, () => {\n    const {contents} = render(dedent`\n      A.B.C. and C-D%F. foo\n\n      *[A.B.C.]: ref1\n      *[C-D%F.]: ref2\n    `, config)\n\n    expect(contents).toContain(`<abbr title=\"ref1\">A.B.C.</abbr>`)\n    expect(contents).toContain(`<abbr title=\"ref2\">C-D%F.</abbr>`)\n  })\n\n  it(`${configName} does not parse words starting with abbr`, () => {\n    const {contents} = render(dedent`\n      ABC ABC ABC\n\n      *[AB]: ref1\n    `, config)\n\n    expect(contents).not.toContain('<abbr')\n  })\n\n  it(`${configName} does not parse words ending with abbr`, () => {\n    const {contents} = render(dedent`\n      ABC ABC ABC\n\n      *[BC]: ref1\n    `, config)\n\n    expect(contents).not.toContain('<abbr')\n  })\n\n  it(`${configName} does not parse words containing abbr`, () => {\n    const {contents} = render(dedent`\n      ABC ABC ABC\n\n      *[B]: ref1\n    `, config)\n\n    expect(contents).not.toContain('<abbr')\n  })\n\n  it(`${configName} does not break with references in their own paragraphs`, () => {\n    const {contents} = render(dedent`\n      Here is a test featuring abc and def\n\n      *[abc]: A B C\n\n      *[def]: D E F\n    `, config)\n\n    expect(contents).toMatchSnapshot()\n  })\n}\n"
  },
  {
    "path": "packages/remark-abbr/dist/index.js",
    "content": "\"use strict\";\n\nconst visit = require('unist-util-visit');\nfunction plugin(options) {\n  const opts = options || {};\n  const expandFirst = opts.expandFirst;\n  function locator(value, fromIndex) {\n    return value.indexOf('*[', fromIndex);\n  }\n  function inlineTokenizer(eat, value, silent) {\n    const regex = /[*]\\[([^\\]]*)\\]:\\s*(.+)\\n*/;\n    const keep = regex.exec(value);\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return silent;\n    if (!keep || keep.index !== 0) return;\n    const [matched, abbr, reference] = keep;\n    return eat(matched)({\n      type: 'abbr',\n      abbr,\n      reference,\n      children: [{\n        type: 'text',\n        value: abbr\n      }],\n      data: {\n        hName: 'abbr',\n        hProperties: {\n          title: reference\n        }\n      }\n    });\n  }\n  function transformer(tree) {\n    const abbrs = {};\n    const emptyParagraphsToRemove = new Map();\n    visit(tree, 'paragraph', find(abbrs, emptyParagraphsToRemove));\n    emptyParagraphsToRemove.forEach((indices, key) => {\n      indices.reverse();\n      indices.forEach(index => {\n        key.children.splice(index, 1);\n      });\n    });\n    visit(tree, replace(abbrs));\n  }\n  function find(abbrs, emptyParagraphsToRemove) {\n    return function one(node, index, parent) {\n      for (let i = 0; i < node.children.length; i++) {\n        const child = node.children[i];\n        if (child.type !== 'abbr') continue;\n        // Store abbr node for later use\n        abbrs[child.abbr] = child;\n        node.children.splice(i, 1);\n        i -= 1;\n      }\n      // Keep track of empty paragraphs to remove\n      if (node.children.length === 0) {\n        const indices = emptyParagraphsToRemove.get(parent) || [];\n        indices.push(index);\n        emptyParagraphsToRemove.set(parent, indices);\n      }\n    };\n  }\n  function replace(abbrs) {\n    function escapeRegExp(str) {\n      return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&'); // eslint-disable-line no-useless-escape\n    }\n    const pattern = Object.keys(abbrs).map(escapeRegExp).join('|');\n    const regex = new RegExp(`(\\\\b|\\\\W)(${pattern})(\\\\b|\\\\W)`);\n    const expanded = {};\n    function one(node, index, parent) {\n      if (Object.keys(abbrs).length === 0) return;\n      if (!node.children) return;\n\n      // If a text node is present in child nodes, check if an abbreviation is present\n      for (let c = 0; c < node.children.length; c++) {\n        const child = node.children[c];\n        if (node.type === 'abbr' || child.type !== 'text') continue;\n        if (!regex.test(child.value)) continue;\n\n        // Transform node\n        const newTexts = child.value.split(regex);\n\n        // Remove old text node\n        node.children.splice(c, 1);\n\n        // Replace abbreviations\n        for (let i = 0; i < newTexts.length; i++) {\n          const content = newTexts[i];\n          if (Object.prototype.hasOwnProperty.call(abbrs, content)) {\n            const abbr = abbrs[content];\n            if (expandFirst && !expanded[content]) {\n              node.children.splice(c + i, 0, {\n                type: 'text',\n                value: `${abbr.reference} (${abbr.abbr})`\n              });\n              expanded[content] = true;\n            } else {\n              node.children.splice(c + i, 0, abbr);\n            }\n          } else {\n            node.children.splice(c + i, 0, {\n              type: 'text',\n              value: content\n            });\n          }\n        }\n      }\n    }\n    return one;\n  }\n  inlineTokenizer.locator = locator;\n  const Parser = this.Parser;\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers;\n  const inlineMethods = Parser.prototype.inlineMethods;\n  inlineTokenizers.abbr = inlineTokenizer;\n  inlineMethods.splice(0, 0, 'abbr');\n  const Compiler = this.Compiler;\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors;\n    if (!visitors) return;\n    const abbrMap = {};\n    visitors.abbr = node => {\n      if (!abbrMap[node.abbr]) {\n        abbrMap[node.abbr] = `*[${node.abbr}]: ${node.reference}`;\n      }\n      return `${node.abbr}`;\n    };\n    const originalRootCompiler = visitors.root;\n    visitors.root = function (node) {\n      return `${originalRootCompiler.apply(this, arguments)}\\n${Object.values(abbrMap).join('\\n')}`;\n    };\n  }\n  return transformer;\n}\nmodule.exports = plugin;"
  },
  {
    "path": "packages/remark-abbr/package.json",
    "content": "{\n  \"name\": \"remark-abbr\",\n  \"version\": \"1.4.2\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-abbr\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"unist-util-visit\": \"^2.0.3\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-abbr/src/index.js",
    "content": "const visit = require('unist-util-visit')\n\nfunction plugin (options) {\n  const opts = options || {}\n  const expandFirst = opts.expandFirst\n\n  function locator (value, fromIndex) {\n    return value.indexOf('*[', fromIndex)\n  }\n\n  function inlineTokenizer (eat, value, silent) {\n    const regex = /[*]\\[([^\\]]*)\\]:\\s*(.+)\\n*/\n    const keep = regex.exec(value)\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return silent\n    if (!keep || keep.index !== 0) return\n\n    const [matched, abbr, reference] = keep\n\n    return eat(matched)({\n      type: 'abbr',\n      abbr,\n      reference,\n      children: [\n        { type: 'text', value: abbr }\n      ],\n      data: {\n        hName: 'abbr',\n        hProperties: {\n          title: reference\n        }\n      }\n    })\n  }\n\n  function transformer (tree) {\n    const abbrs = {}\n    const emptyParagraphsToRemove = new Map()\n\n    visit(tree, 'paragraph', find(abbrs, emptyParagraphsToRemove))\n    emptyParagraphsToRemove.forEach((indices, key) => {\n      indices.reverse()\n      indices.forEach((index) => {\n        key.children.splice(index, 1)\n      })\n    })\n\n    visit(tree, replace(abbrs))\n  }\n\n  function find (abbrs, emptyParagraphsToRemove) {\n    return function one (node, index, parent) {\n      for (let i = 0; i < node.children.length; i++) {\n        const child = node.children[i]\n        if (child.type !== 'abbr') continue\n        // Store abbr node for later use\n        abbrs[child.abbr] = child\n        node.children.splice(i, 1)\n        i -= 1\n      }\n      // Keep track of empty paragraphs to remove\n      if (node.children.length === 0) {\n        const indices = emptyParagraphsToRemove.get(parent) || []\n        indices.push(index)\n        emptyParagraphsToRemove.set(parent, indices)\n      }\n    }\n  }\n\n  function replace (abbrs) {\n    function escapeRegExp (str) {\n      return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&') // eslint-disable-line no-useless-escape\n    }\n\n    const pattern = Object.keys(abbrs).map(escapeRegExp).join('|')\n    const regex = new RegExp(`(\\\\b|\\\\W)(${pattern})(\\\\b|\\\\W)`)\n    const expanded = {}\n\n    function one (node, index, parent) {\n      if (Object.keys(abbrs).length === 0) return\n      if (!node.children) return\n\n      // If a text node is present in child nodes, check if an abbreviation is present\n      for (let c = 0; c < node.children.length; c++) {\n        const child = node.children[c]\n        if (node.type === 'abbr' || child.type !== 'text') continue\n        if (!regex.test(child.value)) continue\n\n        // Transform node\n        const newTexts = child.value.split(regex)\n\n        // Remove old text node\n        node.children.splice(c, 1)\n\n        // Replace abbreviations\n        for (let i = 0; i < newTexts.length; i++) {\n          const content = newTexts[i]\n          if (Object.prototype.hasOwnProperty.call(abbrs, content)) {\n            const abbr = abbrs[content]\n            if (expandFirst && !expanded[content]) {\n              node.children.splice(c + i, 0, {\n                type: 'text',\n                value: `${abbr.reference} (${abbr.abbr})`\n              })\n              expanded[content] = true\n            } else {\n              node.children.splice(c + i, 0, abbr)\n            }\n          } else {\n            node.children.splice(c + i, 0, {\n              type: 'text',\n              value: content\n            })\n          }\n        }\n      }\n    }\n    return one\n  }\n\n  inlineTokenizer.locator = locator\n\n  const Parser = this.Parser\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers\n  const inlineMethods = Parser.prototype.inlineMethods\n  inlineTokenizers.abbr = inlineTokenizer\n  inlineMethods.splice(0, 0, 'abbr')\n\n  const Compiler = this.Compiler\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors\n    if (!visitors) return\n\n    const abbrMap = {}\n    visitors.abbr = (node) => {\n      if (!abbrMap[node.abbr]) {\n        abbrMap[node.abbr] = `*[${node.abbr}]: ${node.reference}`\n      }\n      return `${node.abbr}`\n    }\n\n    const originalRootCompiler = visitors.root\n    visitors.root = function (node) {\n      return `${originalRootCompiler.apply(this, arguments)}\\n${Object.values(abbrMap).join('\\n')}`\n    }\n  }\n  return transformer\n}\n\nmodule.exports = plugin\n"
  },
  {
    "path": "packages/remark-align/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-align/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-align/README.md",
    "content": "# remark-align [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis plugin parses custom Markdown syntax to center- or right-align elements.\n\n## AST node (see [mdast][mdast] specification)\n\nIt adds three new node types, described below, to the [mdast][mdast] produced by [remark][remark]:\n\n### `LeftAligned`\n\n```javascript\ninterface LeftAligned <: Parent {\n  type: \"leftAligned\";\n  data: {\n    hName: \"div\";\n    hProperties: {\n      class: string;\n    }\n  }\n}\n```\n\n### `CenterAligned`\n\n```javascript\ninterface CenterAligned <: Parent {\n  type: \"centerAligned\";\n  data: {\n    hName: \"div\";\n    hProperties: {\n      class: string;\n    }\n  }\n}\n```\n\n### `RightAligned`\n\n```javascript\ninterface RightAligned <: Parent {\n  type: \"rightAligned\";\n  data: {\n    hName: \"div\";\n    hProperties: {\n      class: string;\n    }\n  }\n}\n```\n\nIf you are using [rehype][rehype], the stringified HTML result will be `div`s with configurable CSS classes.\n\nIt is up to you to have CSS rules producing the desired result for these three classes.\n\n## Syntax\n\nAlignment is done by wrapping something in arrows indicating the alignment:\n\n```markdown\n->paragraph<-\n\n->paragraph->\n```\n\nproduces:\n\n```html\n<div class=\"some-class\"><p>paragraph</p></div>\n<div class=\"some-other-class\"><p>paragraph</p></div>\n```\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-align\n```\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkAlign = require('remark-align')\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkAlign, {\n    left: 'align-left',\n    center: 'align-center',\n    right: 'align-right',\n  })\n  .use(remark2rehype)\n  .use(stringify)\n```\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-align/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-align\n\n[mdast]: https://github.com/syntax-tree/mdast/blob/master/readme.md\n\n[remark]: https://github.com/remarkjs/remark\n\n[rehype]: https://github.com/rehypejs/rehype\n"
  },
  {
    "path": "packages/remark-align/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`align 1`] = `\n\"<p>A simple paragraph</p>\n<div class=\\\\\"align-center\\\\\"><p>A centered paragraph</p></div>\n<p>a simple paragraph</p>\n<div class=\\\\\"align-right\\\\\"><p>A right aligned paragraph</p></div>\n<p>an other simple paragraph</p>\n<p>A simple paragraph</p>\n<div class=\\\\\"align-center\\\\\"><p>A centered paragraph</p></div>\n<p>a simple paragraph</p>\n<div class=\\\\\"align-right\\\\\"><p>A right aligned paragraph</p></div>\n<p>an other simple paragraph</p>\n<div class=\\\\\"align-center\\\\\"><p>A centered paragraph.</p><p>Containing two paragraph</p></div>\n<p>an other simple paragraph</p>\n<div class=\\\\\"align-center\\\\\"><p>A right aligned paragraph.</p><p>Containing two paragraph</p></div>\n<p>an other simple paragraph</p>\n<div class=\\\\\"align-center\\\\\"><p>A centered paragraph.</p><p>An other centered paragraph.</p></div>\n<div class=\\\\\"align-left\\\\\"><p>left aligned</p></div>\n<p>a simple paragraph</p>\n<p>->A started block without end.</p>\"\n`;\n\nexports[`align-custom-config 1`] = `\n\"<p>A simple paragraph</p>\n<div class=\\\\\"custom-center\\\\\"><p>A centered paragraph</p></div>\n<p>a simple paragraph</p>\n<div class=\\\\\"custom-right\\\\\"><p>A right aligned paragraph</p></div>\n<p>an other simple paragraph</p>\n<p>A simple paragraph</p>\n<div class=\\\\\"custom-center\\\\\"><p>A centered paragraph</p></div>\n<p>a simple paragraph</p>\n<div class=\\\\\"custom-right\\\\\"><p>A right aligned paragraph</p></div>\n<p>an other simple paragraph</p>\n<div class=\\\\\"custom-center\\\\\"><p>A centered paragraph.</p><p>Containing two paragraph</p></div>\n<p>an other simple paragraph</p>\n<div class=\\\\\"custom-center\\\\\"><p>A right aligned paragraph.</p><p>Containing two paragraph</p></div>\n<p>an other simple paragraph</p>\n<div class=\\\\\"custom-center\\\\\"><p>A centered paragraph.</p><p>An other centered paragraph.</p></div>\n<div class=\\\\\"align-left\\\\\"><p>left aligned</p></div>\n<p>a simple paragraph</p>\n<p>->A started block without end.</p>\"\n`;\n\nexports[`align-custom-config 2`] = `\n\"<p>A simple paragraph</p>\n<div class=\\\\\"custom-center\\\\\"><p>A centered paragraph</p></div>\n<p>a simple paragraph</p>\n<div class=\\\\\"custom-right\\\\\"><p>A right aligned paragraph</p></div>\n<p>an other simple paragraph</p>\n<p>A simple paragraph</p>\n<div class=\\\\\"custom-center\\\\\"><p>A centered paragraph</p></div>\n<p>a simple paragraph</p>\n<div class=\\\\\"custom-right\\\\\"><p>A right aligned paragraph</p></div>\n<p>an other simple paragraph</p>\n<div class=\\\\\"custom-center\\\\\"><p>A centered paragraph.</p><p>Containing two paragraph</p></div>\n<p>an other simple paragraph</p>\n<div class=\\\\\"custom-center\\\\\"><p>A right aligned paragraph.</p><p>Containing two paragraph</p></div>\n<p>an other simple paragraph</p>\n<div class=\\\\\"custom-center\\\\\"><p>A centered paragraph.</p><p>An other centered paragraph.</p></div>\n<div class=\\\\\"custom-left\\\\\"><p>left aligned</p></div>\n<p>a simple paragraph</p>\n<p>->A started block without end.</p>\"\n`;\n\nexports[`block-wrap 1`] = `\n\"<h1>wraps blocks e.g. title:</h1>\n<div class=\\\\\"align-right\\\\\"><p> foo</p><h1>title</h1><p>foo </p></div>\"\n`;\n\nexports[`center-no-start 1`] = `\n\"<h1>title</h1>\n<p>foo &#x3C;-</p>\n<h1>title</h1>\"\n`;\n\nexports[`compiles to markdown 1`] = `\n\"# title\n\n<- foo <-\n\n# title\n\n-> **foo** <-\n\n-> ![img](src) ->\n\n# wraps blocks e.g. title:\n\n->\nfoo\n\n# title\n\nfoo\n->\n\"\n`;\n\nexports[`escapable 1`] = `\n\"<h1>title</h1>\n<div class=\\\\\"align-center\\\\\"><p>foo\n->escaped-in</p></div>\n<p>->escaped-out</p>\n<div class=\\\\\"align-center\\\\\"><p>center</p></div>\"\n`;\n\nexports[`left align 1`] = `\n\"<h1>title</h1>\n<div class=\\\\\"align-left\\\\\"><p> foo </p></div>\n<h1>title</h1>\"\n`;\n\nexports[`list-block 1`] = `\n\"<h1>title</h1>\n<div class=\\\\\"align-right\\\\\"><ul>\n<li>a</li>\n<li>b</li>\n</ul></div>\n<div class=\\\\\"align-center\\\\\"><ul>\n<li>c</li>\n<li>d</li>\n</ul></div>\"\n`;\n\nexports[`no content 1`] = `\n\"<div class=\\\\\"align-left\\\\\"></div>\n<div class=\\\\\"align-left\\\\\"></div>\n<div class=\\\\\"align-center\\\\\"></div>\n<div class=\\\\\"align-center\\\\\"></div>\n<div class=\\\\\"align-center\\\\\"></div>\n<div class=\\\\\"align-right\\\\\"></div>\n<div class=\\\\\"align-right\\\\\"></div>\n<div class=\\\\\"align-right\\\\\"></div>\n<div class=\\\\\"align-right\\\\\"></div>\"\n`;\n\nexports[`right-no-end 1`] = `\n\"<h1>title</h1>\n<p>-> foo</p>\n<h1>title</h1>\"\n`;\n\nexports[`right-no-start 1`] = `\n\"<h1>title</h1>\n<p>foo -></p>\n<h1>title</h1>\"\n`;\n\nexports[`should not crash on invalid align 1`] = `\n\"&lt;- foo ->\n\"\n`;\n"
  },
  {
    "path": "packages/remark-align/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport stringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\nimport remarkStringify from 'remark-stringify'\n\nimport remarkAlign from '../src/'\n\nconst render = (text, config) => unified()\n  .use(reParse)\n  .use(remarkAlign, config)\n  .use(remark2rehype)\n  .use(stringify)\n  .processSync(text)\n\nconst renderToMarkdown = (text, config) => unified()\n  .use(reParse)\n  .use(remarkStringify)\n  .use(remarkAlign, config)\n  .processSync(text)\n\n\nconst alignFixture = dedent`\n  A simple paragraph\n\n  ->A centered paragraph<-\n\n  a simple paragraph\n\n  ->A right aligned paragraph->\n\n  an other simple paragraph\n\n  A simple paragraph\n\n  ->A centered paragraph<-\n\n  a simple paragraph\n\n  ->A right aligned paragraph->\n\n  an other simple paragraph\n\n  ->A centered paragraph.\n\n  Containing two paragraph<-\n\n  an other simple paragraph\n\n  ->A right aligned paragraph.\n\n  Containing two paragraph<-\n\n  an other simple paragraph\n\n  ->A centered paragraph.<-\n  ->An other centered paragraph.<-\n\n  <-left aligned<-\n\n  a simple paragraph\n\n  ->A started block without end.\n`\n\ntest('align', () => {\n  const {contents} = render(alignFixture)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('align-custom-config', () => {\n  const {contents} = render(alignFixture, {\n    right: 'custom-right',\n    center: 'custom-center',\n  })\n  expect(contents).toMatchSnapshot()\n})\n\ntest('align-custom-config', () => {\n  const {contents} = render(alignFixture, {\n    left: 'custom-left',\n    right: 'custom-right',\n    center: 'custom-center',\n  })\n  expect(contents).toMatchSnapshot()\n})\n\ntest('block-wrap', () => {\n  const {contents} = render(dedent`\n    # wraps blocks e.g. title:\n\n    -> foo\n\n    # title\n\n    foo ->\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('center-no-start', () => {\n  const {contents} = render(dedent`\n    # title\n\n    foo <-\n\n    # title\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('right-no-end', () => {\n  const {contents} = render(dedent`\n    # title\n\n    -> foo\n\n    # title\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('right-no-start', () => {\n  const {contents} = render(dedent`\n    # title\n\n    foo ->\n\n    # title\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('list-block', () => {\n  const {contents} = render(dedent`\n    # title\n    ->\n    - a\n    - b\n    ->\n    ->\n    - c\n    - d\n    <-\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest.skip('should not break blocks such as lists', () => {\n  const {contents} = render(dedent`\n    # title\n    ->\n    - list item\n    - list -> item\n    - sublist\n    - ->\n    - c\n    - d\n    <-\n  `)\n  expect(contents).toBe(dedent`\n    <h1>title</h1>\n    <div class=\"align-center\"><ul>\n    <li>list item</li>\n    <li>list -> item</li>\n    <li>sublist</li>\n    <li>-></li>\n    <li>c</li>\n    <li>d</li>\n    </ul></div>\n  `)\n})\n\ntest('escapable', () => {\n  const {contents} = render(dedent`\n    # title\n    ->\n    foo\n    \\->escaped-in\n    <-\n\n    \\->escaped-out\n\n    ->center<-\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('left align', () => {\n  const {contents} = render(dedent`\n    # title\n\n    <- foo <-\n\n    # title\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('no content', () => {\n  const md = dedent`\n    <- <-\n\n    <-\n\n    <-\n\n    -> <-\n\n    -><-\n\n    ->\n\n    <-\n\n    ->->\n\n    ->  ->\n\n    ->\n    ->\n\n    ->\n\n    ->\n  `\n\n  const {contents} = render(md)\n  expect(contents).toMatchSnapshot()\n\n  const contents1 = renderToMarkdown(md).contents\n  const contents2 = renderToMarkdown(contents1).contents\n\n  expect(contents1).toBe(contents2)\n})\n\ntest('compiles to markdown', () => {\n  const md = dedent`\n    # title\n\n    <- foo <-\n\n    # title\n\n    -> **foo** <-\n\n    ->\n    ![img](src)\n    ->\n\n    # wraps blocks e.g. title:\n\n    -> foo\n\n    # title\n\n    foo ->\n  `\n  const {contents} = renderToMarkdown(md)\n  expect(contents).toMatchSnapshot()\n\n  const contents1 = renderToMarkdown(md).contents\n  const contents2 = renderToMarkdown(contents1).contents\n\n  expect(contents1).toBe(contents2)\n})\n\n\ntest('should not crash on invalid align', () => {\n  const md = dedent`\n    <- foo ->\n  `\n  const {contents} = renderToMarkdown(md)\n  expect(contents).toMatchSnapshot()\n\n  const contents1 = renderToMarkdown(md).contents\n  const contents2 = renderToMarkdown(contents1).contents\n\n  expect(contents1).toBe(contents2)\n})\n"
  },
  {
    "path": "packages/remark-align/dist/index.js",
    "content": "\"use strict\";\n\nconst spaceSeparated = require('space-separated-tokens');\nconst C_NEWLINE = '\\n';\nconst C_NEWPARAGRAPH = '\\n\\n';\nmodule.exports = function plugin(classNames = {}) {\n  const locateMarker = /[^\\\\]?(->|<-)/;\n  const endMarkers = ['->', '<-'];\n  function alignTokenizer(eat, value, silent) {\n    const keep = value.match(locateMarker);\n    if (!keep || keep.index !== 0) return;\n    const now = eat.now();\n    const [, startMarker] = keep;\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return true;\n    let index = 0;\n    let linesToEat = [];\n    const finishedBlocks = [];\n    let endMarker = '';\n    let canEatLine = true;\n    let blockStartIndex = 0;\n    while (canEatLine) {\n      const nextIndex = value.indexOf(C_NEWLINE, index + 1);\n      const lineToEat = nextIndex !== -1 ? value.slice(index, nextIndex) : value.slice(index);\n      linesToEat.push(lineToEat);\n      const endIndex = endMarkers.indexOf(lineToEat.slice(-2));\n\n      // If nextIndex = (blockStartIndex + 2), it's the first marker of the block.\n      if ((nextIndex > blockStartIndex + 2 || nextIndex === -1) && lineToEat.length >= 2 && endIndex !== -1) {\n        if (endMarker === '') endMarker = lineToEat.slice(-2);\n        finishedBlocks.push(linesToEat.join(C_NEWLINE));\n\n        // Check if another block is following\n        if (value.indexOf('->', nextIndex) !== nextIndex + 1) break;\n        linesToEat = [];\n        blockStartIndex = nextIndex + 1;\n      }\n      index = nextIndex + 1;\n      canEatLine = nextIndex !== -1;\n    }\n    let elementType = '';\n    let classes = '';\n    if (startMarker === '<-' && endMarker === '<-') {\n      elementType = 'leftAligned';\n      classes = classNames.left ? classNames.left : 'align-left';\n    }\n    if (startMarker === '->') {\n      if (endMarker === '<-') {\n        elementType = 'centerAligned';\n        classes = classNames.center ? classNames.center : 'align-center';\n      }\n      if (endMarker === '->') {\n        elementType = 'rightAligned';\n        classes = classNames.right ? classNames.right : 'align-right';\n      }\n    }\n    if (!elementType) return;\n    if (finishedBlocks.length === 0) return;\n    let stringToEat = '';\n    const marker = finishedBlocks[0].substring(finishedBlocks[0].length - 2, finishedBlocks[0].length);\n    const toEat = [];\n    for (let i = 0; i < finishedBlocks.length; ++i) {\n      const block = finishedBlocks[i];\n      if (marker !== block.substring(block.length - 2, block.length)) break;\n      toEat.push(block);\n      stringToEat += block.slice(2, -2) + C_NEWPARAGRAPH;\n    }\n    const add = eat(toEat.join(C_NEWLINE));\n    const exit = this.enterBlock();\n    const values = this.tokenizeBlock(stringToEat, now);\n    exit();\n    return add({\n      type: elementType,\n      children: values,\n      data: {\n        hName: 'div',\n        hProperties: {\n          class: spaceSeparated.parse(classes)\n        }\n      }\n    });\n  }\n  const Parser = this.Parser;\n\n  // Inject blockTokenizer\n  const blockTokenizers = Parser.prototype.blockTokenizers;\n  const blockMethods = Parser.prototype.blockMethods;\n  blockTokenizers.alignBlocks = alignTokenizer;\n  blockMethods.splice(blockMethods.indexOf('list') + 1, 0, 'alignBlocks');\n  const Compiler = this.Compiler;\n\n  // Stringify\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors;\n    if (!visitors) return;\n    const alignCompiler = function (node) {\n      const innerContent = this.all(node);\n      const markers = {\n        left: ['<-', '<-'],\n        right: ['->', '->'],\n        center: ['->', '<-']\n      };\n      const alignType = node.type.slice(0, -7);\n      if (!markers[alignType]) return innerContent.join('\\n\\n');\n      const [start, end] = markers[alignType];\n      if (innerContent.length < 2) return `${start} ${innerContent.join('\\n').trim()} ${end}`;\n      return `${start}\\n${innerContent.join('\\n\\n').trim()}\\n${end}`;\n    };\n    visitors.leftAligned = alignCompiler;\n    visitors.rightAligned = alignCompiler;\n    visitors.centerAligned = alignCompiler;\n  }\n};"
  },
  {
    "path": "packages/remark-align/package.json",
    "content": "{\n  \"name\": \"remark-align\",\n  \"version\": \"1.2.15\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-align\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"space-separated-tokens\": \"^1.1.5\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-align/src/index.js",
    "content": "const spaceSeparated = require('space-separated-tokens')\n\nconst C_NEWLINE = '\\n'\nconst C_NEWPARAGRAPH = '\\n\\n'\n\nmodule.exports = function plugin (classNames = {}) {\n  const locateMarker = /[^\\\\]?(->|<-)/\n  const endMarkers = ['->', '<-']\n\n  function alignTokenizer (eat, value, silent) {\n    const keep = value.match(locateMarker)\n    if (!keep || keep.index !== 0) return\n\n    const now = eat.now()\n    const [, startMarker] = keep\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return true\n\n    let index = 0\n    let linesToEat = []\n    const finishedBlocks = []\n    let endMarker = ''\n    let canEatLine = true\n    let blockStartIndex = 0\n\n    while (canEatLine) {\n      const nextIndex = value.indexOf(C_NEWLINE, index + 1)\n      const lineToEat = nextIndex !== -1\n        ? value.slice(index, nextIndex)\n        : value.slice(index)\n\n      linesToEat.push(lineToEat)\n\n      const endIndex = endMarkers.indexOf(lineToEat.slice(-2))\n\n      // If nextIndex = (blockStartIndex + 2), it's the first marker of the block.\n      if ((nextIndex > (blockStartIndex + 2) || nextIndex === -1) &&\n        lineToEat.length >= 2 &&\n        endIndex !== -1\n      ) {\n        if (endMarker === '') endMarker = lineToEat.slice(-2)\n\n        finishedBlocks.push(linesToEat.join(C_NEWLINE))\n\n        // Check if another block is following\n        if (value.indexOf('->', nextIndex) !== (nextIndex + 1)) break\n        linesToEat = []\n        blockStartIndex = nextIndex + 1\n      }\n\n      index = nextIndex + 1\n      canEatLine = nextIndex !== -1\n    }\n\n    let elementType = ''\n    let classes = ''\n    if (startMarker === '<-' && endMarker === '<-') {\n      elementType = 'leftAligned'\n      classes = classNames.left ? classNames.left : 'align-left'\n    }\n    if (startMarker === '->') {\n      if (endMarker === '<-') {\n        elementType = 'centerAligned'\n        classes = classNames.center ? classNames.center : 'align-center'\n      }\n      if (endMarker === '->') {\n        elementType = 'rightAligned'\n        classes = classNames.right ? classNames.right : 'align-right'\n      }\n    }\n\n    if (!elementType) return\n    if (finishedBlocks.length === 0) return\n\n    let stringToEat = ''\n    const marker = finishedBlocks[0].substring(\n      finishedBlocks[0].length - 2,\n      finishedBlocks[0].length\n    )\n    const toEat = []\n    for (let i = 0; i < finishedBlocks.length; ++i) {\n      const block = finishedBlocks[i]\n      if (marker !== block.substring(block.length - 2, block.length)) break\n      toEat.push(block)\n      stringToEat += block.slice(2, -2) + C_NEWPARAGRAPH\n    }\n\n    const add = eat(toEat.join(C_NEWLINE))\n    const exit = this.enterBlock()\n    const values = this.tokenizeBlock(stringToEat, now)\n    exit()\n\n    return add({\n      type: elementType,\n      children: values,\n      data: {\n        hName: 'div',\n        hProperties: {\n          class: spaceSeparated.parse(classes)\n        }\n      }\n    })\n  }\n\n  const Parser = this.Parser\n\n  // Inject blockTokenizer\n  const blockTokenizers = Parser.prototype.blockTokenizers\n  const blockMethods = Parser.prototype.blockMethods\n  blockTokenizers.alignBlocks = alignTokenizer\n  blockMethods.splice(blockMethods.indexOf('list') + 1, 0, 'alignBlocks')\n\n  const Compiler = this.Compiler\n\n  // Stringify\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors\n    if (!visitors) return\n\n    const alignCompiler = function (node) {\n      const innerContent = this.all(node)\n\n      const markers = {\n        left: ['<-', '<-'],\n        right: ['->', '->'],\n        center: ['->', '<-']\n      }\n      const alignType = node.type.slice(0, -7)\n\n      if (!markers[alignType]) return innerContent.join('\\n\\n')\n\n      const [start, end] = markers[alignType]\n\n      if (innerContent.length < 2) return `${start} ${innerContent.join('\\n').trim()} ${end}`\n\n      return `${start}\\n${innerContent.join('\\n\\n').trim()}\\n${end}`\n    }\n    visitors.leftAligned = alignCompiler\n    visitors.rightAligned = alignCompiler\n    visitors.centerAligned = alignCompiler\n  }\n}\n"
  },
  {
    "path": "packages/remark-captions/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-captions/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-captions/README.md",
    "content": "# remark-captions [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis [remark][remark] plugin adds custom syntax to add a caption to elements which might benefit from a legend. It wraps the said element in a `figure` node with `figcaption` node as last child. It is particularly interesting for use with quotes, images, tables, code blocks.\n\nIt follows a \"whitelist\" approach: for each [mdast][mdast] node type for which you want to allow captioning you'll have to add a configuration property mapping a node type to its caption \"trigger\".\n\n## Syntax\n\n```markdown\n> Do it or do it not, there is no try\nSource: A little green man, with a saber larger than himself\n```\n\nThis takes what follows `Source: ` until the end of the block containing `Source: ` and puts this inside a `figcaption` mdast node. What precedes it becomes children of a `figure` node, the last child of this `figure` node being `figcaption`.\n\nUsed with `rehype`, it generates the corresponding HTML elements.\n\n```javascript\ninterface figure <: Parent {\n  type: 'figure'\n  data: {\n    hName: 'figure',\n  }\n}\n```\n\n```javascript\ninterface figcaption <: Parent {\n  type: 'figcaption'\n  data: {\n    hName: 'figcaption',\n  }\n}\n```\n\nThis plugin handles two different types of caption/legend nodes :\n\n- `internalLegend`: when the caption, after being parsed by `remark`, is inside the captioned element or inside its wrapping paragraph:\n   - blockquote\n   - image\n   - inlineMath\n   - iframe\n   - ...\n- `externalLegend`: when the caption, after being parsed by `remark`, is outside the captioned element or after its wrapping paragraph:\n   - table\n   - code\n   - math\n   - ...\n\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-captions\n```\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkCaptions = require('remark-captions')\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkCaptions, {\n    external: {\n      table: 'Table:',\n      code: 'Code:',\n      math: 'Equation:',\n    },\n    internal: {\n      image: 'Figure:',\n    }\n  })\n  .use(remark2rehype)\n  .use(stringify)\n```\n\nBy default, it features :\n\n```javascript\nexternal = {\n  table: 'Table:',\n  code: 'Code:',\n}\n\ninternal = {\n  blockquote: 'Source:',\n  image: 'Figure:',\n}\n```\n\n## Other examples\n\n\nThis enables you to deal with such a code:\n\n    ```python\n    a_highlighted_code('blah')\n    ```\n    Code: My code *caption*\n\nwill yield\n\n```javascript\n{\n  type: 'figure',\n  data: {\n    hName: 'figure'\n  },\n  children: [\n    {\n      type: 'code',\n      language: 'python',\n      value: '\\na_highlighted_code(\\'blah\\')\\n'\n    },\n    {\n      type: 'figcaption',\n      data: {\n        hName: 'figcaption'\n      }\n      children: [\n        {\n          type: 'text',\n          value: 'My code '\n        },\n        {\n          type: 'em',\n          children: [\n            {\n              type: 'text',\n              value: 'caption'\n            }\n          ]\n        }\n      ]\n    }\n  ]\n}\n```\n\nTables are also supported, example:\n\n```markdown\nhead1| head2\n-----|------\nbla|bla\nTable: figcapt1\n```\n\nAssociated with `remark-rehype` this generates a HTML tree encapsulated inside a `<figure>` tag\n\n```html\n<figure>\n  <table>\n    <thead>\n      <tr>\n        <th>head1</th>\n        <th>head2</th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr>\n        <td>bla</td>\n        <td>bla</td>\n      </tr>\n    </tbody>\n  </table>\n  <figcaption>figcapt1</figcaption>\n</figure>\n```\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-captions/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-captions\n\n[mdast]: https://github.com/syntax-tree/mdast/blob/master/readme.md\n\n[remark]: https://github.com/remarkjs/remark\n"
  },
  {
    "path": "packages/remark-captions/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`#101 1`] = `\n\"<h2>code followed by non text par</h2>\n<pre><code>foo\n</code></pre>\n<p><a href=\\\\\"#\\\\\"></a></p>\"\n`;\n\nexports[`caption without block 1`] = `\n\"<pre><code class=\\\\\"language-python\\\\\">print('bla')\n</code></pre>\n<pre><code class=\\\\\"language-python\\\\\">print('bla')\nprint('bla')\nprint('bla')\n</code></pre>\n<pre><code>a code without lang\n</code></pre>\"\n`;\n\nexports[`captions should break lists 1`] = `\n\"<figure><blockquote>\n<ul>\n<li>Bar</li>\n</ul>\n</blockquote><figcaption>fc2</figcaption></figure>\n<figure><blockquote>\n<ul>\n<li>Baz\n<pre><code>* Baz\n</code></pre>\n</li>\n</ul>\n</blockquote><figcaption>fc3</figcaption></figure>\"\n`;\n\nexports[`code 1`] = `\n\"<h2>Code</h2>\n<p>Normal code</p>\n<pre><code class=\\\\\"language-python\\\\\">print('bla')\n</code></pre>\n<p>With Legend</p>\n<figure><pre><code class=\\\\\"language-python\\\\\">print('bla')\n</code></pre><figcaption>figcapt1</figcaption></figure>\n<figure><pre><code class=\\\\\"language-python\\\\\">print('bla')\n</code></pre><figcaption>figcapt1</figcaption></figure>\n<p>break</p>\n<figure><pre><code class=\\\\\"language-python\\\\\">print('bla')\n</code></pre><figcaption>figcapt1 <em>em</em> <strong>strong <code>code</code></strong> end</figcaption></figure>\n<p>bla</p>\n<figure><pre><code class=\\\\\"language-python\\\\\">print('bla2')\n</code></pre><figcaption>figcapt1</figcaption></figure>\n<p>Code: bis</p>\"\n`;\n\nexports[`compiles to markdown when at least 1 block caption 1`] = `\n\"foo\n\n![](img)\nFigure: 3 this is a legend\n\n![](img)\nFigure: 4 this is a legend, remainder of the paragraph goes into\nthe\nlegend\n\nFigure: 5 this is a text with and image\n!\\\\\\\\[](<title> img)\nin the middle\n\nFigure: 6 displayed as text\n\n![](img)\nFigure: 7 is a legend\n\n![](img)\nFigure: 8 is a legend.\n\nFigure: 9 this is a text.\n\n> My citation\n> Source: first capt\nSource: last capt··\n2nd line\n\nnoop\n\n> foo\n> bar\n> baz\n> qux\n> Source: **first**\n> b_a_r\nSource: This is **the real** \\`source\\`\n\nnoop\n\n> foo\n> bar\n> baz\n> qux\n> Source: **first**\n> b_a_r\nSource: This is **the real** \\`source\\`\n\"\n`;\n\nexports[`compiles to markdown when at least 1 innerLegend caption 1`] = `\n\"## Code\n\nNormal code\n\n\\`\\`\\`python\nprint('bla')\n\\`\\`\\`\n\nWith Legend\n\n\\`\\`\\`python\nprint('bla')\n\\`\\`\\`\nCode: figcapt1\n\n\\`\\`\\`python\nprint('bla')\n\\`\\`\\`\nCode: figcapt1\n\nbreak\n\n\\`\\`\\`python\nprint('bla')\n\\`\\`\\`\nCode: figcapt1 _em_ **strong \\`code\\`** end\n\nbla\n\n\\`\\`\\`python\nprint('bla2')\n\\`\\`\\`\nCode: figcapt1\n\nCode: bis\n\"\n`;\n\nexports[`compiles to markdown when no caption 1`] = `\n\"foo\n\n![](img)\nFigure: 1 this is parsed as legend\n\nbaz\n\n![](img)\naFigure: 2 this is displayed as text\n\n![alt 2b](https://zestedesavoir.com/static/images/home-clem.4a2f792744c9.png)\nthis is displayed as text\n\"\n`;\n\nexports[`custom-table 1`] = `\n\"<h2>Table</h2>\n<p>Normal table</p>\n<table>\n<thead>\n<tr>\n<th>head1</th>\n<th>head2</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>bla</td>\n<td>bla</td>\n</tr>\n</tbody>\n</table>\n<p>With Legend</p>\n<figure><table>\n<thead>\n<tr>\n<th>head1</th>\n<th>head2</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>bla</td>\n<td>bla</td>\n</tr>\n</tbody>\n</table><figcaption>figcapt1</figcaption></figure>\n<figure><table>\n<thead>\n<tr>\n<th>head1</th>\n<th>head2</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>bla</td>\n<td>bla</td>\n</tr>\n</tbody>\n</table><figcaption>figcapt1</figcaption></figure>\n<p>CustomTable: bis</p>\"\n`;\n\nexports[`external legend: two legends 1`] = `\n\"<figure><table>\n<thead>\n<tr>\n<th>head1</th>\n<th>head2</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>bla</td>\n<td>bla</td>\n</tr>\n</tbody>\n</table><figcaption>figcapt1</figcaption></figure>\n<p>Table: bis</p>\"\n`;\n\nexports[`gridtables 1`] = `\"<figure><table><thead><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>a</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>b</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>c</p></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>1</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>2</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>3</p></td></tr></tbody></table><figcaption>bla bla</figcaption></figure>\"`;\n\nexports[`internal legend: two legends 1`] = `\n\"<p>Should only keep the 1st</p>\n<figure><blockquote>\n<p>My citation\nSource: first capt</p>\n</blockquote><figcaption>last capt<br>\n2nd line</figcaption></figure>\n<p>noop</p>\n<figure><blockquote>\n<p>foo\nbar\nbaz\nqux\nSource: <strong>first</strong>\nb<em>a</em>r</p>\n</blockquote><figcaption>This is <strong>the real</strong> <code>source</code></figcaption></figure>\n<p>noop</p>\"\n`;\n\nexports[`legend in paragraph 1`] = `\n\"<p>foo</p>\n<figure><img src=\\\\\"\\\\\"><figcaption>1 this is parsed as legend</figcaption></figure>\n<p>baz</p>\n<p><img src=\\\\\"\\\\\">\naFigure: 2 this is displayed as text</p>\n<p><img src=\\\\\"https://zestedesavoir.com/static/images/home-clem.4a2f792744c9.png\\\\\" alt=\\\\\"alt 2b\\\\\">\nthis is displayed as text</p>\n<p>foo</p>\n<figure><img src=\\\\\"\\\\\"><figcaption>3 this is a legend</figcaption></figure>\n<figure><img src=\\\\\"\\\\\"><figcaption>4 this is a legend, remainder of the paragraph goes into\nthe\nlegend</figcaption></figure>\n<p>Figure: 5 this is a text with and image\n<img src=\\\\\"\\\\\">\nin the middle</p>\n<p>Figure: 6 displayed as text</p>\n<figure><img src=\\\\\"\\\\\"><figcaption>7 is a legend</figcaption></figure>\n<figure><img src=\\\\\"\\\\\"><figcaption>8 is a legend.</figcaption></figure>\n<p>Figure: 9 this is a text.</p>\"\n`;\n\nexports[`quotation 1`] = `\n\"<p>(for convenience,   are replaced with\nsimple single spaces in the tests)</p>\n<h2>Blockquote</h2>\n<p>Empty blockquote</p>\n<blockquote>\n</blockquote>\n<p>Normal blockquote</p>\n<blockquote>\n<p>My citation</p>\n</blockquote>\n<p>With Legend</p>\n<figure><blockquote>\n<p>My citation</p>\n</blockquote><figcaption>figcapt1</figcaption></figure>\n<p>With Legend without Source:</p>\n<blockquote>\n<p>My citation\n: figcapt2</p>\n</blockquote>\n<p>haha</p>\n<figure><blockquote>\n<figure><blockquote>\n<figure><blockquote>\n<p>Foo<br>\nFoo</p>\n</blockquote><figcaption>fc1</figcaption></figure>\n<p>Bar<br>\nBar<br>\n</p>\n</blockquote><figcaption>fc2</figcaption></figure>\n<p>Baz\nBaz</p>\n</blockquote><figcaption>fc3</figcaption></figure>\"\n`;\n\nexports[`table 1`] = `\n\"<h2>Table</h2>\n<p>Normal table</p>\n<table>\n<thead>\n<tr>\n<th>head1</th>\n<th>head2</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>bla</td>\n<td>bla</td>\n</tr>\n</tbody>\n</table>\n<p>With Legend</p>\n<figure><table>\n<thead>\n<tr>\n<th>head1</th>\n<th>head2</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>bla</td>\n<td>bla</td>\n</tr>\n</tbody>\n</table><figcaption>figcapt1</figcaption></figure>\"\n`;\n"
  },
  {
    "path": "packages/remark-captions/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport stringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\nimport remarkStringify from 'remark-stringify'\n\nimport remarkCaptions from '../src/'\nimport remarkGridTables from '../../remark-grid-tables/src'\n\n\nconst render = (text, config) => unified()\n  .use(reParse, {\n    gfm: true,\n    commonmark: false,\n    footnotes: true,\n    /* sets list of known blocks to nothing, otherwise <h3>hey</h3> would become\n    &#x3C;h3>hey&#x3C;/h3> instead of <p>&#x3C;h3>hey&#x3C;/h3></p> */\n    blocks: [],\n  })\n  .use(remarkGridTables)\n  .use(remarkCaptions, config)\n  .use(remark2rehype)\n  .use(stringify)\n  .processSync(text)\n\n\nconst renderToMarkdown = (text, config) => unified()\n  .use(reParse)\n  .use(remarkStringify)\n  .use(remarkCaptions, config)\n  .processSync(text)\n\n\ntest('code', () => {\n  const {contents} = render(dedent`\n    ## Code\n\n    Normal code\n\n    \\`\\`\\`python\n    print('bla')\n    \\`\\`\\`\n\n    With Legend\n\n    \\`\\`\\`python\n    print('bla')\n    \\`\\`\\`\n    Code: figcapt1\n\n    \\`\\`\\`python\n    print('bla')\n    \\`\\`\\`\n    Code: figcapt1\n    break\n\n\n    \\`\\`\\`python\n    print('bla')\n    \\`\\`\\`\n    Code: figcapt1 *em* **strong \\`code\\`** end\n    bla\n\n    \\`\\`\\`python\n    print('bla2')\n    \\`\\`\\`\n    Code: figcapt1\n    Code: bis\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('#101', () => {\n  const {contents} = render(dedent`\n  ## code followed by non text par\n\n  \\`\\`\\`\n  foo\n  \\`\\`\\`\n\n  [](#)`, {external: {code: 'Code:'}})\n  expect(contents).toMatchSnapshot()\n})\n\ntest('custom-table', () => {\n  const {contents} = render(dedent`\n    ## Table\n\n    Normal table\n\n\n    head1| head2\n    -----|------\n    bla|bla\n\n\n    With Legend\n\n\n    head1| head2\n    -----|------\n    bla|bla\n    CustomTable: figcapt1\n\n\n    head1| head2\n    -----|------\n    bla|bla\n    CustomTable: figcapt1\n    CustomTable: bis\n    `,\n  {external: {table: 'CustomTable:'}}\n  )\n  expect(contents).toMatchSnapshot()\n})\n\ntest('gridtables', () => {\n  const {contents} = render(dedent`\n    +----+----+----+\n    | a  |  b | c  |\n    +====+====+====+\n    | 1  |2   |3   |\n    +----+----+----+\n    Table: bla bla`,\n  {external: {gridTable: 'Table:'}}\n  )\n  expect(contents).toMatchSnapshot()\n})\n\ntest('caption without block', () => {\n  const {contents} = render(dedent`\n      \\`\\`\\`python\n      print('bla')\n      \\`\\`\\`\n\n      \\`\\`\\`python hl_lines=1,2\n      print('bla')\n      print('bla')\n      print('bla')\n      \\`\\`\\`\n\n      \\`\\`\\`\n      a code without lang\n      \\`\\`\\`\n    `, {external: {gridTable: 'Table:'}}\n  )\n  expect(contents).toMatchSnapshot()\n})\n\ntest('quotation', () => {\n  const {contents} = render(dedent`\n    (for convenience, · are replaced with\n    simple single spaces in the tests)\n\n    ## Blockquote\n\n    Empty blockquote\n\n    >\n\n\n    Normal blockquote\n\n    > My citation\n\n    With Legend\n\n    > My citation\n    Source: figcapt1\n\n    With Legend without Source:\n\n    > My citation\n    : figcapt2\n\n    haha\n\n    > > > Foo··\n    > > > Foo\n    > > Source: fc1\n    > >\n    > > Bar··\n    > > Bar··\n    > Source: fc2\n    >\n    > Baz\n    > Baz\n    Source: fc3\n  `.replace(/·/g, ' '))\n  expect(contents).toMatchSnapshot()\n})\n\ntest('captions should break lists', () => {\n  const {contents} = render(dedent`\n    > * Bar\n    Source: fc2\n\n    > * Baz\n    >     * Baz\n    Source: fc3\n  `.replace(/·/g, ' '))\n  expect(contents).toMatchSnapshot()\n})\n\ntest('table', () => {\n  const {contents} = render(dedent`\n    ## Table\n\n    Normal table\n\n\n    head1| head2\n    -----|------\n    bla|bla\n\n\n    With Legend\n\n\n    head1| head2\n    -----|------\n    bla|bla\n    Table: figcapt1\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('external legend: two legends', () => {\n  const {contents} = render(dedent`\n    head1| head2\n    -----|------\n    bla|bla\n    Table: figcapt1\n    Table: bis\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('internal legend: two legends', () => {\n  const {contents} = render(dedent`\n    Should only keep the 1st\n\n    > My citation\n    Source: first capt\n    Source: last capt··\n    2nd line\n\n    noop\n\n    > foo\n    > bar\n    > baz\n    > qux\n    Source: **first**\n    b*a*r\n    Source: This is **the real** \\`source\\`\n\n    noop\n  `.replace(/·/g, ' '))\n  expect(contents).toMatchSnapshot()\n})\n\ntest('legend in paragraph', () => {\n  const {contents} = render(dedent`\n    foo\n\n    ![]()\n    Figure: 1 this is parsed as legend\n\n    baz\n\n    ![]()\n    aFigure: 2 this is displayed as text\n\n    ![alt 2b](https://zestedesavoir.com/static/images/home-clem.4a2f792744c9.png)\n    this is displayed as text\n\n    foo\n    ![]()\n    Figure: 3 this is a legend\n\n    ![]()\n    Figure: 4 this is a legend, remainder of the paragraph goes into\n    the\n    legend\n\n    Figure: 5 this is a text with and image\n    ![]()\n    in the middle\n\n    Figure: 6 displayed as text\n    ![]()\n    Figure: 7 is a legend\n\n    ![]()\n    Figure: 8 is a legend.\n\n    Figure: 9 this is a text.\n  `.replace(/·/g, ' '))\n  expect(contents).toMatchSnapshot()\n})\n\ntest('compiles to markdown when no caption', () => {\n  const md = dedent`\n    foo\n\n    ![](img)\n    Figure: 1 this is parsed as legend\n\n    baz\n\n    ![](img)\n    aFigure: 2 this is displayed as text\n\n    ![alt 2b](https://zestedesavoir.com/static/images/home-clem.4a2f792744c9.png)\n    this is displayed as text\n  `\n  const {contents} = renderToMarkdown(md)\n  expect(contents).toMatchSnapshot()\n\n  const contents1 = renderToMarkdown(md).contents\n  const contents2 = renderToMarkdown(contents1).contents\n\n  expect(contents1).toBe(contents2)\n})\ntest('compiles to markdown when at least 1 block caption', () => {\n  const md = dedent`\n    foo\n    ![](img)\n    Figure: 3 this is a legend\n\n    ![](img)\n    Figure: 4 this is a legend, remainder of the paragraph goes into\n    the\n    legend\n\n    Figure: 5 this is a text with and image\n    ![](<title> img)\n    in the middle\n\n    Figure: 6 displayed as text\n    ![](img)\n    Figure: 7 is a legend\n\n    ![](img)\n    Figure: 8 is a legend.\n\n    Figure: 9 this is a text.\n\n    > My citation\n    Source: first capt\n    Source: last capt··\n    2nd line\n\n    noop\n\n    > foo\n    > bar\n    > baz\n    > qux\n    Source: **first**\n    b*a*r\n    Source: This is **the real** \\`source\\`\n\n    noop\n\n    > foo\n    > bar\n    > baz\n    > qux\n    Source: **first**\n    b*a*r\n    Source: This is **the real** \\`source\\`\n\n  `\n  const {contents} = renderToMarkdown(md)\n  expect(contents).toMatchSnapshot()\n\n  const contents1 = renderToMarkdown(md).contents\n  const contents2 = renderToMarkdown(contents1).contents\n\n  expect(contents1).toBe(contents2)\n})\n\ntest('compiles to markdown when at least 1 innerLegend caption', () => {\n  const md = dedent`\n    ## Code\n\n    Normal code\n\n    \\`\\`\\`python\n    print('bla')\n    \\`\\`\\`\n\n    With Legend\n\n    \\`\\`\\`python\n    print('bla')\n    \\`\\`\\`\n    Code: figcapt1\n\n    \\`\\`\\`python\n    print('bla')\n    \\`\\`\\`\n    Code: figcapt1\n    break\n\n    \\`\\`\\`python\n    print('bla')\n    \\`\\`\\`\n    Code: figcapt1 *em* **strong \\`code\\`** end\n    bla\n\n    \\`\\`\\`python\n    print('bla2')\n    \\`\\`\\`\n    Code: figcapt1\n    Code: bis\n  `\n  const {contents} = renderToMarkdown(md)\n  expect(contents).toMatchSnapshot()\n\n  const contents1 = renderToMarkdown(md).contents\n  const contents2 = renderToMarkdown(contents1).contents\n\n  expect(contents1).toBe(contents2)\n})\n"
  },
  {
    "path": "packages/remark-captions/dist/index.js",
    "content": "\"use strict\";\n\nconst clone = require('clone');\nconst visit = require('unist-util-visit');\nconst xtend = require('xtend');\nconst legendBlock = {\n  table: 'Table:',\n  code: 'Code:'\n};\nconst internLegendBlock = {\n  blockquote: 'Source:',\n  image: 'Figure:'\n};\nfunction plugin(opts) {\n  const externalBlocks = xtend(legendBlock, opts && opts.external || {});\n  const internalBlocks = xtend(internLegendBlock, opts && opts.internal || {});\n  const Compiler = this.Compiler;\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors;\n    if (!visitors) return;\n    visitors.figure = function (node) {\n      const captionedNode = node.children[0];\n      const captionNode = node.children[1];\n      const captionedMarkdown = this.visit(captionedNode);\n\n      // compile without taking care of the \"figcaption\" wrapper node\n      const captionMarkdown = this.all(captionNode).join('');\n      if (!(captionedNode.type in externalBlocks || captionedNode.type in internalBlocks)) {\n        return captionedMarkdown;\n      }\n      let prefix = '';\n      if (captionedNode.type in externalBlocks) {\n        prefix = externalBlocks[captionedNode.type];\n      } else if (captionedNode.type in internalBlocks) {\n        prefix = internalBlocks[captionedNode.type];\n      }\n      return `${captionedMarkdown}\\n${prefix} ${captionMarkdown}`;\n    };\n  }\n  return function transformer(tree) {\n    Object.keys(internalBlocks).forEach(nodeType => visit(tree, nodeType, internLegendVisitor(internalBlocks)));\n    Object.keys(externalBlocks).forEach(nodeType => visit(tree, nodeType, externLegendVisitorCreator(externalBlocks)));\n    visit(tree, 'figure', (figure, index, parent) => {\n      if (parent.type === 'paragraph') {\n        if (index === 0) {\n          parent.type = figure.type;\n          parent.data = figure.data;\n          parent.children = figure.children;\n          return;\n        }\n        parent.type = 'tempWrapper';\n      }\n    });\n    visit(tree, 'tempWrapper', (wrapper, index, parent) => {\n      const newChildren = [];\n      wrapper.children.forEach((node, i) => {\n        const child = clone(node);\n        if (child.type === 'figure') {\n          newChildren.push(child);\n          return;\n        }\n        if (child.type === 'text' && !child.value.trim()) {\n          return;\n        } else if (child.type === 'text') {\n          child.value = child.value.trim();\n        }\n        wrapper.children[i].type = 'paragraph';\n        wrapper.children[i].children = [child];\n        newChildren.push(wrapper.children[i]);\n      });\n      parent.children.splice(index, 1, ...newChildren);\n    });\n  };\n}\nfunction internLegendVisitor(internalBlocks) {\n  return function (node, index, parent) {\n    // if already wrapped in figure, skip\n    if (parent && parent.type === 'figure') return;\n\n    // if the current node has some children, the legend is the last child.\n    // if not, the legend is the last child of the parent node.\n    const lastP = node.children ? getLastParagraph(node.children) : parent;\n    // legend can only be in a paragraph.\n    if (!lastP || node.children && lastP.type !== 'paragraph' || !node.children && parent.type !== 'paragraph') {\n      return;\n    }\n\n    // find which child contains the last legend\n    let legendChildIndex = -1;\n    lastP.children.forEach((child, index) => {\n      if (child.type === 'text' && (child.value.startsWith(internalBlocks[node.type]) || child.value.includes(`\\n${internalBlocks[node.type]}`))) {\n        legendChildIndex = index;\n      }\n    });\n    if (legendChildIndex === -1 || !node.children && legendChildIndex < index) {\n      return;\n    }\n\n    // split the text node containing the last legend and find the line containing it\n    const potentialLegendLines = lastP.children[legendChildIndex].value.split('\\n');\n    let lastLegendIndex = -1;\n    potentialLegendLines.forEach((line, index) => {\n      if (line.startsWith(internalBlocks[node.type])) {\n        lastLegendIndex = index;\n      }\n    });\n\n    // the child containing the last legend is split in two: head contains text until\n    // legend, tail contains legend text\n    const tail = clone(lastP.children[legendChildIndex]);\n    const headText = potentialLegendLines.slice(0, lastLegendIndex).join('\\n');\n    // replace existing node 'head' content with text until legend\n    lastP.children[legendChildIndex].value = headText;\n\n    // legend text is put into the cloned node…\n    const legendText = potentialLegendLines.slice(lastLegendIndex).join('\\n').slice(internalBlocks[node.type].length).trimLeft();\n    tail.value = legendText;\n    // … and 'tail', the cloned node is inserted after 'head'\n    lastP.children.splice(legendChildIndex + 1, 0, tail);\n\n    // gather all nodes that should be inside the legend\n    const legendNodes = lastP.children.slice(legendChildIndex + 1);\n    // remove them from the parent paragraph\n    lastP.children = lastP.children.slice(0, legendChildIndex + 1);\n    const figcaption = {\n      type: 'figcaption',\n      children: legendNodes,\n      data: {\n        hName: 'figcaption'\n      }\n    };\n    const figure = {\n      type: 'figure',\n      children: [clone(node), figcaption],\n      data: {\n        hName: 'figure'\n      }\n    };\n    node.type = figure.type;\n    node.children = figure.children;\n    node.data = figure.data;\n  };\n}\nfunction externLegendVisitorCreator(blocks) {\n  return function (node, index, parent) {\n    if (index >= parent.children.length - 1) return;\n    if (parent.children[index + 1].type !== 'paragraph') return;\n    const legendNode = parent.children[index + 1];\n    const firstChild = legendNode.children[0];\n    if (firstChild.type !== 'text' || !firstChild.value.startsWith(blocks[node.type])) return;\n    const legendNodes = [];\n    const followingNodes = [];\n    const firstTextLine = firstChild.value.replace(blocks[node.type], '').split('\\n')[0];\n    if (firstChild.value.includes('\\n')) {\n      followingNodes.push({\n        type: 'text',\n        value: firstChild.value.replace(blocks[node.type], '').split('\\n')[1]\n      });\n    }\n    legendNodes.push({\n      type: 'text',\n      value: firstTextLine.trimLeft() // remove the \" \" after the {prefix}:\n    });\n    legendNode.children.forEach((node, index) => {\n      if (index === 0) return;\n      if (node.type === 'text') {\n        const keepInLegend = node.value.split('\\n')[0];\n        if (node.value.includes('\\n')) {\n          node.value = node.value.split('\\n')[1];\n          followingNodes.push(node);\n        }\n        legendNodes.push({\n          type: 'text',\n          value: keepInLegend\n        });\n      } else {\n        legendNodes.push(clone(node));\n      }\n    });\n    const figcaption = {\n      type: 'figcaption',\n      children: legendNodes,\n      data: {\n        hName: 'figcaption'\n      }\n    };\n    const figure = {\n      type: 'figure',\n      children: [clone(node), figcaption],\n      data: {\n        hName: 'figure'\n      }\n    };\n    node.type = figure.type;\n    node.children = figure.children;\n    node.data = figure.data;\n    if (followingNodes.length) {\n      parent.children.splice(index + 1, 1, {\n        type: 'paragraph',\n        children: followingNodes\n      });\n    } else {\n      parent.children.splice(index + 1, 1);\n    }\n  };\n}\nfunction getLastParagraph(xs, lastParagraph) {\n  const len = xs.length;\n  if (!len) return;\n  const last = xs[len - 1];\n  if (last.type === 'text') return lastParagraph;\n  if (!last.children || !last.children.length) return lastParagraph;\n  if (last.type === 'paragraph') return getLastParagraph(last.children, last);\n  return getLastParagraph(last.children, lastParagraph);\n}\nmodule.exports = plugin;"
  },
  {
    "path": "packages/remark-captions/package.json",
    "content": "{\n  \"name\": \"remark-captions\",\n  \"version\": \"2.2.4\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-captions\",\n    \"type\": \"git\"\n  },\n  \"author\": \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"clone\": \"^2.1.2\",\n    \"unist-util-visit\": \"^2.0.3\",\n    \"xtend\": \"^4.0.2\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-captions/src/index.js",
    "content": "const clone = require('clone')\nconst visit = require('unist-util-visit')\nconst xtend = require('xtend')\n\nconst legendBlock = {\n  table: 'Table:',\n  code: 'Code:'\n}\n\nconst internLegendBlock = {\n  blockquote: 'Source:',\n  image: 'Figure:'\n}\n\nfunction plugin (opts) {\n  const externalBlocks = xtend(legendBlock, (opts && opts.external) || {})\n  const internalBlocks = xtend(internLegendBlock, (opts && opts.internal) || {})\n\n  const Compiler = this.Compiler\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors\n    if (!visitors) return\n\n    visitors.figure = function (node) {\n      const captionedNode = node.children[0]\n      const captionNode = node.children[1]\n      const captionedMarkdown = this.visit(captionedNode)\n\n      // compile without taking care of the \"figcaption\" wrapper node\n      const captionMarkdown = this.all(captionNode).join('')\n      if (!(captionedNode.type in externalBlocks || captionedNode.type in internalBlocks)) {\n        return captionedMarkdown\n      }\n\n      let prefix = ''\n      if (captionedNode.type in externalBlocks) {\n        prefix = externalBlocks[captionedNode.type]\n      } else if (captionedNode.type in internalBlocks) {\n        prefix = internalBlocks[captionedNode.type]\n      }\n\n      return `${captionedMarkdown}\\n${prefix} ${captionMarkdown}`\n    }\n  }\n\n  return function transformer (tree) {\n    Object.keys(internalBlocks).forEach((nodeType) =>\n      visit(tree, nodeType, internLegendVisitor(internalBlocks)))\n\n    Object.keys(externalBlocks).forEach(nodeType =>\n      visit(tree, nodeType, externLegendVisitorCreator(externalBlocks)))\n    visit(tree, 'figure', (figure, index, parent) => {\n      if (parent.type === 'paragraph') {\n        if (index === 0) {\n          parent.type = figure.type\n          parent.data = figure.data\n          parent.children = figure.children\n          return\n        }\n        parent.type = 'tempWrapper'\n      }\n    })\n    visit(tree, 'tempWrapper', (wrapper, index, parent) => {\n      const newChildren = []\n      wrapper.children.forEach((node, i) => {\n        const child = clone(node)\n        if (child.type === 'figure') {\n          newChildren.push(child)\n          return\n        }\n        if (child.type === 'text' && !child.value.trim()) {\n          return\n        } else if (child.type === 'text') {\n          child.value = child.value.trim()\n        }\n        wrapper.children[i].type = 'paragraph'\n        wrapper.children[i].children = [child]\n        newChildren.push(wrapper.children[i])\n      })\n      parent.children.splice(index, 1, ...newChildren)\n    })\n  }\n}\n\nfunction internLegendVisitor (internalBlocks) {\n  return function (node, index, parent) {\n    // if already wrapped in figure, skip\n    if (parent && parent.type === 'figure') return\n\n    // if the current node has some children, the legend is the last child.\n    // if not, the legend is the last child of the parent node.\n    const lastP = node.children ? getLastParagraph(node.children) : parent\n    // legend can only be in a paragraph.\n    if (!lastP ||\n      (node.children && lastP.type !== 'paragraph') ||\n      (!node.children && parent.type !== 'paragraph')) {\n      return\n    }\n\n    // find which child contains the last legend\n    let legendChildIndex = -1\n    lastP.children.forEach((child, index) => {\n      if (child.type === 'text' &&\n           (child.value.startsWith(internalBlocks[node.type]) ||\n            child.value.includes(`\\n${internalBlocks[node.type]}`))\n      ) {\n        legendChildIndex = index\n      }\n    })\n    if (legendChildIndex === -1 ||\n      (!node.children && legendChildIndex < index)\n    ) {\n      return\n    }\n\n    // split the text node containing the last legend and find the line containing it\n    const potentialLegendLines = lastP.children[legendChildIndex].value.split('\\n')\n    let lastLegendIndex = -1\n    potentialLegendLines.forEach((line, index) => {\n      if (line.startsWith(internalBlocks[node.type])) {\n        lastLegendIndex = index\n      }\n    })\n\n    // the child containing the last legend is split in two: head contains text until\n    // legend, tail contains legend text\n    const tail = clone(lastP.children[legendChildIndex])\n    const headText = potentialLegendLines.slice(0, lastLegendIndex).join('\\n')\n    // replace existing node 'head' content with text until legend\n    lastP.children[legendChildIndex].value = headText\n\n    // legend text is put into the cloned node…\n    const legendText = potentialLegendLines\n      .slice(lastLegendIndex)\n      .join('\\n')\n      .slice(internalBlocks[node.type].length)\n      .trimLeft()\n\n    tail.value = legendText\n    // … and 'tail', the cloned node is inserted after 'head'\n    lastP.children.splice(legendChildIndex + 1, 0, tail)\n\n    // gather all nodes that should be inside the legend\n    const legendNodes = lastP.children.slice(legendChildIndex + 1)\n    // remove them from the parent paragraph\n    lastP.children = lastP.children.slice(0, legendChildIndex + 1)\n\n    const figcaption = {\n      type: 'figcaption',\n      children: legendNodes,\n      data: {\n        hName: 'figcaption'\n      }\n    }\n\n    const figure = {\n      type: 'figure',\n      children: [\n        clone(node),\n        figcaption\n      ],\n      data: {\n        hName: 'figure'\n      }\n    }\n\n    node.type = figure.type\n    node.children = figure.children\n    node.data = figure.data\n  }\n}\n\nfunction externLegendVisitorCreator (blocks) {\n  return function (node, index, parent) {\n    if (index >= parent.children.length - 1) return\n    if (parent.children[index + 1].type !== 'paragraph') return\n\n    const legendNode = parent.children[index + 1]\n    const firstChild = legendNode.children[0]\n    if (firstChild.type !== 'text' || !firstChild.value.startsWith(blocks[node.type])) return\n\n    const legendNodes = []\n    const followingNodes = []\n    const firstTextLine = firstChild.value.replace(blocks[node.type], '').split('\\n')[0]\n\n    if (firstChild.value.includes('\\n')) {\n      followingNodes.push({\n        type: 'text',\n        value: firstChild.value.replace(blocks[node.type], '').split('\\n')[1]\n      })\n    }\n    legendNodes.push({\n      type: 'text',\n      value: firstTextLine.trimLeft() // remove the \" \" after the {prefix}:\n    })\n\n    legendNode.children.forEach((node, index) => {\n      if (index === 0) return\n\n      if (node.type === 'text') {\n        const keepInLegend = node.value.split('\\n')[0]\n        if (node.value.includes('\\n')) {\n          node.value = node.value.split('\\n')[1]\n          followingNodes.push(node)\n        }\n        legendNodes.push({ type: 'text', value: keepInLegend })\n      } else {\n        legendNodes.push(clone(node))\n      }\n    })\n\n    const figcaption = {\n      type: 'figcaption',\n      children: legendNodes,\n      data: {\n        hName: 'figcaption'\n      }\n    }\n    const figure = {\n      type: 'figure',\n      children: [\n        clone(node),\n        figcaption\n      ],\n      data: {\n        hName: 'figure'\n      }\n    }\n\n    node.type = figure.type\n    node.children = figure.children\n    node.data = figure.data\n\n    if (followingNodes.length) {\n      parent.children.splice(index + 1, 1, { type: 'paragraph', children: followingNodes })\n    } else {\n      parent.children.splice(index + 1, 1)\n    }\n  }\n}\n\nfunction getLastParagraph (xs, lastParagraph) {\n  const len = xs.length\n  if (!len) return\n\n  const last = xs[len - 1]\n  if (last.type === 'text') return lastParagraph\n  if (!last.children || !last.children.length) return lastParagraph\n\n  if (last.type === 'paragraph') return getLastParagraph(last.children, last)\n  return getLastParagraph(last.children, lastParagraph)\n}\n\nmodule.exports = plugin\n"
  },
  {
    "path": "packages/remark-comments/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-comments/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-comments/README.md",
    "content": "# remark-comments [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis plugin parses custom Markdown syntax for Markdown source comments.\n\n## Syntax\n\nYou can insert comments in the Markdown source this way:\n\n```markdown\nFoo<--COMMENTS I am a comment COMMENTS-->bar\n```\n\nEverything between `<--COMMENTS` and `COMMENTS-->` will be absent from the HTML output. Compiling to Markdown will preserve all comments.\n\n## AST node (see [mdast][mdast] specification)\n\nThe plugin will product the following node and add it to the MDAST syntax tree:\n\n```javascript\ninterface Comments <: Node {\n  type: \"comments\";\n  data: {\n    comment: string;\n  }\n}\n```\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-comments\n```\n\n## Configuration\n\nTwo options can be passed, as a single argument object:\n\n    {beginMarker = 'COMMENTS', endMarker = 'COMMENTS'}\n\nTherefore, invoking this plugin this way:\n\n```js\n  .use(remarkComments, {\n    beginMarker: 'foo',\n    endMarker: 'bar'\n  })\n```\n\nwill make this plugin remove what's put between `<--foo` and `bar-->`.\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkComments = require('remark-comments')\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkComments)\n  .use(remark2rehype)\n  .use(stringify)\n```\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-comments/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-comments\n"
  },
  {
    "path": "packages/remark-comments/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`comments 1`] = `\n\"<p>Foobar</p>\n<pre><code>Foo&#x3C;--COMMENTS I will not get removed because I am in a code block DEF COMMENTS-->bar\n</code></pre>\n<p>&#x3C;--COMMENTS Unfinished block won't get parsed either GHI</p>\"\n`;\n\nexports[`comments custom different markers 1`] = `\n\"<p>Foobar</p>\n<pre><code>Foo&#x3C;--foo I will not get removed because I am in a code block bAR-->bar\n</code></pre>\n<p>&#x3C;--foo Unfinished block won't get parsed either</p>\"\n`;\n\nexports[`comments custom same markers 1`] = `\n\"<p>Foobar</p>\n<pre><code>Foo&#x3C;--foo I will not get removed because I am in a code block foo-->bar\n</code></pre>\n<p>&#x3C;--foo Unfinished block won't get parsed either</p>\"\n`;\n\nexports[`compiles to markdown 1`] = `\n\"Foo<--COMMENTS I will be gone ABC COMMENTS-->bar\n\n    Foo<--COMMENTS I will not get removed because I am in a code block DEF COMMENTS-->bar\n\n&lt;--COMMENTS Unfinished block won't get parsed either GHI\n\"\n`;\n"
  },
  {
    "path": "packages/remark-comments/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport remark2rehype from 'remark-rehype'\nimport remarkStringify from 'remark-stringify'\nimport rehypeStringify from 'rehype-stringify'\n\nimport plugin from '../src/'\n\nconst renderToMarkdown = text => unified()\n  .use(reParse)\n  .use(remarkStringify)\n  .use(plugin)\n  .processSync(text)\n\ntest('comments', () => {\n  const render = text => unified()\n    .use(reParse)\n    .use(plugin)\n    .use(remark2rehype)\n    .use(rehypeStringify)\n    .processSync(text)\n\n  const {contents} = render(dedent`\n    Foo<--COMMENTS I will be gone ABC COMMENTS-->bar\n\n    \\`\\`\\`\n    Foo<--COMMENTS I will not get removed because I am in a code block DEF COMMENTS-->bar\n    \\`\\`\\`\n\n    <--COMMENTS Unfinished block won't get parsed either GHI\n  `)\n  expect(contents).toMatchSnapshot()\n  expect(contents).not.toContain('ABC')\n  expect(contents).toContain('DEF')\n  expect(contents).toContain('GHI')\n})\n\ntest('compiles to markdown', () => {\n  const {contents} = renderToMarkdown(dedent`\n    Foo<--COMMENTS I will be gone ABC COMMENTS-->bar\n\n    \\`\\`\\`\n    Foo<--COMMENTS I will not get removed because I am in a code block DEF COMMENTS-->bar\n    \\`\\`\\`\n\n    <--COMMENTS Unfinished block won't get parsed either GHI\n  `)\n  expect(contents).toMatchSnapshot()\n  expect(contents).toContain('Foo<--COMMENTS I will be gone ABC COMMENTS-->bar')\n})\n\ntest('comments custom different markers', () => {\n  const render = text => unified()\n    .use(reParse)\n    .use(plugin, {\n      beginMarker: 'foo',\n      endMarker: 'bAR',\n    })\n    .use(remark2rehype)\n    .use(rehypeStringify)\n    .processSync(text)\n\n  const {contents} = render(dedent`\n    Foo<--foo I will be gone bAR-->bar\n\n    \\`\\`\\`\n    Foo<--foo I will not get removed because I am in a code block bAR-->bar\n    \\`\\`\\`\n\n    <--foo Unfinished block won't get parsed either\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('comments custom same markers', () => {\n  const render = text => unified()\n    .use(reParse)\n    .use(plugin, {\n      beginMarker: 'foo',\n      endMarker: 'foo',\n    })\n    .use(remark2rehype)\n    .use(rehypeStringify)\n    .processSync(text)\n\n  const {contents} = render(dedent`\n    Foo<--foo I will be gone foo-->bar\n\n    \\`\\`\\`\n    Foo<--foo I will not get removed because I am in a code block foo-->bar\n    \\`\\`\\`\n\n    <--foo Unfinished block won't get parsed either\n  `)\n  expect(contents).toMatchSnapshot()\n})\n"
  },
  {
    "path": "packages/remark-comments/dist/index.js",
    "content": "\"use strict\";\n\nconst beginMarkerFactory = (marker = 'COMMENTS') => `<--${marker} `;\nconst endMarkerFactory = (marker = 'COMMENTS') => ` ${marker}-->`;\nfunction plugin({\n  beginMarker = 'COMMENTS',\n  endMarker = 'COMMENTS'\n} = {}) {\n  beginMarker = beginMarkerFactory(beginMarker);\n  endMarker = endMarkerFactory(endMarker);\n  function locator(value, fromIndex) {\n    return value.indexOf(beginMarker, fromIndex);\n  }\n  function inlineTokenizer(eat, value, silent) {\n    const keepBegin = value.indexOf(beginMarker);\n    const keepEnd = value.indexOf(endMarker);\n    if (keepBegin !== 0 || keepEnd === -1) return;\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return true;\n    const comment = value.substring(beginMarker.length, keepEnd);\n    return eat(beginMarker + comment + endMarker)({\n      type: 'comments',\n      value: '',\n      data: {\n        comment\n      }\n    });\n  }\n  inlineTokenizer.locator = locator;\n  const Parser = this.Parser;\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers;\n  const inlineMethods = Parser.prototype.inlineMethods;\n  inlineTokenizers.comments = inlineTokenizer;\n  inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'comments');\n  const Compiler = this.Compiler;\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors;\n    if (!visitors) return;\n    visitors.comments = node => {\n      return beginMarker + node.data.comment + endMarker;\n    };\n  }\n}\nmodule.exports = plugin;"
  },
  {
    "path": "packages/remark-comments/package.json",
    "content": "{\n  \"name\": \"remark-comments\",\n  \"version\": \"1.2.10\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-comments\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/remark-comments/src/index.js",
    "content": "const beginMarkerFactory = (marker = 'COMMENTS') => `<--${marker} `\nconst endMarkerFactory = (marker = 'COMMENTS') => ` ${marker}-->`\n\nfunction plugin ({ beginMarker = 'COMMENTS', endMarker = 'COMMENTS' } = {}) {\n  beginMarker = beginMarkerFactory(beginMarker)\n  endMarker = endMarkerFactory(endMarker)\n\n  function locator (value, fromIndex) {\n    return value.indexOf(beginMarker, fromIndex)\n  }\n\n  function inlineTokenizer (eat, value, silent) {\n    const keepBegin = value.indexOf(beginMarker)\n    const keepEnd = value.indexOf(endMarker)\n    if (keepBegin !== 0 || keepEnd === -1) return\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return true\n\n    const comment = value.substring(beginMarker.length, keepEnd)\n    return eat(beginMarker + comment + endMarker)({\n      type: 'comments',\n      value: '',\n      data: { comment }\n    })\n  }\n  inlineTokenizer.locator = locator\n\n  const Parser = this.Parser\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers\n  const inlineMethods = Parser.prototype.inlineMethods\n  inlineTokenizers.comments = inlineTokenizer\n  inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'comments')\n\n  const Compiler = this.Compiler\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors\n    if (!visitors) return\n    visitors.comments = (node) => {\n      return beginMarker + node.data.comment + endMarker\n    }\n  }\n}\n\nmodule.exports = plugin\n"
  },
  {
    "path": "packages/remark-custom-blocks/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-custom-blocks/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-custom-blocks/README.md",
    "content": "# remark-custom-blocks [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis plugin parses custom Markdown syntax to create new custom blocks.\nIt adds new nodes types to the [mdast][mdast] produced by [remark][remark]:\n\n* `{yourType}CustomBlock`\n\nIf you are using [rehype][rehype], the stringified HTML result will be `div`s with configurable CSS classes.\n\nIt is up to you to have CSS rules producing the desired result for these classes.\n\nThe goal is to let you create blocks or panels somewhat similar to [these](http://docdock.netlify.com/shortcodes/panel/).\n\nEach custom block can specify CSS classes and whether users are allowed or required to add a custom title to the block.\n\nOnly inline Markdown will be parsed in titles.\n\n## AST nodes (see [mdast][mdast] specification)\n\nBy default, the plugin will produce the following two nodes, where `whatnot` is the name of you block:\n\n```javascript\ninterface whatnotCustomBlock <: Parent {\n  type: \"whatnotCustomBlock\";\n  data: {\n    hName: \"div\" or \"details\";\n    hProperties: {\n      className: [string];\n    }\n  }\n}\n```\n\n```javascript\ninterface whatnotCustomBlockBody <: Parent {\n  type: \"whatnotCustomBlockBody\";\n  data: {\n    hName: \"div\";\n    hProperties: {\n      className: [string];\n    }\n  }\n}\n```\n\nIf your block has a heading, the following node will also be produced:\n\n```javascript\ninterface whatnotCustomBlockHeading <: Parent {\n  type: \"whatnotCustomBlockHeading\";\n  data: {\n    hName: \"div\" or \"summary\";\n    hProperties: {\n      className: [string];\n    }\n  }\n}\n```\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-custom-blocks\n```\n\n## Usage, Configuration, Syntax\n\n#### Configuration:\n\nThe configuration object follows this pattern:\n\n```\ntrigger: {\n  classes: String, space-separated classes, optional, default: ''\n  title: String, 'optional' | 'required', optional, default: custom titles not allowed\n  containerElement: String, optional, default: 'div'\n  titleElement: String, optional, default: 'div'\n  contentsElement: String, optional, default: 'div'\n  details: Boolean, optional, default: false\n}\n```\n\n`containerElement`, `titleElement`, `contentsElement` allow you to customize the html elements that will be generated by `remark-rehype` stringifier. The generated HTML structure will be\n\n```html\n<containerElement>\n    <titleElement>\n        block title\n    </titleElement>\n    <contentsElement>\n        block content\n    </contentsElement>\n</containerElement>\n```\n\nyou can see `details: true` as a shortcut to\n\n```javascript\n{\n    containerElement: 'details',\n    titleElement: 'summary',\n    contentsElement: 'div',\n}\n```\n\nThose specific parameters are here to help you build semantic HTML structure.\n\n#### Dependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkCustomBlocks = require('remark-custom-blocks')\n```\n\n#### Usage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkCustomBlocks, {\n    foo: {\n      classes: 'a-class another-class'\n    },\n    bar: {\n      classes: 'something',\n      title: 'optional'\n    },\n    qux: {\n      classes: 'qux-block',\n      title: 'required'\n    },\n    spoiler: {\n      classes: 'spoiler-block',\n      title: 'optional',\n      details: true\n    },\n  })\n  .use(remark2rehype)\n  .use(stringify)\n```\n\nThe sample configuration provided above would have the following effect:\n\n1. Allows you to use the following Markdown syntax to create blocks:\n\n    ```markdown\n    [[foo]]\n    | content\n\n    [[bar]]\n    | content\n\n    [[bar | my **title**]]\n    | content\n\n    [[qux | my title]]\n    | content\n\n    [[spoiler | my title]]\n    | content\n    ```\n\n    * Block `foo` cannot have a title, `[[foo | title]]` will not result in a block.\n    * Block `bar` can have a title but does not need to.\n    * Block `qux` requires a title, `[[qux]]` will not result in a block.\n\n1. This Remark plugin would create [mdast][mdast] nodes for these two blocks, these nodes would be of type:\n\n    * `fooCustomBlock`, content will be in `fooCustomBlockBody`\n    * `barCustomBlock`, content in `barCustomBlockBody`, optional title in `barCustomBlockHeading`\n    * `quxCustomBlock`, content in `quxCustomBlockBody`, required title in `quxCustomBlockHeading`\n\n1. If you're using [rehype][rehype], you will end up with these 4 `div`s and 1 `details`:\n\n    ```html\n    <div class=\"custom-block a-class another-class\">\n      <div class=\"custom-block-body\"><p>content</p></div>\n    </div>\n\n    <div class=\"custom-block something\">\n      <div class=\"custom-block-body\"><p>content</p></div>\n    </div>\n\n    <div class=\"custom-block something\">\n      <div class=\"custom-block-heading\">my <strong>title</strong></div>\n      <div class=\"custom-block-body\"><p>content</p></div>\n    </div>\n\n    <div class=\"custom-block qux-block\">\n      <div class=\"custom-block-heading\">my title</div>\n      <div class=\"custom-block-body\"><p>content</p></div>\n    </div>\n\n     <details class=\"custom-block spoiler-block\">\n      <summary class=\"custom-block-heading\">my title</summary>\n      <div class=\"custom-block-body\"><p>content</p></div>\n    </details>\n   ```\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-custom-blocks/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-custom-blocks\n\n[mdast]: https://github.com/syntax-tree/mdast/blob/master/readme.md\n\n[remark]: https://github.com/remarkjs/remark\n\n[rehype]: https://github.com/rehypejs/rehype\n"
  },
  {
    "path": "packages/remark-custom-blocks/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Common 1`] = `\n\"<div class=\\\\\"custom-block spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Secret Block</p></div></div>\n<div class=\\\\\"custom-block spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Secret Block</p></div></div>\n<div class=\\\\\"custom-block spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>another</p></div></div>\n<blockquote>\n<div class=\\\\\"custom-block spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><blockquote>\n<p>Blockquote in secret block in blockquote</p>\n</blockquote></div></div>\n</blockquote>\n<div class=\\\\\"custom-block information ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Information Block</p></div></div>\n<div class=\\\\\"custom-block information ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>another</p></div></div>\n<div class=\\\\\"custom-block question ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Question Block</p></div></div>\n<div class=\\\\\"custom-block question ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>another</p></div></div>\n<div class=\\\\\"custom-block warning ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Attention Block</p></div></div>\n<div class=\\\\\"custom-block warning ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>another</p></div></div>\n<div class=\\\\\"custom-block error ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Erreur Block</p></div></div>\n<div class=\\\\\"custom-block error ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>another</p></div></div>\n<p>[[se]]\n| not a block</p>\n<p>[[secretsecret]]\n| not a block</p>\n<p>[[SECRET]]\n| not a block</p>\n<div class=\\\\\"custom-block spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Multiline block</p><blockquote>\n<p>with blockquote !</p>\n</blockquote></div></div>\n<p>| Not a block</p>\n<p>[[attention | title]]\n| not parsed</p>\"\n`;\n\nexports[`compile fixture to markdown 1`] = `\n\"[[s]]\n| Secret Block\n\n[[s]]\n| Secret Block\n\n[[secret]]\n| another\n\n> [[s]]\n> | > Blockquote in secret block in blockquote\n\n[[i]]\n| Information Block\n\n[[information]]\n| another\n\n[[q]]\n| Question Block\n\n[[question]]\n| another\n\n[[a]]\n| Attention Block\n\n[[attention]]\n| another\n\n[[e]]\n| Erreur Block\n\n[[erreur]]\n| another\n\n\\\\\\\\[[se]]\n| not a block\n\n\\\\\\\\[[secretsecret]]\n| not a block\n\n\\\\\\\\[[SECRET]]\n| not a block\n\n[[s]]\n| Multiline block\n|\n| > with blockquote !\n\n| Not a block\n\n\\\\\\\\[[attention | title]]\n| not parsed\n\"\n`;\n\nexports[`compile multiline block to markdown 1`] = `\n\"[[information]]\n| content\n|\n| > blockquote\n|\n| simple paragraph\n\"\n`;\n\nexports[`compile regression1 to markdown 1`] = `\n\"content before\n\n[[s]]\n| Block\n\nwith content after\n\"\n`;\n\nexports[`compile titled block to markdown 1`] = `\n\"[[details | **my** title]]\n| content\n\"\n`;\n\nexports[`regression 1 1`] = `\n\"<p>content before</p>\n<div class=\\\\\"custom-block spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Block</p></div></div>\n<p>with content after</p>\"\n`;\n\nexports[`regression 2 1`] = `\n\"<p>[[information]][titre]\n| test</p>\"\n`;\n\nexports[`title is optional 1`] = `\n\"<div class=\\\\\"custom-block neutral foo\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>yes</p></div></div>\n<div class=\\\\\"custom-block neutral foo\\\\\"><div class=\\\\\"custom-block-heading\\\\\">my tïtle</div><div class=\\\\\"custom-block-body\\\\\"><p>yes</p></div></div>\"\n`;\n\nexports[`title is required 1`] = `\n\"<p>[[neutre]]\n| no</p>\n<div class=\\\\\"custom-block neutral foo\\\\\"><div class=\\\\\"custom-block-heading\\\\\">my title</div><div class=\\\\\"custom-block-body\\\\\"><p>yes</p></div></div>\n<div class=\\\\\"custom-block neutral foo\\\\\"><div class=\\\\\"custom-block-heading\\\\\">my <strong>title</strong></div><div class=\\\\\"custom-block-body\\\\\"><p>yes</p></div></div>\"\n`;\n\nexports[`with customized container, contents and title element types 1`] = `\n\"<div class=\\\\\"custom-block spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Secret Block</p></div></div>\n<div class=\\\\\"custom-block spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Secret Block</p></div></div>\n<details class=\\\\\"custom-block\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>another</p></div></details>\n<blockquote>\n<div class=\\\\\"custom-block spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><blockquote>\n<p>Blockquote in secret block in blockquote</p>\n</blockquote></div></div>\n</blockquote>\n<div class=\\\\\"custom-block information ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Information Block</p></div></div>\n<div class=\\\\\"custom-block information ico-after\\\\\"><fieldset class=\\\\\"custom-block-body\\\\\"><p>another</p></fieldset></div>\n<div class=\\\\\"custom-block question ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Question Block</p></div></div>\n<div class=\\\\\"custom-block question ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>another</p></div></div>\n<div class=\\\\\"custom-block warning ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Attention Block</p></div></div>\n<article class=\\\\\"custom-block warning ico-after\\\\\"><section class=\\\\\"custom-block-body\\\\\"><p>another</p></section></article>\n<div class=\\\\\"custom-block error ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Erreur Block</p></div></div>\n<div class=\\\\\"custom-block error ico-after\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>another</p></div></div>\n<p>[[se]]\n| not a block</p>\n<p>[[secretsecret]]\n| not a block</p>\n<p>[[SECRET]]\n| not a block</p>\n<div class=\\\\\"custom-block spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Multiline block</p><blockquote>\n<p>with blockquote !</p>\n</blockquote></div></div>\n<p>| Not a block</p>\n<article class=\\\\\"custom-block warning ico-after\\\\\"><header class=\\\\\"custom-block-heading\\\\\">title</header><section class=\\\\\"custom-block-body\\\\\"><p>not parsed</p></section></article>\"\n`;\n"
  },
  {
    "path": "packages/remark-custom-blocks/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport stringify from 'rehype-stringify'\nimport remarkStringify from 'remark-stringify'\nimport remark2rehype from 'remark-rehype'\nimport xtend from 'xtend'\nimport plugin from '../src/'\n\nconst defaultConfig = {\n  secret: {\n    classes: 'spoiler',\n  },\n  s: {\n    classes: 'spoiler',\n  },\n  information: {\n    classes: 'information ico-after',\n  },\n  i: {\n    classes: 'information ico-after',\n  },\n  question: {\n    classes: 'question ico-after',\n  },\n  q: {\n    classes: 'question ico-after',\n  },\n  attention: {\n    classes: 'warning ico-after',\n  },\n  a: {\n    classes: 'warning ico-after',\n  },\n  erreur: {\n    classes: 'error ico-after',\n  },\n  e: {\n    classes: 'error ico-after',\n  },\n  neutre: {\n    classes: 'neutral foo',\n    title: 'required',\n  },\n  customizableBlock: {\n    classes: 'neutral foo',\n    title: 'optional',\n  },\n  details: {\n    classes: 'spoiler',\n    title: 'optional',\n    details: true,\n  },\n  defaultTitle: {\n    classes: 'defaultTitle',\n    title: 'optional',\n    defaultTitle: 'Anything you want',\n  },\n}\n\nconst render = (text, allowTitle, config) => {\n  const realConfig = xtend(Object.assign({}, defaultConfig), config)\n\n  return unified()\n    .use(reParse)\n    .use(remark2rehype)\n    .use(plugin, realConfig, allowTitle)\n    .use(stringify)\n    .processSync(text)\n}\n\nconst renderToMarkdown = (text) => unified()\n  .use(reParse)\n  .use(remarkStringify)\n  .use(plugin, Object.assign({}, defaultConfig))\n  .processSync(text)\n\nconst fixture = dedent`\n  [[s]]\n  | Secret Block\n\n  [[s]]\n  |Secret Block\n\n  [[secret]]\n  | another\n\n  > [[s]]\n  > | > Blockquote in secret block in blockquote\n\n  [[i]]\n  | Information Block\n\n  [[information]]\n  | another\n\n  [[q]]\n  | Question Block\n\n  [[question]]\n  | another\n\n  [[a]]\n  | Attention Block\n\n  [[attention]]\n  | another\n\n  [[e]]\n  | Erreur Block\n\n  [[erreur]]\n  | another\n\n  [[se]]\n  | not a block\n\n  [[secretsecret]]\n  | not a block\n\n  [[SECRET]]\n  | not a block\n\n  [[s]]\n  | Multiline block\n  |\n  | > with blockquote !\n\n  | Not a block\n\n  [[attention | title]]\n  | not parsed\n`\n\ntest('Common', () => {\n  const {contents} = render(fixture)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('title is required', () => {\n  const {contents} = render(dedent`\n    [[neutre]]\n    | no\n\n    [[neutre|my title]]\n    | yes\n\n    [[neutre |  my **title**]]\n    | yes\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('title is optional', () => {\n  const {contents} = render(dedent`\n    [[customizableBlock]]\n    | yes\n\n    [[customizableBlock    | my <i>tïtle</i>]]\n    | yes\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('details', () => {\n  const {contents} = render(dedent`\n    [[details| my title]]\n    | content\n  `)\n\n  expect(contents).toBe(dedent`\n    <details class=\"custom-block spoiler\">\\\n    <summary class=\"custom-block-heading\">my title</summary>\\\n    <div class=\"custom-block-body\"><p>content</p></div>\\\n    </details>`)\n})\n\ntest('Errors without config', () => {\n  const fail = () => unified()\n    .use(reParse)\n    .use(remark2rehype)\n    .use(plugin)\n    .use(stringify)\n    .processSync('')\n\n  expect(fail).toThrowError(Error)\n})\n\ntest('regression 1', () => {\n  const {contents} = render(dedent`\n    content before\n    [[s]]\n    |Block\n    with content after\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('regression 2', () => {\n  const {contents} = render(dedent`\n    [[information]][titre]\n    | test\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('compile fixture to markdown', () => {\n  const {contents} = renderToMarkdown(fixture)\n  expect(contents).toMatchSnapshot()\n  const result = renderToMarkdown(contents)\n  expect(result.contents).toBe(contents)\n})\n\ntest('compile regression1 to markdown', () => {\n  const {contents} = renderToMarkdown(dedent`\n    content before\n    [[s]]\n    |Block\n    with content after\n  `)\n  expect(contents).toMatchSnapshot()\n  const result = renderToMarkdown(contents)\n  expect(result.contents).toBe(contents)\n})\n\ntest('compile titled block to markdown', () => {\n  const {contents} = renderToMarkdown(dedent`\n    [[details| **my** title]]\n    | content\n  `)\n\n  expect(contents).toMatchSnapshot()\n  const result = renderToMarkdown(contents)\n  expect(result.contents).toBe(contents)\n})\n\ntest('compile multiline block to markdown', () => {\n  const fixture = dedent`\n    [[information]]\n    | content\n    | > blockquote\n    |\n    | simple paragraph\n  `\n  const {contents} = renderToMarkdown(fixture)\n\n  expect(contents).toMatchSnapshot()\n  const result = renderToMarkdown(contents)\n  expect(result.contents).toBe(contents)\n  expect(renderToMarkdown(result.contents).contents).toBe(result.contents)\n})\n\ntest('compile multiline block to markdown, with multiline paragraph', () => {\n  const fixture = dedent`\n    [[information]]\n    | content\n    |\n    | > blockquote\n    |\n    | a long\n    | multiline\n    | paragraph\n  `\n  let {contents} = renderToMarkdown(fixture)\n  contents = renderToMarkdown(contents).contents\n  contents = renderToMarkdown(contents).contents.trim()\n  expect(contents).toBe(fixture)\n})\n\ntest('with customized container, contents and title element types', () => {\n  const {contents} = render(fixture, true, {\n    attention: {\n      title: 'optional',\n      titleElement: 'header',\n      contentsElement: 'section',\n      containerElement: 'article',\n      classes: 'warning ico-after',\n    },\n    information: {\n      classes: 'information ico-after',\n      contentsElement: 'fieldset',\n    },\n    secret: {\n      title: 'optional',\n      containerElement: 'details',\n      titleElement: 'summary',\n    },\n  })\n  expect(contents).toMatchSnapshot()\n})\n\ntest('weirdly named blocks', () => {\n  // a block name would usually be something like \"info\" or \"spoiler\"\n  // here we test that using regex special characters still works as\n  // block names since they are correctly escaped\n  const blockNames = [\n    '[a]',\n    '(b|)',\n    '[a})',\n    '[a-Z]',\n    '.*',\n    '??}',\n    '^$',\n    '|||',\n    ']',\n    '[]]',\n  ]\n  const config = blockNames.reduce((acc, blockName, idx) => {\n    acc[blockName] = {\n      classes: `class${idx}`,\n    }\n    return acc\n  }, {})\n  const render = (text, allowTitle) => unified()\n    .use(reParse)\n    .use(remark2rehype)\n    .use(plugin, config, allowTitle)\n    .use(stringify)\n    .processSync(text)\n\n  const makeFixture = (blockName) => dedent`\n    [[${blockName}]]\n    |     [[${blockName}]]\n    |     | this\n  `\n\n  blockNames.forEach((blockName, idx) => {\n    const {contents} = render(makeFixture(blockName))\n    expect(contents).toContain(`class=\"custom-block class${idx}\"`)\n    expect(contents).toContain(`<pre><code>[[${blockName}]]`)\n  })\n})\n"
  },
  {
    "path": "packages/remark-custom-blocks/dist/index.js",
    "content": "\"use strict\";\n\nconst spaceSeparated = require('space-separated-tokens');\nfunction escapeRegExp(str) {\n  return str.replace(/[-[\\]{}()*+?.\\\\^$|/]/g, '\\\\$&');\n}\nconst C_NEWLINE = '\\n';\nconst C_FENCE = '|';\nfunction compilerFactory(nodeType) {\n  let text;\n  let title;\n  return {\n    blockHeading(node) {\n      title = this.all(node).join('');\n      return '';\n    },\n    blockBody(node) {\n      text = this.all(node).map(s => s.replace(/\\n/g, '\\n| ')).join('\\n|\\n| ');\n      return text;\n    },\n    block(node) {\n      text = '';\n      title = '';\n      this.all(node);\n      if (title) {\n        return `[[${nodeType} | ${title}]]\\n| ${text}`;\n      } else {\n        return `[[${nodeType}]]\\n| ${text}`;\n      }\n    }\n  };\n}\nmodule.exports = function blockPlugin(availableBlocks = {}) {\n  const pattern = Object.keys(availableBlocks).map(escapeRegExp).join('|');\n  if (!pattern) {\n    throw new Error('remark-custom-blocks needs to be passed a configuration object as option');\n  }\n  const regex = new RegExp(`\\\\[\\\\[(${pattern})(?: *\\\\| *(.*))?\\\\]\\\\]\\n`);\n  function blockTokenizer(eat, value, silent) {\n    const now = eat.now();\n    const keep = regex.exec(value);\n    if (!keep) return;\n    if (keep.index !== 0) return;\n    const [eaten, blockType] = keep;\n    const potentialBlock = availableBlocks[blockType];\n    const blockTitle = keep[2] || potentialBlock.defaultTitle;\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return true;\n    const linesToEat = [];\n    const content = [];\n    let idx = 0;\n    while ((idx = value.indexOf(C_NEWLINE)) !== -1) {\n      const next = value.indexOf(C_NEWLINE, idx + 1);\n      // either slice until next NEWLINE or slice until end of string\n      const lineToEat = next !== -1 ? value.slice(idx + 1, next) : value.slice(idx + 1);\n      if (lineToEat[0] !== C_FENCE) break;\n      // remove leading `FENCE ` or leading `FENCE`\n      const line = lineToEat.slice(lineToEat.startsWith(`${C_FENCE} `) ? 2 : 1);\n      linesToEat.push(lineToEat);\n      content.push(line);\n      value = value.slice(idx + 1);\n    }\n    const contentString = content.join(C_NEWLINE);\n    const stringToEat = eaten + linesToEat.join(C_NEWLINE);\n    const titleAllowed = potentialBlock.title && ['optional', 'required'].includes(potentialBlock.title);\n    const titleRequired = potentialBlock.title && potentialBlock.title === 'required';\n    if (titleRequired && !blockTitle) return;\n    if (!titleAllowed && blockTitle) return;\n    const add = eat(stringToEat);\n    if (potentialBlock.details) {\n      potentialBlock.containerElement = 'details';\n      potentialBlock.titleElement = 'summary';\n    }\n    const exit = this.enterBlock();\n    const contents = {\n      type: `${blockType}CustomBlockBody`,\n      data: {\n        hName: potentialBlock.contentsElement ? potentialBlock.contentsElement : 'div',\n        hProperties: {\n          className: 'custom-block-body'\n        }\n      },\n      children: this.tokenizeBlock(contentString, now)\n    };\n    exit();\n    const blockChildren = [contents];\n    if (titleAllowed && blockTitle) {\n      const titleElement = potentialBlock.titleElement ? potentialBlock.titleElement : 'div';\n      const titleNode = {\n        type: `${blockType}CustomBlockHeading`,\n        data: {\n          hName: titleElement,\n          hProperties: {\n            className: 'custom-block-heading'\n          }\n        },\n        children: this.tokenizeInline(blockTitle, now)\n      };\n      blockChildren.unshift(titleNode);\n    }\n    const classList = spaceSeparated.parse(potentialBlock.classes || '');\n    return add({\n      type: `${blockType}CustomBlock`,\n      children: blockChildren,\n      data: {\n        hName: potentialBlock.containerElement ? potentialBlock.containerElement : 'div',\n        hProperties: {\n          className: ['custom-block', ...classList]\n        }\n      }\n    });\n  }\n  const Parser = this.Parser;\n\n  // Inject blockTokenizer\n  const blockTokenizers = Parser.prototype.blockTokenizers;\n  const blockMethods = Parser.prototype.blockMethods;\n  blockTokenizers.customBlocks = blockTokenizer;\n  blockMethods.splice(blockMethods.indexOf('fencedCode') + 1, 0, 'customBlocks');\n  const Compiler = this.Compiler;\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors;\n    if (!visitors) return;\n    Object.keys(availableBlocks).forEach(key => {\n      const compiler = compilerFactory(key);\n      visitors[`${key}CustomBlock`] = compiler.block;\n      visitors[`${key}CustomBlockHeading`] = compiler.blockHeading;\n      visitors[`${key}CustomBlockBody`] = compiler.blockBody;\n    });\n  }\n\n  // Inject into interrupt rules\n  const interruptParagraph = Parser.prototype.interruptParagraph;\n  const interruptList = Parser.prototype.interruptList;\n  const interruptBlockquote = Parser.prototype.interruptBlockquote;\n  interruptParagraph.splice(interruptParagraph.indexOf('fencedCode') + 1, 0, ['customBlocks']);\n  interruptList.splice(interruptList.indexOf('fencedCode') + 1, 0, ['customBlocks']);\n  interruptBlockquote.splice(interruptBlockquote.indexOf('fencedCode') + 1, 0, ['customBlocks']);\n};"
  },
  {
    "path": "packages/remark-custom-blocks/package.json",
    "content": "{\n  \"name\": \"remark-custom-blocks\",\n  \"version\": \"2.6.1\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-custom-blocks\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"space-separated-tokens\": \"^1.1.5\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-custom-blocks/src/index.js",
    "content": "const spaceSeparated = require('space-separated-tokens')\n\nfunction escapeRegExp (str) {\n  return str.replace(/[-[\\]{}()*+?.\\\\^$|/]/g, '\\\\$&')\n}\n\nconst C_NEWLINE = '\\n'\nconst C_FENCE = '|'\n\nfunction compilerFactory (nodeType) {\n  let text\n  let title\n\n  return {\n    blockHeading (node) {\n      title = this.all(node).join('')\n      return ''\n    },\n    blockBody (node) {\n      text = this.all(node).map(s => s.replace(/\\n/g, '\\n| ')).join('\\n|\\n| ')\n      return text\n    },\n    block (node) {\n      text = ''\n      title = ''\n      this.all(node)\n      if (title) {\n        return `[[${nodeType} | ${title}]]\\n| ${text}`\n      } else {\n        return `[[${nodeType}]]\\n| ${text}`\n      }\n    }\n  }\n}\n\nmodule.exports = function blockPlugin (availableBlocks = {}) {\n  const pattern = Object\n    .keys(availableBlocks)\n    .map(escapeRegExp)\n    .join('|')\n\n  if (!pattern) {\n    throw new Error('remark-custom-blocks needs to be passed a configuration object as option')\n  }\n\n  const regex = new RegExp(`\\\\[\\\\[(${pattern})(?: *\\\\| *(.*))?\\\\]\\\\]\\n`)\n\n  function blockTokenizer (eat, value, silent) {\n    const now = eat.now()\n    const keep = regex.exec(value)\n\n    if (!keep) return\n    if (keep.index !== 0) return\n\n    const [eaten, blockType] = keep\n    const potentialBlock = availableBlocks[blockType]\n    const blockTitle = keep[2] || potentialBlock.defaultTitle\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return true\n\n    const linesToEat = []\n    const content = []\n\n    let idx = 0\n    while ((idx = value.indexOf(C_NEWLINE)) !== -1) {\n      const next = value.indexOf(C_NEWLINE, idx + 1)\n      // either slice until next NEWLINE or slice until end of string\n      const lineToEat = next !== -1 ? value.slice(idx + 1, next) : value.slice(idx + 1)\n      if (lineToEat[0] !== C_FENCE) break\n      // remove leading `FENCE ` or leading `FENCE`\n      const line = lineToEat.slice(lineToEat.startsWith(`${C_FENCE} `) ? 2 : 1)\n      linesToEat.push(lineToEat)\n      content.push(line)\n      value = value.slice(idx + 1)\n    }\n\n    const contentString = content.join(C_NEWLINE)\n    const stringToEat = eaten + linesToEat.join(C_NEWLINE)\n\n    const titleAllowed = potentialBlock.title &&\n      ['optional', 'required'].includes(potentialBlock.title)\n    const titleRequired = potentialBlock.title && potentialBlock.title === 'required'\n\n    if (titleRequired && !blockTitle) return\n    if (!titleAllowed && blockTitle) return\n\n    const add = eat(stringToEat)\n    if (potentialBlock.details) {\n      potentialBlock.containerElement = 'details'\n      potentialBlock.titleElement = 'summary'\n    }\n\n    const exit = this.enterBlock()\n    const contents = {\n      type: `${blockType}CustomBlockBody`,\n      data: {\n        hName: potentialBlock.contentsElement ? potentialBlock.contentsElement : 'div',\n        hProperties: {\n          className: 'custom-block-body'\n        }\n      },\n      children: this.tokenizeBlock(contentString, now)\n    }\n    exit()\n\n    const blockChildren = [contents]\n    if (titleAllowed && blockTitle) {\n      const titleElement = potentialBlock.titleElement ? potentialBlock.titleElement : 'div'\n      const titleNode = {\n        type: `${blockType}CustomBlockHeading`,\n        data: {\n          hName: titleElement,\n          hProperties: {\n            className: 'custom-block-heading'\n          }\n        },\n        children: this.tokenizeInline(blockTitle, now)\n      }\n\n      blockChildren.unshift(titleNode)\n    }\n\n    const classList = spaceSeparated.parse(potentialBlock.classes || '')\n\n    return add({\n      type: `${blockType}CustomBlock`,\n      children: blockChildren,\n      data: {\n        hName: potentialBlock.containerElement ? potentialBlock.containerElement : 'div',\n        hProperties: {\n          className: ['custom-block', ...classList]\n        }\n      }\n    })\n  }\n\n  const Parser = this.Parser\n\n  // Inject blockTokenizer\n  const blockTokenizers = Parser.prototype.blockTokenizers\n  const blockMethods = Parser.prototype.blockMethods\n\n  blockTokenizers.customBlocks = blockTokenizer\n  blockMethods.splice(blockMethods.indexOf('fencedCode') + 1, 0, 'customBlocks')\n\n  const Compiler = this.Compiler\n\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors\n    if (!visitors) return\n    Object.keys(availableBlocks).forEach(key => {\n      const compiler = compilerFactory(key)\n      visitors[`${key}CustomBlock`] = compiler.block\n      visitors[`${key}CustomBlockHeading`] = compiler.blockHeading\n      visitors[`${key}CustomBlockBody`] = compiler.blockBody\n    })\n  }\n\n  // Inject into interrupt rules\n  const interruptParagraph = Parser.prototype.interruptParagraph\n  const interruptList = Parser.prototype.interruptList\n  const interruptBlockquote = Parser.prototype.interruptBlockquote\n\n  interruptParagraph.splice(interruptParagraph.indexOf('fencedCode') + 1, 0, ['customBlocks'])\n  interruptList.splice(interruptList.indexOf('fencedCode') + 1, 0, ['customBlocks'])\n  interruptBlockquote.splice(interruptBlockquote.indexOf('fencedCode') + 1, 0, ['customBlocks'])\n}\n"
  },
  {
    "path": "packages/remark-disable-tokenizers/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-disable-tokenizers/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-disable-tokenizers/README.md",
    "content": "# remark-disable-tokenizers [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis [remark][remark] plugin can disable any or all remark `blockTokenizers` and `inlineTokenizers`. It can not only disable the ones provided by remark core, but also any other tokenizer that has been added to the remark parser whether through plugins or not.\n\nRemark default tokenizers that can be disabled are listed [here][remark-doc]:\n\n* [blockTokenizers][blockTokenizers]\n* [inlineTokenizers][inlineTokenizers]\n\n## Configuration\n\nTwo options can be passed, as a single argument object:\n\n    {block = [], inline = []}\n\nEach of these can contain both tokenizer names as strings or arrays `['tokenizerName', 'error message']`.\n\n* A string `name`: this tokenizer will be disabled\n* An array `[name, message]`: this tokenizer, if used, will throw an `Error` with the message `message`\n\n## Motivation\n\nIn some situations it might be interesting to only parse inline Markdown syntax. We created it for the purpose of parsing/rendering forum signatures -- short textual content people can use to sign their messages on web forums. In this context it made no sense to allow elements that would eat up a lot of vertical space.\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-disable-tokenizers\n```\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkDisableBlocks = require('remark-disable-tokenizers')\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkDisableTokenizers, {\n    block: [\n      'indentedCode',\n      'fencedCode',\n      // I'd like to ignore a bunch of blockTokenizers but specifically\n      // I want blockquotes to throw this `Error` if used in the input Markdown\n      ['blockquote', 'Blockquote are not allowed!'],\n      'atxHeading',\n      'setextHeading',\n      'footnote',\n      'table',\n      'custom_blocks'\n    ],\n    inline: [\n      'emphasis' // emphasis is the only inlineTokenizer I'm disallowing\n    ]\n  })\n  .use(remark2rehype)\n  .use(stringify)\n```\n\n## Caveats\n\n* `autoLink` is not working correctly -- in order to disable auto-linking, you have to pass `url` to the array of disabled inline tokenizers.\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkDisableTokenizers, {\n    inline: ['url']\n  })\n  .use(remark2rehype)\n  .use(stringify)\n```\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-disable-tokenizers/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-disable-tokenizers\n\n[remark]: https://github.com/remarkjs/remark\n\n[remark-doc]: https://github.com/remarkjs/remark/tree/master/packages/remark-parse#parserblocktokenizers\n\n[blockTokenizers]: https://github.com/remarkjs/remark/tree/master/packages/remark-parse#parserblockmethods\n\n[inlineTokenizers]: https://github.com/remarkjs/remark/tree/master/packages/remark-parse#parserinlinemethods\n"
  },
  {
    "path": "packages/remark-disable-tokenizers/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`block + inline 1`] = `\n\"<p>*a*</p>\n<p>> *a*</p>\n<p>foo <code>bar</code> baz</p>\"\n`;\n\nexports[`block 1`] = `\n\"<p><em>a</em></p>\n<p>> <em>a</em></p>\n<p>foo <code>bar</code> baz</p>\"\n`;\n\nexports[`block throws + inline 1`] = `\"Blockquote are not allowed!\"`;\n\nexports[`block throws + inline throws 1`] = `\"Blockquote are not allowed!\"`;\n\nexports[`block throws 1`] = `\"Blockquote are not allowed!\"`;\n\nexports[`does nothing 1`] = `\n\"<p><em>a</em></p>\n<blockquote>\n<p><em>a</em></p>\n</blockquote>\n<p>foo <code>bar</code> baz</p>\"\n`;\n\nexports[`inline 1`] = `\n\"<p>*a*</p>\n<blockquote>\n<p>*a*</p>\n</blockquote>\n<p>foo <code>bar</code> baz</p>\"\n`;\n\nexports[`inline throws 1`] = `\"nope\"`;\n\nexports[`regression: actually turn off the tokenizer #412 1`] = `\n\"<p>hello\nworld</p>\"\n`;\n\nexports[`unknown tokenizer 1`] = `\n\"<p><em>a</em></p>\n<blockquote>\n<p><em>a</em></p>\n</blockquote>\n<p>foo <code>bar</code> baz</p>\"\n`;\n"
  },
  {
    "path": "packages/remark-disable-tokenizers/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport stringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\n\nimport plugin from '../src/'\n\ntest('block throws + inline', () => {\n  function t () {\n    unified()\n      .use(reParse)\n      .use(plugin, {\n        block: [\n          ['blockquote', 'Blockquote are not allowed!'],\n        ],\n        inline: [\n          'emphasis',\n        ],\n      })\n      .use(remark2rehype)\n      .use(stringify)\n      .processSync(dedent`\n        *a*\n\n        > *a*\n\n        foo \\`bar\\` baz\n      `)\n  }\n\n  expect(t).toThrowErrorMatchingSnapshot()\n})\n\ntest('block + inline', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(plugin, {\n      block: [\n        'blockquote',\n      ],\n      inline: [\n        'emphasis',\n      ],\n    })\n    .use(remark2rehype)\n    .use(stringify)\n    .processSync(dedent`\n      *a*\n\n      > *a*\n\n      foo \\`bar\\` baz\n    `)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('block', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(plugin, {\n      block: [\n        'blockquote',\n      ],\n    })\n    .use(remark2rehype)\n    .use(stringify)\n    .processSync(dedent`\n      *a*\n\n      > *a*\n\n      foo \\`bar\\` baz\n    `)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('inline', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(plugin, {\n      inline: [\n        'emphasis',\n      ],\n    })\n    .use(remark2rehype)\n    .use(stringify)\n    .processSync(dedent`\n      *a*\n\n      > *a*\n\n      foo \\`bar\\` baz\n    `)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('inline throws', () => {\n  function t () {\n    unified()\n      .use(reParse)\n      .use(plugin, {\n        inline: [\n          ['emphasis', 'nope'],\n        ],\n      })\n      .use(remark2rehype)\n      .use(stringify)\n      .processSync(dedent`\n        *a*\n\n        > *a*\n\n        foo \\`bar\\` baz\n      `)\n  }\n\n  expect(t).toThrowErrorMatchingSnapshot()\n})\n\ntest('block throws', () => {\n  function t () {\n    unified()\n      .use(reParse)\n      .use(plugin, {\n        block: [\n          ['blockquote', 'Blockquote are not allowed!'],\n        ],\n      })\n      .use(remark2rehype)\n      .use(stringify)\n      .processSync(dedent`\n        *a*\n\n        > *a*\n\n        foo \\`bar\\` baz\n      `)\n  }\n\n  expect(t).toThrowErrorMatchingSnapshot()\n})\n\ntest('block throws + inline throws', () => {\n  function t () {\n    unified()\n      .use(reParse)\n      .use(plugin, {\n        block: [\n          ['blockquote', 'Blockquote are not allowed!'],\n        ],\n        inline: [\n          ['emphasis', 'Nope.'],\n        ],\n      })\n      .use(remark2rehype)\n      .use(stringify)\n      .processSync(dedent`\n        *a*\n\n        > *a*\n\n        foo \\`bar\\` baz\n      `)\n  }\n\n  expect(t).toThrowErrorMatchingSnapshot()\n})\n\ntest('does nothing', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(plugin)\n    .use(remark2rehype)\n    .use(stringify)\n    .processSync(dedent`\n      *a*\n\n      > *a*\n\n      foo \\`bar\\` baz\n    `)\n\n  expect(contents).toMatchSnapshot()\n})\n\n\ntest('unknown tokenizer', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(plugin, {\n      inline: [\n        'foo bar',\n      ],\n    })\n    .use(remark2rehype)\n    .use(stringify)\n    .processSync(dedent`\n      *a*\n\n      > *a*\n\n      foo \\`bar\\` baz\n    `)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('regression: actually turn off the tokenizer #412', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(plugin, {\n      block: [\n        ['html'],\n      ],\n      inline: [\n        ['html'],\n      ],\n    })\n    .use(remark2rehype)\n    .use(stringify)\n    .processSync(`hello\\nworld`)\n\n  expect(contents).toMatchSnapshot()\n})\n"
  },
  {
    "path": "packages/remark-disable-tokenizers/dist/index.js",
    "content": "\"use strict\";\n\nconst clone = require('clone');\nconst noop = () => false;\nconst noopLocator = () => -1;\nconst throwing = msg => () => {\n  throw new Error(msg);\n};\nfunction plugin({\n  block = [],\n  inline = []\n} = {}) {\n  if (block.length) {\n    block.filter(key => {\n      if (Array.isArray(key)) return block.map(xs => xs[0]).includes(key[0]);\n      return block.includes(key);\n    }).forEach(key => {\n      if (Array.isArray(key) && key.length === 2) {\n        this.Parser.prototype.blockTokenizers[key[0]] = throwing(key[1]);\n      } else {\n        this.Parser.prototype.blockTokenizers[key] = noop;\n      }\n    });\n  }\n  if (inline.length) {\n    inline.filter(key => {\n      if (Array.isArray(key)) return inline.map(xs => xs[0]).includes(key[0]);\n      return inline.includes(key);\n    }).forEach(key => {\n      let tokenizerName;\n      let replacer;\n      if (Array.isArray(key) && key.length === 2) {\n        tokenizerName = key[0];\n        replacer = throwing(key[1]);\n      } else {\n        tokenizerName = key;\n        replacer = clone(noop);\n      }\n      if (this.Parser.prototype.inlineTokenizers[tokenizerName]) {\n        Object.keys(this.Parser.prototype.inlineTokenizers[tokenizerName]).forEach(prop => {\n          replacer[prop] = this.Parser.prototype.inlineTokenizers[tokenizerName][prop];\n        });\n      }\n      this.Parser.prototype.inlineTokenizers[tokenizerName] = replacer;\n      this.Parser.prototype.inlineTokenizers[tokenizerName].locator = noopLocator;\n    });\n  }\n}\nmodule.exports = plugin;"
  },
  {
    "path": "packages/remark-disable-tokenizers/package.json",
    "content": "{\n  \"name\": \"remark-disable-tokenizers\",\n  \"version\": \"1.1.1\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-disable-tokenizers\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"clone\": \"^2.1.2\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-disable-tokenizers/src/index.js",
    "content": "const clone = require('clone')\n\nconst noop = () => false\nconst noopLocator = () => -1\n\nconst throwing = (msg) =>\n  () => {\n    throw new Error(msg)\n  }\n\nfunction plugin ({ block = [], inline = [] } = {}) {\n  if (block.length) {\n    block\n      .filter((key) => {\n        if (Array.isArray(key)) return block.map(xs => xs[0]).includes(key[0])\n        return block.includes(key)\n      })\n      .forEach((key) => {\n        if (Array.isArray(key) && key.length === 2) {\n          this.Parser.prototype.blockTokenizers[key[0]] = throwing(key[1])\n        } else {\n          this.Parser.prototype.blockTokenizers[key] = noop\n        }\n      })\n  }\n\n  if (inline.length) {\n    inline\n      .filter((key) => {\n        if (Array.isArray(key)) return inline.map(xs => xs[0]).includes(key[0])\n        return inline.includes(key)\n      })\n      .forEach((key) => {\n        let tokenizerName\n        let replacer\n        if (Array.isArray(key) && key.length === 2) {\n          tokenizerName = key[0]\n          replacer = throwing(key[1])\n        } else {\n          tokenizerName = key\n          replacer = clone(noop)\n        }\n        if (this.Parser.prototype.inlineTokenizers[tokenizerName]) {\n          Object\n            .keys(this.Parser.prototype.inlineTokenizers[tokenizerName])\n            .forEach((prop) => {\n              replacer[prop] = this.Parser.prototype.inlineTokenizers[tokenizerName][prop]\n            })\n        }\n        this.Parser.prototype.inlineTokenizers[tokenizerName] = replacer\n        this.Parser.prototype.inlineTokenizers[tokenizerName].locator = noopLocator\n      })\n  }\n}\n\nmodule.exports = plugin\n"
  },
  {
    "path": "packages/remark-emoticons/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-emoticons/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-emoticons/README.md",
    "content": "# remark-emoticons [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis [remark][remark] plugin parses ASCII emoticons such as `:D` or shortcodes such as `:smiling-cat:`. It can be configured to parse any shortcode/emoticon you wish.\n\nIt introduces a new [MDAST][mdast] node type: \"emoticon\".\n\nThis plugin is compatible with [rehype][rehype], turning the emoticons or shortcodes into HTML `<img>` tags with customizable classes.\n\n## AST node (see [mdast][mdast] specification)\n\n```javascript\ninterface emoticon <: Node {\n  type: \"emoticon\";\n  value: string;\n  data: {\n    hName: \"img\";\n    hProperties: {\n      src: string;\n      alt: string;\n      className: string;\n    }\n  }\n}\n```\n\n## Syntax\n\nThe following Markdown:\n\n```markdown\n:D\n```\n\nif you configured the plugin with:\n\n```javascript\n{\n  emoticons: {\n    ':D': '/static/smileys/happy.png',\n  },\n  classes: 'some-smiley foo',\n}\n```\n\nwill produce this AST node:\n\n```javascript\n{\n  type: \"emoticon\",\n  value: \":D\",\n  data: {\n    hName: \"img\";\n    hProperties: {\n      src: '/static/smileys/happy.png';\n      alt: \":D\";\n      className: \"some-smiley foo\";\n    }\n  }\n}\n```\n\nIf you use [rehype][rehype] stringifier it will output:\n\n```html\n<img src=\"/static/smileys/happy.png\" alt=\":D\" class=\"some-smiley foo\">\n```\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-emoticons\n```\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkEmoticons = require('remark-emoticons')\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkEmoticons, {\n   emoticons: {\n     ':D': '/static/smileys/happy.png',\n   },\n   classes: 'some-class'\n  })\n  .use(remark2rehype)\n  .use(stringify)\n```\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-emoticons/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-emoticons\n\n[mdast]: https://github.com/syntax-tree/mdast/blob/master/readme.md\n\n[remark]: https://github.com/remarkjs/remark\n\n[rehype]: https://github.com/rehypejs/rehype\n"
  },
  {
    "path": "packages/remark-emoticons/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`emoticons 1`] = `\n\"<p>Hello <img src=\\\\\"/static/smileys/smile.png\\\\\" alt=\\\\\":)\\\\\" class=\\\\\"foo bar\\\\\"> Hey <img src=\\\\\"/static/smileys/heureux.png\\\\\" alt=\\\\\":D\\\\\" class=\\\\\"foo bar\\\\\"></p>\n<p><img src=\\\\\"/static/smileys/smile.png\\\\\" alt=\\\\\":)\\\\\" class=\\\\\"foo bar\\\\\"></p>\n<blockquote>\n<p>Citation</p>\n</blockquote>\n<p><img src=\\\\\"/static/smileys/heureux.png\\\\\" alt=\\\\\":D\\\\\" class=\\\\\"foo bar\\\\\"> This is not a caption</p>\n<p><img src=\\\\\"https://zestedesavoir.com/media/galleries/3014/bee33fae-2216-463a-8b85-d1d9efe2c374.png\\\\\" alt=\\\\\"toto\\\\\"></p>\n<p><img src=\\\\\"/static/smileys/heureux.png\\\\\" alt=\\\\\":D\\\\\" class=\\\\\"foo bar\\\\\"> This is not a caption</p>\n<p>This is not a smiley:)</p>\n<p>Not :)a smiley either.</p>\n<p>Smiley after another node: <a href=\\\\\"#foo\\\\\">link</a> <img src=\\\\\"/static/smileys/smile.png\\\\\" alt=\\\\\":)\\\\\" class=\\\\\"foo bar\\\\\"></p>\n<p>Smiley after another node w/2 spaces: <a href=\\\\\"#foo\\\\\">link</a>  <img src=\\\\\"/static/smileys/smile.png\\\\\" alt=\\\\\":)\\\\\" class=\\\\\"foo bar\\\\\"></p>\n<p>Smiley after another node w/3 spaces: <a href=\\\\\"#foo\\\\\">link</a>   <img src=\\\\\"/static/smileys/smile.png\\\\\" alt=\\\\\":)\\\\\" class=\\\\\"foo bar\\\\\"></p>\"\n`;\n\nexports[`emoticons without class 1`] = `\n\"<p>Hello <img src=\\\\\"/static/smileys/smile.png\\\\\" alt=\\\\\":)\\\\\"> Hey <img src=\\\\\"/static/smileys/heureux.png\\\\\" alt=\\\\\":D\\\\\"></p>\n<p><img src=\\\\\"/static/smileys/smile.png\\\\\" alt=\\\\\":)\\\\\"></p>\n<blockquote>\n<p>Citation</p>\n</blockquote>\n<p><img src=\\\\\"/static/smileys/heureux.png\\\\\" alt=\\\\\":D\\\\\"> This is not a caption</p>\n<p><img src=\\\\\"https://zestedesavoir.com/media/galleries/3014/bee33fae-2216-463a-8b85-d1d9efe2c374.png\\\\\" alt=\\\\\"toto\\\\\"></p>\n<p><img src=\\\\\"/static/smileys/heureux.png\\\\\" alt=\\\\\":D\\\\\"> This is not a caption</p>\n<p>This is not a smiley:)</p>\n<p>Not :)a smiley either.</p>\n<p>Smiley after another node: <a href=\\\\\"#foo\\\\\">link</a> <img src=\\\\\"/static/smileys/smile.png\\\\\" alt=\\\\\":)\\\\\"></p>\n<p>Smiley after another node w/2 spaces: <a href=\\\\\"#foo\\\\\">link</a>  <img src=\\\\\"/static/smileys/smile.png\\\\\" alt=\\\\\":)\\\\\"></p>\n<p>Smiley after another node w/3 spaces: <a href=\\\\\"#foo\\\\\">link</a>   <img src=\\\\\"/static/smileys/smile.png\\\\\" alt=\\\\\":)\\\\\"></p>\"\n`;\n\nexports[`renders to markdown 1`] = `\n\"Hello :) Hey :D\n\n:)\n\n> Citation\n\n:D This is not a caption\n\n![toto](https://zestedesavoir.com/media/galleries/3014/bee33fae-2216-463a-8b85-d1d9efe2c374.png)\n\n:D This is not a caption\n\nThis is not a smiley:)\n\nNot :)a smiley either.\n\nSmiley after another node: [link](#foo) :)\n\nSmiley after another node w/2 spaces: [link](#foo)  :)\n\nSmiley after another node w/3 spaces: [link](#foo)   :)\n\"\n`;\n\nexports[`unicode emoticons 1`] = `\"<p><img src=\\\\\"/static/smileys/svg/1f9d0.svg\\\\\" alt=\\\\\"🧐\\\\\" class=\\\\\"foo bar\\\\\"></p>\"`;\n"
  },
  {
    "path": "packages/remark-emoticons/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport stringify from 'rehype-stringify'\nimport visit from 'unist-util-visit'\nimport remark2rehype from 'remark-rehype'\nimport remarkStringify from 'remark-stringify'\nimport remarkCaption from '../../remark-captions/src'\n\nimport plugin from '../src/'\n\nconst config = {\n  emoticons: {\n    ':ange:': '/static/smileys/ange.png',\n    ':colere:': '/static/smileys/angry.gif',\n    'o_O': '/static/smileys/blink.gif',\n    ';)': '/static/smileys/clin.png',\n    ':diable:': '/static/smileys/diable.png',\n    ':D': '/static/smileys/heureux.png',\n    '^^': '/static/smileys/hihi.png',\n    ':o': '/static/smileys/huh.png',\n    ':p': '/static/smileys/langue.png',\n    ':magICIen:': '/static/smileys/magicien.png',\n    ':colere2:': '/static/smileys/mechant.png',\n    ':ninja:': '/static/smileys/ninja.png',\n    'x(': '/static/smileys/pinch.png',\n    ':pirate:': '/static/smileys/pirate.png',\n    \":'(\": '/static/smileys/pleure.png',\n    ':lol:': '/static/smileys/rire.gif',\n    ':honte:': '/static/smileys/rouge.png',\n    ':-°': '/static/smileys/siffle.png',\n    ':)': '/static/smileys/smile.png',\n    ':soleil:': '/static/smileys/soleil.png',\n    ':(': '/static/smileys/triste.png',\n    ':euh:': '/static/smileys/unsure.gif',\n    ':waw:': '/static/smileys/waw.png',\n    ':zorro:': '/static/smileys/zorro.png',\n    '🧐': '/static/smileys/svg/1f9d0.svg',\n  },\n  classes: 'foo bar',\n}\n\nconst render = text => unified()\n  .use(reParse)\n  .use(plugin, config)\n  .use(remark2rehype)\n  .use(stringify)\n  .processSync(text)\n\nconst renderToMarkdown = text => unified()\n  .use(reParse)\n  .use(remarkStringify)\n  .use(plugin, config)\n  .use(remarkCaption)\n  .processSync(text)\n\ntest('emoticons', () => {\n  const {contents} = render(dedent`\n    Hello :) Hey :D\n\n    :)\n\n    > Citation\n\n    :D This is not a caption\n\n    ![toto](https://zestedesavoir.com/media/galleries/3014/bee33fae-2216-463a-8b85-d1d9efe2c374.png)\n\n    :D This is not a caption\n\n    This is not a smiley:)\n\n    Not :)a smiley either.\n\n    Smiley after another node: [link](#foo) :)\n\n    Smiley after another node w/2 spaces: [link](#foo)  :)\n\n    Smiley after another node w/3 spaces: [link](#foo)   :)\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('does not eat spaces leading to a smiley', () => {\n  const {contents} = render(dedent`\n    *hey* :)\n\n    [ho](#) :D let's go\n  `)\n  expect(contents).not.toContain('</em><img')\n  expect(contents).not.toContain('</a><img')\n})\n\ntest('confusable locators', () => {\n  const {contents} = render(dedent`\n    :)     o_O   :)\n  `)\n  expect((contents.match(/<img/g) || []).length).toBe(3)\n})\n\ntest('multiple chars no match', () => {\n  const {contents} = render(dedent`\n    this contains an o_O\n  `)\n\n  expect((contents.match(/<img/g) || []).length).toBe(1)\n})\n\ntest('unicode emoticons', () => {\n  const {contents} = render(dedent`\n    🧐\n  `)\n  expect(contents).toContain('<img')\n  expect(contents).toMatchSnapshot()\n})\n\ntest('emoticons without class', () => {\n  const render = text => unified()\n    .use(reParse)\n    .use(plugin, config)\n    .use(remark2rehype)\n    .use(stringify)\n    .processSync(text)\n\n  delete config.classes\n\n  const {contents} = render(dedent`\n    Hello :) Hey :D\n\n    :)\n\n    > Citation\n\n    :D This is not a caption\n\n    ![toto](https://zestedesavoir.com/media/galleries/3014/bee33fae-2216-463a-8b85-d1d9efe2c374.png)\n\n    :D This is not a caption\n\n    This is not a smiley:)\n\n    Not :)a smiley either.\n\n    Smiley after another node: [link](#foo) :)\n\n    Smiley after another node w/2 spaces: [link](#foo)  :)\n\n    Smiley after another node w/3 spaces: [link](#foo)   :)\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('errors without config', () => {\n  const fail = () => unified()\n    .use(reParse)\n    .use(remark2rehype)\n    .use(plugin)\n    .use(stringify)\n    .processSync('')\n\n  expect(fail).toThrowError(Error)\n})\n\ntest('renders to markdown', () => {\n  const {contents} = renderToMarkdown(dedent`\n    Hello :) Hey :D\n\n    :)\n\n    > Citation\n\n    :D This is not a caption\n\n    ![toto](https://zestedesavoir.com/media/galleries/3014/bee33fae-2216-463a-8b85-d1d9efe2c374.png)\n\n    :D This is not a caption\n\n    This is not a smiley:)\n\n    Not :)a smiley either.\n\n    Smiley after another node: [link](#foo) :)\n\n    Smiley after another node w/2 spaces: [link](#foo)  :)\n\n    Smiley after another node w/3 spaces: [link](#foo)   :)\n  `)\n  expect(contents).toMatchSnapshot()\n\n  const recompiled = renderToMarkdown(contents).contents\n  expect(recompiled).toBe(contents)\n})\n\ntest('emoticons are case insensitive', () => {\n  const render = text => unified()\n    .use(reParse)\n    .use(plugin, config)\n    .use(() => (tree) => {\n      visit(tree, 'emoticon', (node) => {\n        node.data.hProperties.alt = ''\n      })\n    })\n    .use(remark2rehype)\n    .use(stringify)\n    .processSync(text)\n\n  expect(render(`:p`).contents).toBe(render(`:P`).contents)\n  expect(render(`:d`).contents).toBe(render(`:D`).contents)\n  expect(render(`:magicien:`).contents).toBe(render(`:MAGICIEN:`).contents)\n  expect(render(`:magicien:`).contents).toBe(render(`:MagICIEn:`).contents)\n  expect(render(`:magICIen:`).contents).toBe(render(`:MagICIEn:`).contents)\n})\n"
  },
  {
    "path": "packages/remark-emoticons/dist/index.js",
    "content": "\"use strict\";\n\nconst whitespace = require('is-whitespace-character');\nfunction escapeRegExp(str) {\n  return str.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&');\n}\nmodule.exports = function inlinePlugin(ctx) {\n  const emoticonClasses = ctx && ctx.classes;\n  const emoticonsRaw = ctx && ctx.emoticons;\n  if (!emoticonsRaw) {\n    throw new Error('remark-emoticons needs to be passed a configuration object as option');\n  }\n\n  // Convert emoticons to lowercase\n  const emoticons = Object.keys(emoticonsRaw).reduce((acc, key) => {\n    acc[key.toLowerCase()] = emoticonsRaw[key];\n    return acc;\n  }, {});\n\n  // Create a list composed of the first character of each emoticon\n  const firstChars = Object.keys(emoticons).reduce((acc, key) => {\n    const firstChar = key.charAt(0);\n    if (acc.indexOf(firstChar) === -1) acc.push(firstChar);\n    return acc;\n  }, []);\n  const pattern = Object.keys(emoticons).map(escapeRegExp).join('|');\n  const regex = new RegExp(`(?:\\\\s|^)(${pattern})(?:\\\\s|$)`, 'i');\n  function locator(value, fromIndex) {\n    let lowestMatch = -1;\n\n    // Iterate on chars\n    for (let c = 0; c < firstChars.length; c++) {\n      const char = firstChars[c];\n      let offset = 0;\n      let match = -1;\n\n      // Oftentimes, the first occurence is not good, so loop on all possible ones\n      while (match === -1 && offset < value.length - 1) {\n        match = value.indexOf(char, fromIndex + offset);\n\n        // Also match uppercase\n        if (match === -1 && char !== char.toUpperCase()) {\n          match = value.indexOf(char.toUpperCase(), fromIndex + offset);\n        }\n        if (match === -1) {\n          break;\n          // A smiley should be precedeed by at least one whitespace\n        } else if (!whitespace(value[match - 1])) {\n          offset = match;\n          match = -1;\n        }\n      }\n      if (match !== -1 && (lowestMatch === -1 || match < lowestMatch)) {\n        lowestMatch = match;\n      }\n    }\n    return lowestMatch;\n  }\n  function inlineTokenizer(eat, value, silent) {\n    const keep = regex.exec(value);\n    if (!keep || keep.index !== 0) return true;\n    if (!keep[0].startsWith(keep[1])) return true;\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return true;\n    const toEat = keep[1];\n    const emoticon = toEat.trim();\n    const src = emoticons[emoticon.toLowerCase()];\n    const emoticonNode = {\n      type: 'emoticon',\n      value: emoticon,\n      data: {\n        hName: 'img',\n        hProperties: {\n          src,\n          alt: emoticon\n        }\n      }\n    };\n    if (emoticonClasses) {\n      emoticonNode.data.hProperties.class = emoticonClasses;\n    }\n    eat(toEat)(emoticonNode);\n  }\n  inlineTokenizer.locator = locator;\n  const Parser = this.Parser;\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers;\n  const inlineMethods = Parser.prototype.inlineMethods;\n  inlineTokenizers.emoticons = inlineTokenizer;\n  inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'emoticons');\n  const Compiler = this.Compiler;\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors;\n    if (!visitors) return;\n    visitors.emoticon = node => node.value;\n  }\n};"
  },
  {
    "path": "packages/remark-emoticons/package.json",
    "content": "{\n  \"name\": \"remark-emoticons\",\n  \"version\": \"2.3.2\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-emoticons\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"dependencies\": {\n    \"is-whitespace-character\": \"^1.0.4\"\n  },\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/remark-emoticons/src/index.js",
    "content": "const whitespace = require('is-whitespace-character')\n\nfunction escapeRegExp (str) {\n  return str.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&')\n}\n\nmodule.exports = function inlinePlugin (ctx) {\n  const emoticonClasses = ctx && ctx.classes\n  const emoticonsRaw = ctx && ctx.emoticons\n\n  if (!emoticonsRaw) {\n    throw new Error('remark-emoticons needs to be passed a configuration object as option')\n  }\n\n  // Convert emoticons to lowercase\n  const emoticons = Object.keys(emoticonsRaw).reduce((acc, key) => {\n    acc[key.toLowerCase()] = emoticonsRaw[key]\n    return acc\n  }, {})\n\n  // Create a list composed of the first character of each emoticon\n  const firstChars = Object.keys(emoticons).reduce((acc, key) => {\n    const firstChar = key.charAt(0)\n    if (acc.indexOf(firstChar) === -1) acc.push(firstChar)\n    return acc\n  }, [])\n\n  const pattern = Object.keys(emoticons).map(escapeRegExp).join('|')\n  const regex = new RegExp(`(?:\\\\s|^)(${pattern})(?:\\\\s|$)`, 'i')\n\n  function locator (value, fromIndex) {\n    let lowestMatch = -1\n\n    // Iterate on chars\n    for (let c = 0; c < firstChars.length; c++) {\n      const char = firstChars[c]\n      let offset = 0\n      let match = -1\n\n      // Oftentimes, the first occurence is not good, so loop on all possible ones\n      while (match === -1 && offset < (value.length - 1)) {\n        match = value.indexOf(char, fromIndex + offset)\n\n        // Also match uppercase\n        if (match === -1 && char !== char.toUpperCase()) {\n          match = value.indexOf(char.toUpperCase(), fromIndex + offset)\n        }\n\n        if (match === -1) {\n          break\n        // A smiley should be precedeed by at least one whitespace\n        } else if (!whitespace(value[match - 1])) {\n          offset = match\n          match = -1\n        }\n      }\n\n      if (match !== -1 && (lowestMatch === -1 || match < lowestMatch)) {\n        lowestMatch = match\n      }\n    }\n\n    return lowestMatch\n  }\n\n  function inlineTokenizer (eat, value, silent) {\n    const keep = regex.exec(value)\n\n    if (!keep || keep.index !== 0) return true\n    if (!keep[0].startsWith(keep[1])) return true\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return true\n\n    const toEat = keep[1]\n    const emoticon = toEat.trim()\n    const src = emoticons[emoticon.toLowerCase()]\n\n    const emoticonNode = {\n      type: 'emoticon',\n      value: emoticon,\n      data: {\n        hName: 'img',\n        hProperties: {\n          src,\n          alt: emoticon\n        }\n      }\n    }\n\n    if (emoticonClasses) {\n      emoticonNode.data.hProperties.class = emoticonClasses\n    }\n\n    eat(toEat)(emoticonNode)\n  }\n\n  inlineTokenizer.locator = locator\n\n  const Parser = this.Parser\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers\n  const inlineMethods = Parser.prototype.inlineMethods\n  inlineTokenizers.emoticons = inlineTokenizer\n  inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'emoticons')\n\n  const Compiler = this.Compiler\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors\n    if (!visitors) return\n    visitors.emoticon = (node) => node.value\n  }\n}\n"
  },
  {
    "path": "packages/remark-escape-escaped/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-escape-escaped/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-escape-escaped/README.md",
    "content": "This plugin escapes HTML entities from Markdown input.\n\nThis is the default behavior though, it's configurable.\n\n* `&` -> `&#x26;`\n* `&amp;` -> `&#x26;`\n* `&eacute;` -> `é`\n\nthis plugin does\n\n* `&` -> `&#x26;`\n* `&amp;` -> `&#x26;amp;`\n* `&eacute;` -> `&#x26;eacute;`\n"
  },
  {
    "path": "packages/remark-escape-escaped/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`with 1`] = `\n\"<p>this plugin does</p>\n<ul>\n<li>&#x26; -> &#x26;#x26;</li>\n<li>&#x26;amp; -> &#x26;#x26;amp;</li>\n<li>&#x26;eacute; -> &#x26;#x26;eacute;</li>\n</ul>\"\n`;\n\nexports[`without 1`] = `\n\"<p>remark does</p>\n<ul>\n<li>&#x26; -> &#x26;#x26;</li>\n<li>&#x26;amp; -> &#x26;#x26;</li>\n<li>&#x26;eacute; -> é</li>\n</ul>\"\n`;\n"
  },
  {
    "path": "packages/remark-escape-escaped/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport stringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\n\nimport plugin from '../src/'\n\nconst render = (text, config) => unified()\n  .use(reParse)\n  .use(remark2rehype)\n  .use(plugin, config)\n  .use(stringify)\n  .processSync(text)\n\ntest('with', () => {\n  const {contents} = render(dedent`\n    this plugin does\n\n    * & -> &#x26;\n    * &amp; -> &#x26;amp;\n    * &eacute; -> &#x26;eacute;\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('without', () => {\n  const {contents} = render(dedent`\n    remark does\n\n    * & -> &#x26;\n    * &amp; -> &#x26;\n    * &eacute; -> é\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('Errors with invalid config: []', () => {\n  const fail = () => render('', [])\n  expect(fail).toThrowError(Error)\n})\n\ntest('Errors with invalid config: 1', () => {\n  const fail = () => render('', 1)\n  expect(fail).toThrowError(Error)\n})\n"
  },
  {
    "path": "packages/remark-escape-escaped/dist/index.js",
    "content": "\"use strict\";\n\nfunction escapeRegExp(str) {\n  return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&'); // eslint-disable-line no-useless-escape\n}\nmodule.exports = function escapeEscaped(entitiesToKeep = ['&']) {\n  if (!Array.isArray(entitiesToKeep) || !entitiesToKeep.length) {\n    throw new Error('remark-escape-escaped needs to be passed a configuration array as option');\n  }\n  const pattern = entitiesToKeep.map(escapeRegExp).join('|');\n  const regex = new RegExp(`(${pattern})`);\n  function locator(value, fromIndex) {\n    const indices = entitiesToKeep.map(entity => value.indexOf(entity, fromIndex));\n    return Math.min(...indices);\n  }\n  function inlineTokenizer(eat, value, silent) {\n    const keep = regex.exec(value);\n    if (keep) {\n      if (keep.index !== 0) return true;\n\n      /* istanbul ignore if - never used (yet) */\n      if (silent) return true;\n      eat(keep[0])({\n        type: 'text',\n        value: keep[0]\n      });\n    }\n  }\n  inlineTokenizer.locator = locator;\n  const Parser = this.Parser;\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers;\n  const inlineMethods = Parser.prototype.inlineMethods;\n  inlineTokenizers.keep_entities = inlineTokenizer;\n  inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'keep_entities');\n};"
  },
  {
    "path": "packages/remark-escape-escaped/package.json",
    "content": "{\n  \"name\": \"remark-escape-escaped\",\n  \"version\": \"0.0.35\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-escape-escaped\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/remark-escape-escaped/src/index.js",
    "content": "function escapeRegExp (str) {\n  return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, '\\\\$&') // eslint-disable-line no-useless-escape\n}\n\nmodule.exports = function escapeEscaped (entitiesToKeep = ['&']) {\n  if (!Array.isArray(entitiesToKeep) || !entitiesToKeep.length) {\n    throw new Error('remark-escape-escaped needs to be passed a configuration array as option')\n  }\n  const pattern = entitiesToKeep.map(escapeRegExp).join('|')\n  const regex = new RegExp(`(${pattern})`)\n\n  function locator (value, fromIndex) {\n    const indices = entitiesToKeep.map(entity => value.indexOf(entity, fromIndex))\n    return Math.min(...indices)\n  }\n\n  function inlineTokenizer (eat, value, silent) {\n    const keep = regex.exec(value)\n    if (keep) {\n      if (keep.index !== 0) return true\n\n      /* istanbul ignore if - never used (yet) */\n      if (silent) return true\n\n      eat(keep[0])({\n        type: 'text',\n        value: keep[0]\n      })\n    }\n  }\n  inlineTokenizer.locator = locator\n\n  const Parser = this.Parser\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers\n  const inlineMethods = Parser.prototype.inlineMethods\n  inlineTokenizers.keep_entities = inlineTokenizer\n  inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'keep_entities')\n}\n"
  },
  {
    "path": "packages/remark-fix-guillemets/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-fix-guillemets/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-fix-guillemets/README.md",
    "content": "# remark-fix-guillemets [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis plugin fixes `typographic-plugin` when used together with `remark-parse`.\n\n## Motivation\n\nWhen `<<a>>` is parsed by `remark-parse` the resulting tree is:\n\n```\nroot[1] (1:1-1:6, 0-5)\n└─ paragraph[3] (1:1-1:6, 0-5)\n   ├─ text: \"<\" (1:1-1:2, 0-1)\n   ├─ html: \"<a>\" (1:2-1:5, 1-4)\n   └─ text: \">\" (1:5-1:6, 0-1)\n```\n\nAs you see here `<<` got split into a text node `<` and an HTML node.\nSince [remark-textr][remark-textr] only gets applied to 'text' nodes, `<<` is not replaced by `«`.\n\nThis plugin replaces the previous tree with:\n```\nroot[1] (1:1-1:6, 0-5)\n└─ paragraph[1] (1:1-1:6, 0-5)\n   └─ text: \"<<a>>\" (1:1-1:6, 0-5)\n```\n\n## Install\n\n[npm][npm]:\n\n```sh\nnpm install --save remark-fix-guillemets\n```\n\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkFixGuillemets = require('remark-fix-guillemets')\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkFixGuillemets)\n  .use(remark2rehype)\n  .use(stringify)\n```\n\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-fix-guillemets/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-fix-guillemets\n\n[remark-textr]: https://github.com/remarkjs/remark-textr\n"
  },
  {
    "path": "packages/remark-fix-guillemets/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`do-not-replace 1`] = `\"<p>></p>\"`;\n\nexports[`issue-80 1`] = `\n\"<p>« html » « html1 » « html2 » « html3 » « html4 » « <strong>bold</strong> »</p>\n<p>« html » « html1 » &#x3C;foobar> « html3 » « html4 » « <strong>bold</strong> »</p>\"\n`;\n\nexports[`no-html-block 1`] = `\"<p>« 1 »</p>\"`;\n"
  },
  {
    "path": "packages/remark-fix-guillemets/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport remark2rehype from 'remark-rehype'\nimport reParse from 'remark-parse'\nimport stringify from 'rehype-stringify'\nimport textr from 'textr'\nimport textrGuillemets from 'typographic-guillemets'\nimport unified from 'unified'\nimport visit from 'unist-util-visit'\n\nimport remarkFixGuillemets from '../src/'\n\nfunction remarkTextr ({plugins = [], options = {}} = {}) {\n  let fn\n\n  return function transformer (tree) {\n    fn = plugins.reduce(\n      (processor, p) => processor.use(typeof p === 'string' ? require(p) : p),\n      textr(options)\n    )\n\n    visit(tree, 'text', visitor)\n  }\n\n  function visitor (node) {\n    node.value = fn(node.value)\n  }\n}\n\n\nconst render = (text, config) => unified()\n  .use(reParse, {\n    gfm: true,\n    commonmark: false,\n    footnotes: true,\n    /* sets list of known blocks to nothing, otherwise <h3>hey</h3> would become\n    &#x3C;h3>hey&#x3C;/h3> instead of <p>&#x3C;h3>hey&#x3C;/h3></p> */\n    blocks: [],\n  })\n  .use(remarkFixGuillemets)\n  .use(remark2rehype)\n  .use(stringify)\n  .use(remarkTextr, {\n    plugins: [\n      textrGuillemets,\n    ],\n    options: {\n      locale: 'fr',\n    },\n  })\n  .processSync(text)\n\ntest('issue-80', () => {\n  const {contents} = render(dedent`\n    <<html>> <<html1>> <<html2>> <<html3>> <<html4>> <<**bold**>>\n\n    <<html>> <<html1>> <foo<html2>bar> <<html3>> <<html4>> <<**bold**>>\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('no-html-block', () => {\n  const {contents} = render(dedent`\n    << 1 >>\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('do-not-replace', () => {\n  const {contents} = render(dedent`\n    <a>>\n  `)\n  expect(contents).toMatchSnapshot()\n})\n"
  },
  {
    "path": "packages/remark-fix-guillemets/dist/index.js",
    "content": "\"use strict\";\n\nconst visit = require('unist-util-visit');\nfunction plugin() {\n  return transformer;\n}\nfunction transformer(tree) {\n  visit(tree, 'paragraph', visitor);\n}\nfunction visitor(node, index, parent) {\n  for (let c = 1; c < node.children.length - 1; c++) {\n    const child = node.children[c];\n    if (child.type === 'html') {\n      const previousNode = node.children[c - 1];\n      const nextNode = node.children[c + 1];\n      if (previousNode.type === 'text' && previousNode.value.slice(-1) === '<' && nextNode.type === 'text' && nextNode.value[0] === '>') {\n        previousNode.value += child.value;\n        previousNode.value += nextNode.value;\n        node.children.splice(c, 2);\n        c -= 1;\n      }\n    }\n  }\n}\nmodule.exports = plugin;"
  },
  {
    "path": "packages/remark-fix-guillemets/package.json",
    "content": "{\n  \"name\": \"remark-fix-guillemets\",\n  \"version\": \"1.1.3\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-fix-guillemets\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"unist-util-visit\": \"^2.0.3\"\n  },\n  \"devDependencies\": {\n    \"typographic-guillemets\": \"file:../typographic-guillemets\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-fix-guillemets/src/index.js",
    "content": "const visit = require('unist-util-visit')\n\nfunction plugin () {\n  return transformer\n}\n\nfunction transformer (tree) {\n  visit(tree, 'paragraph', visitor)\n}\n\nfunction visitor (node, index, parent) {\n  for (let c = 1; c < node.children.length - 1; c++) {\n    const child = node.children[c]\n    if (child.type === 'html') {\n      const previousNode = node.children[c - 1]\n      const nextNode = node.children[c + 1]\n\n      if (previousNode.type === 'text' &&\n        previousNode.value.slice(-1) === '<' &&\n        nextNode.type === 'text' &&\n        nextNode.value[0] === '>') {\n        previousNode.value += child.value\n        previousNode.value += nextNode.value\n        node.children.splice(c, 2)\n        c -= 1\n      }\n    }\n  }\n}\n\nmodule.exports = plugin\n"
  },
  {
    "path": "packages/remark-grid-tables/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-grid-tables/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-grid-tables/README.md",
    "content": "# remark-grid-tables [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis plugin parses custom Markdown syntax to describe tables. It was inspired by [this syntax](https://github.com/smartboyathome/Markdown-GridTables/blob/b4d16d5d254bed4336713d27eb8a37dc0e5f4273/mdx_grid_tables.py).\n\n## AST nodes\n\nIt adds a new node type to the [mdast][mdast] produced by [remark][remark]: `gridTable`.\n\nIf you are using [rehype][rehype], the stringified HTML result will be a `table`.\n\nIt is up to you to have CSS rules producing the desired result for these `table`.\n\n```javascript\ninterface GridTable <: Parent {\n  type: \"gridTable\";\n  data: {\n    hName: \"table\";\n  }\n}\n```\n\nA `gridTable` mdast node can contain the following mdast node types:\n\n### `tableHeader`\n\n```javascript\ninterface TableHeader <: Parent {\n  type: \"tableHeader\";\n  data: {\n    hName: \"thead\" or \"tbody\";\n  }\n}\n```\n\nWhere `hName` can be either `thead` or `tbody`.\n\n### `tableRow`\n\n```javascript\ninterface TableRow <: Parent {\n  type: \"tableRow\";\n  data: {\n    hName: \"tr\";\n  }\n}\n```\n\n### `tableCell`\n\n```javascript\ninterface TableCell <: Parent {\n  type: \"tableCell\";\n  data: {\n    hName: \"td\";\n    hProperties: {\n      colspan: number >= 1;\n      rowspan: number >= 1;\n    }\n  }\n}\n```\n\n## Syntax\n\nFor example:\n\n```markdown\n# Grid table\n\n## Basic example\n\n+-------+----------+------+\n| Table Headings   | Here |\n+-------+----------+------+\n| Sub   | Headings | Too  |\n+=======+==========+======+\n| cell  | column spanning |\n+ spans +----------+------+\n| rows  | normal   | cell |\n+-------+----------+------+\n| multi | cells can be    |\n| line  | *formatted*     |\n|       | **paragraphs**  |\n| cells |                 |\n| too   |                 |\n+-------+-----------------+\n```\n\nproduces:\n\n```html\n<h1>Grid table</h1>\n<h2>Basic example</h2>\n\n<table>\n  <thead>\n    <tr>\n      <th colspan=\"2\" rowspan=\"1\"><p>Table Headings</p></th>\n      <th colspan=\"1\" rowspan=\"1\"><p>Here</p></th>\n    </tr>\n    <tr>\n      <th colspan=\"1\" rowspan=\"1\"><p>Sub</p></th>\n      <th colspan=\"1\" rowspan=\"1\"><p>Headings</p></th>\n      <th colspan=\"1\" rowspan=\"1\"><p>Too</p></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td colspan=\"1\" rowspan=\"2\"><p>cell\nspans\nrows</p></td>\n      <td colspan=\"2\" rowspan=\"1\"><p>column spanning</p></td>\n    </tr>\n    <tr>\n      <td colspan=\"1\" rowspan=\"1\"><p>normal</p></td>\n      <td colspan=\"1\" rowspan=\"1\"><p>cell</p></td>\n    </tr>\n    <tr>\n      <td colspan=\"1\" rowspan=\"1\"><p>multi\nline</p><p>cells\ntoo</p></td>\n      <td colspan=\"2\" rowspan=\"1\"><p>cells can be\n<em>formatted</em>\n<strong>paragraphs</strong></p></td>\n    </tr>\n  </tbody>\n</table>\n```\n\nNote: the top of a cell must be indicated by `+-` followed by some `-` or `+` and finished by `-+`.  \nSo, this is not a correct cell:\n```md\n+--+\n|a |\n+--+\n```\n\nBut, this is a correct cell:\n```md\n+---+\n| a |\n+---+\n```\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-grid-tables\n```\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkGridTables = require('remark-grid-tables')\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkGridTables)\n  .use(remark2rehype)\n  .use(stringify)\n```\n\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-grid-tables/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-grid-tables\n\n[remark]: https://github.com/remarkjs/remark\n\n[mdast]: https://github.com/wooorm/mdast\n\n[rehype]: https://github.com/rehypejs/rehype\n"
  },
  {
    "path": "packages/remark-grid-tables/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`grid-table 1`] = `\n\"<h1>Grid table</h1>\n<h2>Basic example</h2>\n<table><thead><tr><th colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>Table Headings</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Here</p></th></tr><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Sub</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Headings</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Too</p></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>cell\nspans\nrows</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>column spanning</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>normal</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>cell</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>multi\nline</p><p>cells\ntoo</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>cells can be\n<em>formatted</em>\n<strong>paragraphs</strong></p></td></tr></tbody></table>\n<table><thead><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>D</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"3\\\\\"><p>A</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"3\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>D</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"4\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>G</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>H</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>I</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"4\\\\\"><p>C</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>F</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"3\\\\\"><p>A</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"3\\\\\"><p>F</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>H</p></td></tr><tr><td colspan=\\\\\"6\\\\\" rowspan=\\\\\"1\\\\\"><p>I</p></td></tr></tbody></table>\n<table><thead><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></th><th colspan=\\\\\"6\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"4\\\\\"><p>C</p></td><td colspan=\\\\\"6\\\\\" rowspan=\\\\\"4\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>H</p></td></tr></tbody></table></td></tr><tr></tr><tr></tr><tr></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>H</p></td><td colspan=\\\\\"16\\\\\" rowspan=\\\\\"1\\\\\"></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>He</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Li</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Be</p></td><td colspan=\\\\\"10\\\\\" rowspan=\\\\\"2\\\\\"></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>N</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>O</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ne</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Na</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Mg</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Al</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Si</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>P</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>S</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cl</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ar</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>K</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ca</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Sc</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ti</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>V</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cr</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Mn</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Fe</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Co</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ni</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cu</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Zn</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ga</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ge</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>As</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Se</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Br</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Kr</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Rb</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Sr</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Y</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Zr</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Nb</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Mo</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Tc</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ru</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Rh</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pd</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ag</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cd</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>In</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Sn</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Sb</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Te</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>I</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Xe</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cs</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ba</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>LAN</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Hf</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ta</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>W</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Re</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Os</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ir</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pt</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Au</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Hg</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Tl</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pb</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Bi</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Po</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>At</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Rn</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Fr</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ra</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ACT</p></td><td colspan=\\\\\"15\\\\\" rowspan=\\\\\"1\\\\\"></td></tr><tr><td colspan=\\\\\"18\\\\\" rowspan=\\\\\"1\\\\\"></td></tr><tr><td colspan=\\\\\"3\\\\\" rowspan=\\\\\"1\\\\\"><p>Lanthanide</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>La</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ce</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pr</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Nd</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pm</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Sm</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Eu</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Gd</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Tb</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Dy</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ho</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Er</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Tm</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Yb</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Lu</p></td></tr><tr><td colspan=\\\\\"3\\\\\" rowspan=\\\\\"1\\\\\"><p>Actinide</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ac</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Th</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pa</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>U</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Np</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pu</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Am</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cm</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Bk</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cf</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Es</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Fm</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Md</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>No</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Lw</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td></tr></tbody></table>\n<p>Text at the end</p>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td></tr></tbody></table>\n<p>Text at the</p>\n<h2>specific tests</h2>\n<p>In this examples, the second row should always be a full-cell</p>\n<table><tbody><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>B | C</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td><td colspan=\\\\\"3\\\\\" rowspan=\\\\\"1\\\\\"></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>B | C</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>D   E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>B | C</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>B  | C</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table>\n<h2>Failing example</h2>\n<p>+--- A ---+</p>\n<p>+---------+\n+---------+</p>\n<p>+---------+\n| A       |\n|         |</p>\n<p>+---------+\n| A       |\n+=========+\n| B       |\n+=========+</p>\n<p>+--- A ---+\n|         |</p>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"></td></tr></tbody></table>\n<p>Bug #107</p>\n<table><thead><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"></th><th colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>case1</p></th><th colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>case2</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>case3</p></th></tr><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>case4</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>case5</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>case6</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>case7</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>X</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>X</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>X</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>X</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>X</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>X</p></td></tr></tbody></table>\"\n`;\n\nexports[`grid-table double 1`] = `\n\"<h1>Grid table</h1>\n<h2>Basic example</h2>\n<table><thead><tr><th colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>テーブル表題</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>表題</p></th></tr><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>副題</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>見出し</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>セル</p></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>行の\n結合\n列</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>列の結合行</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>標準</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>セル</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>複数\n行の</p><p>セル\n結合</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p><em>書式つきの</em>\n<strong>段落</strong>\nセル</p></td></tr></tbody></table>\n<table><thead><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>い</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>う</p></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>え</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>お</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>か</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>き</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"3\\\\\"><p>あ</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>い</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>う</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>え</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>お</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"3\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>い</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>う</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>え</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>お</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"4\\\\\"><p>う</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>え</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>お</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>か</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>き</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>く</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>け</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>い</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"4\\\\\"><p>う</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>え</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>お</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>か</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>き</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>い</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>う</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>え</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>お</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>か</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>き</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>い</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>う</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>え</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>お</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>か</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>き</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"3\\\\\"><p>あ</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>い</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>う</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>え</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>お</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"3\\\\\"><p>か</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>き</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>く</p></td></tr><tr><td colspan=\\\\\"6\\\\\" rowspan=\\\\\"1\\\\\"><p>け</p></td></tr></tbody></table>\n<table><thead><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></th><th colspan=\\\\\"6\\\\\" rowspan=\\\\\"1\\\\\"><p>い</p></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"4\\\\\"><p>う</p></td><td colspan=\\\\\"6\\\\\" rowspan=\\\\\"4\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>え</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>お</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>か</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>き</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>く</p></td></tr></tbody></table></td></tr><tr></tr><tr></tr><tr></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></td></tr></tbody></table>\n<p>Text at the end</p>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></td></tr></tbody></table>\n<p>Text at the</p>\n<h2>specific tests</h2>\n<p>In this examples, the second row should always be a full-cell</p>\n<table><tbody><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>い | う</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>え</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>お</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>か</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>き</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></td><td colspan=\\\\\"3\\\\\" rowspan=\\\\\"1\\\\\"></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>い | う</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>え   お</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>か</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>き</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>い</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>う</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>え</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>い | う</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>え</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>お</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>か</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>き</p></td></tr></tbody></table>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>い</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>う</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>え</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>い  | う</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>え</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>お</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>か</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>き</p></td></tr></tbody></table>\n<h2>Failing example</h2>\n<p>+--- あ ---+</p>\n<p>+---------+\n+---------+</p>\n<p>+---------+\n| あ      |\n|         |</p>\n<p>+---------+\n| あ      |\n+=========+\n| い      |\n+=========+</p>\n<p>+--- あ ---+\n|          |</p>\n<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"></td></tr></tbody></table>\n<p>Bug #107</p>\n<table><thead><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"></th><th colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>例1</p></th><th colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>例2</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>例3</p></th></tr><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>例4</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>例5</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>例6</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>例7</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>あ</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>い</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>う</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>え</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>お</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>か</p></td></tr></tbody></table>\n<h2>Emoji</h2>\n<table><thead><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>xy</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>🐶</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>🍣</p></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>✌</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>👏 🌵</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>🦄</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>👨‍👨‍👧‍👦</p></td></tr></tbody></table>\n<h2>Emoji and Ambiguous Width</h2>\n<table><thead><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>xy</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>🐶</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>é</p></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>✌</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>👏 🌵</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>è</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>👨‍👨‍👧‍👦</p></td></tr></tbody></table>\"\n`;\n\nexports[`handles Cyrillic script 1`] = `\"<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>А</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Б</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>В</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Г</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Д</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Е</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ё</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ж</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>З</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>И</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Й</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>К</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Л</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>М</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Н</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>О</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>П</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Р</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>С</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Т</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>У</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ф</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Х</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ц</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ч</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ш</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Щ</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ъ</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ы</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ь</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Э</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ю</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Я</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>а</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>б</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>в</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>г</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>д</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>е</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ё</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ж</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>з</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>и</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>й</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>к</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>л</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>м</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>н</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>о</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>п</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>р</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>с</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>т</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>у</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ф</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>х</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ц</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ч</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ш</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>щ</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ъ</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ы</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ь</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>э</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ю</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>я</p></td></tr></tbody></table>\"`;\n\nexports[`handles Cyrillic script 2`] = `\"<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>abc</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ѥръ</p></td></tr></tbody></table>\"`;\n\nexports[`handles Cyrillic script 3`] = `\"<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ӂ</p></td></tr></tbody></table>\"`;\n\nexports[`handles Cyrillic script 4`] = `\"<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>z</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ӽ</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ӽ</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ў</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ў</p></td></tr></tbody></table>\"`;\n\nexports[`indentation in code blocks - negative indent 1`] = `\n\"<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Code</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Block</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><pre><code class=\\\\\"language-python\\\\\"> def echo(str):\nprint(str)\n</code></pre></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Another\nthing\nhere\nmaybe?</p></td></tr></tbody></table>\"\n`;\n\nexports[`indentation in code blocks - simple example 1`] = `\n\"<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Code</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Block</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><pre><code class=\\\\\"language-python\\\\\">def echo(str):\n  print(str)\n</code></pre></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Another\nthing\nhere\nmaybe?</p></td></tr></tbody></table>\"\n`;\n\nexports[`regression: grid table in fenced code block 1`] = `\n\"<pre><code>+---+---+---+\n| A | B | C |\n+===+===+===+\n| D | E     |\n|   +---+---+\n|   | F | G |\n+---+---+---+\n</code></pre>\"\n`;\n\nexports[`regression: grid table in non-fenced code block 1`] = `\n\"<pre><code>+---+---+---+\n| A | B | C |\n+===+===+===+\n| D | E     |\n|   +---+---+\n|   | F | G |\n+---+---+---+\n</code></pre>\"\n`;\n\nexports[`regression: should not crash with two spaces on the next line 1`] = `\"<table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>:)</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>:)</p></td></tr></tbody></table>\"`;\n"
  },
  {
    "path": "packages/remark-grid-tables/__tests__/grid-tables.double.md",
    "content": "# Grid table\n\n## Basic example\n\n+------+--------+------+\n| テーブル表題  | 表題 |\n+------+--------+------+\n| 副題 | 見出し | セル |\n+======+========+======+\n| 行の | 列の結合行    |\n+ 結合 +--------+------+\n| 列   | 標準   | セル |\n+------+--------+------+\n| 複数 | *書式つきの*  |\n| 行の | **段落**      |\n|      | セル          |\n| セル |               |\n| 結合 |               |\n+------+---------------+\n\n+----+----+----+\n| あ | い | う |\n+====+====+====+\n| え | お      |\n|    +----+----+\n|    | か | き |\n+----+----+----+\n\n+----+---------+\n| あ | い      |\n|    +----+----+\n|    | う | え |\n|    +----+----+\n|    | お      |\n+----+---------+\n\n+--------------+\n| あ           |\n+----+----+----+\n| い | う | え |\n|    +----+    |\n|    | お |    |\n+----+----+----+\n\n+----+----+----+\n| う | え | お |\n|    |    +----+\n|    |    | か |\n|    +----+----+\n|    | き | く |\n|    |    +----+\n|    |    | け |\n+----+----+----+\n\n+----+----+----+\n| あ | い | う |\n+----+    |    |\n| え |    |    |\n+----+----+    |\n| お | か |    |\n+----+    |    |\n| き |    |    |\n+----+----+----+\n\n+----+----+----+----+\n| あ | い | う | え |\n+----+----+----+----+\n| お      | か      |\n+---------+---------+\n| き                |\n+-------------------+\n\n+-------------------+\n| あ                |\n+---------+---------+\n| い      | う      |\n+----+----+----+----+\n| え | お | か | き |\n+----+----+----+----+\n\n\n+----+----+----+----+----+----+\n| あ | い | う | え | お | か |\n|    |    +----+----+    |    |\n|    |    | き      |    |    |\n|    +----+---------+----+    |\n|    | く                |    |\n+----+-------------------+----+\n| け                          |\n+-----------------------------+\n\n+----+-----------------------+\n| あ | い                    |\n+====+=======================+\n| う |                       |\n|    | +----+----+----+----+ |\n|    | | え | お | か | き | |\n|    | +----+----+----+----+ |\n|    | | く                | |\n|    | +-------------------+ |\n|    |                       |\n+----+-----------------------+\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n+----------+\n| あ       |\n+----------+\nText at the end\n\n+----------+\n| あ       |\n+----------+\nText at the\n\n## specific tests\n\nIn this examples, the second row should always be a full-cell\n\n+-------------------+\n| あ                |\n+-------------------+\n| い | う           |\n+----+----+----+----+\n| え | お | か | き |\n+----+----+----+----+\n\n+----+--------------+\n| あ |              |\n+----+--------------+\n| い | う           |\n+---------+----+----+\n| え   お | か | き |\n+---------+----+----+\n\n+----+----+----+----+\n| あ | い | う | え |\n+----+----+----+----+\n| い | う           |\n|                   |\n+----+----+----+----+\n| え | お | か | き |\n+----+----+----+----+\n\n+----+----+----+----+\n| あ | い | う | え |\n+----+----+----+----+\n| い  | う          |\n+----+----+----+----+\n| え | お | か | き |\n+----+----+----+----+\n\n## Failing example\n\n+--- あ ---+\n\n+---------+\n+---------+\n\n+---------+\n| あ      |\n|         |\n\n+---------+\n| あ      |\n+=========+\n| い      |\n+=========+\n\n+--- あ ---+\n|          |\n+----------+\n|          |\n+----------+\n\nBug #107\n\n+----+-----+-----+-----+-----+-----+\n|    | 例1       | 例2       | 例3 |\n+----+-----+-----+-----+-----+-----+\n|    | 例4 | 例5 | 例6 | 例7 |     |\n+====+=====+=====+=====+=====+=====+\n| あ | い  | う  | え  | お  | か  |\n+----+-----+-----+-----+-----+-----+\n\n## Emoji\n\n+----+----+----+\n| xy | 🐶 | 🍣 |\n+====+====+====+\n| ✌ | 👏 🌵   |\n|    +----+----+\n|    | 🦄 | 👨‍👨‍👧‍👦 |\n+----+----+----+\n\n## Emoji and Ambiguous Width\n\n+----+----+----+\n| xy | 🐶 | é  |\n+====+====+====+\n| ✌ | 👏 🌵   |\n|    +----+----+\n|    | è  | 👨‍👨‍👧‍👦 |\n+----+----+----+"
  },
  {
    "path": "packages/remark-grid-tables/__tests__/grid-tables.md",
    "content": "# Grid table\n\n## Basic example\n\n+-------+----------+------+\n| Table Headings   | Here |\n+-------+----------+------+\n| Sub   | Headings | Too  |\n+=======+==========+======+\n| cell  | column spanning |\n+ spans +----------+------+\n| rows  | normal   | cell |\n+-------+----------+------+\n| multi | cells can be    |\n| line  | *formatted*     |\n|       | **paragraphs**  |\n| cells |                 |\n| too   |                 |\n+-------+-----------------+\n\n+---+---+---+\n| A | B | C |\n+===+===+===+\n| D | E     |\n|   +---+---+\n|   | F | G |\n+---+---+---+\n\n+---+-------+\n| A | B     |\n|   +---+---+\n|   | C | D |\n|   +---+---+\n|   | E     |\n+---+-------+\n\n+-----------+\n| A         |\n+---+---+---+\n| B | C | D |\n|   +---+   |\n|   | E |   |\n+---+---+---+\n\n+---+---+---+\n| C | D | E |\n|   |   +---+\n|   |   | F |\n|   +---+---+\n|   | G | H |\n|   |   +---+\n|   |   | I |\n+---+---+---+\n\n+---+---+---+\n| A | B | C |\n+---+   |   |\n| D |   |   |\n+---+---+   |\n| E | F |   |\n+---+   |   |\n| G |   |   |\n+---+---+---+\n\n+---+---+---+---+\n| A | B | C | D |\n+---+---+---+---+\n| E     | F     |\n+-------+-------+\n| G             |\n+---------------+\n\n+---------------+\n| A             |\n+-------+-------+\n| B     | C     |\n+---+---+---+---+\n| D | E | F | G |\n+---+---+---+---+\n\n\n+---+---+---+---+---+---+\n| A | B | C | D | E | F |\n|   |   +---+---+   |   |\n|   |   | G     |   |   |\n|   +---+-------+---+   |\n|   | H             |   |\n+---+---------------+---+\n| I                     |\n+-----------------------+\n\n+---+-------------------+\n| A | B                 |\n+===+===================+\n| C |                   |\n|   | +---+---+---+---+ |\n|   | | D | E | F | G | |\n|   | +---+---+---+---+ |\n|   | | H             | |\n|   | +---------------+ |\n|   |                   |\n+---+-------------------+\n\n+---+---------------------------------------------------------------+---+\n| H |                                                               |He |\n+---+---+---------------------------------------+---+---+---+---+---+---+\n|Li |Be |                                       | B | C | N | O | F |Ne |\n+---+---+                                       +---+---+---+---+---+---+\n|Na |Mg |                                       |Al |Si | P | S |Cl |Ar |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n| K |Ca |Sc |Ti | V |Cr |Mn |Fe |Co |Ni |Cu |Zn |Ga |Ge |As |Se |Br |Kr |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Rb |Sr | Y |Zr |Nb |Mo |Tc |Ru |Rh |Pd |Ag |Cd |In |Sn |Sb |Te | I |Xe |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Cs |Ba |LAN|Hf |Ta | W |Re |Os |Ir |Pt |Au |Hg |Tl |Pb |Bi |Po |At |Rn |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Fr |Ra |ACT|                                                           |\n+---+---+---+-----------------------------------------------------------+\n|                                                                       |\n+-----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Lanthanide |La |Ce |Pr |Nd |Pm |Sm |Eu |Gd |Tb |Dy |Ho |Er |Tm |Yb |Lu |\n+-----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Actinide   |Ac |Th |Pa | U |Np |Pu |Am |Cm |Bk |Cf |Es |Fm |Md |No |Lw |\n+-----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n\n+---------+\n| A       |\n+---------+\nText at the end\n\n+---------+\n| A       |\n+---------+\nText at the\n\n## specific tests\n\nIn this examples, the second row should always be a full-cell\n\n+---------------+\n| A             |\n+---------------+\n| B | C         |\n+---+---+---+---+\n| D | E | F | G |\n+---+---+---+---+\n\n+---+-----------+\n| A |           |\n+---+-----------+\n| B | C         |\n+-------+---+---+\n| D   E | F | G |\n+-------+---+---+\n\n+---+---+---+---+\n| A | B | C | D |\n+---+---+---+---+\n| B | C         |\n|               |\n+---+---+---+---+\n| D | E | F | G |\n+---+---+---+---+\n\n+---+---+---+---+\n| A | B | C | D |\n+---+---+---+---+\n| B  | C        |\n+---+---+---+---+\n| D | E | F | G |\n+---+---+---+---+\n\n## Failing example\n\n+--- A ---+\n\n+---------+\n+---------+\n\n+---------+\n| A       |\n|         |\n\n+---------+\n| A       |\n+=========+\n| B       |\n+=========+\n\n+--- A ---+\n|         |\n+---------+\n|         |\n+---------+\n\nBug #107\n\n+-----+-------+-------+-------+-------+-------+\n|     | case1         | case2         | case3 |\n+-----+-------+-------+-------+-------+-------+\n|     | case4 | case5 | case6 | case7 |       |\n+=====+=======+=======+=======+=======+=======+\n|  X  |    X  |   X   |   X   |   X   |   X   |\n+-----+-------+-------+-------+-------+-------+\n"
  },
  {
    "path": "packages/remark-grid-tables/__tests__/index.js",
    "content": "/* eslint-disable max-len */\nimport {readFileSync as file} from 'fs'\nimport {join} from 'path'\nimport unified from 'unified'\nimport dedent from 'dedent'\nimport reParse from 'remark-parse'\nimport stringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\nimport stringifyRemark from 'remark-stringify'\n\nimport plugin from '../src/'\n\nconst render = text => unified()\n  .use(reParse)\n  .use(plugin)\n  .use(remark2rehype)\n  .use(stringify)\n  .processSync(text)\n\nconst compiler = text => unified()\n  .use(reParse)\n  .use(stringifyRemark)\n  .use(plugin)\n  .processSync(text)\n\ntest('grid-table', () => {\n  const {contents} = render(file(join(__dirname, 'grid-tables.md')))\n  expect(contents).toMatchSnapshot()\n})\n\ntest('grid-table double', () => {\n  const {contents} = render(file(join(__dirname, 'grid-tables.double.md')))\n  expect(contents).toMatchSnapshot()\n})\n\ntest('regression: grid table in fenced code block', () => {\n  const {contents} = render(`\n\\`\\`\\`\n+---+---+---+\n| A | B | C |\n+===+===+===+\n| D | E     |\n|   +---+---+\n|   | F | G |\n+---+---+---+\n\\`\\`\\`\n`)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('regression: grid table in non-fenced code block', () => {\n  const {contents} = render(`\n    +---+---+---+\n    | A | B | C |\n    +===+===+===+\n    | D | E     |\n    |   +---+---+\n    |   | F | G |\n    +---+---+---+\n`)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('regression: should not crash with two spaces on the next line', () => {\n  const {contents} = render(dedent`\n    +----+----+\n    + :) | :) +\n    +----+----+\n    ··\n    `.replace(/·/g, ' '))\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('regression: should be parsed with two spaces on last line', () => {\n  const {contents: base} = render(dedent`\n    +----+----+\n    + :) | :) +\n    +----+----+\n\n    hello\n    `)\n\n  const {contents} = render(dedent`\n    +----+----+\n    + :) | :) +\n    +----+----+··\n\n    hello\n    `.replace(/·/g, ' '))\n\n  expect(contents).toBe(base)\n})\n\ntest('regression: should not crash with leading space', () => {\n  const {contents: base} = render(dedent`\n    a\n    +---+\n    | b |\n    +---+\n\n    hello\n    `)\n\n  const {contents} = render(dedent`\n    a·\n    +---+\n    | b |\n    +---+\n\n    hello\n    `.replace(/·/g, ' '))\n\n  expect(contents).toBe(base)\n})\n\ntest('regression: should not crash when followed by \"sth<space>\"', () => {\n  const {contents: base} = render(dedent`\n    +---+\n    | A |\n    +===+\n    | B |\n    +---+\n    <-\n    bug\n    `)\n\n  const {contents} = render(dedent`\n    +---+\n    | A |\n    +===+\n    | B |\n    +---+\n    <-·\n    bug\n    `.replace(/·/g, ' '))\n\n  expect(contents).toBe(base)\n})\n\ntest('regression: should ignore spaces at the right of the table', () => {\n  const {contents: base} = render(dedent`\n    +---+\n    | A |\n    +===+\n    | B |\n    +---+\n\n    `)\n\n  const {contents} = render(dedent`\n    +---+\n    | A |\n    +===+···\n    | B |·\n    +---+\n\n    `.replace(/·/g, ' '))\n\n  expect(contents).toBe(base)\n})\n\ntest('regression: handles east asian ambiguous width', () => {\n  const {contents: base} = render(dedent`\n    +---+\n    | ï |\n    +---+\n  `)\n\n  const {contents: test1} = render(dedent`\n    +---+\n    | é |\n    +---+\n  `)\n\n  const {contents: test2} = render(dedent`\n    +---+\n    | Ê |\n    +---+\n  `)\n\n  const {contents: test3} = render(dedent`\n    +---+\n    | ﬂ |\n    +---+\n  `)\n\n  const {contents: test4} = render(dedent`\n    +---+\n    | ¯ |\n    +---+\n  `)\n\n  expect(test1).toBe(base.replace('ï', 'é'))\n  expect(test2).toBe(base.replace('ï', 'Ê'))\n  expect(test3).toBe(base.replace('ï', 'ﬂ'))\n  expect(test4).toBe(base.replace('ï', '¯'))\n})\n\ntest('distinguish between tables of the same width', () => {\n  const {contents: test1} = render(dedent`\n    +---+---+---+\n    | 1 | 2 | 3 |\n    +---+---+---+\n    |   | a     |\n    +---+---+---+\n    |     b |   |\n    +-------+---+\n  `)\n\n  const {contents: test2} = render(dedent`\n    +---+---+---+\n    | 1 | 2 | 3 |\n    +---+---+---+\n    |   | a     |\n    +---+-------+\n    | b |       |\n    +---+-------+\n  `)\n\n  expect(test1).not.toEqual(test2)\n})\n\ntest('indentation in code blocks - simple example', () => {\n  const {contents} = render(dedent`\n    +----------------+---------+\n    | Code           | Block   |\n    +----------------+---------+\n    | \\`\\`\\`python      | Another |\n    | def echo(str): | thing   |\n    |   print(str)   | here    |\n    | \\`\\`\\`            | maybe?  |\n    +----------------+---------+\n  `)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('indentation in code blocks - negative indent', () => {\n  const {contents} = render(dedent`\n    +-----------------+---------+\n    | Code            | Block   |\n    +-----------------+---------+\n    | \\`\\`\\`python       | Another |\n    |  def echo(str): | thing   |\n    | print(str)      | here    |\n    | \\`\\`\\`             | maybe?  |\n    +-----------------+---------+\n  `)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('handles Cyrillic script', () => {\n  const {contents: test1} = render(dedent`\n    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n    | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z | z |\n    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n    | А | Б | В | Г | Д | Е | Ё | Ж | З | И | Й | К | Л | М | Н | О | П | Р | С | Т | У | Ф | Х | Ц | Ч | Ш | Щ | Ъ | Ы | Ь | Э | Ю | Я |\n    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n    | а | б | в | г | д | е | ё | ж | з | и | й | к | л | м | н | о | п | р | с | т | у | ф | х | ц | ч | ш | щ | ъ | ы | ь | э | ю | я |\n    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n  `)\n\n  const {contents: test2} = render(dedent`\n    +-----+\n    | abc |\n    +-----+\n    | ѥръ |\n    +-----+\n  `)\n\n  const {contents: test3} = render(dedent`\n    +---+\n    | Ӂ |\n    +---+\n  `)\n\n  const {contents: test4} = render(dedent`\n    +---+---+\n    | z | z |\n    +---+---+\n    | Ӽ | ӽ |\n    +---+---+\n    | Ў | ў |\n    +---+---+\n  `)\n\n  expect(test1).toMatchSnapshot()\n  expect(test2).toMatchSnapshot()\n  expect(test3).toMatchSnapshot()\n  expect(test4).toMatchSnapshot()\n})\n\ntest('stringify', () => {\n  const fileExample = file(join(__dirname, 'grid-tables.md'))\n  const {contents} = render(fileExample)\n  const contents2 = render(compiler(fileExample)).contents\n  expect(contents).toBe(contents2)\n})\n"
  },
  {
    "path": "packages/remark-grid-tables/dist/index.js",
    "content": "\"use strict\";\n\nconst trimEnd = require('lodash.trimend');\nconst visit = require('unist-util-visit');\nconst stringWidth = require('string-width');\nconst splitter = new (require('grapheme-splitter'))();\nconst mainLineRegex = /((\\+)|(\\|)).+((\\|)|(\\+))/;\nconst totalMainLineRegex = /^((\\+)|(\\|)).+((\\|)|(\\+))$/;\nconst headerLineRegex = /^\\+=[=+]+=\\+$/;\nconst partLineRegex = /\\+-[-+]+-\\+/;\nconst separationLineRegex = /^\\+-[-+]+-\\+$/;\nmodule.exports = plugin;\n\n// A small class helping table generation\nclass Table {\n  constructor(linesInfos) {\n    this._parts = [];\n    this._linesInfos = linesInfos;\n    this.addPart();\n  }\n  lastPart() {\n    return this._parts[this._parts.length - 1];\n  }\n  addPart() {\n    this._parts.push(new TablePart(this._linesInfos));\n  }\n}\nclass TablePart {\n  constructor(linesInfos) {\n    this._rows = [];\n    this._linesInfos = linesInfos;\n    this.addRow();\n  }\n  addRow() {\n    this._rows.push(new TableRow(this._linesInfos));\n  }\n  removeLastRow() {\n    this._rows.pop();\n  }\n  lastRow() {\n    return this._rows[this._rows.length - 1];\n  }\n  updateWithMainLine(line, isEndLine) {\n    // Update last row according to a line.\n    const mergeChars = isEndLine ? '+|' : '|';\n    const newCells = [this.lastRow()._cells[0]];\n    for (let c = 1; c < this.lastRow()._cells.length; c++) {\n      const cell = this.lastRow()._cells[c];\n\n      // Only cells with rowSpan equals can be merged\n      // Test if the char does not compose a character\n      // or the char before the cell is a separation character\n      if (cell._rowSpan === newCells[newCells.length - 1]._rowSpan && (!isCodePointPosition(line, cell._startPosition - 1) || !mergeChars.includes(substringLine(line, cell._startPosition - 1)))) {\n        newCells[newCells.length - 1].mergeWith(cell);\n      } else {\n        newCells.push(cell);\n      }\n    }\n    this.lastRow()._cells = newCells;\n  }\n  updateWithPartLine(line) {\n    // Get cells not finished\n    const remainingCells = [];\n    for (let c = 0; c < this.lastRow()._cells.length; c++) {\n      const cell = this.lastRow()._cells[c];\n      const partLine = substringLine(line, cell._startPosition - 1, cell._endPosition + 1);\n      if (!isSeparationLine(partLine)) {\n        cell._lines.push(substringLine(line, cell._startPosition, cell._endPosition));\n        cell._rowSpan += 1;\n        remainingCells.push(cell);\n      }\n    }\n    // Generate new row\n    this.addRow();\n    const newCells = [];\n    for (let c = 0; c < remainingCells.length; c++) {\n      const remainingCell = remainingCells[c];\n      for (let cc = 0; cc < this.lastRow()._cells.length; cc++) {\n        const cell = this.lastRow()._cells[cc];\n        if (cell._endPosition < remainingCell._startPosition && !newCells.includes(cell)) {\n          newCells.push(cell);\n        }\n      }\n      newCells.push(remainingCell);\n      for (let cc = 0; cc < this.lastRow()._cells.length; cc++) {\n        const cell = this.lastRow()._cells[cc];\n        if (cell._startPosition > remainingCell._endPosition && !newCells.includes(cell)) {\n          newCells.push(cell);\n        }\n      }\n    }\n\n    // Remove duplicates\n    for (let nc = 0; nc < newCells.length; nc++) {\n      let newCell = newCells[nc];\n      for (let ncc = 0; ncc < newCells.length; ncc++) {\n        if (nc !== ncc) {\n          const other = newCells[ncc];\n          if (other._startPosition >= newCell._startPosition && other._endPosition <= newCell._endPosition) {\n            if (other._lines.length === 0) {\n              newCells.splice(ncc, 1);\n              ncc -= 1;\n              if (nc > ncc) {\n                nc -= 1;\n                newCell = newCells[nc];\n              }\n            }\n          }\n        }\n      }\n    }\n    this.lastRow()._cells = newCells;\n  }\n}\nclass TableRow {\n  constructor(linesInfos) {\n    this._linesInfos = linesInfos;\n    this._cells = [];\n    for (let i = 0; i < linesInfos.length - 1; i++) {\n      this._cells.push(new TableCell(linesInfos[i] + 1, linesInfos[i + 1]));\n    }\n  }\n  updateContent(line) {\n    for (let c = 0; c < this._cells.length; c++) {\n      const cell = this._cells[c];\n      cell._lines.push(substringLine(line, cell._startPosition, cell._endPosition));\n    }\n  }\n}\nclass TableCell {\n  constructor(startPosition, endPosition) {\n    this._startPosition = startPosition;\n    this._endPosition = endPosition;\n    this._colSpan = 1;\n    this._rowSpan = 1;\n    this._lines = [];\n  }\n  mergeWith(other) {\n    this._endPosition = other._endPosition;\n    this._colSpan += other._colSpan;\n    const newLines = [];\n    for (let l = 0; l < this._lines.length; l++) {\n      newLines.push(`${this._lines[l]}|${other._lines[l]}`);\n    }\n    this._lines = newLines;\n  }\n}\nfunction merge(beforeTable, gridTable, afterTable) {\n  // get the eaten text\n  let total = beforeTable.join('\\n');\n  if (total.length) {\n    total += '\\n';\n  }\n  total += gridTable.join('\\n');\n  if (afterTable.join('\\n').length) {\n    total += '\\n';\n  }\n  total += afterTable.join('\\n');\n  return total;\n}\nfunction isSeparationLine(line) {\n  return separationLineRegex.exec(line);\n}\nfunction isHeaderLine(line) {\n  return headerLineRegex.exec(line);\n}\nfunction isPartLine(line) {\n  return partLineRegex.exec(line);\n}\nfunction findAll(str, characters) {\n  let current = 0;\n  const pos = [];\n  const content = splitter.splitGraphemes(str);\n  for (let i = 0; i < content.length; i++) {\n    const char = content[i];\n    if (characters.includes(char)) {\n      pos.push(current);\n    }\n    current += stringWidth(char);\n  }\n  return pos;\n}\nfunction computePlainLineColumnsStartingPositions(line) {\n  return findAll(line, '+|');\n}\nfunction mergeColumnsStartingPositions(allPos) {\n  // Get all starting positions, allPos is an array of array of positions\n  const positions = [];\n  allPos.forEach(posRow => posRow.forEach(pos => {\n    if (!positions.includes(pos)) {\n      positions.push(pos);\n    }\n  }));\n  return positions.sort((a, b) => a - b);\n}\nfunction computeColumnStartingPositions(lines) {\n  const linesInfo = [];\n  lines.forEach(line => {\n    if (isHeaderLine(line) || isPartLine(line)) {\n      linesInfo.push(computePlainLineColumnsStartingPositions(line));\n    }\n  });\n  return mergeColumnsStartingPositions(linesInfo);\n}\nfunction isCodePointPosition(line, pos) {\n  const content = splitter.splitGraphemes(line);\n  let offset = 0;\n  for (let i = 0; i < content.length; i++) {\n    // The pos points character position\n    if (pos === offset) {\n      return true;\n    }\n    // The pos points non-character position\n    if (pos < offset) {\n      return false;\n    }\n    offset += stringWidth(content[i]);\n  }\n\n  // Reaching end means character position\n  return true;\n}\nfunction substringLine(line, start, end) {\n  end = end || start + 1;\n  const content = splitter.splitGraphemes(line);\n  let offset = 0;\n  let str = '';\n  for (let i = 0; i < content.length; i++) {\n    if (offset >= start) {\n      str += content[i];\n    }\n    offset += stringWidth(content[i]);\n    if (offset >= end) {\n      break;\n    }\n  }\n  return str;\n}\nfunction extractTable(value, eat, tokenizer) {\n  // Extract lines before the grid table\n  const markdownLines = value.split('\\n');\n  let i = 0;\n  const before = [];\n  for (; i < markdownLines.length; i++) {\n    const line = markdownLines[i];\n    if (isSeparationLine(line)) break;\n    if (stringWidth(line) === 0) break;\n    before.push(line);\n  }\n  const possibleGridTable = markdownLines.map(line => trimEnd(line));\n\n  // Extract table\n  if (!possibleGridTable[i + 1]) return [null, null, null, null];\n  const gridTable = [];\n  const realGridTable = [];\n  let hasHeader = false;\n  for (; i < possibleGridTable.length; i++) {\n    const line = possibleGridTable[i];\n    const realLine = markdownLines[i];\n    // line is in table\n    if (totalMainLineRegex.exec(line)) {\n      const isHeaderLine = headerLineRegex.exec(line);\n      if (isHeaderLine && !hasHeader) hasHeader = true;\n      // A table can't have 2 headers\n      else if (isHeaderLine && hasHeader) {\n        break;\n      }\n      realGridTable.push(realLine);\n      gridTable.push(line);\n    } else {\n      // this line is not in the grid table.\n      break;\n    }\n  }\n\n  // if the last line is not a plain line\n  if (!separationLineRegex.exec(gridTable[gridTable.length - 1])) {\n    // Remove lines not in the table\n    for (let j = gridTable.length - 1; j >= 0; j--) {\n      const isSeparation = separationLineRegex.exec(gridTable[j]);\n      if (isSeparation) break;\n      gridTable.pop();\n      i -= 1;\n    }\n  }\n\n  // Extract lines after table\n  const after = [];\n  for (; i < possibleGridTable.length; i++) {\n    const line = possibleGridTable[i];\n    if (stringWidth(line) === 0) break;\n    after.push(markdownLines[i]);\n  }\n  return [before, gridTable, realGridTable, after, hasHeader];\n}\nfunction extractTableContent(lines, linesInfos, hasHeader) {\n  const table = new Table(linesInfos);\n  for (let l = 0; l < lines.length; l++) {\n    const line = lines[l];\n    // Get if the line separate the head of the table from the body\n    const matchHeader = hasHeader & isHeaderLine(line) !== null;\n    // Get if the line close some cells\n    const isEndLine = matchHeader | isPartLine(line) !== null;\n    if (isEndLine) {\n      // It is a header, a plain line or a line with plain line part.\n      // First, update the last row\n      table.lastPart().updateWithMainLine(line, isEndLine);\n\n      // Create the new row\n      if (l !== 0) {\n        if (matchHeader) {\n          table.addPart();\n        } else if (isSeparationLine(line)) {\n          table.lastPart().addRow();\n        } else {\n          table.lastPart().updateWithPartLine(line);\n        }\n      }\n      // update the last row\n      table.lastPart().updateWithMainLine(line, isEndLine);\n    } else {\n      // it's a plain line\n      table.lastPart().updateWithMainLine(line, isEndLine);\n      table.lastPart().lastRow().updateContent(line);\n    }\n  }\n  // Because the last line is a separation, the last row is always empty\n  table.lastPart().removeLastRow();\n  return table;\n}\nfunction processCellLines(lines) {\n  const trimmedLines = [];\n  let inCodeBlock = false;\n  let leadingWhitespace = 0;\n  let leadingWhitespaceRegex = null;\n  for (let i = 0; i < lines.length; i++) {\n    let line = lines[i];\n\n    // Trim the end of the line\n    line = line.trimEnd();\n\n    // Check if we're entering or exiting a code block\n    if (line.trim().startsWith('```')) {\n      inCodeBlock = !inCodeBlock;\n\n      // If we're entering a code block, remember the amount of leading whitespace\n      if (inCodeBlock) {\n        // Set how much whitespace to remoev from lines\n        // inside the code-block\n        leadingWhitespace = line.match(/^ */)[0].length;\n        leadingWhitespaceRegex = new RegExp(`^ {0,${leadingWhitespace}}`);\n      }\n\n      // Remove leading whitespace from the opening/closing code-block\n      // statement as well\n      line = line.replace(leadingWhitespaceRegex, '');\n    } else if (inCodeBlock) {\n      // If we're *already* in a code block, trim the start of the line\n      // by the amount of leading whitespace\n      line = line.replace(leadingWhitespaceRegex, '');\n    } else {\n      // We're not in a code block, trim the start of the line\n      line = line.trimStart();\n    }\n\n    // Replace the line in the array\n    trimmedLines.push(line);\n  }\n  return trimmedLines;\n}\nfunction generateTable(tableContent, now, tokenizer) {\n  // Generate the gridTable node to insert in the AST\n  const tableElt = {\n    type: 'gridTable',\n    children: [],\n    data: {\n      hName: 'table'\n    }\n  };\n  const hasHeader = tableContent._parts.length > 1;\n  for (let p = 0; p < tableContent._parts.length; p++) {\n    const part = tableContent._parts[p];\n    const partElt = {\n      type: 'tableHeader',\n      children: [],\n      data: {\n        hName: hasHeader && p === 0 ? 'thead' : 'tbody'\n      }\n    };\n    for (let r = 0; r < part._rows.length; r++) {\n      const row = part._rows[r];\n      const rowElt = {\n        type: 'tableRow',\n        children: [],\n        data: {\n          hName: 'tr'\n        }\n      };\n      for (let c = 0; c < row._cells.length; c++) {\n        const cell = row._cells[c];\n        const trimmedLines = processCellLines(cell._lines);\n        const tokenizedContent = tokenizer.tokenizeBlock(trimmedLines.join('\\n'), now);\n        const cellElt = {\n          type: 'tableCell',\n          children: tokenizedContent,\n          data: {\n            hName: hasHeader && p === 0 ? 'th' : 'td',\n            hProperties: {\n              colSpan: cell._colSpan,\n              rowSpan: cell._rowSpan\n            }\n          }\n        };\n        const endLine = r + cell._rowSpan;\n        if (cell._rowSpan > 1 && endLine - 1 < part._rows.length) {\n          for (let rs = 1; rs < cell._rowSpan; rs++) {\n            for (let cc = 0; cc < part._rows[r + rs]._cells.length; cc++) {\n              const other = part._rows[r + rs]._cells[cc];\n              if (cell._startPosition === other._startPosition && cell._endPosition === other._endPosition && cell._colSpan === other._colSpan && cell._rowSpan === other._rowSpan && cell._lines === other._lines) {\n                part._rows[r + rs]._cells.splice(cc, 1);\n              }\n            }\n          }\n        }\n        rowElt.children.push(cellElt);\n      }\n      partElt.children.push(rowElt);\n    }\n    tableElt.children.push(partElt);\n  }\n  return tableElt;\n}\nfunction gridTableTokenizer(eat, value, silent) {\n  let index = 0;\n  const length = value.length;\n  let character;\n  while (index < length) {\n    character = value.charAt(index);\n    if (character !== ' ' && character !== '\\t') {\n      break;\n    }\n    index++;\n  }\n  if (value.charAt(index) !== '+') {\n    return;\n  }\n  if (value.charAt(index + 1) !== '-') {\n    return;\n  }\n  const keep = mainLineRegex.test(value);\n  if (!keep) return;\n  const [before, gridTable, realGridTable, after, hasHeader] = extractTable(value, eat, this);\n  if (!gridTable || gridTable.length < 3) return;\n  const now = eat.now();\n  const linesInfos = computeColumnStartingPositions(gridTable);\n  const tableContent = extractTableContent(gridTable, linesInfos, hasHeader);\n  const tableElt = generateTable(tableContent, now, this);\n  const merged = merge(before, realGridTable, after);\n\n  // Because we can't add multiples blocs in one eat, I use a temp block\n  const wrapperBlock = {\n    type: 'element',\n    tagName: 'WrapperBlock',\n    children: []\n  };\n  if (before.length) {\n    const tokensBefore = this.tokenizeBlock(before.join('\\n'), now)[0];\n    wrapperBlock.children.push(tokensBefore);\n  }\n  wrapperBlock.children.push(tableElt);\n  if (after.length) {\n    const tokensAfter = this.tokenizeBlock(after.join('\\n'), now);\n    if (tokensAfter.length) {\n      wrapperBlock.children.push(tokensAfter[0]);\n    }\n  }\n  return eat(merged)(wrapperBlock);\n}\nfunction deleteWrapperBlock() {\n  function one(node, index, parent) {\n    if (!node.children) return;\n    const newChildren = [];\n    let replace = false;\n    for (let c = 0; c < node.children.length; c++) {\n      const child = node.children[c];\n      if (child.tagName === 'WrapperBlock' && child.type === 'element') {\n        replace = true;\n        for (let cc = 0; cc < child.children.length; cc++) {\n          newChildren.push(child.children[cc]);\n        }\n      } else {\n        newChildren.push(child);\n      }\n    }\n    if (replace) {\n      node.children = newChildren;\n    }\n  }\n  return one;\n}\nfunction transformer(tree) {\n  // Remove the temporary block in which we previously wrapped the table parts\n  visit(tree, deleteWrapperBlock());\n}\nfunction createGrid(nbRows, nbCols) {\n  const grid = [];\n  for (let i = 0; i < nbRows; i++) {\n    grid.push([]);\n    for (let j = 0; j < nbCols; j++) {\n      grid[i].push({\n        height: -1,\n        width: -1,\n        hasBottom: true,\n        hasRigth: true\n      });\n    }\n  }\n  return grid;\n}\nfunction setWidth(grid, i, j, cols) {\n  /* To do it, we put enougth space to write the text.\n   * For multi-cell, we divid it among the cells. */\n  let tmpWidth = Math.max(...Array.from(grid[i][j].value).map(x => x.length)) + 2;\n  grid[i].forEach((_, c) => {\n    if (c < cols) {\n      // To divid\n      const localWidth = Math.ceil(tmpWidth / (cols - c)); // cols - c will be 1 for the last cell\n      tmpWidth -= localWidth;\n      grid[i][j + c].width = localWidth;\n    }\n  });\n}\nfunction setHeight(grid, i, j, values) {\n  // To do it, we count the line. Extra length to cell with a pipe\n  // in the value of the last line, to not be confuse with a border.\n  grid[i][j].height = values.length;\n  // Extra line\n  if (values[values.length - 1].indexOf('|') > 0) {\n    grid[i][j].height += 1;\n  }\n}\nfunction extractAST(gridNode, grid) {\n  let i = 0;\n  /* Fill the grid with value, height and width from the ast */\n  gridNode.children.forEach(th => {\n    th.children.forEach(row => {\n      row.children.forEach((cell, j) => {\n        let X = 0; // x taking colSpan and rowSpan into account\n\n        while (grid[i][j + X].evaluated) X++;\n        grid[i][j + X].value = this.all(cell).join('\\n\\n').split('\\n');\n        setHeight(grid, i, j + X, grid[i][j + X].value);\n        setWidth(grid, i, j + X, cell.data.hProperties.colSpan);\n\n        // If it's empty, we fill it up with a useless space\n        // Otherwise, it will not be parsed.\n        if (!grid[0][0].value.join('\\n')) {\n          grid[0][0].value = [' '];\n          grid[0][0].width = 3;\n        }\n\n        // Define the border of each cell\n        for (let x = 0; x < cell.data.hProperties.rowSpan; x++) {\n          for (let y = 0; y < cell.data.hProperties.colSpan; y++) {\n            // b attribute is for bottom\n            grid[i + x][j + X + y].hasBottom = x + 1 === cell.data.hProperties.rowSpan;\n            // r attribute is for right\n            grid[i + x][j + X + y].hasRigth = y + 1 === cell.data.hProperties.colSpan;\n\n            // set v if a cell has ever been define\n            grid[i + x][j + X + y].evaluated = ' ';\n          }\n        }\n      });\n      i++;\n    });\n  });\n\n  // If they is 2 differents tableHeader, so the first one is a header and\n  // should be underlined\n  if (gridNode.children.length > 1) {\n    grid[gridNode.children[0].children.length - 1][0].isHeader = true;\n  }\n}\nfunction setSize(grid) {\n  // The idea is the max win\n\n  // Set the height of each column\n  grid.forEach(row => {\n    // Find the max\n    const maxHeight = Math.max(...row.map(cell => cell.height));\n\n    // Set it to each cell\n    row.forEach(cell => {\n      cell.height = maxHeight;\n    });\n  });\n\n  // Set the width of each row\n  grid[0].forEach((_, j) => {\n    // Find the max\n    const maxWidth = Math.max(...grid.map(row => row[j].width));\n\n    // Set it to each cell\n    grid.forEach(row => {\n      row[j].width = maxWidth;\n    });\n  });\n}\nfunction generateBorders(grid, nbRows, nbCols, gridString) {\n  /** **** Create the borders *******/\n\n  // Create the first line\n  /*\n   * We have to create the first line manually because\n   * we process the borders from the attributes bottom\n   * and right of each cell. For the first line, their\n   * is no bottom nor right cell.\n   *\n   * We only need the right attribute of the first row's\n   * cells\n   */\n  let first = '+';\n  grid[0].forEach((cell, i) => {\n    first += '-'.repeat(cell.width);\n    first += cell.hasRigth || i === nbCols - 1 ? '+' : '-';\n  });\n  gridString.push(first);\n  grid.forEach((row, i) => {\n    let line = '';\n\n    // Cells lines\n    // The inner of the cell\n    line = '|';\n    row.forEach(cell => {\n      cell.y = gridString.length;\n      cell.x = line.length + 1;\n      line += ' '.repeat(cell.width);\n      line += cell.hasRigth ? '|' : ' ';\n    });\n\n    // Add it until the text can fit\n    for (let t = 0; t < row[0].height; t++) {\n      gridString.push(line);\n    }\n\n    // \"End\" line\n    // It's the last line of the cell. Actually the border.\n    line = row[0].hasBottom ? '+' : '|';\n    row.forEach((cell, j) => {\n      let char = ' ';\n      if (cell.hasBottom) {\n        if (row[0].isHeader) {\n          char = '=';\n        } else {\n          char = '-';\n        }\n      }\n      line += char.repeat(cell.width);\n      if (cell.hasBottom || j + 1 < nbCols && grid[i][j + 1].hasBottom) {\n        if (cell.hasRigth || i + 1 < nbRows && grid[i + 1][j].hasRigth) {\n          line += '+';\n        } else {\n          line += row[0].isHeader ? '=' : '-';\n        }\n      } else if (cell.hasRigth || i + 1 < nbRows && grid[i + 1][j].hasRigth) {\n        line += '|';\n      } else {\n        line += ' ';\n      }\n    });\n    gridString.push(line);\n  });\n}\nfunction writeText(grid, gridString) {\n  grid.forEach(row => {\n    row.forEach(cell => {\n      if (cell.value && cell.value[0]) {\n        for (let tmpCount = 0; tmpCount < cell.value.length; tmpCount++) {\n          const tmpLine = cell.y + tmpCount;\n          const line = cell.value[tmpCount];\n          const lineEdit = gridString[tmpLine];\n          gridString[tmpLine] = lineEdit.substr(0, cell.x);\n          gridString[tmpLine] += line;\n          gridString[tmpLine] += lineEdit.substr(cell.x + line.length);\n        }\n      }\n    });\n  });\n}\nfunction stringifyGridTables(gridNode) {\n  const gridString = [];\n  const nbRows = gridNode.children.map(th => th.children.length).reduce((a, b) => a + b);\n  const nbCols = gridNode.children[0].children[0].children.map(c => c.data.hProperties.colSpan).reduce((a, b) => a + b);\n  const grid = createGrid(nbRows, nbCols);\n\n  /* First, we extract the information\n   * then, we set the size(2) of the border\n   * and create it(3).\n   * Finaly we fill it up.\n   */\n\n  extractAST.bind(this)(gridNode, grid);\n  setSize(grid);\n  generateBorders(grid, nbRows, nbCols, gridString);\n  writeText(grid, gridString);\n  return gridString.join('\\n');\n}\nfunction plugin() {\n  const Parser = this.Parser;\n\n  // Inject blockTokenizer\n  const blockTokenizers = Parser.prototype.blockTokenizers;\n  const blockMethods = Parser.prototype.blockMethods;\n  blockTokenizers.gridTable = gridTableTokenizer;\n  blockMethods.splice(blockMethods.indexOf('fencedCode') + 1, 0, 'gridTable');\n  const Compiler = this.Compiler;\n\n  // Stringify\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors;\n    if (!visitors) return;\n    visitors.gridTable = stringifyGridTables;\n  }\n  return transformer;\n}"
  },
  {
    "path": "packages/remark-grid-tables/package.json",
    "content": "{\n  \"name\": \"remark-grid-tables\",\n  \"version\": \"2.2.2\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-grid-tables\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"grapheme-splitter\": \"^1.0.4\",\n    \"lodash.trimend\": \"^4.5.1\",\n    \"string-width\": \"^4.2.0\",\n    \"unist-util-visit\": \"^2.0.3\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-grid-tables/src/index.js",
    "content": "const trimEnd = require('lodash.trimend')\nconst visit = require('unist-util-visit')\nconst stringWidth = require('string-width')\nconst splitter = new (require('grapheme-splitter'))()\n\nconst mainLineRegex = /((\\+)|(\\|)).+((\\|)|(\\+))/\nconst totalMainLineRegex = /^((\\+)|(\\|)).+((\\|)|(\\+))$/\nconst headerLineRegex = /^\\+=[=+]+=\\+$/\nconst partLineRegex = /\\+-[-+]+-\\+/\nconst separationLineRegex = /^\\+-[-+]+-\\+$/\n\nmodule.exports = plugin\n\n// A small class helping table generation\nclass Table {\n  constructor (linesInfos) {\n    this._parts = []\n    this._linesInfos = linesInfos\n    this.addPart()\n  }\n\n  lastPart () {\n    return this._parts[this._parts.length - 1]\n  }\n\n  addPart () {\n    this._parts.push(new TablePart(this._linesInfos))\n  }\n}\n\nclass TablePart {\n  constructor (linesInfos) {\n    this._rows = []\n    this._linesInfos = linesInfos\n    this.addRow()\n  }\n\n  addRow () {\n    this._rows.push(new TableRow(this._linesInfos))\n  }\n\n  removeLastRow () {\n    this._rows.pop()\n  }\n\n  lastRow () {\n    return this._rows[this._rows.length - 1]\n  }\n\n  updateWithMainLine (line, isEndLine) {\n    // Update last row according to a line.\n    const mergeChars = isEndLine ? '+|' : '|'\n    const newCells = [this.lastRow()._cells[0]]\n    for (let c = 1; c < this.lastRow()._cells.length; c++) {\n      const cell = this.lastRow()._cells[c]\n\n      // Only cells with rowSpan equals can be merged\n      // Test if the char does not compose a character\n      // or the char before the cell is a separation character\n      if (cell._rowSpan === newCells[newCells.length - 1]._rowSpan && (\n        !isCodePointPosition(line, cell._startPosition - 1) ||\n        !mergeChars.includes(substringLine(line, cell._startPosition - 1))\n      )) {\n        newCells[newCells.length - 1].mergeWith(cell)\n      } else {\n        newCells.push(cell)\n      }\n    }\n    this.lastRow()._cells = newCells\n  }\n\n  updateWithPartLine (line) {\n    // Get cells not finished\n    const remainingCells = []\n    for (let c = 0; c < this.lastRow()._cells.length; c++) {\n      const cell = this.lastRow()._cells[c]\n      const partLine = substringLine(line, cell._startPosition - 1, cell._endPosition + 1)\n      if (!isSeparationLine(partLine)) {\n        cell._lines.push(substringLine(line, cell._startPosition, cell._endPosition))\n        cell._rowSpan += 1\n        remainingCells.push(cell)\n      }\n    }\n    // Generate new row\n    this.addRow()\n    const newCells = []\n    for (let c = 0; c < remainingCells.length; c++) {\n      const remainingCell = remainingCells[c]\n      for (let cc = 0; cc < this.lastRow()._cells.length; cc++) {\n        const cell = this.lastRow()._cells[cc]\n        if (cell._endPosition < remainingCell._startPosition && !newCells.includes(cell)) {\n          newCells.push(cell)\n        }\n      }\n      newCells.push(remainingCell)\n      for (let cc = 0; cc < this.lastRow()._cells.length; cc++) {\n        const cell = this.lastRow()._cells[cc]\n        if (cell._startPosition > remainingCell._endPosition && !newCells.includes(cell)) {\n          newCells.push(cell)\n        }\n      }\n    }\n\n    // Remove duplicates\n    for (let nc = 0; nc < newCells.length; nc++) {\n      let newCell = newCells[nc]\n      for (let ncc = 0; ncc < newCells.length; ncc++) {\n        if (nc !== ncc) {\n          const other = newCells[ncc]\n          if (other._startPosition >= newCell._startPosition &&\n          other._endPosition <= newCell._endPosition) {\n            if (other._lines.length === 0) {\n              newCells.splice(ncc, 1)\n              ncc -= 1\n              if (nc > ncc) {\n                nc -= 1\n                newCell = newCells[nc]\n              }\n            }\n          }\n        }\n      }\n    }\n    this.lastRow()._cells = newCells\n  }\n}\n\nclass TableRow {\n  constructor (linesInfos) {\n    this._linesInfos = linesInfos\n    this._cells = []\n    for (let i = 0; i < linesInfos.length - 1; i++) {\n      this._cells.push(new TableCell(linesInfos[i] + 1, linesInfos[i + 1]))\n    }\n  }\n\n  updateContent (line) {\n    for (let c = 0; c < this._cells.length; c++) {\n      const cell = this._cells[c]\n      cell._lines.push(substringLine(line, cell._startPosition, cell._endPosition))\n    }\n  }\n}\n\nclass TableCell {\n  constructor (startPosition, endPosition) {\n    this._startPosition = startPosition\n    this._endPosition = endPosition\n    this._colSpan = 1\n    this._rowSpan = 1\n    this._lines = []\n  }\n\n  mergeWith (other) {\n    this._endPosition = other._endPosition\n    this._colSpan += other._colSpan\n    const newLines = []\n    for (let l = 0; l < this._lines.length; l++) {\n      newLines.push(`${this._lines[l]}|${other._lines[l]}`)\n    }\n    this._lines = newLines\n  }\n}\n\nfunction merge (beforeTable, gridTable, afterTable) {\n  // get the eaten text\n  let total = beforeTable.join('\\n')\n  if (total.length) {\n    total += '\\n'\n  }\n  total += gridTable.join('\\n')\n  if (afterTable.join('\\n').length) {\n    total += '\\n'\n  }\n  total += afterTable.join('\\n')\n  return total\n}\n\nfunction isSeparationLine (line) {\n  return separationLineRegex.exec(line)\n}\n\nfunction isHeaderLine (line) {\n  return headerLineRegex.exec(line)\n}\n\nfunction isPartLine (line) {\n  return partLineRegex.exec(line)\n}\n\nfunction findAll (str, characters) {\n  let current = 0\n  const pos = []\n  const content = splitter.splitGraphemes(str)\n  for (let i = 0; i < content.length; i++) {\n    const char = content[i]\n    if (characters.includes(char)) {\n      pos.push(current)\n    }\n    current += stringWidth(char)\n  }\n  return pos\n}\n\nfunction computePlainLineColumnsStartingPositions (line) {\n  return findAll(line, '+|')\n}\n\nfunction mergeColumnsStartingPositions (allPos) {\n  // Get all starting positions, allPos is an array of array of positions\n  const positions = []\n\n  allPos.forEach((posRow) => posRow.forEach((pos) => {\n    if (!positions.includes(pos)) {\n      positions.push(pos)\n    }\n  }))\n\n  return positions.sort((a, b) => a - b)\n}\n\nfunction computeColumnStartingPositions (lines) {\n  const linesInfo = []\n\n  lines.forEach((line) => {\n    if (isHeaderLine(line) || isPartLine(line)) {\n      linesInfo.push(computePlainLineColumnsStartingPositions(line))\n    }\n  })\n\n  return mergeColumnsStartingPositions(linesInfo)\n}\n\nfunction isCodePointPosition (line, pos) {\n  const content = splitter.splitGraphemes(line)\n  let offset = 0\n\n  for (let i = 0; i < content.length; i++) {\n    // The pos points character position\n    if (pos === offset) {\n      return true\n    }\n    // The pos points non-character position\n    if (pos < offset) {\n      return false\n    }\n    offset += stringWidth(content[i])\n  }\n\n  // Reaching end means character position\n  return true\n}\n\nfunction substringLine (line, start, end) {\n  end = end || start + 1\n\n  const content = splitter.splitGraphemes(line)\n  let offset = 0\n  let str = ''\n\n  for (let i = 0; i < content.length; i++) {\n    if (offset >= start) {\n      str += content[i]\n    }\n\n    offset += stringWidth(content[i])\n\n    if (offset >= end) {\n      break\n    }\n  }\n\n  return str\n}\n\nfunction extractTable (value, eat, tokenizer) {\n  // Extract lines before the grid table\n  const markdownLines = value\n    .split('\\n')\n\n  let i = 0\n  const before = []\n  for (; i < markdownLines.length; i++) {\n    const line = markdownLines[i]\n    if (isSeparationLine(line)) break\n    if (stringWidth(line) === 0) break\n    before.push(line)\n  }\n\n  const possibleGridTable = markdownLines\n    .map(line => trimEnd(line))\n\n  // Extract table\n  if (!possibleGridTable[i + 1]) return [null, null, null, null]\n\n  const gridTable = []\n  const realGridTable = []\n  let hasHeader = false\n  for (; i < possibleGridTable.length; i++) {\n    const line = possibleGridTable[i]\n    const realLine = markdownLines[i]\n    // line is in table\n    if (totalMainLineRegex.exec(line)) {\n      const isHeaderLine = headerLineRegex.exec(line)\n      if (isHeaderLine && !hasHeader) hasHeader = true\n      // A table can't have 2 headers\n      else if (isHeaderLine && hasHeader) {\n        break\n      }\n      realGridTable.push(realLine)\n      gridTable.push(line)\n    } else {\n      // this line is not in the grid table.\n      break\n    }\n  }\n\n  // if the last line is not a plain line\n  if (!separationLineRegex.exec(gridTable[gridTable.length - 1])) {\n    // Remove lines not in the table\n    for (let j = gridTable.length - 1; j >= 0; j--) {\n      const isSeparation = separationLineRegex.exec(gridTable[j])\n      if (isSeparation) break\n      gridTable.pop()\n      i -= 1\n    }\n  }\n\n  // Extract lines after table\n  const after = []\n  for (; i < possibleGridTable.length; i++) {\n    const line = possibleGridTable[i]\n    if (stringWidth(line) === 0) break\n    after.push(markdownLines[i])\n  }\n\n  return [before, gridTable, realGridTable, after, hasHeader]\n}\n\nfunction extractTableContent (lines, linesInfos, hasHeader) {\n  const table = new Table(linesInfos)\n\n  for (let l = 0; l < lines.length; l++) {\n    const line = lines[l]\n    // Get if the line separate the head of the table from the body\n    const matchHeader = hasHeader & isHeaderLine(line) !== null\n    // Get if the line close some cells\n    const isEndLine = matchHeader | isPartLine(line) !== null\n\n    if (isEndLine) {\n      // It is a header, a plain line or a line with plain line part.\n      // First, update the last row\n      table.lastPart().updateWithMainLine(line, isEndLine)\n\n      // Create the new row\n      if (l !== 0) {\n        if (matchHeader) {\n          table.addPart()\n        } else if (isSeparationLine(line)) {\n          table.lastPart().addRow()\n        } else {\n          table.lastPart().updateWithPartLine(line)\n        }\n      }\n      // update the last row\n      table.lastPart().updateWithMainLine(line, isEndLine)\n    } else {\n      // it's a plain line\n      table.lastPart().updateWithMainLine(line, isEndLine)\n      table.lastPart().lastRow().updateContent(line)\n    }\n  }\n  // Because the last line is a separation, the last row is always empty\n  table.lastPart().removeLastRow()\n  return table\n}\n\nfunction processCellLines (lines) {\n  const trimmedLines = []\n  let inCodeBlock = false\n  let leadingWhitespace = 0\n  let leadingWhitespaceRegex = null\n\n  for (let i = 0; i < lines.length; i++) {\n    let line = lines[i]\n\n    // Trim the end of the line\n    line = line.trimEnd()\n\n    // Check if we're entering or exiting a code block\n    if (line.trim().startsWith('```')) {\n      inCodeBlock = !inCodeBlock\n\n      // If we're entering a code block, remember the amount of leading whitespace\n      if (inCodeBlock) {\n        // Set how much whitespace to remoev from lines\n        // inside the code-block\n        leadingWhitespace = line.match(/^ */)[0].length\n        leadingWhitespaceRegex = new RegExp(`^ {0,${leadingWhitespace}}`)\n      }\n\n      // Remove leading whitespace from the opening/closing code-block\n      // statement as well\n      line = line.replace(leadingWhitespaceRegex, '')\n    } else if (inCodeBlock) {\n      // If we're *already* in a code block, trim the start of the line\n      // by the amount of leading whitespace\n      line = line.replace(leadingWhitespaceRegex, '')\n    } else {\n      // We're not in a code block, trim the start of the line\n      line = line.trimStart()\n    }\n\n    // Replace the line in the array\n    trimmedLines.push(line)\n  }\n\n  return trimmedLines\n}\n\nfunction generateTable (tableContent, now, tokenizer) {\n  // Generate the gridTable node to insert in the AST\n  const tableElt = {\n    type: 'gridTable',\n    children: [],\n    data: {\n      hName: 'table'\n    }\n  }\n\n  const hasHeader = tableContent._parts.length > 1\n\n  for (let p = 0; p < tableContent._parts.length; p++) {\n    const part = tableContent._parts[p]\n    const partElt = {\n      type: 'tableHeader',\n      children: [],\n      data: {\n        hName: (hasHeader && p === 0) ? 'thead' : 'tbody'\n      }\n    }\n    for (let r = 0; r < part._rows.length; r++) {\n      const row = part._rows[r]\n      const rowElt = {\n        type: 'tableRow',\n        children: [],\n        data: {\n          hName: 'tr'\n        }\n      }\n      for (let c = 0; c < row._cells.length; c++) {\n        const cell = row._cells[c]\n        const trimmedLines = processCellLines(cell._lines)\n\n        const tokenizedContent = tokenizer.tokenizeBlock(\n          trimmedLines.join('\\n'),\n          now\n        )\n        const cellElt = {\n          type: 'tableCell',\n          children: tokenizedContent,\n          data: {\n            hName: (hasHeader && p === 0) ? 'th' : 'td',\n            hProperties: {\n              colSpan: cell._colSpan,\n              rowSpan: cell._rowSpan\n            }\n          }\n        }\n\n        const endLine = r + cell._rowSpan\n        if (cell._rowSpan > 1 && endLine - 1 < part._rows.length) {\n          for (let rs = 1; rs < cell._rowSpan; rs++) {\n            for (let cc = 0; cc < part._rows[r + rs]._cells.length; cc++) {\n              const other = part._rows[r + rs]._cells[cc]\n              if (cell._startPosition === other._startPosition &&\n              cell._endPosition === other._endPosition &&\n              cell._colSpan === other._colSpan &&\n              cell._rowSpan === other._rowSpan &&\n              cell._lines === other._lines) {\n                part._rows[r + rs]._cells.splice(cc, 1)\n              }\n            }\n          }\n        }\n\n        rowElt.children.push(cellElt)\n      }\n      partElt.children.push(rowElt)\n    }\n    tableElt.children.push(partElt)\n  }\n\n  return tableElt\n}\n\nfunction gridTableTokenizer (eat, value, silent) {\n  let index = 0\n  const length = value.length\n  let character\n  while (index < length) {\n    character = value.charAt(index)\n\n    if (character !== ' ' && character !== '\\t') {\n      break\n    }\n\n    index++\n  }\n\n  if (value.charAt(index) !== '+') {\n    return\n  }\n  if (value.charAt(index + 1) !== '-') {\n    return\n  }\n\n  const keep = mainLineRegex.test(value)\n  if (!keep) return\n\n  const [before, gridTable, realGridTable, after, hasHeader] = extractTable(value, eat, this)\n  if (!gridTable || gridTable.length < 3) return\n\n  const now = eat.now()\n  const linesInfos = computeColumnStartingPositions(gridTable)\n  const tableContent = extractTableContent(gridTable, linesInfos, hasHeader)\n  const tableElt = generateTable(tableContent, now, this)\n  const merged = merge(before, realGridTable, after)\n\n  // Because we can't add multiples blocs in one eat, I use a temp block\n  const wrapperBlock = {\n    type: 'element',\n    tagName: 'WrapperBlock',\n    children: []\n  }\n\n  if (before.length) {\n    const tokensBefore = this.tokenizeBlock(before.join('\\n'), now)[0]\n    wrapperBlock.children.push(tokensBefore)\n  }\n\n  wrapperBlock.children.push(tableElt)\n\n  if (after.length) {\n    const tokensAfter = this.tokenizeBlock(after.join('\\n'), now)\n    if (tokensAfter.length) {\n      wrapperBlock.children.push(tokensAfter[0])\n    }\n  }\n\n  return eat(merged)(wrapperBlock)\n}\n\nfunction deleteWrapperBlock () {\n  function one (node, index, parent) {\n    if (!node.children) return\n\n    const newChildren = []\n    let replace = false\n    for (let c = 0; c < node.children.length; c++) {\n      const child = node.children[c]\n      if (child.tagName === 'WrapperBlock' && child.type === 'element') {\n        replace = true\n        for (let cc = 0; cc < child.children.length; cc++) {\n          newChildren.push(child.children[cc])\n        }\n      } else {\n        newChildren.push(child)\n      }\n    }\n    if (replace) {\n      node.children = newChildren\n    }\n  }\n  return one\n}\n\nfunction transformer (tree) {\n  // Remove the temporary block in which we previously wrapped the table parts\n  visit(tree, deleteWrapperBlock())\n}\n\nfunction createGrid (nbRows, nbCols) {\n  const grid = []\n\n  for (let i = 0; i < nbRows; i++) {\n    grid.push([])\n    for (let j = 0; j < nbCols; j++) {\n      grid[i].push({ height: -1, width: -1, hasBottom: true, hasRigth: true })\n    }\n  }\n\n  return grid\n}\n\nfunction setWidth (grid, i, j, cols) {\n  /* To do it, we put enougth space to write the text.\n   * For multi-cell, we divid it among the cells. */\n  let tmpWidth = Math.max(...Array.from(grid[i][j].value).map(x => x.length)) + 2\n\n  grid[i].forEach((_, c) => {\n    if (c < cols) { // To divid\n      const localWidth = Math.ceil(tmpWidth / (cols - c)) // cols - c will be 1 for the last cell\n      tmpWidth -= localWidth\n      grid[i][j + c].width = localWidth\n    }\n  })\n}\n\nfunction setHeight (grid, i, j, values) {\n  // To do it, we count the line. Extra length to cell with a pipe\n  // in the value of the last line, to not be confuse with a border.\n  grid[i][j].height = values.length\n  // Extra line\n  if (values[values.length - 1].indexOf('|') > 0) {\n    grid[i][j].height += 1\n  }\n}\n\nfunction extractAST (gridNode, grid) {\n  let i = 0\n  /* Fill the grid with value, height and width from the ast */\n  gridNode.children.forEach(th => {\n    th.children.forEach(row => {\n      row.children.forEach((cell, j) => {\n        let X = 0 // x taking colSpan and rowSpan into account\n\n        while (grid[i][j + X].evaluated) X++\n        grid[i][j + X].value = this.all(cell).join('\\n\\n').split('\\n')\n\n        setHeight(grid, i, j + X, grid[i][j + X].value)\n        setWidth(grid, i, j + X, cell.data.hProperties.colSpan)\n\n        // If it's empty, we fill it up with a useless space\n        // Otherwise, it will not be parsed.\n        if (!grid[0][0].value.join('\\n')) {\n          grid[0][0].value = [' ']\n          grid[0][0].width = 3\n        }\n\n        // Define the border of each cell\n        for (let x = 0; x < cell.data.hProperties.rowSpan; x++) {\n          for (let y = 0; y < cell.data.hProperties.colSpan; y++) {\n            // b attribute is for bottom\n            grid[i + x][j + X + y].hasBottom = x + 1 === cell.data.hProperties.rowSpan\n            // r attribute is for right\n            grid[i + x][j + X + y].hasRigth = y + 1 === cell.data.hProperties.colSpan\n\n            // set v if a cell has ever been define\n            grid[i + x][j + X + y].evaluated = ' '\n          }\n        }\n      })\n      i++\n    })\n  })\n\n  // If they is 2 differents tableHeader, so the first one is a header and\n  // should be underlined\n  if (gridNode.children.length > 1) {\n    grid[gridNode.children[0].children.length - 1][0].isHeader = true\n  }\n}\n\nfunction setSize (grid) {\n  // The idea is the max win\n\n  // Set the height of each column\n  grid.forEach(row => {\n    // Find the max\n    const maxHeight = Math.max(...row.map(cell => cell.height))\n\n    // Set it to each cell\n    row.forEach(cell => { cell.height = maxHeight })\n  })\n\n  // Set the width of each row\n  grid[0].forEach((_, j) => {\n    // Find the max\n    const maxWidth = Math.max(...grid.map(row => row[j].width))\n\n    // Set it to each cell\n    grid.forEach(row => { row[j].width = maxWidth })\n  })\n}\nfunction generateBorders (grid, nbRows, nbCols, gridString) {\n  /** **** Create the borders *******/\n\n  // Create the first line\n  /*\n   * We have to create the first line manually because\n   * we process the borders from the attributes bottom\n   * and right of each cell. For the first line, their\n   * is no bottom nor right cell.\n   *\n   * We only need the right attribute of the first row's\n   * cells\n   */\n  let first = '+'\n  grid[0].forEach((cell, i) => {\n    first += '-'.repeat(cell.width)\n    first += cell.hasRigth || i === nbCols - 1 ? '+' : '-'\n  })\n\n  gridString.push(first)\n\n  grid.forEach((row, i) => {\n    let line = ''\n\n    // Cells lines\n    // The inner of the cell\n    line = '|'\n    row.forEach(cell => {\n      cell.y = gridString.length\n      cell.x = line.length + 1\n      line += ' '.repeat(cell.width)\n      line += cell.hasRigth ? '|' : ' '\n    })\n\n    // Add it until the text can fit\n    for (let t = 0; t < row[0].height; t++) {\n      gridString.push(line)\n    }\n\n    // \"End\" line\n    // It's the last line of the cell. Actually the border.\n    line = row[0].hasBottom ? '+' : '|'\n\n    row.forEach((cell, j) => {\n      let char = ' '\n\n      if (cell.hasBottom) {\n        if (row[0].isHeader) {\n          char = '='\n        } else {\n          char = '-'\n        }\n      }\n\n      line += char.repeat(cell.width)\n\n      if (cell.hasBottom || (j + 1 < nbCols && grid[i][j + 1].hasBottom)) {\n        if (cell.hasRigth || (i + 1 < nbRows && grid[i + 1][j].hasRigth)) {\n          line += '+'\n        } else {\n          line += (row[0].isHeader ? '=' : '-')\n        }\n      } else if (cell.hasRigth || (i + 1 < nbRows && grid[i + 1][j].hasRigth)) {\n        line += '|'\n      } else {\n        line += ' '\n      }\n    })\n\n    gridString.push(line)\n  })\n}\n\nfunction writeText (grid, gridString) {\n  grid.forEach(row => {\n    row.forEach(cell => {\n      if (cell.value && cell.value[0]) {\n        for (let tmpCount = 0; tmpCount < cell.value.length; tmpCount++) {\n          const tmpLine = cell.y + tmpCount\n          const line = cell.value[tmpCount]\n          const lineEdit = gridString[tmpLine]\n\n          gridString[tmpLine] = lineEdit.substr(0, cell.x)\n          gridString[tmpLine] += line\n          gridString[tmpLine] += lineEdit.substr(cell.x + line.length)\n        }\n      }\n    })\n  })\n}\n\nfunction stringifyGridTables (gridNode) {\n  const gridString = []\n\n  const nbRows = gridNode.children.map(th => th.children.length).reduce((a, b) => a + b)\n  const nbCols = gridNode.children[0]\n    .children[0]\n    .children.map(c => c.data.hProperties.colSpan)\n    .reduce((a, b) => a + b)\n\n  const grid = createGrid(nbRows, nbCols)\n\n  /* First, we extract the information\n   * then, we set the size(2) of the border\n   * and create it(3).\n   * Finaly we fill it up.\n   */\n\n  extractAST.bind(this)(gridNode, grid)\n\n  setSize(grid)\n\n  generateBorders(grid, nbRows, nbCols, gridString)\n\n  writeText(grid, gridString)\n\n  return gridString.join('\\n')\n}\n\nfunction plugin () {\n  const Parser = this.Parser\n\n  // Inject blockTokenizer\n  const blockTokenizers = Parser.prototype.blockTokenizers\n  const blockMethods = Parser.prototype.blockMethods\n  blockTokenizers.gridTable = gridTableTokenizer\n  blockMethods.splice(blockMethods.indexOf('fencedCode') + 1, 0, 'gridTable')\n\n  const Compiler = this.Compiler\n\n  // Stringify\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors\n    if (!visitors) return\n\n    visitors.gridTable = stringifyGridTables\n  }\n\n  return transformer\n}\n"
  },
  {
    "path": "packages/remark-heading-shift/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-heading-shift/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-heading-shift/README.md",
    "content": "# remark-heading-shift [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis plugin increments headings by `shift`. It guards against shifting too far backwards or forwards.\n\n`shift` defaults to `1`, it can be a positive or negative value, it will never shift a heading past `6` (because `h6` is the smallest HTML heading) in case of a positive `shift`, or lower than `1` (`h0` is not a valid HTML heading) in case of a negative `shift`.\n\nFor example, the following markdown:\n\n    ## foo\n    #### bar\n    ##### baz\n\nYields:\n\n    (shift=1)\n    ### foo\n    ##### bar\n    ###### baz\n\n\n    (shift=3)\n    ##### foo\n    ###### bar\n    ###### baz\n\n\n    (shift=-2)\n    # foo\n    ## bar\n    ### baz\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-heading-shift/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n"
  },
  {
    "path": "packages/remark-heading-shift/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`shift -1 1`] = `\n\"# remark-heading-shift\n\n# Example\n\n# API\n\n## foo\n\n# Contributing\n\"\n`;\n\nexports[`shift 0 1`] = `\n\"# remark-heading-shift\n\n## Example\n\n## API\n\n### foo\n\n## Contributing\n\"\n`;\n\nexports[`shift 1 1`] = `\n\"## remark-heading-shift\n\n### Example\n\n### API\n\n#### foo\n\n### Contributing\n\"\n`;\n\nexports[`shift 3 1`] = `\n\"#### remark-heading-shift\n\n##### Example\n\n##### API\n\n###### foo\n\n##### Contributing\n\"\n`;\n\nexports[`shift null 1`] = `\n\"# remark-heading-shift\n\n## Example\n\n## API\n\n### foo\n\n## Contributing\n\"\n`;\n"
  },
  {
    "path": "packages/remark-heading-shift/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport remark from 'remark'\n\nimport plugin from '../src/'\n\nArray.from([null, 0, 1, -1, 3]).forEach(shift => {\n  test(`shift ${shift}`, () => {\n    const {contents} = remark()\n      .use(plugin, shift)\n      .processSync(dedent`\n        # remark-heading-shift\n\n        ## Example\n\n        ## API\n\n        ### foo\n\n        ## Contributing\n      `)\n    expect(contents).toMatchSnapshot()\n  })\n})\n"
  },
  {
    "path": "packages/remark-heading-shift/dist/index.js",
    "content": "\"use strict\";\n\nconst visit = require('unist-util-visit');\nfunction shifter(shift = 1) {\n  return tree => {\n    visit(tree, 'heading', function (node) {\n      if (!shift) return;\n      if (node.depth + shift <= 1) {\n        node.depth = 1;\n        return;\n      }\n      if (node.depth + shift >= 6) {\n        node.depth = 6;\n        return;\n      }\n      node.depth += shift;\n    });\n  };\n}\nmodule.exports = shifter;"
  },
  {
    "path": "packages/remark-heading-shift/package.json",
    "content": "{\n  \"name\": \"remark-heading-shift\",\n  \"version\": \"1.1.2\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-heading-shift\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"unist-util-visit\": \"^2.0.3\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-heading-shift/src/index.js",
    "content": "const visit = require('unist-util-visit')\n\nfunction shifter (shift = 1) {\n  return (tree) => {\n    visit(tree, 'heading', function (node) {\n      if (!shift) return\n      if ((node.depth + shift) <= 1) {\n        node.depth = 1\n        return\n      }\n      if ((node.depth + shift) >= 6) {\n        node.depth = 6\n        return\n      }\n      node.depth += shift\n    })\n  }\n}\n\nmodule.exports = shifter\n"
  },
  {
    "path": "packages/remark-heading-trailing-spaces/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-heading-trailing-spaces/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-heading-trailing-spaces/README.md",
    "content": "This plugin removes trailing spaces from Markdown headers.\n\nExamples, here `·` represents a space ` `\n\n```\nHeader\n------··\n\n### H3···\n\nH1··\n=\n\nH2\n--··\n\n```\n\nResult:\n\n```\n<h2>Header</h2>\n<h3>H3</h3>\n<h1>H1</h1>\n<h2>H2</h2>\n```\n"
  },
  {
    "path": "packages/remark-heading-trailing-spaces/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`regression 1 1`] = `\n\"<p>word</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th>a</th>\n<th>b</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>c</td>\n<td>d</td>\n</tr>\n</tbody>\n</table>\"\n`;\n\nexports[`with plugin 1`] = `\n\"<h2>Header</h2>\n<h3>H3</h3>\n<h1>H1</h1>\n<p>H2\n--  </p>\"\n`;\n\nexports[`without 1`] = `\n\"<p>Header\n------··</p>\n<h3>H3···</h3>\n<h1>H1··</h1>\n<p>H2\n--··</p>\"\n`;\n"
  },
  {
    "path": "packages/remark-heading-trailing-spaces/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport rehypeStringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\n\nimport plugin from '../src/'\n\n\nconst render = text => unified()\n  .use(reParse)\n  .use(remark2rehype)\n  .use(plugin)\n  .use(rehypeStringify)\n  .processSync(text.replace(/·/g, ' '))\n\n/**\n * (for convenience, · are replaced with\n * simple single spaces in the tests)\n */\n\nconst fixture = dedent`\n  Header\n  ------··\n\n  ### H3···\n\n  H1··\n  =\n\n  H2\n  --··\n`\n\ntest('with plugin', () => {\n  const {contents} = render(fixture)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('without', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(remark2rehype)\n    .use(rehypeStringify)\n    .processSync(fixture)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('regression 1', () => {\n  const {contents} = render(dedent`\n    word\n    -·item·1\n    -·item·2\n\n    a|b\n    ---|---\n    c|d\n  `)\n  expect(contents).toMatchSnapshot()\n})\n"
  },
  {
    "path": "packages/remark-heading-trailing-spaces/dist/index.js",
    "content": "\"use strict\";\n\nmodule.exports = function alignPlugin() {\n  function headingTokenizer(eat, value, silent) {\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return true;\n    const lines = value.match(/.*\\n/g) || [];\n    // Check if first line is not empty,\n    // here, we don't use \\s because a line with a tab is not empty\n    if (/^$| +/.test(lines[0])) return;\n    // and if the second line is a heading with trailing spaces\n    if (!/^(-+|=+)\\s+\\n?$/.test(lines[1])) return;\n    const now = eat.now();\n    const head = lines[0] + lines[1];\n    const add = eat(head);\n    const exit = this.enterBlock();\n    exit();\n    return add({\n      type: 'heading',\n      depth: lines[1][0] === '=' ? 1 : 2,\n      children: this.tokenizeInline(lines[0].slice(0, -1), now)\n    });\n  }\n  const Parser = this.Parser;\n\n  // Inject blockTokenizer\n  const blockTokenizers = Parser.prototype.blockTokenizers;\n  const blockMethods = Parser.prototype.blockMethods;\n  blockTokenizers.heading_blocks = headingTokenizer;\n  blockMethods.splice(blockMethods.indexOf('fencedCode') + 1, 0, 'heading_blocks');\n};"
  },
  {
    "path": "packages/remark-heading-trailing-spaces/package.json",
    "content": "{\n  \"name\": \"remark-heading-trailing-spaces\",\n  \"version\": \"0.0.32\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-heading-trailing-spaces\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/remark-heading-trailing-spaces/src/index.js",
    "content": "module.exports = function alignPlugin () {\n  function headingTokenizer (eat, value, silent) {\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return true\n\n    const lines = value.match(/.*\\n/g) || []\n    // Check if first line is not empty,\n    // here, we don't use \\s because a line with a tab is not empty\n    if (/^$| +/.test(lines[0])) return\n    // and if the second line is a heading with trailing spaces\n    if (!/^(-+|=+)\\s+\\n?$/.test(lines[1])) return\n\n    const now = eat.now()\n    const head = lines[0] + lines[1]\n    const add = eat(head)\n    const exit = this.enterBlock()\n    exit()\n\n    return add({\n      type: 'heading',\n      depth: lines[1][0] === '=' ? 1 : 2,\n      children: this.tokenizeInline(lines[0].slice(0, -1), now)\n    })\n  }\n\n  const Parser = this.Parser\n\n  // Inject blockTokenizer\n  const blockTokenizers = Parser.prototype.blockTokenizers\n  const blockMethods = Parser.prototype.blockMethods\n  blockTokenizers.heading_blocks = headingTokenizer\n  blockMethods.splice(blockMethods.indexOf('fencedCode') + 1, 0, 'heading_blocks')\n}\n"
  },
  {
    "path": "packages/remark-iframes/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-iframes/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-iframes/README.md",
    "content": "# remark-iframes [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis plugin parses custom Markdown syntax to create iframes.\n\nThis creates a new MDAST element called \"iframe\"\n\nIf you are using [rehype][rehype], the stringified HTML result will be a tag you can configure. Most of time you want `iframe`.\n\n## iframe node type\n\n```javascript\ninterface iframe <: Node {\n  type: \"iframe\";\n  url: string;\n  provider: string;\n  data: {\n    hName: \"iframe\";\n    hProperties: {\n      src: string;\n      width: 0 <= uint32;\n      height: 0 <= uint32;\n      allowfullscreen: boolean;\n      frameborder: string;\n    }\n    thumbnail: string?;\n  }\n}\n```\n\n`provider` variable refers to the provider as configured in plugin options.\n\n## Syntax\n\n```markdown\n!(https://www.youtube.com/watch?v=8TQIvdFl4aU)\n```\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-iframes\n```\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkIframe = require('remark-iframes')\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkIframe, {\n    // this key corresponds to the hostname: !(http://hostname/foo)\n    // the config associated to this hostname will apply to any iframe\n    // with a matching hostname\n   'www.youtube.com': {\n      tag: 'iframe',\n      width: 560,\n      height: 315,\n      disabled: false,\n      replace: [\n        ['watch?v=', 'embed/'],\n        ['http://', 'https://'],\n      ],\n      thumbnail: {\n        format: 'http://img.youtube.com/vi/{id}/0.jpg',\n        id: '.+/(.+)$'\n      },\n      removeAfter: '&'\n    }\n  })\n  .use(remark2rehype)\n  .use(stringify)\n```\n\n## Configuration fields:\n\n- `tag`: HTML tag to use in rehype output, you most probably want `iframe`.\n- `width` and `height`: iframe size, set as `width=\"\" height=\"\"` HTML attributes.\n- `disabled`: Can be used to disable this provider. This is useful when you want to deal with multiple configurations from a common set of plugins.\n- `replace`: Rules passed to `String.prototype.replace` with the `input_url`. It's a list `[[from, to]]`, rules are applied sequentially on the output of the previous rule. Each rule only replaces the first occurrence.\n- `removeAfter`: Truncates the URL after the first occurrence of char. For example `http://dailymotion.com/video/?time=1&bla=2` will result in `http://dailymotion.com/video/?time=1` if `removeAfter` is set to `&`.\n- `append`: Any string you want to append to the URL, for example an API key.\n- `removeFileName`: If set to `true`, removes the filename (i.e last fragment before query string) from URL.\n- `match`: a regular expression passed to `String.prototype.test`, used to validate the URL.\n- `thumbnail`: a way to retrieve a thumbnail. This param is an object with a `format` key of this type: `'http://url/{param1}/{param2}'` you must then provide patterns `param: 'pattern'` to extract the value which will replace the corresponding `{param}` in the `format` URL.\n- `droppedQueryParameters`: a list of query parameters to remove from the iframe source URL.\n- `oembed`: an URL to the oEmbed API of the website you want to embed;\n- `lazyLoad`: tell browsers to lazy load the iframe whenever possible, using the HTML `loading` attribute.\n\n### oEmbed usage\n\nWhen using the `oembed` configuration parameter, the other parameters are discarded, excepted for `disabled`, which can be used freely; you may use `width` and `height` if really needed, altough it is not recommended by the oEmbed specification.\n\nThe thumbnail is constructed from the oEmbed `thumbnail_url` response, so there is no need for providing any URL, and any configuration will not be taken into account.\n\n### Thumbnail construction\n\nwhen you configure the `thumbnail` as part of a provider, the URL of the thumbnail is computed following this algorithm:\n\n```\nthumbnail_url_template = provider.thumbnail.format\nfor each property of provider.thumbnail\n  if property is not \"format\":\n    regexp_for_current_property = provider.thumbnail[property]\n    extracted_value = video_url.search(regexp_for_current_property)[1]\n    thumbnail_url_template = thumbnail_url_template.replace('{' + property + '}', extracted_value)\n```\n\n## Example\n\n### Config:\n\n```javascript\n{\n    // Youtube RegEx example\n    'www.youtube.com': {\n      tag: 'iframe',\n      width: 560,\n      height: 315,\n      disabled: false,\n      replace: [\n        ['watch?v=', 'embed/'],\n        ['http://', 'https://'],\n      ],\n      thumbnail: {\n        format: 'http://img.youtube.com/vi/{id}/0.jpg',\n        id: '.+/(.+)$'\n      },\n      removeAfter: '&'\n    },\n    // Youtube oEmbed example\n    'youtu.be': {\n      width: 560,\n      height: 315,\n      disabled: false,\n      oembed: 'https://www.youtube.com/oembed'\n    }\n}\n```\n\n### Input:\n\n```markdown\n!(https://www.youtube.com/watch?v=8TQIvdFl4aU)\n```\n\n### Resulting Node\n\n```javascript\n{\n    type: 'iframe',\n    provider: 'www.youtube.com',\n    data: {\n        hName: 'iframe',\n        hProperties: {\n          src: 'https://www.youtube.com/embed/8TQIvdFl4aU',\n          width: 560,\n          height: 315,\n          allowfullscreen: true,\n          frameborder: '0'\n        }\n        thumbnail: 'https://image.youtube.com/8TQIvdFl4aU/0.jpg'\n      }\n}\n```\n\n### Resulting HTML\n\n```html\n<iframe src=\"https://www.youtube.com/embed/8TQIvdFl4aU\" width=\"560\" height=\"315\"></iframe>\n```\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-iframes/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-iframes\n\n[rehype]: https://github.com/rehypejs/rehype\n"
  },
  {
    "path": "packages/remark-iframes/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Compiles to Markdown 1`] = `\n\"A [link with **bold**](http://example.com)\n\n!(https://www.youtube.com/watch?v=FdltlrKFr1w)\n\nThese ones should not be allowed by config:\n\n!(http&#x3A;//jsfiddle.net/Sandhose/BcKhe/1/)\n\n!(http&#x3A;//jsfiddle.net/zgjhjv9j/)\n\n!(http&#x3A;//jsfiddle.net/zgjhjv9j/1/)\n\n!(http&#x3A;//jsfiddle.net/Sandhose/BcKhe/)\n\nFoo !(this is a parenthesis) bar\n\"\n`;\n\nexports[`Compiles to Markdown 2`] = `\n\"A [link with **bold**](http://example.com)\n\n!(https://www.youtube.com/watch?v=FdltlrKFr1w)\n\nThese ones should not be allowed by config:\n\n!(http://jsfiddle.net/Sandhose/BcKhe/1/)\n\n!(http://jsfiddle.net/zgjhjv9j/)\n\n!(http://jsfiddle.net/zgjhjv9j/1/)\n\n!(http&#x3A;//jsfiddle.net/Sandhose/BcKhe/)\n\nFoo !(this is a parenthesis) bar\n\"\n`;\n\nexports[`does not parse without markers 1`] = `\n\"<iframe src=\\\\\"https://www.youtube.com/embed/FdltlrKFr1w\\\\\" width=\\\\\"560\\\\\" height=\\\\\"315\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<p><a href=\\\\\"https://www.youtube.com/watch?v=FdltlrKFr1w\\\\\">https://www.youtube.com/watch?v=FdltlrKFr1w</a></p>\"\n`;\n\nexports[`oembed falls back 1`] = `\"<a href=\\\\\"https://www.youtube.com/watch?v=FdltlrKFr1w\\\\\">https://www.youtube.com/watch?v=FdltlrKFr1w</a>\"`;\n\nexports[`video 1`] = `\n\"<iframe src=\\\\\"https://www.youtube.com/embed/FdltlrKFr1w?feature=oembed\\\\\" width=\\\\\"560\\\\\" height=\\\\\"315\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<iframe src=\\\\\"https://www.dailymotion.com/embed/video/x2y6lhm\\\\\" width=\\\\\"480\\\\\" height=\\\\\"270\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<iframe src=\\\\\"https://player.vimeo.com/video/133693532\\\\\" width=\\\\\"500\\\\\" height=\\\\\"281\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<iframe src=\\\\\"https://screen.yahoo.com/weatherman-gives-forecast-using-taylor-191821481.html?format=embed&#x26;player_autoplay=false\\\\\" width=\\\\\"624\\\\\" height=\\\\\"351\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<p>A <a href=\\\\\"http://example.com\\\\\">link with <strong>bold</strong></a></p>\n<iframe src=\\\\\"https://www.youtube.com/embed/FdltlrKFr1w?feature=oembed\\\\\" width=\\\\\"560\\\\\" height=\\\\\"315\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<iframe src=\\\\\"https://www.youtube.com/embed/FdltlrKFr1w?feature=oembed\\\\\" width=\\\\\"560\\\\\" height=\\\\\"315\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<iframe src=\\\\\"https://jsfiddle.net/Sandhose/BcKhe/1/embedded/result,js,html,css/\\\\\" width=\\\\\"560\\\\\" height=\\\\\"560\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<iframe src=\\\\\"https://jsfiddle.net/zgjhjv9j/embedded/result,js,html,css/\\\\\" width=\\\\\"560\\\\\" height=\\\\\"560\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<iframe src=\\\\\"https://jsfiddle.net/zgjhjv9j/1/embedded/result,js,html,css/\\\\\" width=\\\\\"560\\\\\" height=\\\\\"560\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<iframe src=\\\\\"https://www.youtube.com/embed/1Bh4DZ2xGmw?feature=oembed\\\\\" width=\\\\\"560\\\\\" height=\\\\\"315\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<iframe src=\\\\\"http://player.ina.fr/player/embed/MAN9062216517/1/1b0bd203fbcd702f9bc9b10ac3d0fc21/560/315/1/148db8\\\\\" width=\\\\\"620\\\\\" height=\\\\\"349\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<p>Not parsed:</p>\n<p>!(http://jsfiddle.net/Sandhose/BcKhe/)</p>\n<iframe src=\\\\\"https://www.youtube.com/embed/FdltlrKFr1w?feature=oembed\\\\\" width=\\\\\"560\\\\\" height=\\\\\"315\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe>\n<p>with text after</p>\"\n`;\n"
  },
  {
    "path": "packages/remark-iframes/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport stringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\nimport remarkStringify from 'remark-stringify'\n\nimport plugin from '../src/'\n\nconst render = async (text, config) => unified()\n  .use(reParse)\n  .use(plugin, config)\n  .use(remark2rehype)\n  .use(stringify)\n  .process(text)\n\nconst renderMarkdown = (text, config) => unified()\n  .use(reParse)\n  .use(remarkStringify)\n  .use(plugin, config)\n  .processSync(text)\n\nconst config = {\n  video: {\n    'www.dailymotion.com': {\n      tag: 'iframe',\n      width: 480,\n      height: 270,\n      disabled: false,\n      replace: [\n        ['video/', 'embed/video/'],\n      ],\n    },\n    'www.vimeo.com': {\n      tag: 'iframe',\n      width: 500,\n      height: 281,\n      disabled: false,\n      replace: [\n        ['http://', 'https://'],\n        ['www.', ''],\n        ['vimeo.com/', 'player.vimeo.com/video/'],\n      ],\n    },\n    'vimeo.com': {\n      tag: 'iframe',\n      width: 500,\n      height: 281,\n      disabled: false,\n      replace: [\n        ['http://', 'https://'],\n        ['www.', ''],\n        ['vimeo.com/', 'player.vimeo.com/video/'],\n      ],\n    },\n    'www.youtube.com': {\n      width: 560,\n      height: 315,\n      disabled: false,\n      oembed: 'https://www.youtube.com/oembed',\n    },\n    'youtube.com': {\n      width: 560,\n      height: 315,\n      disabled: false,\n      oembed: 'https://www.youtube.com/oembed',\n    },\n    'youtu.be': {\n      width: 560,\n      height: 315,\n      disabled: false,\n      oembed: 'https://www.youtube.com/oembed',\n    },\n    'screen.yahoo.com': {\n      tag: 'iframe',\n      width: 624,\n      height: 351,\n      disabled: false,\n      append: '?format=embed&player_autoplay=false',\n    },\n    'www.ina.fr': {\n      tag: 'iframe',\n      width: 620,\n      height: 349,\n      disabled: false,\n      replace: [\n        ['www.', 'player.'],\n        ['/video/', '/player/embed/'],\n      ],\n      append: '/1/1b0bd203fbcd702f9bc9b10ac3d0fc21/560/315/1/148db8',\n      removeFileName: true,\n    },\n    'www.jsfiddle.net': {\n      tag: 'iframe',\n      width: 560,\n      height: 560,\n      disabled: false,\n      replace: [\n        ['http://', 'https://'],\n      ],\n      append: 'embedded/result,js,html,css/',\n      match: /https?:\\/\\/(www\\.)?jsfiddle\\.net\\/([\\w\\d]+\\/[\\w\\d]+\\/\\d+\\/?|[\\w\\d]+\\/\\d+\\/?|[\\w\\d]+\\/?)$/,\n    },\n    'jsfiddle.net': {\n      tag: 'iframe',\n      width: 560,\n      height: 560,\n      disabled: false,\n      replace: [\n        ['http://', 'https://'],\n      ],\n      append: 'embedded/result,js,html,css/',\n      match: /https?:\\/\\/(www\\.)?jsfiddle\\.net\\/([\\w\\d]+\\/[\\w\\d]+\\/\\d+\\/?|[\\w\\d]+\\/\\d+\\/?|[\\w\\d]+\\/?)$/,\n    },\n  },\n  extra: {\n    'www.youtube.com': {\n      tag: 'iframe',\n      width: 560,\n      height: 315,\n      disabled: false,\n      replace: [\n        ['watch?v=', 'embed/'],\n        ['http://', 'https://'],\n      ],\n      droppedQueryParameters: ['feature'],\n      removeAfter: '&',\n    },\n    'jsfiddle.net': {\n      tag: 'iframe',\n      width: 560,\n      height: 560,\n      disabled: true,\n      replace: [\n        ['http://', 'https://'],\n      ],\n      append: 'embedded/result,js,html,css/',\n    },\n  },\n  toMd: {\n    'www.youtube.com': {\n      tag: 'iframe',\n      width: 560,\n      height: 315,\n      disabled: false,\n      replace: [\n        ['watch?v=', 'embed/'],\n        ['http://', 'https://'],\n      ],\n      removeAfter: '&',\n    },\n    'jsfiddle.net': {\n      tag: 'iframe',\n      width: 560,\n      height: 560,\n      disabled: true,\n      replace: [\n        ['http://', 'https://'],\n      ],\n      append: 'embedded/result,js,html,css/',\n      match: /https?:\\/\\/(www\\.)?jsfiddle\\.net\\/([\\w\\d]+\\/[\\w\\d]+\\/\\d+\\/?|[\\w\\d]+\\/\\d+\\/?|[\\w\\d]+\\/?)$/,\n      thumbnail: {\n        format: 'http://www.unixstickers.com/image/data/stickers' +\n        '/jsfiddle/JSfiddle-blue-w-type.sh.png',\n      },\n    },\n  },\n}\n\ntest('video', async () => {\n  const {contents} = await render(dedent`\n    !(https://www.youtube.com/watch?v=FdltlrKFr1w)\n\n    !(https://www.dailymotion.com/video/x2y6lhm)\n\n    !(http://vimeo.com/133693532)\n\n    !(https://screen.yahoo.com/weatherman-gives-forecast-using-taylor-191821481.html)\n\n    A [link with **bold**](http://example.com)\n\n    !(https://youtu.be/FdltlrKFr1w)\n\n    !(http://youtube.com/watch?v=FdltlrKFr1w)\n\n    !(http://jsfiddle.net/Sandhose/BcKhe/1/)\n\n    !(http://jsfiddle.net/zgjhjv9j/)\n\n    !(http://jsfiddle.net/zgjhjv9j/1/)\n\n    !(https://www.youtube.com/watch?v=1Bh4DZ2xGmw&ab_channel=DestinationPr%C3%A9pa)\n\n    !(http://www.ina.fr/video/MAN9062216517/)\n\n    Not parsed:\n\n    !(http://jsfiddle.net/Sandhose/BcKhe/)\n\n    !(https://www.youtube.com/watch?v=FdltlrKFr1w)\n    with text after\n  `, config.video)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('oembed falls back', async () => {\n  const config = {\n    'www.youtube.com': {\n      width: 560,\n      height: 315,\n      disabled: false,\n      oembed: 'http://example.com:7777/oembed',\n    },\n  }\n  const result = await render(dedent`\n    !(https://www.youtube.com/watch?v=FdltlrKFr1w)\n  `, config)\n\n  expect(result.messages[0].message).toContain('timeout')\n  expect(result.contents).toMatchSnapshot()\n})\n\ntest('extra', async () => {\n  const {contents: parsed} = await render(dedent`\n    !(https://www.youtube.com/watch?v=FdltlrKFr1w)\n\n    !(https://www.youtube.com/watch?feature=embedded&v=FdltlrKFr1w)\n  `, config.extra)\n  expect(parsed).toMatch(/iframe.*iframe/)\n\n  const {contents: notParsed} = await render(dedent`\n    !(http://jsfiddle.net/Sandhose/BcKhe/1/)\n\n    !(http://jsfiddle.net/zgjhjv9j/)\n\n    !(http://jsfiddle.net/zgjhjv9j/1/)\n\n    !(http://jsfiddle.net/Sandhose/BcKhe/)\n  `, config.extra)\n  expect(notParsed).not.toMatch('iframe')\n})\n\ntest('does not parse without markers', async () => {\n  const config = {\n    'www.youtube.com': {\n      tag: 'iframe',\n      width: 560,\n      height: 315,\n      disabled: false,\n      replace: [\n        ['watch?v=', 'embed/'],\n        ['http://', 'https://'],\n      ],\n      droppedQueryParameters: ['feature'],\n      removeAfter: '&',\n    },\n  }\n\n  const {contents} = await render(dedent`\n    !(https://www.youtube.com/watch?v=FdltlrKFr1w)\n\n    https://www.youtube.com/watch?v=FdltlrKFr1w\n  `, config)\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('allows lazy loading', async () => {\n  const config = {\n    'youtube.com': {\n      width: 560,\n      height: 315,\n      disabled: false,\n      lazyLoad: true,\n      oembed: 'https://www.youtube.com/oembed',\n    },\n  }\n\n  const {contents} = await render('!(http://youtube.com/watch?v=FdltlrKFr1w)', config)\n  expect(contents).toContain('loading=\"lazy\"')\n})\n\ntest('Errors without config', async () => {\n  expect(render('')).rejects.toThrowError(Error)\n})\n\ntest('Errors with empty config', async () => {\n  expect(render('', {})).rejects.toThrowError(Error)\n})\n\n\ntest('Errors with invalid config', async () => {\n  expect(render('', '')).rejects.toThrowError(Error)\n})\n\n\ntest('Compiles to Markdown', () => {\n  const txt = dedent`\n    A [link with **bold**](http://example.com)\n\n    !(https://www.youtube.com/watch?v=FdltlrKFr1w)\n\n    These ones should not be allowed by config:\n\n    !(http://jsfiddle.net/Sandhose/BcKhe/1/)\n\n    !(http://jsfiddle.net/zgjhjv9j/)\n\n    !(http://jsfiddle.net/zgjhjv9j/1/)\n\n    !(http://jsfiddle.net/Sandhose/BcKhe/)\n\n    Foo !(this is a parenthesis) bar\n  `\n  const {contents} = renderMarkdown(txt, config.toMd)\n  expect(contents).toMatchSnapshot()\n\n  const recompiled = renderMarkdown(contents.replace(/&#x3A;/g, ':'), config.toMd).contents\n  expect(recompiled).toBe(contents)\n\n  config.toMd['jsfiddle.net'].disabled = false\n  const withJsFiddleActivated = renderMarkdown(txt, config.toMd).contents\n  expect(withJsFiddleActivated).toMatchSnapshot()\n\n  const recompiledWithJsFiddleActivated = renderMarkdown(withJsFiddleActivated.replace(/&#x3A;/g, ':'), config.toMd).contents\n  expect(recompiledWithJsFiddleActivated).toBe(withJsFiddleActivated)\n})\n"
  },
  {
    "path": "packages/remark-iframes/dist/index.js",
    "content": "\"use strict\";\n\nconst visit = require('unist-util-visit');\nconst fetch = require('node-fetch');\nmodule.exports = function plugin(opts) {\n  if (typeof opts !== 'object' || !Object.keys(opts).length) {\n    throw new Error('remark-iframes needs to be passed a configuration object as option');\n  }\n  function detectProvider(url) {\n    const hostname = new URL(url).hostname;\n    return opts[hostname];\n  }\n  function blockTokenizer(eat, value, silent) {\n    if (!value.startsWith('!(http')) return;\n    let eatenValue = '';\n    let url = '';\n    const specialChars = ['!', '(', ')'];\n    for (let i = 0; i < value.length && value[i - 1] !== ')'; i++) {\n      eatenValue += value[i];\n      if (!specialChars.includes(value[i])) {\n        url += value[i];\n      }\n    }\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return true;\n    const provider = detectProvider(url);\n    if (!provider || provider.disabled === true || provider.match && provider.match instanceof RegExp && !provider.match.test(url)) {\n      return eat(eatenValue)({\n        type: 'paragraph',\n        children: [{\n          type: 'text',\n          value: eatenValue\n        }]\n      });\n    }\n    let finalUrl, thumbnail;\n    const data = {\n      hName: provider.tag || 'iframe',\n      hProperties: {\n        src: 'tmp',\n        width: provider.width,\n        height: provider.height,\n        allowfullscreen: true,\n        frameborder: '0'\n      }\n    };\n    if (provider.lazyLoad) data.hProperties.loading = 'lazy';\n    if (provider.oembed) {\n      Object.assign(data, {\n        oembed: {\n          provider,\n          url: `${provider.oembed}?format=json&url=${encodeURIComponent(url)}`,\n          fallback: {\n            type: 'link',\n            url,\n            children: [{\n              type: 'text',\n              value: url\n            }]\n          }\n        }\n      });\n    } else {\n      finalUrl = computeFinalUrl(provider, url);\n      thumbnail = computeThumbnail(provider, finalUrl);\n      Object.assign(data, {\n        hProperties: {\n          src: finalUrl,\n          width: provider.width,\n          height: provider.height,\n          allowfullscreen: true,\n          frameborder: '0'\n        },\n        thumbnail\n      });\n    }\n    eat(eatenValue)({\n      type: 'iframe',\n      src: url,\n      data\n    });\n  }\n  const Parser = this.Parser;\n\n  // Inject blockTokenizer\n  const blockTokenizers = Parser.prototype.blockTokenizers;\n  const blockMethods = Parser.prototype.blockMethods;\n  blockTokenizers.iframes = blockTokenizer;\n  blockMethods.splice(blockMethods.indexOf('blockquote') + 1, 0, 'iframes');\n  const Compiler = this.Compiler;\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors;\n    if (!visitors) return;\n    visitors.iframe = node => `!(${node.src})`;\n  }\n  return async function transform(tree, vfile, next) {\n    let toVisit = 0;\n    visit(tree, 'iframe', async node => {\n      toVisit++;\n    });\n    function nextVisitOrBail() {\n      if (toVisit === 0) next();\n    }\n    nextVisitOrBail();\n    visit(tree, 'iframe', async node => {\n      if (!node.data.oembed) {\n        toVisit--;\n        nextVisitOrBail();\n        return;\n      }\n      const data = node.data;\n      const oembed = data.oembed;\n      const provider = data.oembed.provider;\n      const fallback = data.oembed.fallback;\n      try {\n        const {\n          url,\n          thumbnail,\n          height,\n          width\n        } = await fetchEmbed(oembed.url);\n        node.thumbnail = thumbnail;\n        Object.assign(data.hProperties, {\n          src: url,\n          width: provider.width || width,\n          height: provider.height || height,\n          allowfullscreen: true,\n          frameborder: '0'\n        });\n      } catch (err) {\n        let message = err.message;\n        if (err.name === 'FetchError') {\n          message = `oEmbed URL timeout: ${oembed.url}`;\n        }\n        vfile.message(message, node.position, oembed.url);\n        node.data = {};\n        Object.assign(node, fallback);\n      }\n      delete data.oembed;\n      toVisit--;\n      nextVisitOrBail();\n    });\n  };\n};\nfunction computeFinalUrl(provider, url) {\n  let finalUrl = url;\n  let parsed = new URL(finalUrl);\n  if (provider.droppedQueryParameters && parsed.search) {\n    const search = new URLSearchParams(parsed.search);\n    provider.droppedQueryParameters.forEach(ignored => search.delete(ignored));\n    parsed.search = search.toString();\n    finalUrl = parsed.toString();\n  }\n  if (provider.replace && provider.replace.length) {\n    provider.replace.forEach(rule => {\n      const [from, to] = rule;\n      if (from && to) finalUrl = finalUrl.replace(from, to);\n      parsed = new URL(finalUrl);\n    });\n    finalUrl = parsed.toString();\n  }\n  if (provider.removeFileName) {\n    parsed.pathname = parsed.pathname.substring(0, parsed.pathname.lastIndexOf('/'));\n    finalUrl = parsed.toString();\n  }\n  if (provider.removeAfter && finalUrl.includes(provider.removeAfter)) {\n    finalUrl = finalUrl.substring(0, finalUrl.indexOf(provider.removeAfter));\n  }\n  if (provider.append) {\n    finalUrl += provider.append;\n  }\n  return finalUrl;\n}\nfunction computeThumbnail(provider, url) {\n  let thumbnailURL = '';\n  const thumbnailConfig = provider.thumbnail;\n  if (thumbnailConfig && thumbnailConfig.format) {\n    thumbnailURL = thumbnailConfig.format;\n    Object.keys(thumbnailConfig).filter(key => key !== 'format').forEach(key => {\n      const search = new RegExp(`{${key}}`, 'g');\n      const replace = new RegExp(thumbnailConfig[key]).exec(url);\n      if (replace) thumbnailURL = thumbnailURL.replace(search, replace[1]);\n    });\n  }\n  return thumbnailURL;\n}\nasync function fetchEmbed(url) {\n  return fetch(url, {\n    timeout: 1500\n  }).then(res => res.json()).then(oembedRes => {\n    const oembedUrl = oembedRes.html.match(/src=\"(.+?)\"/)[1];\n    const oembedThumbnail = oembedRes.thumbnail_url;\n    return {\n      url: oembedUrl,\n      thumbnail: oembedThumbnail,\n      width: oembedRes.width,\n      height: oembedRes.height\n    };\n  });\n}"
  },
  {
    "path": "packages/remark-iframes/package.json",
    "content": "{\n  \"name\": \"remark-iframes\",\n  \"version\": \"4.1.1\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-iframes\",\n    \"type\": \"git\"\n  },\n  \"author\": \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"node-fetch\": \"^2.6.0\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-iframes/src/index.js",
    "content": "const visit = require('unist-util-visit')\nconst fetch = require('node-fetch')\n\nmodule.exports = function plugin (opts) {\n  if (typeof opts !== 'object' || !Object.keys(opts).length) {\n    throw new Error('remark-iframes needs to be passed a configuration object as option')\n  }\n\n  function detectProvider (url) {\n    const hostname = new URL(url).hostname\n    return opts[hostname]\n  }\n\n  function blockTokenizer (eat, value, silent) {\n    if (!value.startsWith('!(http')) return\n\n    let eatenValue = ''\n    let url = ''\n    const specialChars = ['!', '(', ')']\n    for (let i = 0; i < value.length && value[i - 1] !== ')'; i++) {\n      eatenValue += value[i]\n      if (!specialChars.includes(value[i])) {\n        url += value[i]\n      }\n    }\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return true\n\n    const provider = detectProvider(url)\n    if (\n      (!provider || provider.disabled === true) ||\n      (provider.match && provider.match instanceof RegExp && !provider.match.test(url))\n    ) {\n      return eat(eatenValue)({\n        type: 'paragraph',\n        children: [{\n          type: 'text',\n          value: eatenValue\n        }]\n      })\n    }\n\n    let finalUrl, thumbnail\n    const data = {\n      hName: provider.tag || 'iframe',\n      hProperties: {\n        src: 'tmp',\n        width: provider.width,\n        height: provider.height,\n        allowfullscreen: true,\n        frameborder: '0'\n      }\n    }\n\n    if (provider.lazyLoad) data.hProperties.loading = 'lazy'\n\n    if (provider.oembed) {\n      Object.assign(data, {\n        oembed: {\n          provider,\n          url: `${provider.oembed}?format=json&url=${encodeURIComponent(url)}`,\n          fallback: {\n            type: 'link',\n            url,\n            children: [{ type: 'text', value: url }]\n          }\n        }\n      })\n    } else {\n      finalUrl = computeFinalUrl(provider, url)\n      thumbnail = computeThumbnail(provider, finalUrl)\n\n      Object.assign(data, {\n        hProperties: {\n          src: finalUrl,\n          width: provider.width,\n          height: provider.height,\n          allowfullscreen: true,\n          frameborder: '0'\n        },\n        thumbnail\n      })\n    }\n\n    eat(eatenValue)({\n      type: 'iframe',\n      src: url,\n      data\n    })\n  }\n\n  const Parser = this.Parser\n\n  // Inject blockTokenizer\n  const blockTokenizers = Parser.prototype.blockTokenizers\n  const blockMethods = Parser.prototype.blockMethods\n  blockTokenizers.iframes = blockTokenizer\n  blockMethods.splice(blockMethods.indexOf('blockquote') + 1, 0, 'iframes')\n\n  const Compiler = this.Compiler\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors\n    if (!visitors) return\n    visitors.iframe = (node) => `!(${node.src})`\n  }\n\n  return async function transform (tree, vfile, next) {\n    let toVisit = 0\n    visit(tree, 'iframe', async (node) => {\n      toVisit++\n    })\n\n    function nextVisitOrBail () {\n      if (toVisit === 0) next()\n    }\n    nextVisitOrBail()\n\n    visit(tree, 'iframe', async (node) => {\n      if (!node.data.oembed) {\n        toVisit--\n        nextVisitOrBail()\n        return\n      }\n\n      const data = node.data\n      const oembed = data.oembed\n      const provider = data.oembed.provider\n      const fallback = data.oembed.fallback\n\n      try {\n        const {\n          url,\n          thumbnail,\n          height,\n          width\n        } = await fetchEmbed(oembed.url)\n\n        node.thumbnail = thumbnail\n\n        Object.assign(data.hProperties, {\n          src: url,\n          width: provider.width || width,\n          height: provider.height || height,\n          allowfullscreen: true,\n          frameborder: '0'\n        })\n      } catch (err) {\n        let message = err.message\n\n        if (err.name === 'FetchError') {\n          message = `oEmbed URL timeout: ${oembed.url}`\n        }\n\n        vfile.message(message, node.position, oembed.url)\n        node.data = {}\n        Object.assign(node, fallback)\n      }\n\n      delete data.oembed\n      toVisit--\n      nextVisitOrBail()\n    })\n  }\n}\n\nfunction computeFinalUrl (provider, url) {\n  let finalUrl = url\n  let parsed = new URL(finalUrl)\n\n  if (provider.droppedQueryParameters && parsed.search) {\n    const search = new URLSearchParams(parsed.search)\n    provider.droppedQueryParameters.forEach(ignored => search.delete(ignored))\n    parsed.search = search.toString()\n    finalUrl = parsed.toString()\n  }\n\n  if (provider.replace && provider.replace.length) {\n    provider.replace.forEach((rule) => {\n      const [from, to] = rule\n      if (from && to) finalUrl = finalUrl.replace(from, to)\n      parsed = new URL(finalUrl)\n    })\n    finalUrl = parsed.toString()\n  }\n\n  if (provider.removeFileName) {\n    parsed.pathname = parsed.pathname.substring(0, parsed.pathname.lastIndexOf('/'))\n    finalUrl = parsed.toString()\n  }\n\n  if (provider.removeAfter && finalUrl.includes(provider.removeAfter)) {\n    finalUrl = finalUrl.substring(0, finalUrl.indexOf(provider.removeAfter))\n  }\n\n  if (provider.append) {\n    finalUrl += provider.append\n  }\n\n  return finalUrl\n}\n\nfunction computeThumbnail (provider, url) {\n  let thumbnailURL = ''\n  const thumbnailConfig = provider.thumbnail\n  if (thumbnailConfig && thumbnailConfig.format) {\n    thumbnailURL = thumbnailConfig.format\n    Object\n      .keys(thumbnailConfig)\n      .filter((key) => key !== 'format')\n      .forEach((key) => {\n        const search = new RegExp(`{${key}}`, 'g')\n        const replace = new RegExp(thumbnailConfig[key]).exec(url)\n        if (replace) thumbnailURL = thumbnailURL.replace(search, replace[1])\n      })\n  }\n  return thumbnailURL\n}\n\nasync function fetchEmbed (url) {\n  return fetch(url, { timeout: 1500 })\n    .then((res) => res.json())\n    .then((oembedRes) => {\n      const oembedUrl = oembedRes.html.match(/src=\"(.+?)\"/)[1]\n      const oembedThumbnail = oembedRes.thumbnail_url\n      return {\n        url: oembedUrl,\n        thumbnail: oembedThumbnail,\n        width: oembedRes.width,\n        height: oembedRes.height\n      }\n    })\n}\n"
  },
  {
    "path": "packages/remark-images-download/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-images-download/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-images-download/README.md",
    "content": "# remark-images-download [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis plugin downloads images to a custom directory, replacing images URLs\nwith the path to the downloaded file.\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-images-download\n```\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkImagesDownload = require('remark-images-download')\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkIframe,\n  .use(remarkImagesDownload, {\n    disabled: true,\n    downloadDestination: './img/',\n    defaultImagePath: 'black.png',\n    defaultOn: {\n      statusCode: true,\n      mimeType: false,\n      fileTooBig: false,\n    },\n    maxlength: 1000000,\n    dirSizeLimit: 10000000,\n    localUrlToLocalPath: (localUrl) => localPath\n  })\n  .use(remark2rehype)\n  .use(stringify)\n```\n\n## Configuration options:\n\nAll options are optional.\n\n- `disabled`: bool, default: `false`\n\n  If `true`, disables the plugin.\n\n- `downloadDestination`: string, default: `/tmp`\n\n  Parent destination folder for downloads.\n\n- `defaultImagePath`: string or boolean, default: `false`\n\n  Image path to fallback to for images that couldn't be found.\n  Set to `false` or keep default value to disable.\n\n- `defaultOn`: object, with properties,\n\n  Cases when the default image should be used.\n\n  - `statusCode`: boolean, default `false`\n\n    The status code is different than 200.\n\n  - `mimeType`: boolean, default `false`\n\n    The MIME type does not match an image.\n\n  - `fileTooBig`: boolean, default `false`\n\n    The file size exceed the `maxFileSize` limit.\n\n- `maxFileLength`: number, default: `1000000`\n\n  Any file with a bigger size than this number (in bytes) will be skipped.\n\n- `dirSizeLimit`: number, default: `10000000`\n\n  Download directory size limit (in bytes). When reached, subsequent\n  images are skipped.\n\n- `localUrlToLocalPath`: `(localUrl: string): string => localPath` or `[from: string, to: string]`, default: `<none>` (skip local images)\n\n  If provided, local images referenced in Markdown source (such\n  as `![](/img/example.png)`) will be copied to `downloadDestination`\n  after applying this function to the path to obtain the local location\n  of `example.png`, e.g.\n  `localUrlToLocalPath('/img/example.png') === '/opt/assets/example.png'`.\n  It will get renamed to a shortId just like any downloaded image.\n\n  In case a two-element array is provided, the string `from` will get\n  replaced by `to` using the following RegExp:\n\n  ```js\n  '/img/example.png'.replace(new RegExp(`^${from}`), to)\n  ```\n\n  If not provided, local images will not end up in `downloadDestination`.\n\n## Example\n\n```markdown\nTwo small images:\n![](https://example.com/example.png)\n![](https://example.com/example2.png)\n\nAnd an image of 1Tb!\n![](https://example.com/example_1Tb.png)\n```\n\nwith the previous configuration `remark-images-download` will download the two first images in `img/UUID/otherUUID.png` and `img/UUID/yetAnotherUUID.png` where `UUID` is a random string and it does not download `example_1Tb.png` because the file is too large.\n\n`vfile.data.imageDir` will be set to the path to the folder where images were downloaded.\n\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-images-download/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-images-download\n"
  },
  {
    "path": "packages/remark-images-download/__mock__/files/empty",
    "content": ""
  },
  {
    "path": "packages/remark-images-download/__mock__/files/world",
    "content": "hello\n"
  },
  {
    "path": "packages/remark-images-download/__mock__/files/wrong-mime.txt",
    "content": "coucou!\n"
  },
  {
    "path": "packages/remark-images-download/__mock__/server.js",
    "content": "const path = require('path')\nconst express = require('express')\nconst fs = require('fs')\n\nconst app = express()\n\nlet pngHeader\nconst fd = fs.createReadStream(path.join(__dirname, 'files', 'ok.png'))\nfd.on('data', (data) => {\n  if (!pngHeader) {\n    pngHeader = data\n  }\n})\n\napp.use((req, res, next) => {\n  /* Some websites (like Wikimedia) may refuse requests without User-Agent\n   * header, so mimic their behaviour: */\n  if (!req.get('User-Agent')) {\n    res.writeHead(403)\n    res.end()\n  }\n  next()\n})\n\nconst bloat = Buffer.alloc(10 * 1024)\n\napp.get('/stream-bomb', (req, res) => {\n  res.header('content-type', 'image/png')\n  res.header('transfer-encoding', 'chunked')\n  res.writeHead(200)\n\n  res.write(pngHeader)\n\n  // Send garbage until the client closes the connection\n  const sendBloat = () => {\n    while (res.write(bloat));\n  }\n\n  sendBloat()\n  res.socket.on('drain', sendBloat)\n})\n\napp.get('/empty', (req, res) => {\n  res.header('content-type', 'image/png')\n  res.header('transfer-encoding', 'chunked')\n  res.writeHead(200)\n  res.end()\n})\n\napp.use('/', express.static(path.join(__dirname, 'files')))\n\nconst server = app.listen(27273, () => {})\n\nmodule.exports = server\n"
  },
  {
    "path": "packages/remark-images-download/__tests__/index.js",
    "content": "/* global beforeAll, afterAll */\nimport clone from 'clone'\nimport fs from 'fs'\nimport dedent from 'dedent'\nimport path from 'path'\nimport rimraf from 'rimraf'\n\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport stringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\n\nimport plugin from '../src/'\nimport server from '../__mock__/server'\n\nconst DOWNLOAD_DESTINATION = '/tmp'\nconst downloadDestination = path.join(DOWNLOAD_DESTINATION, 'remark-image-download-tests')\n\nconst testFilesDir = `${__dirname.replace('__tests__', '__mock__')}/files`\n\nconst firstMsg = (vfile) => vfile.messages[0].message\n\nconst renderFactory = (opts = {}) =>\n  (text) => unified()\n    .use(reParse)\n    .use(plugin, Object.assign(clone(opts), {downloadDestination}))\n    .use(remark2rehype)\n    .use(stringify)\n    .process(text)\n\nbeforeAll((done) => {\n  fs.mkdir(downloadDestination, done)\n})\n\nafterAll((done) => {\n  server.close()\n  rimraf(downloadDestination, done)\n})\n\nconst r = (html) => html.replace(\n  new RegExp(\n    path.join(downloadDestination, '([a-zA-Z0-9_-]{7,14})', '([a-zA-Z0-9_-]{7,14})'),\n    'g'),\n  'foo/bar')\n\nconst noDownloads = async asyncFunction => {\n  const prevDownloadDirCount = fs.readdirSync(downloadDestination).length\n\n  await asyncFunction()\n\n  const downloadDirCount = fs.readdirSync(downloadDestination).length\n  expect(downloadDirCount).toBe(prevDownloadDirCount)\n}\n\ndescribe('mock server tests', () => {\n  test('rejects invalid URLs', () => {\n    const file = '![foo](https://example.com:demo)'\n\n    const render = renderFactory()\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toBe('Invalid URL: https://example.com:demo')\n    })\n  })\n\n  test('downloads image ok', () => {\n    const file = dedent`\n      ![](http://localhost:27273/test.svg)\n\n      ![](http://localhost:27273/ok.png)\n\n      ![](http://localhost:27273/ok.png?foo)\n    `\n    const html = dedent`\n      <p><img src=\"foo/bar.svg\"></p>\n      <p><img src=\"foo/bar.png\"></p>\n      <p><img src=\"foo/bar.png\"></p>\n    `\n\n    const render = renderFactory()\n\n    return render(file).then(vfile => {\n      expect(r(vfile.contents)).toBe(html)\n      const downloadedFiles = fs.readdirSync(vfile.data.imageDir)\n      expect(downloadedFiles.length).toBe(3)\n    })\n  })\n\n  test('does not crash without images', () => {\n    const file = `foo`\n    const html = `<p>foo</p>`\n\n    const render = renderFactory()\n\n    return render(file).then(vfile => {\n      expect(vfile.contents).toBe(html)\n    })\n  })\n\n  test('does not create empty dest folder', async () => {\n    const file = `foo`\n\n    const render = renderFactory()\n\n    return noDownloads(() =>\n      render(file).then(vfile => {\n        expect(vfile.data.imageDir).toBe(undefined)\n      }),\n    )\n  })\n\n  test('skips bigger images and reports', () => {\n    const file = `![](http://localhost:27273/ok.png)`\n    const html = `<p><img src=\"http://localhost:27273/ok.png\"></p>`\n\n    const error = 'File at http://localhost:27273/ok.png weighs 516, max size is 400'\n\n    const render = renderFactory({\n      maxFileSize: 400,\n    })\n\n    return noDownloads(() =>\n      render(file).then(vfile => {\n        expect(firstMsg(vfile)).toBe(error)\n        expect(vfile.contents).toBe(html)\n        expect(vfile.data.imageDir).toBe(undefined)\n      }),\n    )\n  })\n\n  test('skips empty images', () => {\n    const md = `![]()`\n    const html = `<p><img src=\"\"></p>`\n\n    const render = renderFactory()\n\n    return render(md).then(vfile => {\n      expect(firstMsg(vfile)).toBe('URL is empty')\n      expect(vfile.contents).toBe(html)\n    })\n  })\n\n  test('default big images', () => {\n    const defaultImagePath = 'default.png'\n    const file = `![](http://localhost:27273/ok.png)`\n    const html = `<p><img src=\"${downloadDestination}/${defaultImagePath}\"></p>`\n\n    const render = renderFactory({\n      maxFileSize: 400,\n      defaultImagePath,\n      defaultOn: {\n        fileTooBig: true,\n      },\n    })\n\n    return render(file).then(vfile => {\n      expect(vfile.contents).toBe(html)\n    })\n  })\n\n  test('reports bad SVG', () => {\n    const file = `![](http://localhost:27273/bad.svg)`\n    const html = `<p><img src=\"http://localhost:27273/bad.svg\"></p>`\n\n    const render = renderFactory()\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toBe(\n        'Could not detect http://localhost:27273/bad.svg mime type, not SVG either')\n      expect(vfile.contents).toBe(html)\n      expect(vfile.data.imageDir).toBe(undefined)\n    })\n  })\n\n  test('skips wrong mimes', () => {\n    const file = `![](http://localhost:27273/wrong-mime.txt)`\n    const html = `<p><img src=\"http://localhost:27273/wrong-mime.txt\"></p>`\n\n    const render = renderFactory()\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toBe(\n        'Content-Type of http://localhost:27273/wrong-mime.txt is not an image/ type')\n      expect(vfile.contents).toBe(html)\n    })\n  })\n\n  test('default wrong mime', () => {\n    const defaultImagePath = 'default.png'\n    const file = `![](http://localhost:27273/wrong-mime.txt)`\n    const html = `<p><img src=\"${downloadDestination}/${defaultImagePath}\"></p>`\n\n    const render = renderFactory({\n      defaultImagePath,\n      defaultOn: {\n        mimeType: true,\n      },\n    })\n\n    return render(file).then(vfile => {\n      expect(vfile.contents).toBe(html)\n    })\n  })\n\n  test('reports bad mime headers', () => {\n    const file = `![](http://localhost:27273/wrong-mime.txt)`\n\n    const render = renderFactory()\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toBe(\n        'Content-Type of http://localhost:27273/wrong-mime.txt is not an image/ type')\n    })\n  })\n\n  test('reports bad mime content', () => {\n    const file = `![](http://localhost:27273/wrong-mime.png)`\n\n    const render = renderFactory()\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toBe(\n        'Could not detect http://localhost:27273/wrong-mime.png mime type, not SVG either')\n    })\n  })\n\n  test('reports protocol not whitelisted', () => {\n    const file = `![](xmpp://localhost:27273/wrong-mime.png)`\n\n    const error = \"Protocol 'xmpp:' not allowed.\"\n\n    const render = renderFactory()\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toBe(error)\n    })\n  })\n\n  test('skips when directory reaches size limit', () => {\n    const file = dedent`\n      ![](http://localhost:27273/ok.png)\n      ![](http://localhost:27273/ok.png?foo)\n      ![](http://localhost:27273/ok.png?bar)\n      ![](http://localhost:27273/ok.png?moo)\n    `\n\n    // query strings are required in order to make URLs unique (one single\n    // file is downloaded otherwise).\n    // each file being roughly 30% of directory size limit, the 4th one would exceed this\n    // limit. It shouldn't get downloaded & replaced:\n\n    const html = dedent`\n      <p><img src=\"foo/bar.png\">\n      <img src=\"foo/bar.png\">\n      <img src=\"foo/bar.png\">\n      <img src=\"http://localhost:27273/ok.png?moo\"></p>\n    `\n\n    const error = 'Cannot download http://localhost:27273/ok.png?moo because ' +\n      'destination directory reached size limit'\n\n    const render = renderFactory({\n      maxFileSize: 516,\n      dirSizeLimit: (516 * 3) + 50,\n    })\n\n    return render(file)\n      .then(vfile => {\n        expect(firstMsg(vfile)).toBe(error)\n        expect(r(vfile.contents)).toBe(html)\n      })\n  })\n\n  test('does not download when disabled', () => {\n    const file = dedent`\n      ![](http://localhost:27273/ok.png)\n      ![](http://localhost:27273/ok.png)\n      ![](http://localhost:27273/ok.png)\n      ![](http://localhost:27273/ok.png)\n    `\n\n    // images will not be downloaded\n    const html = dedent`\n      <p><img src=\"http://localhost:27273/ok.png\">\n      <img src=\"http://localhost:27273/ok.png\">\n      <img src=\"http://localhost:27273/ok.png\">\n      <img src=\"http://localhost:27273/ok.png\"></p>\n    `\n\n    const render = renderFactory({\n      disabled: true,\n    })\n\n    return noDownloads(async () => {\n      const vfile = await render(file)\n      expect(vfile.contents).toBe(html)\n    })\n  })\n\n  test('skips local images', () => {\n    const file = `![](local.png)`\n    const html = `<p><img src=\"local.png\"></p>`\n\n    const render = renderFactory()\n\n    expect(render(file).then(vfile => vfile.contents)).resolves.toBe(html)\n  })\n\n  test('reports local magic number errors', () => {\n    const file = `![](/foobar/wrong-mime.txt)`\n\n    const render = renderFactory({\n      localUrlToLocalPath: (localUrl) => {\n        const localPath = __dirname.replace('__tests__', '__mock__')\n        return `${localPath}/files${localUrl.slice(7)}`\n      },\n    })\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toMatch('mime type, not SVG either')\n    })\n  })\n\n  test('copies local images with function', () => {\n    const file = `![](/foobar/ok.png)`\n    const html = `<p><img src=\"foo/bar.png\"></p>`\n\n    const render = renderFactory({\n      localUrlToLocalPath: (localUrl) => {\n        const localPath = __dirname.replace('__tests__', '__mock__')\n        return `${localPath}/files${localUrl.slice(7)}`\n      },\n    })\n\n    return render(file).then(vfile => {\n      expect(vfile.messages).toEqual([])\n      expect(r(vfile.contents)).toBe(html)\n    })\n  })\n\n  test('copies local images with replacement array', () => {\n    const file = `![](/foobar/ok.png)`\n    const html = `<p><img src=\"foo/bar.png\"></p>`\n\n    const render = renderFactory({\n      localUrlToLocalPath: [\n        '/foobar',\n        testFilesDir,\n      ],\n    })\n\n    return render(file).then(vfile => {\n      expect(vfile.messages).toEqual([])\n      expect(r(vfile.contents)).toBe(html)\n    })\n  })\n\n  test('copies local SVG with replacement array', () => {\n    const file = `![](/foobar/test.svg)`\n    const html = `<p><img src=\"foo/bar.svg\"></p>`\n\n    const render = renderFactory({\n      localUrlToLocalPath: [\n        '/foobar',\n        testFilesDir,\n      ],\n    })\n\n    return render(file).then(vfile => {\n      expect(vfile.messages).toEqual([])\n      expect(r(vfile.contents)).toBe(html)\n    })\n  })\n\n  test('copies local images with replacement array', () => {\n    const file = `![](/foobar/ok.png)`\n    const html = `<p><img src=\"foo/bar.png\"></p>`\n\n    const render = renderFactory({\n      localUrlToLocalPath: [\n        '/foobar',\n        testFilesDir,\n      ],\n    })\n\n    return render(file).then(vfile => {\n      expect(vfile.messages).toEqual([])\n      expect(r(vfile.contents)).toBe(html)\n    })\n  })\n\n  test('does not copy bad local SVG', () => {\n    const file = `![](/foobar/bad.svg)`\n    const html = `<p><img src=\"/foobar/bad.svg\"></p>`\n\n    const render = renderFactory({\n      localUrlToLocalPath: [\n        '/foobar',\n        testFilesDir,\n      ],\n    })\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toMatch('mime type, not SVG either')\n      expect(r(vfile.contents)).toBe(html)\n    })\n  })\n\n  test('ignores nonexistent local files', () => {\n    const file = `![](/does-not-exist)`\n    const html = `<p><img src=\"/does-not-exist\"></p>`\n\n    const render = renderFactory({\n      localUrlToLocalPath: ['', `${__dirname}`],\n    })\n\n    return render(file).then(vfile => {\n      // XXX probably okay but a bit dirty\n      expect(firstMsg(vfile)).toMatch('ENOENT: no such file or directory, open ')\n      expect(r(vfile.contents)).toBe(html)\n    })\n  })\n\n  test('ignores empty local files', () => {\n    const file = `![](/empty)`\n    const html = `<p><img src=\"/empty\"></p>`\n\n    const render = renderFactory({\n      localUrlToLocalPath: ['', testFilesDir],\n    })\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toMatch('Empty file: ')\n      expect(r(vfile.contents)).toBe(html)\n    })\n  })\n\n  test('does not copy non-image files', () => {\n    const file = `![](/foobar/wrong-mime.zip)`\n    const html = `<p><img src=\"/foobar/wrong-mime.zip\"></p>`\n\n    const render = renderFactory({\n      localUrlToLocalPath: [\n        '/foobar',\n        testFilesDir,\n      ],\n    })\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toMatch('is not an image/ type')\n      expect(r(vfile.contents)).toBe(html)\n    })\n  })\n\n  test('does not copy dangerous local absolute URLs', () => {\n    const file = `![](/../../../etc/shadow)`\n    const html = `<p><img src=\"/../../../etc/shadow\"></p>`\n    const render = renderFactory({\n      localUrlToLocalPath: (localUrl) => {\n        const localPath = __dirname.replace('__tests__', '__mock__')\n        return `${localPath}/files${localUrl.slice(7)}`\n      },\n    })\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toMatch('Dangerous absolute image URL detected')\n      expect(r(vfile.contents)).toBe(html)\n    })\n  })\n\n  test('default nonexisting images', () => {\n    const defaultImagePath = 'default.png'\n    const file = `![](/home/img.png)`\n    const html = `<p><img src=\"${downloadDestination}/${defaultImagePath}\"></p>`\n\n    const render = renderFactory({\n      defaultImagePath,\n      localUrlToLocalPath: ['/', '/tmp/'],\n      defaultOn: {\n        invalidPath: true,\n      },\n    })\n\n    return render(file).then(vfile => {\n      expect(vfile.contents).toBe(html)\n    })\n  })\n\n  test('reports 404', () => {\n    const file = `![](http://localhost:27273/404/notfound)`\n    const html = `<p><img src=\"http://localhost:27273/404/notfound\"></p>`\n\n    const render = renderFactory()\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toBe(\n        'Received HTTP404 for: http://localhost:27273/404/notfound')\n      expect(vfile.contents).toBe(html)\n    })\n  })\n\n  test('default bad status code', () => {\n    const defaultImagePath = 'default.png'\n    const file = `![](http://localhost:27273/noimage.png)`\n    const html = `<p><img src=\"${downloadDestination}/${defaultImagePath}\"></p>`\n\n    const render = renderFactory({\n      defaultImagePath,\n      defaultOn: {\n        statusCode: true,\n      },\n    })\n\n    return render(file).then(vfile => {\n      expect(vfile.contents).toBe(html)\n    })\n  })\n\n  test('reports DNS resolution issues', () => {\n    const file = `![](http://doesnotexist-kqwtkk78.com)`\n    const html = `<p><img src=\"http://doesnotexist-kqwtkk78.com\"></p>`\n\n    const render = renderFactory({httpRequestTimeout: 500})\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toContain(\n        'getaddrinfo ENOTFOUND doesnotexist-kqwtkk78.com')\n      expect(vfile.contents).toBe(html)\n    })\n  })\n\n  test('report timeout errors', () => {\n    const blackholeAddr = '192.0.2.1'\n    const file = `![](http://${blackholeAddr}:32764/bad)`\n    const html = `<p><img src=\"http://${blackholeAddr}:32764/bad\"></p>`\n\n    const render = renderFactory({httpRequestTimeout: 500})\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toBe(\n        `Request for http://${blackholeAddr}:32764/bad timed out`)\n      expect(vfile.contents).toBe(html)\n    })\n  })\n\n  test('report timeout errors - IPv6 unreachable', () => {\n    const file = `![](http://example.com:32764/bad)`\n    const html = `<p><img src=\"http://example.com:32764/bad\"></p>`\n\n    const render = renderFactory({httpRequestTimeout: 500})\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toBe(\n        'Request for http://example.com:32764/bad timed out')\n      expect(vfile.contents).toBe(html)\n    })\n  })\n\n  test('does not download large chunked streams', async () => {\n    const file = `![](http://localhost:27273/stream-bomb)`\n    const html = `<p><img src=\"http://localhost:27273/stream-bomb\"></p>`\n\n    const render = renderFactory()\n\n    const error = 'File at http://localhost:27273/stream-bomb weighs more than 1000000'\n\n    await noDownloads(async () => {\n      const vfile = await render(file)\n      expect(vfile.data.imageDir).toBe(undefined)\n      expect(vfile.contents).toBe(html)\n      expect(vfile.messages.length).toBe(1)\n      expect(firstMsg(vfile)).toBe(error)\n    })\n  })\n\n  test('rejects empty files', async () => {\n    const file = `![](http://localhost:27273/empty)`\n    const html = `<p><img src=\"http://localhost:27273/empty\"></p>`\n\n    const render = renderFactory()\n\n    const error = 'File at http://localhost:27273/empty is empty'\n\n    await noDownloads(async () => {\n      const vfile = await render(file)\n      expect(vfile.data.imageDir).toBe(undefined)\n      expect(vfile.contents).toBe(html)\n      expect(vfile.messages.length).toBe(1)\n      expect(firstMsg(vfile)).toBe(error)\n    })\n  })\n\n  test('does not download many times the same image', async () => {\n    const file = dedent`\n      ![](http://localhost:27273/ok.png)\n      ![](http://localhost:27273/ok.png)\n    `\n\n    const html = new RegExp(dedent`\n      <p><img src=\"([^\"]+)\">\n      <img src=\"([^\"]+)\"></p>\n    `)\n\n    const render = renderFactory()\n\n    return render(file)\n      .then(vfile => {\n        expect(vfile.messages.length).toBe(0)\n        const match = vfile.contents.match(html)\n        expect(match).toBeTruthy()\n        expect(match[1]).toBe(match[2])\n        const downloadedFiles = fs.readdirSync(vfile.data.imageDir)\n        expect(downloadedFiles.length).toBe(1)\n      })\n  })\n\n  test('prevents local hosts', () => {\n    const file = `![](http://192.168.2.3:27273/ok.png)`\n    const html = `<p><img src=\"http://192.168.2.3:27273/ok.png\"></p>`\n\n    const render = renderFactory({\n      disallowLocal: true,\n    })\n\n    return render(file).then(vfile => {\n      expect(firstMsg(vfile)).toBe(\n        'IP resolved in a forbidden range')\n      expect(vfile.contents).toBe(html)\n    })\n  })\n})\n"
  },
  {
    "path": "packages/remark-images-download/dist/index.js",
    "content": "\"use strict\";\n\nconst dns = require('dns');\nconst fs = require('fs');\nconst http = require('http');\nconst https = require('https');\nconst path = require('path');\nconst {\n  promisify\n} = require('util');\nconst {\n  Transform\n} = require('stream');\nconst {\n  URL\n} = require('url');\nconst {\n  Address4,\n  Address6\n} = require('ip-address');\nconst FileType = require('file-type');\nconst isSvg = require('is-svg');\nconst shortid = require('shortid');\nconst visit = require('unist-util-visit');\nconst rimraf = require('rimraf');\nconst isImage = headers => {\n  return headers['content-type'].substring(0, 6) === 'image/';\n};\nconst getSize = (headers = {}) => {\n  const size = parseInt(headers['content-length'], 10);\n  if (Number.isNaN(size)) {\n    return 0;\n  }\n  return size;\n};\nconst mkdir = path => new Promise((resolve, reject) => {\n  fs.mkdir(path, err => {\n    if (err) reject(new Error(`Failed to create dir ${path}`));\n    resolve();\n  });\n});\nconst checkFileType = async (name, data) => {\n  if (!data.length) {\n    throw new Error(`Empty file: ${name}`);\n  }\n  return FileType.fromBuffer(data).catch(() => {}).then((type = {\n    mime: ''\n  }) => {\n    if (!type.mime || type.mime === 'application/xml') {\n      if (!isSvg(data.toString())) {\n        return Promise.reject(new Error(`Could not detect ${name} mime type, not SVG either`));\n      }\n    } else if (type.mime.slice(0, 6) !== 'image/') {\n      return Promise.reject(new Error(`Detected mime of local file '${name}' is not an image/ type`));\n    }\n    return Promise.resolve();\n  });\n};\n\n// Creates a Transform stream which raises an error if the file type\n// is wrong or if the file is not a image.\nconst makeValidatorStream = (fileName, maxSize) => {\n  let firstChunk = true;\n  let totalSize = 0;\n  return new Transform({\n    flush(cb) {\n      if (totalSize === 0) {\n        cb(new Error(`File at ${fileName} is empty`));\n        return;\n      }\n      cb(null);\n    },\n    transform(chunk, encoding, cb) {\n      totalSize += chunk.length;\n      if (maxSize && maxSize < totalSize) {\n        cb(new Error(`File at ${fileName} weighs more than ${maxSize}`));\n        return;\n      }\n      if (firstChunk) {\n        checkFileType(fileName, chunk).then(() => {\n          firstChunk = false;\n          cb(null, chunk);\n        }).catch(error => {\n          cb(error);\n        });\n      } else {\n        cb(null, chunk);\n      }\n    }\n  });\n};\nconst FORBIDDEN_IPV4 = ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', '192.18.0.0/15'].map(a => new Address4(a));\nconst FORBIDDEN_IPV6 = ['fc0::/7', 'fe80::/10'].map(a => new Address6(a));\nconst checkHost = async rawUrl => {\n  const url = new URL(rawUrl);\n  const unbracketedHost = url.hostname.replace(/^\\[/, '').replace(/\\]$/, '');\n\n  // Check for IP in hostname\n  let ipv4 = Address4.isValid(url.hostname) && url.hostname;\n  let ipv6 = Address6.isValid(unbracketedHost) && unbracketedHost;\n\n  // Try to resolve hostname\n  if (!ipv4 && !ipv6) {\n    const {\n      address,\n      family\n    } = await promisify(dns.lookup)(url.hostname);\n    if (family === 4) {\n      ipv4 = address;\n    } else {\n      ipv6 = address;\n    }\n  }\n  const ipv4Resolved = Boolean(ipv4);\n  const ipv6Resolved = Boolean(ipv6);\n\n  // Match forbidden ranges\n  if (ipv4Resolved) {\n    ipv4 = new Address4(ipv4);\n    ipv4 = FORBIDDEN_IPV4.reduce((acc, cur) => acc && !ipv4.isInSubnet(cur), true) && ipv4;\n  }\n  if (ipv6Resolved) {\n    ipv6 = new Address6(ipv6);\n\n    // IPv6to4 addresses are handled separately\n    if (ipv6.is6to4()) {\n      const ipv6to4 = new Address4(ipv6.to4());\n      ipv6 = FORBIDDEN_IPV4.reduce((acc, cur) => acc && !ipv6to4.isInSubnet(cur), true) && ipv6;\n    } else {\n      ipv6 = FORBIDDEN_IPV6.reduce((acc, cur) => acc && !ipv6.isInSubnet(cur), true) && ipv6;\n    }\n  }\n  if (ipv4Resolved && !ipv4 || ipv6Resolved && !ipv6) {\n    throw new Error('IP resolved in a forbidden range');\n  }\n  return rawUrl;\n};\nfunction plugin({\n  disabled = false,\n  maxFileSize = 1000000,\n  dirSizeLimit = 10000000,\n  downloadDestination = '/tmp',\n  defaultImagePath = false,\n  defaultOn = {\n    statusCode: false,\n    mimeType: false,\n    fileTooBig: false,\n    invalidPath: false\n  },\n  localUrlToLocalPath,\n  httpRequestTimeout = 5000 // in milliseconds\n} = {}) {\n  // Sends an HTTP request, checks headers and resolves a readable stream\n  // if headers are valid.\n  // Rejects with an error if headers are invalid.\n  const initDownload = url => new Promise((resolve, reject) => {\n    const packageInfo = require('../package.json');\n    const parsedUrl = new URL(url);\n    const proto = parsedUrl.protocol === 'https:' ? https : http;\n    const reqOptions = {\n      timeout: httpRequestTimeout,\n      // Websites may refuse connection if there is no User-Agent\n      // (see for instance https://meta.wikimedia.org/wiki/User-Agent_policy)\n      headers: {\n        'User-Agent': `${packageInfo.name} bot/${packageInfo.version} (${packageInfo.repository.url})`\n      }\n    };\n    const req = proto.get(parsedUrl, reqOptions, res => {\n      const {\n        headers,\n        statusCode\n      } = res;\n      let error;\n      const fileSize = getSize(headers);\n      if (statusCode !== 200) {\n        error = new Error(`Received HTTP${statusCode} for: ${url}`);\n        error.replaceWithDefault = defaultOn && defaultOn.statusCode;\n      } else if (!isImage(headers)) {\n        error = new Error(`Content-Type of ${url} is not an image/ type`);\n        error.replaceWithDefault = defaultOn && defaultOn.mimeType;\n      } else if (maxFileSize && fileSize > maxFileSize) {\n        error = new Error(`File at ${url} weighs ${headers['content-length']}, ` + `max size is ${maxFileSize}`);\n        error.replaceWithDefault = defaultOn && defaultOn.fileTooBig;\n      }\n      if (error) {\n        req.destroy();\n        res.resume();\n        reject(error);\n        return;\n      }\n      resolve(res);\n    });\n    req.on('timeout', () => {\n      req.destroy();\n      reject(new Error(`Request for ${url} timed out`));\n    });\n    req.on('error', err => {\n      if (err.errors) {\n        const errorCodes = err.errors.map(e => e.code);\n        // Node > 18 issues two requests: IPv4 and IPv6, timeout is\n        // not handled by default if one of them throws unreachable\n        if (errorCodes.length === 2 && errorCodes.includes('ETIMEDOUT') && errorCodes.includes('ENETUNREACH')) {\n          req.emit('timeout');\n        }\n      }\n      reject(err);\n    });\n  });\n  const checkAndCopy = async (from, to) => {\n    const data = await promisify(fs.readFile)(from).catch(e => {\n      e.replaceWithDefault = defaultOn && defaultOn.invalidPath;\n      throw e;\n    });\n    await checkFileType(from, data);\n    try {\n      await promisify(fs.copyFile)(from, to);\n    } catch (err) {\n      throw new Error(`Failed to copy ${from} to ${to}`);\n    }\n  };\n  const downloadAndSave = (node, sourceUrl, httpResponse, destinationPath) => new Promise((resolve, reject) => httpResponse.on('error', function (error) {\n    reject(error);\n    httpResponse.destroy(error);\n  }).pipe(makeValidatorStream(sourceUrl, maxFileSize)).on('error', function (error) {\n    reject(error);\n    httpResponse.destroy(error);\n  }).pipe(fs.createWriteStream(destinationPath)).on('error', function (error) {\n    reject(error);\n    httpResponse.destroy(error);\n  }).on('close', e => {\n    resolve();\n  }));\n  const doDownloadTasks = async tasks => {\n    await Promise.all(tasks.map(task => checkHost(task.url).then(initDownload).then(res => {\n      task.res = res;\n    }, error => {\n      task.error = error;\n    })));\n    if (dirSizeLimit) {\n      let totalSize = 0;\n      for (const task of tasks) {\n        if (task.error) {\n          continue;\n        }\n        const fileSize = getSize(task.res.headers);\n        if (totalSize + fileSize >= dirSizeLimit) {\n          const e = new Error(`Cannot download ${task.url} because destination ` + 'directory reached size limit');\n          task.error = e;\n          task.res.destroy(e);\n        } else {\n          totalSize += fileSize;\n        }\n      }\n    }\n    await Promise.all(tasks.map(task => {\n      if (!task.error) {\n        return downloadAndSave(task.node, task.url, task.res, task.destination).catch(error => {\n          task.error = error;\n        });\n      } else {\n        return null;\n      }\n    }));\n  };\n  const doLocalCopyTasks = tasks => Promise.all(tasks.map(task => {\n    if (task.localSourcePath.includes('../')) {\n      task.error = new Error(`Dangerous absolute image URL detected: ${task.localSourcePath}`);\n      task.error.replaceWithDefault = defaultOn && defaultOn.invalidPath;\n\n      // eslint-disable-next-line array-callback-return\n      return;\n    }\n    return checkAndCopy(task.localSourcePath, task.destination).catch(error => {\n      task.error = error;\n    });\n  }));\n  return async function transform(tree, vfile) {\n    if (disabled) return;\n\n    // images are downloaded to destinationPath\n    const destinationPath = path.join(downloadDestination, shortid.generate());\n    // allow to fallback when image is not found\n    const defaultImageDestination = defaultImagePath ? path.join(downloadDestination, defaultImagePath) : false;\n    let downloadTasks = [];\n    let localCopyTasks = [];\n    visit(tree, 'image', async node => {\n      const {\n        url,\n        position\n      } = node;\n\n      // Empty URL make nasty error messages, so ignore them\n      if (!url) {\n        vfile.message('URL is empty', position);\n        return;\n      }\n      let parsedURI;\n      try {\n        parsedURI = new URL(url);\n      } catch (error) {\n        try {\n          // If the URL was invalid, it might be a local file\n          parsedURI = new URL(url, 'file://');\n        } catch (_) {\n          vfile.message(`Invalid URL: ${url}`, position, url);\n          return;\n        }\n      }\n      const extension = path.extname(parsedURI.pathname);\n      const filename = `${shortid.generate()}${extension}`;\n      const destination = path.join(destinationPath, filename);\n      if (!parsedURI.host) {\n        let localPath;\n        if (typeof localUrlToLocalPath === 'function') {\n          localPath = localUrlToLocalPath(url);\n        } else if (Array.isArray(localUrlToLocalPath) && localUrlToLocalPath.length === 2) {\n          const [from, to] = localUrlToLocalPath;\n          localPath = url.replace(new RegExp(`^${from}`), to);\n        } else {\n          return;\n        }\n        localCopyTasks.push({\n          node,\n          url,\n          destination,\n          localSourcePath: localPath\n        });\n        return;\n      }\n      if (!['http:', 'https:'].includes(parsedURI.protocol)) {\n        vfile.message(`Protocol '${parsedURI.protocol}' not allowed.`, position, url);\n        return;\n      }\n      downloadTasks.push({\n        node,\n        url,\n        destination\n      });\n    });\n\n    // Group by URL in order to download each file only once\n    const groupTasksByUrl = tasks => {\n      const map = new Map();\n      for (const task of tasks) {\n        const otherTasks = map.get(task.url) || [];\n        map.set(task.url, otherTasks.concat([task]));\n      }\n      return Array.from(map.values()).map(taskGroup => Object.assign({}, taskGroup[0], {\n        nodes: taskGroup.map(t => t.node)\n      }));\n    };\n    downloadTasks = groupTasksByUrl(downloadTasks);\n    localCopyTasks = groupTasksByUrl(localCopyTasks);\n    const tasks = downloadTasks.concat(localCopyTasks);\n    if (!tasks.length) {\n      return tree;\n    }\n    let successfulTasks = [];\n    await mkdir(destinationPath);\n    try {\n      await Promise.all([doDownloadTasks(downloadTasks), doLocalCopyTasks(localCopyTasks)]);\n      const failedTasks = tasks.filter(t => t.error);\n      successfulTasks = tasks.filter(t => !t.error);\n      for (const task of failedTasks) {\n        for (const node of task.nodes) {\n          // mutates the AST even in case of error if requested\n          if (defaultImageDestination && task.error.replaceWithDefault) {\n            node.url = defaultImageDestination;\n          }\n          vfile.message(task.error, node.position, task.url);\n        }\n      }\n      for (const task of successfulTasks) {\n        for (const node of task.nodes) {\n          // mutates the AST!\n          node.url = task.destination;\n        }\n      }\n    } catch (err) {\n      vfile.message(err);\n      await promisify(rimraf)(destinationPath);\n    }\n    if (successfulTasks.length) {\n      vfile.data.imageDir = destinationPath;\n    } else {\n      await promisify(rimraf)(destinationPath);\n    }\n    return tree;\n  };\n}\nmodule.exports = plugin;"
  },
  {
    "path": "packages/remark-images-download/package.json",
    "content": "{\n  \"name\": \"remark-images-download\",\n  \"version\": \"3.0.5\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-images-download\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"clone\": \"^2.1.2\",\n    \"file-type\": \"^14.6.2\",\n    \"ip-address\": \"^8.1.0\",\n    \"is-svg\": \"~4.2.1\",\n    \"read-chunk\": \"^3.2.0\",\n    \"rimraf\": \"^3.0.2\",\n    \"shortid\": \"^2.2.15\",\n    \"unist-util-visit\": \"^2.0.3\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-images-download/src/index.js",
    "content": "const dns = require('dns')\nconst fs = require('fs')\nconst http = require('http')\nconst https = require('https')\nconst path = require('path')\nconst { promisify } = require('util')\nconst { Transform } = require('stream')\nconst { URL } = require('url')\n\nconst { Address4, Address6 } = require('ip-address')\nconst FileType = require('file-type')\nconst isSvg = require('is-svg')\nconst shortid = require('shortid')\nconst visit = require('unist-util-visit')\nconst rimraf = require('rimraf')\n\nconst isImage = (headers) => {\n  return (headers['content-type'].substring(0, 6) === 'image/')\n}\n\nconst getSize = (headers = {}) => {\n  const size = parseInt(headers['content-length'], 10)\n  if (Number.isNaN(size)) {\n    return 0\n  }\n  return size\n}\n\nconst mkdir = (path) => new Promise((resolve, reject) => {\n  fs.mkdir(path, (err) => {\n    if (err) reject(new Error(`Failed to create dir ${path}`))\n    resolve()\n  })\n})\n\nconst checkFileType = async (name, data) => {\n  if (!data.length) {\n    throw new Error(`Empty file: ${name}`)\n  }\n\n  return FileType.fromBuffer(data)\n    .catch(() => {})\n    .then((type = { mime: '' }) => {\n      if (!type.mime || type.mime === 'application/xml') {\n        if (!isSvg(data.toString())) {\n          return Promise.reject(new Error(`Could not detect ${name} mime type, not SVG either`))\n        }\n      } else if (type.mime.slice(0, 6) !== 'image/') {\n        return Promise.reject(new Error(\n          `Detected mime of local file '${name}' is not an image/ type`))\n      }\n      return Promise.resolve()\n    })\n}\n\n// Creates a Transform stream which raises an error if the file type\n// is wrong or if the file is not a image.\nconst makeValidatorStream = (fileName, maxSize) => {\n  let firstChunk = true\n  let totalSize = 0\n\n  return new Transform({\n    flush (cb) {\n      if (totalSize === 0) {\n        cb(new Error(`File at ${fileName} is empty`))\n        return\n      }\n      cb(null)\n    },\n\n    transform (chunk, encoding, cb) {\n      totalSize += chunk.length\n\n      if (maxSize && maxSize < totalSize) {\n        cb(new Error(`File at ${fileName} weighs more than ${maxSize}`))\n        return\n      }\n\n      if (firstChunk) {\n        checkFileType(fileName, chunk)\n          .then(() => {\n            firstChunk = false\n            cb(null, chunk)\n          })\n          .catch((error) => {\n            cb(error)\n          })\n      } else {\n        cb(null, chunk)\n      }\n    }\n  })\n}\n\nconst FORBIDDEN_IPV4 = [\n  '10.0.0.0/8',\n  '172.16.0.0/12',\n  '192.168.0.0/16',\n  '192.18.0.0/15'\n].map(a => new Address4(a))\n\nconst FORBIDDEN_IPV6 = [\n  'fc0::/7',\n  'fe80::/10'\n].map(a => new Address6(a))\n\nconst checkHost = async rawUrl => {\n  const url = new URL(rawUrl)\n  const unbracketedHost = url.hostname.replace(/^\\[/, '').replace(/\\]$/, '')\n\n  // Check for IP in hostname\n  let ipv4 = Address4.isValid(url.hostname) && url.hostname\n  let ipv6 = Address6.isValid(unbracketedHost) && unbracketedHost\n\n  // Try to resolve hostname\n  if (!ipv4 && !ipv6) {\n    const { address, family } = await promisify(dns.lookup)(url.hostname)\n\n    if (family === 4) {\n      ipv4 = address\n    } else {\n      ipv6 = address\n    }\n  }\n\n  const ipv4Resolved = Boolean(ipv4)\n  const ipv6Resolved = Boolean(ipv6)\n\n  // Match forbidden ranges\n  if (ipv4Resolved) {\n    ipv4 = new Address4(ipv4)\n    ipv4 = FORBIDDEN_IPV4.reduce((acc, cur) => acc && !ipv4.isInSubnet(cur), true) && ipv4\n  }\n\n  if (ipv6Resolved) {\n    ipv6 = new Address6(ipv6)\n\n    // IPv6to4 addresses are handled separately\n    if (ipv6.is6to4()) {\n      const ipv6to4 = new Address4(ipv6.to4())\n      ipv6 = FORBIDDEN_IPV4.reduce((acc, cur) => acc && !ipv6to4.isInSubnet(cur), true) && ipv6\n    } else {\n      ipv6 = FORBIDDEN_IPV6.reduce((acc, cur) => acc && !ipv6.isInSubnet(cur), true) && ipv6\n    }\n  }\n\n  if ((ipv4Resolved && !ipv4) || (ipv6Resolved && !ipv6)) {\n    throw new Error('IP resolved in a forbidden range')\n  }\n\n  return rawUrl\n}\n\nfunction plugin ({\n  disabled = false,\n  maxFileSize = 1000000,\n  dirSizeLimit = 10000000,\n  downloadDestination = '/tmp',\n  defaultImagePath = false,\n  defaultOn = {\n    statusCode: false,\n    mimeType: false,\n    fileTooBig: false,\n    invalidPath: false\n  },\n  localUrlToLocalPath,\n  httpRequestTimeout = 5000 // in milliseconds\n} = {}) {\n  // Sends an HTTP request, checks headers and resolves a readable stream\n  // if headers are valid.\n  // Rejects with an error if headers are invalid.\n  const initDownload = url =>\n    new Promise((resolve, reject) => {\n      const packageInfo = require('../package.json')\n      const parsedUrl = new URL(url)\n      const proto = parsedUrl.protocol === 'https:' ? https : http\n      const reqOptions = {\n        timeout: httpRequestTimeout,\n        // Websites may refuse connection if there is no User-Agent\n        // (see for instance https://meta.wikimedia.org/wiki/User-Agent_policy)\n        headers: {\n          'User-Agent': `${packageInfo.name} bot/${packageInfo.version} (${\n            packageInfo.repository.url})`\n        }\n      }\n\n      const req = proto.get(parsedUrl, reqOptions, res => {\n        const { headers, statusCode } = res\n        let error\n\n        const fileSize = getSize(headers)\n\n        if (statusCode !== 200) {\n          error = new Error(`Received HTTP${statusCode} for: ${url}`)\n          error.replaceWithDefault = defaultOn && defaultOn.statusCode\n        } else if (!isImage(headers)) {\n          error = new Error(`Content-Type of ${url} is not an image/ type`)\n          error.replaceWithDefault = defaultOn && defaultOn.mimeType\n        } else if (maxFileSize && fileSize > maxFileSize) {\n          error = new Error(\n            `File at ${url} weighs ${headers['content-length']}, ` +\n            `max size is ${maxFileSize}`\n          )\n          error.replaceWithDefault = defaultOn && defaultOn.fileTooBig\n        }\n\n        if (error) {\n          req.destroy()\n          res.resume()\n          reject(error)\n          return\n        }\n\n        resolve(res)\n      })\n\n      req.on('timeout', () => {\n        req.destroy()\n        reject(new Error(`Request for ${url} timed out`))\n      })\n\n      req.on('error', err => {\n        if (err.errors) {\n          const errorCodes = err.errors.map(e => e.code)\n          // Node > 18 issues two requests: IPv4 and IPv6, timeout is\n          // not handled by default if one of them throws unreachable\n          if (errorCodes.length === 2 &&\n              errorCodes.includes('ETIMEDOUT') &&\n              errorCodes.includes('ENETUNREACH')) {\n            req.emit('timeout')\n          }\n        }\n        reject(err)\n      })\n    })\n\n  const checkAndCopy = async (from, to) => {\n    const data = await promisify(fs.readFile)(from)\n      .catch(e => {\n        e.replaceWithDefault = defaultOn && defaultOn.invalidPath\n        throw e\n      })\n    await checkFileType(from, data)\n    try {\n      await promisify(fs.copyFile)(from, to)\n    } catch (err) {\n      throw new Error(`Failed to copy ${from} to ${to}`)\n    }\n  }\n\n  const downloadAndSave = (node, sourceUrl, httpResponse, destinationPath) =>\n    new Promise((resolve, reject) =>\n      httpResponse\n        .on('error', function (error) {\n          reject(error)\n          httpResponse.destroy(error)\n        })\n        .pipe(makeValidatorStream(sourceUrl, maxFileSize))\n        .on('error', function (error) {\n          reject(error)\n          httpResponse.destroy(error)\n        })\n        .pipe(fs.createWriteStream(destinationPath))\n        .on('error', function (error) {\n          reject(error)\n          httpResponse.destroy(error)\n        })\n        .on('close', e => {\n          resolve()\n        })\n    )\n\n  const doDownloadTasks = async tasks => {\n    await Promise.all(tasks.map(task =>\n      checkHost(task.url)\n        .then(initDownload)\n        .then(\n          res => { task.res = res },\n          error => { task.error = error }\n        )\n    ))\n\n    if (dirSizeLimit) {\n      let totalSize = 0\n      for (const task of tasks) {\n        if (task.error) {\n          continue\n        }\n\n        const fileSize = getSize(task.res.headers)\n        if ((totalSize + fileSize) >= dirSizeLimit) {\n          const e = new Error(`Cannot download ${task.url} because destination ` +\n            'directory reached size limit')\n          task.error = e\n          task.res.destroy(e)\n        } else {\n          totalSize += fileSize\n        }\n      }\n    }\n\n    await Promise.all(tasks.map(task => {\n      if (!task.error) {\n        return downloadAndSave(task.node, task.url, task.res, task.destination)\n          .catch(error => { task.error = error })\n      } else {\n        return null\n      }\n    }))\n  }\n\n  const doLocalCopyTasks = tasks =>\n    Promise.all(tasks.map(task => {\n      if (task.localSourcePath.includes('../')) {\n        task.error = new Error(`Dangerous absolute image URL detected: ${task.localSourcePath}`)\n        task.error.replaceWithDefault = defaultOn && defaultOn.invalidPath\n\n        // eslint-disable-next-line array-callback-return\n        return\n      }\n\n      return checkAndCopy(task.localSourcePath, task.destination)\n        .catch(error => { task.error = error })\n    }))\n\n  return async function transform (tree, vfile) {\n    if (disabled) return\n\n    // images are downloaded to destinationPath\n    const destinationPath = path.join(downloadDestination, shortid.generate())\n    // allow to fallback when image is not found\n    const defaultImageDestination = defaultImagePath\n      ? path.join(downloadDestination, defaultImagePath)\n      : false\n\n    let downloadTasks = []\n    let localCopyTasks = []\n\n    visit(tree, 'image', async node => {\n      const { url, position } = node\n\n      // Empty URL make nasty error messages, so ignore them\n      if (!url) {\n        vfile.message('URL is empty', position)\n        return\n      }\n\n      let parsedURI\n      try {\n        parsedURI = new URL(url)\n      } catch (error) {\n        try {\n          // If the URL was invalid, it might be a local file\n          parsedURI = new URL(url, 'file://')\n        } catch (_) {\n          vfile.message(`Invalid URL: ${url}`, position, url)\n          return\n        }\n      }\n\n      const extension = path.extname(parsedURI.pathname)\n      const filename = `${shortid.generate()}${extension}`\n      const destination = path.join(destinationPath, filename)\n\n      if (!parsedURI.host) {\n        let localPath\n        if (typeof localUrlToLocalPath === 'function') {\n          localPath = localUrlToLocalPath(url)\n        } else if (Array.isArray(localUrlToLocalPath) && localUrlToLocalPath.length === 2) {\n          const [from, to] = localUrlToLocalPath\n          localPath = url.replace(new RegExp(`^${from}`), to)\n        } else {\n          return\n        }\n\n        localCopyTasks.push({ node, url, destination, localSourcePath: localPath })\n\n        return\n      }\n\n      if (!['http:', 'https:'].includes(parsedURI.protocol)) {\n        vfile.message(`Protocol '${parsedURI.protocol}' not allowed.`, position, url)\n        return\n      }\n\n      downloadTasks.push({ node, url, destination })\n    })\n\n    // Group by URL in order to download each file only once\n    const groupTasksByUrl = tasks => {\n      const map = new Map()\n      for (const task of tasks) {\n        const otherTasks = map.get(task.url) || []\n        map.set(task.url, otherTasks.concat([task]))\n      }\n\n      return Array.from(map.values())\n        .map(taskGroup =>\n          Object.assign(\n            {},\n            taskGroup[0],\n            { nodes: taskGroup.map(t => t.node) }\n          )\n        )\n    }\n\n    downloadTasks = groupTasksByUrl(downloadTasks)\n    localCopyTasks = groupTasksByUrl(localCopyTasks)\n\n    const tasks = downloadTasks.concat(localCopyTasks)\n    if (!tasks.length) {\n      return tree\n    }\n\n    let successfulTasks = []\n\n    await mkdir(destinationPath)\n\n    try {\n      await Promise.all([\n        doDownloadTasks(downloadTasks),\n        doLocalCopyTasks(localCopyTasks)\n      ])\n\n      const failedTasks = tasks.filter(t => t.error)\n      successfulTasks = tasks.filter(t => !t.error)\n\n      for (const task of failedTasks) {\n        for (const node of task.nodes) {\n          // mutates the AST even in case of error if requested\n          if (defaultImageDestination && task.error.replaceWithDefault) {\n            node.url = defaultImageDestination\n          }\n\n          vfile.message(task.error, node.position, task.url)\n        }\n      }\n      for (const task of successfulTasks) {\n        for (const node of task.nodes) {\n          // mutates the AST!\n          node.url = task.destination\n        }\n      }\n    } catch (err) {\n      vfile.message(err)\n      await promisify(rimraf)(destinationPath)\n    }\n\n    if (successfulTasks.length) {\n      vfile.data.imageDir = destinationPath\n    } else {\n      await promisify(rimraf)(destinationPath)\n    }\n\n    return tree\n  }\n}\n\nmodule.exports = plugin\n"
  },
  {
    "path": "packages/remark-kbd/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-kbd/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-kbd/README.md",
    "content": "# remark-kbd [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis plugin parses custom Markdown syntax to handle keyboard keys.\nIt adds a new node type to the [mdast][mdast] produced by [remark][remark]: `kbd`\n\nIf you are using [rehype][rehype], the stringified HTML result will be `<kbd>`.\n\n## Syntax\n\n```markdown\nHit ||enter|| twice to create a new paragraph.\n```\n\n## AST (see [mdast][mdast] specification)\n\n`Kbd` ([`Parent`][parent]) represents a reference to a user.\n\n```javascript\ninterface Kbd <: Parent {\n  type: \"kbd\";\n}\n```\n\nFor example, the following markdown:\n\n`||enter||`\n\nYields:\n\n```javascript\n{\n  type: 'kbd',\n  children: [{\n    type: 'text',\n    value: 'enter'\n  }]\n}\n```\n\n## Rehype\n\nThis plugin is compatible with [rehype][rehype]. `Kbd` mdast nodes will become `<kbd>contents</kbd>`.\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-kbd\n```\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkKbd = require('remark-kbd')\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkKbd)\n  .use(remark2rehype)\n  .use(stringify)\n```\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-kbd/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-kbd\n\n[mdast]: https://github.com/syntax-tree/mdast/blob/master/readme.md\n\n[remark]: https://github.com/remarkjs/remark\n\n[rehype]: https://github.com/rehypejs/rehype\n\n[parent]: https://github.com/syntax-tree/unist#parent\n"
  },
  {
    "path": "packages/remark-kbd/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`allow different left-right characters 1`] = `\"<p><kbd>CTRL</kbd>+<kbd>ALT</kbd>+<kbd>SUPPR</kbd></p>\"`;\n\nexports[`allow non-pipe characters 1`] = `\"<p><kbd>CTRL</kbd>, +<kbd>D</kbd></p>\"`;\n\nexports[`parses kbd parses a big fixture 1`] = `\n\"<p>Blabla <kbd>ok</kbd> kxcvj <kbd>ok foo</kbd> sdff</p>\n<p>sdf |||| df</p>\n<p>sfdgs | | dfg || dgsg | qs</p>\n<p>With two pipes: ||key|| you'll get <kbd>key</kbd>.</p>\n<p>It can contain inline markdown:</p>\n<ul>\n<li><kbd>hell<a href=\\\\\"#he\\\\\"><del>o</del></a>?</kbd></li>\n</ul>\n<p>It cannot contain blocks:</p>\n<ul>\n<li><kbd>hello: [[secret]]?</kbd></li>\n</ul>\"\n`;\n\nexports[`to markdown 1`] = `\n\"Blabla ||ok|| kxcvj ||ok foo|| sdff\n\nsdf |||| df\n\nsfdgs | | dfg || dgsg | qs\n\nWith two pipes: \\\\\\\\||key|| you'll get ||key||.\n\nIt can contain inline markdown:\n\n-   ||hell[~~o~~](#he)?||\n\nIt cannot contain blocks:\n\n-   ||hello: \\\\\\\\[[secret]]?||\n\"\n`;\n"
  },
  {
    "path": "packages/remark-kbd/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport remarkStringify from 'remark-stringify'\nimport rehypeStringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\nimport remarkCustomBlocks from '../../remark-custom-blocks'\n\nimport plugin from '../src/'\n\nconst render = text => unified()\n  .use(reParse, {\n    footnotes: true,\n  })\n  .use(remarkCustomBlocks, {\n    secret: 'spoiler',\n  })\n  .use(plugin)\n  .use(remark2rehype)\n  .use(rehypeStringify)\n  .processSync(text)\n\nconst fixture = dedent`\n  Blabla ||ok|| kxcvj ||ok foo|| sdff\n\n  sdf |||| df\n\n  sfdgs | | dfg || dgsg | qs\n\n  With two pipes: \\||key|| you'll get ||key||.\n\n  It can contain inline markdown:\n\n  * ||hell[~~o~~](#he)?||\n\n  It cannot contain blocks:\n\n  * ||hello: [[secret]]?||\n`\n\n\ndescribe('parses kbd', () => {\n  it('parses a big fixture', () => {\n    const {contents} = render(fixture)\n    expect(contents).toMatchSnapshot()\n  })\n\n  it('escapes the start marker', () => {\n    const {contents} = render(dedent`\n      ||one|| \\||escaped|| ||three|| \\|||four|| ||five||\n    `)\n    expect(contents).toContain('||escaped||')\n    expect(contents).toContain('|<kbd>four</kbd>')\n  })\n})\n\ntest('allow non-pipe characters', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(plugin, {charLeft: '+', charRight: '+'})\n    .use(remark2rehype)\n    .use(rehypeStringify)\n    .processSync('++CTRL++, \\\\+++D++')\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('allow different left-right characters', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(plugin, {charLeft: '[', charRight: ']'})\n    .use(remark2rehype)\n    .use(rehypeStringify)\n    .processSync('[[CTRL]]+[[ALT]]+[[SUPPR]]')\n\n  expect(contents).toMatchSnapshot()\n})\n\ntest('to markdown', () => {\n  const {contents} = unified()\n    .use(reParse)\n    .use(remarkStringify)\n    .use(plugin)\n    .processSync(fixture)\n\n  expect(contents).toMatchSnapshot()\n})\n"
  },
  {
    "path": "packages/remark-kbd/dist/index.js",
    "content": "\"use strict\";\n\nconst whitespace = require('is-whitespace-character');\nconst DEFAULT_LEFT = '|';\nconst DEFAULT_RIGHT = '|';\nfunction plugin(config) {\n  const CHAR_LEFT = config && config.charLeft || DEFAULT_LEFT;\n  const CHAR_RIGHT = config && config.charRight || DEFAULT_RIGHT;\n  const DOUBLE_LEFT = CHAR_LEFT + CHAR_LEFT;\n  const DOUBLE_RIGHT = CHAR_RIGHT + CHAR_RIGHT;\n  function locator(value, fromIndex) {\n    const index = value.indexOf(DOUBLE_LEFT, fromIndex);\n    return index;\n  }\n  function inlineTokenizer(eat, value, silent) {\n    if (!this.options.gfm || value.substr(0, 2) !== DOUBLE_LEFT || value.substr(0, 4) === DOUBLE_LEFT + DOUBLE_RIGHT || whitespace(value.charAt(2))) {\n      return;\n    }\n    let character = '';\n    let previous = '';\n    let preceding = '';\n    let subvalue = '';\n    let index = 1;\n    const length = value.length;\n    const now = eat.now();\n    now.column += 2;\n    now.offset += 2;\n    while (++index < length) {\n      character = value.charAt(index);\n      if (character === CHAR_RIGHT && previous === CHAR_RIGHT && (!preceding || !whitespace(preceding))) {\n        /* istanbul ignore if - never used (yet) */\n        if (silent) return true;\n        return eat(DOUBLE_LEFT + subvalue + DOUBLE_RIGHT)({\n          type: 'kbd',\n          children: this.tokenizeInline(subvalue, now),\n          data: {\n            hName: 'kbd'\n          }\n        });\n      }\n      subvalue += previous;\n      preceding = previous;\n      previous = character;\n    }\n  }\n  inlineTokenizer.locator = locator;\n  const Parser = this.Parser;\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers;\n  const inlineMethods = Parser.prototype.inlineMethods;\n  inlineTokenizers.kbd = inlineTokenizer;\n  inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'kbd');\n  const Compiler = this.Compiler;\n\n  // Stringify\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors;\n    visitors.kbd = function (node) {\n      return `${DOUBLE_LEFT}${this.all(node).join('')}${DOUBLE_RIGHT}`;\n    };\n  }\n}\nmodule.exports = plugin;"
  },
  {
    "path": "packages/remark-kbd/package.json",
    "content": "{\n  \"name\": \"remark-kbd\",\n  \"version\": \"1.1.1\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-kbd\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"is-whitespace-character\": \"^1.0.4\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-kbd/src/index.js",
    "content": "const whitespace = require('is-whitespace-character')\n\nconst DEFAULT_LEFT = '|'\nconst DEFAULT_RIGHT = '|'\n\nfunction plugin (config) {\n  const CHAR_LEFT = (config && config.charLeft) || DEFAULT_LEFT\n  const CHAR_RIGHT = (config && config.charRight) || DEFAULT_RIGHT\n\n  const DOUBLE_LEFT = CHAR_LEFT + CHAR_LEFT\n  const DOUBLE_RIGHT = CHAR_RIGHT + CHAR_RIGHT\n\n  function locator (value, fromIndex) {\n    const index = value.indexOf(DOUBLE_LEFT, fromIndex)\n    return index\n  }\n\n  function inlineTokenizer (eat, value, silent) {\n    if (\n      !this.options.gfm ||\n      (value.substr(0, 2) !== DOUBLE_LEFT) ||\n      (value.substr(0, 4) === (DOUBLE_LEFT + DOUBLE_RIGHT)) ||\n      whitespace(value.charAt(2))\n    ) {\n      return\n    }\n\n    let character = ''\n    let previous = ''\n    let preceding = ''\n    let subvalue = ''\n    let index = 1\n    const length = value.length\n    const now = eat.now()\n    now.column += 2\n    now.offset += 2\n\n    while (++index < length) {\n      character = value.charAt(index)\n\n      if (\n        character === CHAR_RIGHT &&\n        previous === CHAR_RIGHT &&\n        (!preceding || !whitespace(preceding))\n      ) {\n        /* istanbul ignore if - never used (yet) */\n        if (silent) return true\n\n        return eat(DOUBLE_LEFT + subvalue + DOUBLE_RIGHT)({\n          type: 'kbd',\n          children: this.tokenizeInline(subvalue, now),\n          data: {\n            hName: 'kbd'\n          }\n        })\n      }\n\n      subvalue += previous\n      preceding = previous\n      previous = character\n    }\n  }\n\n  inlineTokenizer.locator = locator\n\n  const Parser = this.Parser\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers\n  const inlineMethods = Parser.prototype.inlineMethods\n  inlineTokenizers.kbd = inlineTokenizer\n  inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'kbd')\n\n  const Compiler = this.Compiler\n\n  // Stringify\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors\n    visitors.kbd = function (node) {\n      return `${DOUBLE_LEFT}${this.all(node).join('')}${DOUBLE_RIGHT}`\n    }\n  }\n}\n\nmodule.exports = plugin\n"
  },
  {
    "path": "packages/remark-numbered-footnotes/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-numbered-footnotes/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-numbered-footnotes/README.md",
    "content": "This plugin replaces the footnote references with a number sequence (starting from 1) in the same order as the footnote definitions (**not** the footnote references).\n\nReordering the definitions (usually put at the end of the document in the Markdown source) will therefore let you reorder the sequence.\n\nThis is useful if you want your footnotes to be superscript numbers without having to manually enter them while keeping the benefit of using strings that make sense to you in your Markdown source.\n\n# Warning\n\nIf you are using this plugin, your project is most certainly relying on [mdast-util-to-hast](https://github.com/syntax-tree/mdast-util-to-hast). Run `npm ls mdast-util-to-hast` if you're unsure.\nStarting from `mdast-util-to-hast@6.0.0`, the [footnote order changed](https://github.com/syntax-tree/mdast-util-to-hast/commit/fd38c45421bbec497f56e5c624eb8652d3a3bba4). Before `6.0.0`, footnotes were following the order in which they were defined, starting from `6.0.0` they follow the order of the references.\n\n```md\na[^first_footnote_reference]\n\nb[^`b` second footnote reference but first footnote definition]\n\nc[^last_footnote_reference]\n\n[^last_footnote_reference]: `c` last footnote reference but second footnote definition\n[^first_footnote_reference]: `a` first footnote reference but last footnote definition\n```\n\nBefore `6.0.0`:\n\n![image](https://user-images.githubusercontent.com/2022803/73589529-7207e980-44d7-11ea-8c67-cd8a20d961fe.png)\n\nAfter `6.0.0`:\n\n![image](https://user-images.githubusercontent.com/2022803/73589535-7cc27e80-44d7-11ea-90e0-3e0e0dbac87c.png)\n\nIn the HTML ordered list, the list items 1/2/3 don't match the footnote references numbers anymore.\n\nTo avoid this issue you can either use older versions of your dependencies (not recommended) or visit the HAST tree after `mdast-util-to-hast` to fix the footnote orders (recommended).\n[Here is an example](https://github.com/zestedesavoir/zmarkdown/blob/7edd73057aba4eba52600106c6f8511619f045bd/packages/zmarkdown/common.js#L175-L206).\nThis way the above markdown will always generate HTML with matching footnote list items and footnote numbered references as can be seen below:\n\n![image](https://user-images.githubusercontent.com/2022803/73589529-7207e980-44d7-11ea-8c67-cd8a20d961fe.png)\n"
  },
  {
    "path": "packages/remark-numbered-footnotes/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`{\"gfm\":false,\"commonmark\":false} footnote-split 1`] = `\n\"<p>a<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup>b<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>c<sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-2\\\\\">first def<a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-1\\\\\">second def<a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-3\\\\\">third def<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":false} footnotes 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":false} footnotes with customized labelTemplate 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">[2]</a></sup> or more <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">[3]</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">[4]</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">[5]</a></sup>. One again: <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">[6]</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":false} footnotes with customized labelTemplate 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">[2]</a></sup> or more <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">[3]</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">[4]</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">[5]</a></sup>. One again: <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">[6]</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":false} regression-1 1`] = `\n\"<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">MyNote<a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":false} regression-2 1`] = `\n\"<p>1 <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>\n2 <sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup>\n3 <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup>\n4 <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>\n4 <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>\n5 <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">alpha bravo one<a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-2\\\\\">alpha bravo two<a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-3\\\\\">alpha bravo third<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-5\\\\\">foo<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-4\\\\\">alpha bravo fourth<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} footnote-split 1`] = `\n\"<p>a<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup>b<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>c<sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-2\\\\\">first def<a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-1\\\\\">second def<a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-3\\\\\">third def<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} footnotes 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} footnotes with customized labelTemplate 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">[2]</a></sup> or more <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">[3]</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">[4]</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">[5]</a></sup>. One again: <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">[6]</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} footnotes with customized labelTemplate 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">[2]</a></sup> or more <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">[3]</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">[4]</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">[5]</a></sup>. One again: <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">[6]</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} regression-1 1`] = `\n\"<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">MyNote<a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":false,\"commonmark\":true} regression-2 1`] = `\n\"<p>1 <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>\n2 <sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup>\n3 <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup>\n4 <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>\n4 <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>\n5 <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">alpha bravo one<a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-2\\\\\">alpha bravo two<a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-3\\\\\">alpha bravo third<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-5\\\\\">foo<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-4\\\\\">alpha bravo fourth<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} footnote-split 1`] = `\n\"<p>a<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup>b<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>c<sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-2\\\\\">first def<a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-1\\\\\">second def<a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-3\\\\\">third def<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} footnotes 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} footnotes with customized labelTemplate 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">[2]</a></sup> or more <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">[3]</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">[4]</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">[5]</a></sup>. One again: <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">[6]</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} footnotes with customized labelTemplate 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">[2]</a></sup> or more <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">[3]</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">[4]</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">[5]</a></sup>. One again: <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">[6]</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} regression-1 1`] = `\n\"<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">MyNote<a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":false} regression-2 1`] = `\n\"<p>1 <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>\n2 <sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup>\n3 <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup>\n4 <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>\n4 <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>\n5 <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">alpha bravo one<a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-2\\\\\">alpha bravo two<a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-3\\\\\">alpha bravo third<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-5\\\\\">foo<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-4\\\\\">alpha bravo fourth<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} footnote-split 1`] = `\n\"<p>a<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup>b<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>c<sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-2\\\\\">first def<a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-1\\\\\">second def<a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-3\\\\\">third def<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} footnotes 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>. One again: <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} footnotes with customized labelTemplate 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">[2]</a></sup> or more <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">[3]</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">[4]</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">[5]</a></sup>. One again: <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">[6]</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} footnotes with customized labelTemplate 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup> or two<sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">[2]</a></sup> or more <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">[3]</a></sup> <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">[4]</a></sup> <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">[5]</a></sup>. One again: <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">[1]</a></sup></p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6\\\\\"><a href=\\\\\"#fn-6\\\\\" class=\\\\\"footnote-ref\\\\\">[6]</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} regression-1 1`] = `\n\"<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>a<sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup><sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">MyNote<a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`{\"gfm\":true,\"commonmark\":true} regression-2 1`] = `\n\"<p>1 <sup id=\\\\\"fnref-1\\\\\"><a href=\\\\\"#fn-1\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup>\n2 <sup id=\\\\\"fnref-2\\\\\"><a href=\\\\\"#fn-2\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup>\n3 <sup id=\\\\\"fnref-3\\\\\"><a href=\\\\\"#fn-3\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup>\n4 <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>\n4 <sup id=\\\\\"fnref-5\\\\\"><a href=\\\\\"#fn-5\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>\n5 <sup id=\\\\\"fnref-4\\\\\"><a href=\\\\\"#fn-4\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1\\\\\">alpha bravo one<a href=\\\\\"#fnref-1\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-2\\\\\">alpha bravo two<a href=\\\\\"#fnref-2\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-3\\\\\">alpha bravo third<a href=\\\\\"#fnref-3\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-5\\\\\">foo<a href=\\\\\"#fnref-5\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n<li id=\\\\\"fn-4\\\\\">alpha bravo fourth<a href=\\\\\"#fnref-4\\\\\" class=\\\\\"footnote-backref\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n"
  },
  {
    "path": "packages/remark-numbered-footnotes/__tests__/fixtures/footnote-split.fixture.md",
    "content": "a[^first]b^[second def]c[^third]\n\n[^first]: first def\n[^third]: third def\n"
  },
  {
    "path": "packages/remark-numbered-footnotes/__tests__/fixtures/footnotes.fixture.md",
    "content": "This is the body with a footnote[^foo] or two[^bar] or more [^baz] [^qux] [^fiji]. One again: [^foo]\n\nAlso a reference that does not exist[^nope].\n\n[^foo]: Footnote that ends with a list:\n\n    * item 1\n    * item 2\n\n[^bar]: > This footnote is a blockquote.\n\n[^baz]: A simple oneliner.\n\n[^qux]: A footnote with multiple paragraphs.\n\n    Paragraph two.\n\n[^fiji]: First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...\n"
  },
  {
    "path": "packages/remark-numbered-footnotes/__tests__/fixtures/regression-1.fixture.md",
    "content": "a[^foo]\n\na[^foo][^foo]\n\na[^foo][^foo][^foo]\n\na[^foo][^foo][^foo][^foo]\n\na[^foo][^foo][^foo][^foo][^foo]\n\na[^foo][^foo][^foo][^foo][^foo][^foo]\n\n[^foo]: MyNote\n"
  },
  {
    "path": "packages/remark-numbered-footnotes/__tests__/fixtures/regression-2.fixture.md",
    "content": "1 ^[alpha bravo one]\n2 ^[alpha bravo two]\n3 ^[alpha bravo third]\n4 [^w]\n4 [^w]\n5 ^[alpha bravo fourth]\n\n[^w]: foo\n"
  },
  {
    "path": "packages/remark-numbered-footnotes/__tests__/index.js",
    "content": "import {readdirSync as directory, readFileSync as file} from 'fs'\nimport {join} from 'path'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport footnotes from 'remark-footnotes'\nimport stringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\n\nconst base = join(__dirname, 'fixtures')\nconst specs = directory(base).reduce((tests, contents) => {\n  const parts = contents.split('.')\n  if (!tests[parts[0]]) {\n    tests[parts[0]] = {}\n  }\n  tests[parts[0]][parts[1]] = file(join(base, contents), 'utf-8')\n  return tests\n}, {})\n\n\nconst configs = [\n  {\n    gfm: true,\n    commonmark: false,\n  },\n  {\n    gfm: false,\n    commonmark: false,\n  },\n  {\n    gfm: false,\n    commonmark: true,\n  },\n  {\n    gfm: true,\n    commonmark: true,\n  },\n]\n\nconfigs.forEach(config => {\n  describe(JSON.stringify(config), () => {\n    test('footnotes', () => {\n      const {contents} = unified()\n        .use(reParse, config)\n        .use(footnotes, {inlineNotes: true})\n        .use(require('../src'))\n        .use(remark2rehype)\n        .use(stringify)\n        .processSync(specs['footnotes'].fixture)\n\n      expect(contents).toMatchSnapshot()\n    })\n\n    test('regression-1', () => {\n      const {contents} = unified()\n        .use(reParse, config)\n        .use(footnotes, {inlineNotes: true})\n        .use(require('../src'))\n        .use(remark2rehype)\n        .use(stringify)\n        .processSync(specs['regression-1'].fixture)\n\n      expect(contents).toMatchSnapshot()\n    })\n\n    test('regression-2', () => {\n      const {contents} = unified()\n        .use(reParse, config)\n        .use(footnotes, {inlineNotes: true})\n        .use(require('../src'))\n        .use(remark2rehype)\n        .use(stringify)\n        .processSync(specs['regression-2'].fixture)\n\n      expect(contents).toMatchSnapshot()\n    })\n\n    test('footnote-split', () => {\n      const {contents} = unified()\n        .use(reParse, config)\n        .use(footnotes, {inlineNotes: true})\n        .use(require('../src'))\n        .use(remark2rehype)\n        .use(stringify)\n        .processSync(specs['footnote-split'].fixture)\n\n      expect(contents).toMatchSnapshot()\n    })\n\n    test('footnotes with customized labelTemplate', () => {\n      const {contents} = unified()\n        .use(reParse, config)\n        .use(footnotes, {inlineNotes: true})\n        .use(require('../src'), {labelPrefix: '[', labelSuffix: ']'})\n        .use(remark2rehype)\n        .use(stringify)\n        .processSync(specs['footnotes'].fixture)\n\n      expect(contents).toMatchSnapshot()\n    })\n  })\n})\n"
  },
  {
    "path": "packages/remark-numbered-footnotes/dist/index.js",
    "content": "\"use strict\";\n\nconst visit = require('unist-util-visit');\nfunction plugin({\n  labelPrefix = '',\n  labelSuffix = ''\n} = {}) {\n  function transformer(tree) {\n    const footnotes = {};\n    visit(tree, 'footnote', convert);\n    visit(tree, 'footnoteDefinition', createIds(footnotes));\n    visit(tree, 'footnoteReference', replaceIds(footnotes));\n  }\n  function createIds(footnotes) {\n    return (node, index, parent) => {\n      const identifier = node.identifier;\n      if (!Object.prototype.hasOwnProperty.call(footnotes, identifier)) {\n        footnotes[identifier] = Object.keys(footnotes).length + 1;\n      }\n      node.identifier = String(footnotes[identifier]);\n      node.label = `${labelPrefix}${footnotes[identifier]}${labelSuffix}`;\n    };\n  }\n  function replaceIds(footnotes) {\n    return (node, index, parent) => {\n      const identifier = node.identifier;\n      if (!Object.prototype.hasOwnProperty.call(footnotes, identifier)) {\n        footnotes[identifier] = Object.keys(footnotes).length + 1;\n      }\n      node.identifier = String(footnotes[identifier]);\n      node.label = `${labelPrefix}${footnotes[identifier]}${labelSuffix}`;\n    };\n  }\n  return transformer;\n}\nfunction convert(node, index, parent) {\n  const id = autoId(node.position.start);\n  const footnoteDefinition = {\n    type: 'footnoteDefinition',\n    identifier: id,\n    children: [{\n      type: 'paragraph',\n      children: node.children\n    }]\n  };\n  const footnoteReference = {\n    type: 'footnoteReference',\n    identifier: id\n  };\n  parent.children.splice(index, 1, footnoteReference, footnoteDefinition);\n}\nfunction autoId(node) {\n  const {\n    line,\n    column,\n    offset\n  } = node;\n  return `l${line}c${column}o${offset}`;\n}\nmodule.exports = plugin;"
  },
  {
    "path": "packages/remark-numbered-footnotes/package.json",
    "content": "{\n  \"name\": \"remark-numbered-footnotes\",\n  \"version\": \"3.1.1\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-numbered-footnotes\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"unist-util-visit\": \"^2.0.3\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-numbered-footnotes/src/index.js",
    "content": "const visit = require('unist-util-visit')\n\nfunction plugin ({ labelPrefix = '', labelSuffix = '' } = {}) {\n  function transformer (tree) {\n    const footnotes = {}\n    visit(tree, 'footnote', convert)\n\n    visit(tree, 'footnoteDefinition', createIds(footnotes))\n\n    visit(tree, 'footnoteReference', replaceIds(footnotes))\n  }\n\n  function createIds (footnotes) {\n    return (node, index, parent) => {\n      const identifier = node.identifier\n\n      if (!Object.prototype.hasOwnProperty.call(footnotes, identifier)) {\n        footnotes[identifier] = Object.keys(footnotes).length + 1\n      }\n      node.identifier = String(footnotes[identifier])\n      node.label = `${labelPrefix}${footnotes[identifier]}${labelSuffix}`\n    }\n  }\n\n  function replaceIds (footnotes) {\n    return (node, index, parent) => {\n      const identifier = node.identifier\n\n      if (!Object.prototype.hasOwnProperty.call(footnotes, identifier)) {\n        footnotes[identifier] = Object.keys(footnotes).length + 1\n      }\n      node.identifier = String(footnotes[identifier])\n      node.label = `${labelPrefix}${footnotes[identifier]}${labelSuffix}`\n    }\n  }\n\n  return transformer\n}\n\nfunction convert (node, index, parent) {\n  const id = autoId(node.position.start)\n  const footnoteDefinition = {\n    type: 'footnoteDefinition',\n    identifier: id,\n    children: [{\n      type: 'paragraph',\n      children: node.children\n    }]\n  }\n  const footnoteReference = {\n    type: 'footnoteReference',\n    identifier: id\n  }\n  parent.children.splice(index, 1, footnoteReference, footnoteDefinition)\n}\n\nfunction autoId (node) {\n  const { line, column, offset } = node\n  return `l${line}c${column}o${offset}`\n}\n\nmodule.exports = plugin\n"
  },
  {
    "path": "packages/remark-ping/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-ping/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-ping/README.md",
    "content": "# remark-ping [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis plugin parses custom Markdown syntax such as `@someone` or `@**nick with spaces**` to create links such as `/member/profile/someone` to the corresponding user page if this user exists in your system.\n\n## Default Syntax\n\n```markdown\n@username\n@**nick with spaces**\n```\n\n## AST (see [mdast][mdast] specification)\n\n`Ping` ([`Parent`][parent]) represents a reference to a user.\n\n```javascript\ninterface Ping <: Parent {\n  type: \"ping\";\n  url: \"member profile url\";\n  username: \"username\";\n}\n```\n\n## rehype\n\nThis plugin is compatible with [rehype][rehype]. `Ping` mdast nodes will become HTML links pointing to a customizable target, usually used to link to a user profile.\n\n```md\n@foo\n```\n\ngives:\n\n```html\n<a href=\"/custom/link/foo/\" rel=\"nofollow\" class=\"ping ping-link\">\n  @<span class=\"ping-username\">foo</span>\n</a>\n```\n\nPings are handled a bit differently if they are already inside of a link:\n\n```md\n[@foo](http://example.com)\n```\n\ngives:\n\n```html\n<a href=\"http://example.com\">\n  <span class=\"ping ping-in-link\">\n    @<span class=\"ping-username\">foo</span>\n  </span>\n</a>\n```\n\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-ping\n```\n\n## Usage\n\n### Dependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkPing = require('remark-ping')\n```\n\n### Usage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkPing, {\n      pingUsername: (username) => true,\n      userURL: (username) => `https://your.website.com/path/to/${username}`\n  })\n  .use(remark2rehype)\n  .use(stringify)\n```\n\nas you can see, `remark-ping` takes two mandatory options :\n\n- `pingUsername` is a function taking `username` as parameter and returning `true` if the user exists or should be pinged\n    - If you want to parse any username without checking whether they exist or (like GitHub does), use a function always returning `true` (`() => true`)\n    - When `pingUsername(username)` doesn't return `true`, the ping syntax is simply ignored and no AST `Ping` node gets created for this username\n- `userUrl` is a function taking `username` as parameter and returning a path or URL to this user profile or member page\n\nYou can override the default parsing regexp, for example if you don't want to include `@**username with space**` by setting up the `usernameRegex` option:\n\n```js\n  .use(remarkPing, {\n      pingUsername: (username) => true,\n      userURL: (username) => `https://your.website.com/path/to/${username}`,\n      usernameRegex: /[\\s'\"(,:<]?@(\\w+)/,\n  })\n```\n\n### Retrieving the usernames to ping\n\nOnce the Markdown has been processed by this plugin, the output `vfile` contains a `ping` array in the `data` property.\n\nThis array contains every username that should be ping, should you want your backend to generate notifications for these.\n\n```js\nunified()\n  .use(reParse)\n  .use(plugin, {pingUsername, userURL})\n  .use(remark2rehype)\n  .use(rehypeStringify)\n  .process('@foo @bar')\n  .then((vfile) => {\n    console.log(vfile.data.ping.length === 2) // true\n    console.log(vfile.data.ping[0] === 'foo') // true\n    console.log(vfile.data.ping[1] === 'bar') // true\n    return vfile\n  })\n```\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-ping/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-ping\n\n[mdast]: https://github.com/syntax-tree/mdast/blob/master/readme.md\n\n[rehype]: https://github.com/rehypejs/rehype\n\n[parent]: https://github.com/syntax-tree/unist#parent\n"
  },
  {
    "path": "packages/remark-ping/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`compiles to Markdown 1`] = `\n\"remark-ping: expected configuration to be passed: {\n  pingUsername: (username) => bool,\n  userURL: (username) => string\n}\"\n`;\n\nexports[`fixture suite 0 compiles to HTML: h0 1`] = `\n\"<p>ping @Clem</p>\n<p>ping @<strong>FOO BAR</strong></p>\n<p>no ping @quxjhdshqjkhfyhefezhjzjhdsjlfjlsqjdfjhsd</p>\n<p>ping <a href=\\\\\"http://example.com\\\\\"><span class=\\\\\"ping ping-in-link\\\\\">@<span class=\\\\\"ping-username\\\\\">I AM CLEM</span></span></a></p>\n<p><a href=\\\\\"/membres/voir/baz baz/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">baz baz</span></a></p>\"\n`;\n\nexports[`fixture suite 0 compiles to Markdown: m0 1`] = `\n\"ping @Clem\n\nping @**FOO BAR**\n\nno ping @quxjhdshqjkhfyhefezhjzjhdsjlfjlsqjdfjhsd\n\nping [@**I AM CLEM**](http://example.com)\n\n@**baz baz**\n\"\n`;\n\nexports[`fixture suite 0 parses: f0 1`] = `\nObject {\n  \"children\": Array [\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 11,\n              \"line\": 1,\n              \"offset\": 10,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 1,\n              \"offset\": 0,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"ping @Clem\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 11,\n          \"line\": 1,\n          \"offset\": 10,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 1,\n          \"offset\": 0,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 7,\n              \"line\": 3,\n              \"offset\": 18,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 3,\n              \"offset\": 12,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"ping @\",\n        },\n        Object {\n          \"children\": Array [\n            Object {\n              \"position\": Position {\n                \"end\": Object {\n                  \"column\": 16,\n                  \"line\": 3,\n                  \"offset\": 27,\n                },\n                \"indent\": Array [],\n                \"start\": Object {\n                  \"column\": 9,\n                  \"line\": 3,\n                  \"offset\": 20,\n                },\n              },\n              \"type\": \"text\",\n              \"value\": \"FOO BAR\",\n            },\n          ],\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 18,\n              \"line\": 3,\n              \"offset\": 29,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 7,\n              \"line\": 3,\n              \"offset\": 18,\n            },\n          },\n          \"type\": \"strong\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 18,\n          \"line\": 3,\n          \"offset\": 29,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 3,\n          \"offset\": 12,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 50,\n              \"line\": 5,\n              \"offset\": 80,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 5,\n              \"offset\": 31,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"no ping @quxjhdshqjkhfyhefezhjzjhdsjlfjlsqjdfjhsd\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 50,\n          \"line\": 5,\n          \"offset\": 80,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 5,\n          \"offset\": 31,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 6,\n              \"line\": 7,\n              \"offset\": 87,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 7,\n              \"offset\": 82,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"ping \",\n        },\n        Object {\n          \"children\": Array [\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"@\",\n                },\n                Object {\n                  \"children\": Array [\n                    Object {\n                      \"type\": \"text\",\n                      \"value\": \"I AM CLEM\",\n                    },\n                  ],\n                  \"data\": Object {\n                    \"hName\": \"span\",\n                    \"hProperties\": Object {\n                      \"class\": \"ping-username\",\n                    },\n                  },\n                  \"type\": \"emphasis\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"a\",\n                \"hProperties\": Object {\n                  \"class\": \"ping ping-link\",\n                  \"href\": \"/membres/voir/I AM CLEM/\",\n                  \"rel\": \"nofollow\",\n                },\n              },\n              \"position\": Position {\n                \"end\": Object {\n                  \"column\": 21,\n                  \"line\": 7,\n                  \"offset\": 102,\n                },\n                \"indent\": Array [],\n                \"start\": Object {\n                  \"column\": 7,\n                  \"line\": 7,\n                  \"offset\": 88,\n                },\n              },\n              \"type\": \"ping\",\n              \"url\": \"/membres/voir/I AM CLEM/\",\n              \"username\": \"I AM CLEM\",\n            },\n          ],\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 42,\n              \"line\": 7,\n              \"offset\": 123,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 6,\n              \"line\": 7,\n              \"offset\": 87,\n            },\n          },\n          \"title\": null,\n          \"type\": \"link\",\n          \"url\": \"http://example.com\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 42,\n          \"line\": 7,\n          \"offset\": 123,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 7,\n          \"offset\": 82,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"children\": Array [\n            Object {\n              \"type\": \"text\",\n              \"value\": \"@\",\n            },\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"baz baz\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"span\",\n                \"hProperties\": Object {\n                  \"class\": \"ping-username\",\n                },\n              },\n              \"type\": \"emphasis\",\n            },\n          ],\n          \"data\": Object {\n            \"hName\": \"a\",\n            \"hProperties\": Object {\n              \"class\": \"ping ping-link\",\n              \"href\": \"/membres/voir/baz baz/\",\n              \"rel\": \"nofollow\",\n            },\n          },\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 13,\n              \"line\": 9,\n              \"offset\": 137,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 9,\n              \"offset\": 125,\n            },\n          },\n          \"type\": \"ping\",\n          \"url\": \"/membres/voir/baz baz/\",\n          \"username\": \"baz baz\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 13,\n          \"line\": 9,\n          \"offset\": 137,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 9,\n          \"offset\": 125,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n  ],\n  \"position\": Object {\n    \"end\": Object {\n      \"column\": 13,\n      \"line\": 9,\n      \"offset\": 137,\n    },\n    \"start\": Object {\n      \"column\": 1,\n      \"line\": 1,\n      \"offset\": 0,\n    },\n  },\n  \"type\": \"root\",\n}\n`;\n\nexports[`fixture suite 1 compiles to HTML: h1 1`] = `\n\"<h2>Test ping <a href=\\\\\"/membres/voir/I AM CLEM/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">I AM CLEM</span></a></h2>\n<blockquote>\n<blockquote>\n<p>no metadata output <a href=\\\\\"/membres/voir/I AM CLEM/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">I AM CLEM</span></a></p>\n</blockquote>\n</blockquote>\n<blockquote>\n<p>no metadata output <a href=\\\\\"/membres/voir/I AM CLEM/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">I AM CLEM</span></a></p>\n</blockquote>\n<p>ping <a href=\\\\\"/membres/voir/I AM CLEM/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">I AM CLEM</span></a></p>\n<p>ping <em><a href=\\\\\"/membres/voir/I AM CLEM/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">I AM CLEM</span></a></em></p>\n<blockquote>\n<p>no metadata output <a href=\\\\\"/membres/voir/I AM CLEM/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">I AM CLEM</span></a></p>\n</blockquote>\"\n`;\n\nexports[`fixture suite 1 compiles to Markdown: m1 1`] = `\n\"## Test ping @**I AM CLEM**\n\n> > no metadata output @**I AM CLEM**\n\n> no metadata output @**I AM CLEM**\n\nping @**I AM CLEM**\n\nping _@**I AM CLEM**_\n\n> no metadata output @**I AM CLEM**\n\"\n`;\n\nexports[`fixture suite 1 parses: f1 1`] = `\nObject {\n  \"children\": Array [\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 14,\n              \"line\": 1,\n              \"offset\": 13,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 4,\n              \"line\": 1,\n              \"offset\": 3,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"Test ping \",\n        },\n        Object {\n          \"children\": Array [\n            Object {\n              \"type\": \"text\",\n              \"value\": \"@\",\n            },\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"I AM CLEM\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"span\",\n                \"hProperties\": Object {\n                  \"class\": \"ping-username\",\n                },\n              },\n              \"type\": \"emphasis\",\n            },\n          ],\n          \"data\": Object {\n            \"hName\": \"a\",\n            \"hProperties\": Object {\n              \"class\": \"ping ping-link\",\n              \"href\": \"/membres/voir/I AM CLEM/\",\n              \"rel\": \"nofollow\",\n            },\n          },\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 28,\n              \"line\": 1,\n              \"offset\": 27,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 14,\n              \"line\": 1,\n              \"offset\": 13,\n            },\n          },\n          \"type\": \"ping\",\n          \"url\": \"/membres/voir/I AM CLEM/\",\n          \"username\": \"I AM CLEM\",\n        },\n      ],\n      \"depth\": 2,\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 28,\n          \"line\": 1,\n          \"offset\": 27,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 1,\n          \"offset\": 0,\n        },\n      },\n      \"type\": \"heading\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"children\": Array [\n            Object {\n              \"children\": Array [\n                Object {\n                  \"position\": Position {\n                    \"end\": Object {\n                      \"column\": 24,\n                      \"line\": 3,\n                      \"offset\": 52,\n                    },\n                    \"indent\": Array [],\n                    \"start\": Object {\n                      \"column\": 5,\n                      \"line\": 3,\n                      \"offset\": 33,\n                    },\n                  },\n                  \"type\": \"text\",\n                  \"value\": \"no metadata output \",\n                },\n                Object {\n                  \"children\": Array [\n                    Object {\n                      \"type\": \"text\",\n                      \"value\": \"@\",\n                    },\n                    Object {\n                      \"children\": Array [\n                        Object {\n                          \"type\": \"text\",\n                          \"value\": \"I AM CLEM\",\n                        },\n                      ],\n                      \"data\": Object {\n                        \"hName\": \"span\",\n                        \"hProperties\": Object {\n                          \"class\": \"ping-username\",\n                        },\n                      },\n                      \"type\": \"emphasis\",\n                    },\n                  ],\n                  \"data\": Object {\n                    \"hName\": \"a\",\n                    \"hProperties\": Object {\n                      \"class\": \"ping ping-link\",\n                      \"href\": \"/membres/voir/I AM CLEM/\",\n                      \"rel\": \"nofollow\",\n                    },\n                  },\n                  \"position\": Position {\n                    \"end\": Object {\n                      \"column\": 38,\n                      \"line\": 3,\n                      \"offset\": 66,\n                    },\n                    \"indent\": Array [],\n                    \"start\": Object {\n                      \"column\": 24,\n                      \"line\": 3,\n                      \"offset\": 52,\n                    },\n                  },\n                  \"type\": \"ping\",\n                  \"url\": \"/membres/voir/I AM CLEM/\",\n                  \"username\": \"I AM CLEM\",\n                },\n              ],\n              \"position\": Position {\n                \"end\": Object {\n                  \"column\": 38,\n                  \"line\": 3,\n                  \"offset\": 66,\n                },\n                \"indent\": Array [],\n                \"start\": Object {\n                  \"column\": 5,\n                  \"line\": 3,\n                  \"offset\": 33,\n                },\n              },\n              \"type\": \"paragraph\",\n            },\n          ],\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 38,\n              \"line\": 3,\n              \"offset\": 66,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 3,\n              \"line\": 3,\n              \"offset\": 31,\n            },\n          },\n          \"type\": \"blockquote\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 38,\n          \"line\": 3,\n          \"offset\": 66,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 3,\n          \"offset\": 29,\n        },\n      },\n      \"type\": \"blockquote\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"children\": Array [\n            Object {\n              \"position\": Position {\n                \"end\": Object {\n                  \"column\": 22,\n                  \"line\": 5,\n                  \"offset\": 89,\n                },\n                \"indent\": Array [],\n                \"start\": Object {\n                  \"column\": 3,\n                  \"line\": 5,\n                  \"offset\": 70,\n                },\n              },\n              \"type\": \"text\",\n              \"value\": \"no metadata output \",\n            },\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"@\",\n                },\n                Object {\n                  \"children\": Array [\n                    Object {\n                      \"type\": \"text\",\n                      \"value\": \"I AM CLEM\",\n                    },\n                  ],\n                  \"data\": Object {\n                    \"hName\": \"span\",\n                    \"hProperties\": Object {\n                      \"class\": \"ping-username\",\n                    },\n                  },\n                  \"type\": \"emphasis\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"a\",\n                \"hProperties\": Object {\n                  \"class\": \"ping ping-link\",\n                  \"href\": \"/membres/voir/I AM CLEM/\",\n                  \"rel\": \"nofollow\",\n                },\n              },\n              \"position\": Position {\n                \"end\": Object {\n                  \"column\": 36,\n                  \"line\": 5,\n                  \"offset\": 103,\n                },\n                \"indent\": Array [],\n                \"start\": Object {\n                  \"column\": 22,\n                  \"line\": 5,\n                  \"offset\": 89,\n                },\n              },\n              \"type\": \"ping\",\n              \"url\": \"/membres/voir/I AM CLEM/\",\n              \"username\": \"I AM CLEM\",\n            },\n          ],\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 36,\n              \"line\": 5,\n              \"offset\": 103,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 3,\n              \"line\": 5,\n              \"offset\": 70,\n            },\n          },\n          \"type\": \"paragraph\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 36,\n          \"line\": 5,\n          \"offset\": 103,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 5,\n          \"offset\": 68,\n        },\n      },\n      \"type\": \"blockquote\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 6,\n              \"line\": 7,\n              \"offset\": 110,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 7,\n              \"offset\": 105,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"ping \",\n        },\n        Object {\n          \"children\": Array [\n            Object {\n              \"type\": \"text\",\n              \"value\": \"@\",\n            },\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"I AM CLEM\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"span\",\n                \"hProperties\": Object {\n                  \"class\": \"ping-username\",\n                },\n              },\n              \"type\": \"emphasis\",\n            },\n          ],\n          \"data\": Object {\n            \"hName\": \"a\",\n            \"hProperties\": Object {\n              \"class\": \"ping ping-link\",\n              \"href\": \"/membres/voir/I AM CLEM/\",\n              \"rel\": \"nofollow\",\n            },\n          },\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 20,\n              \"line\": 7,\n              \"offset\": 124,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 6,\n              \"line\": 7,\n              \"offset\": 110,\n            },\n          },\n          \"type\": \"ping\",\n          \"url\": \"/membres/voir/I AM CLEM/\",\n          \"username\": \"I AM CLEM\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 20,\n          \"line\": 7,\n          \"offset\": 124,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 7,\n          \"offset\": 105,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 6,\n              \"line\": 9,\n              \"offset\": 131,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 9,\n              \"offset\": 126,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"ping \",\n        },\n        Object {\n          \"children\": Array [\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"@\",\n                },\n                Object {\n                  \"children\": Array [\n                    Object {\n                      \"type\": \"text\",\n                      \"value\": \"I AM CLEM\",\n                    },\n                  ],\n                  \"data\": Object {\n                    \"hName\": \"span\",\n                    \"hProperties\": Object {\n                      \"class\": \"ping-username\",\n                    },\n                  },\n                  \"type\": \"emphasis\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"a\",\n                \"hProperties\": Object {\n                  \"class\": \"ping ping-link\",\n                  \"href\": \"/membres/voir/I AM CLEM/\",\n                  \"rel\": \"nofollow\",\n                },\n              },\n              \"position\": Position {\n                \"end\": Object {\n                  \"column\": 21,\n                  \"line\": 9,\n                  \"offset\": 146,\n                },\n                \"indent\": Array [],\n                \"start\": Object {\n                  \"column\": 7,\n                  \"line\": 9,\n                  \"offset\": 132,\n                },\n              },\n              \"type\": \"ping\",\n              \"url\": \"/membres/voir/I AM CLEM/\",\n              \"username\": \"I AM CLEM\",\n            },\n          ],\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 22,\n              \"line\": 9,\n              \"offset\": 147,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 6,\n              \"line\": 9,\n              \"offset\": 131,\n            },\n          },\n          \"type\": \"emphasis\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 22,\n          \"line\": 9,\n          \"offset\": 147,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 9,\n          \"offset\": 126,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"children\": Array [\n            Object {\n              \"position\": Position {\n                \"end\": Object {\n                  \"column\": 22,\n                  \"line\": 11,\n                  \"offset\": 170,\n                },\n                \"indent\": Array [],\n                \"start\": Object {\n                  \"column\": 3,\n                  \"line\": 11,\n                  \"offset\": 151,\n                },\n              },\n              \"type\": \"text\",\n              \"value\": \"no metadata output \",\n            },\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"@\",\n                },\n                Object {\n                  \"children\": Array [\n                    Object {\n                      \"type\": \"text\",\n                      \"value\": \"I AM CLEM\",\n                    },\n                  ],\n                  \"data\": Object {\n                    \"hName\": \"span\",\n                    \"hProperties\": Object {\n                      \"class\": \"ping-username\",\n                    },\n                  },\n                  \"type\": \"emphasis\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"a\",\n                \"hProperties\": Object {\n                  \"class\": \"ping ping-link\",\n                  \"href\": \"/membres/voir/I AM CLEM/\",\n                  \"rel\": \"nofollow\",\n                },\n              },\n              \"position\": Position {\n                \"end\": Object {\n                  \"column\": 36,\n                  \"line\": 11,\n                  \"offset\": 184,\n                },\n                \"indent\": Array [],\n                \"start\": Object {\n                  \"column\": 22,\n                  \"line\": 11,\n                  \"offset\": 170,\n                },\n              },\n              \"type\": \"ping\",\n              \"url\": \"/membres/voir/I AM CLEM/\",\n              \"username\": \"I AM CLEM\",\n            },\n          ],\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 36,\n              \"line\": 11,\n              \"offset\": 184,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 3,\n              \"line\": 11,\n              \"offset\": 151,\n            },\n          },\n          \"type\": \"paragraph\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 36,\n          \"line\": 11,\n          \"offset\": 184,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 11,\n          \"offset\": 149,\n        },\n      },\n      \"type\": \"blockquote\",\n    },\n  ],\n  \"position\": Object {\n    \"end\": Object {\n      \"column\": 36,\n      \"line\": 11,\n      \"offset\": 184,\n    },\n    \"start\": Object {\n      \"column\": 1,\n      \"line\": 1,\n      \"offset\": 0,\n    },\n  },\n  \"type\": \"root\",\n}\n`;\n\nexports[`fixture suite 2 compiles to HTML: h2 1`] = `\n\"<p><a href=\\\\\"/membres/voir/foo/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">foo</span></a> <a href=\\\\\"/membres/voir/bar/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">bar</span></a></p>\n<p>@baz baz</p>\n<blockquote>\n<p><a href=\\\\\"/membres/voir/baz baz/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">baz baz</span></a></p>\n</blockquote>\"\n`;\n\nexports[`fixture suite 2 compiles to Markdown: m2 1`] = `\n\"@foo @bar\n\n@baz baz\n\n> @**baz baz**\n\"\n`;\n\nexports[`fixture suite 2 parses: f2 1`] = `\nObject {\n  \"children\": Array [\n    Object {\n      \"children\": Array [\n        Object {\n          \"children\": Array [\n            Object {\n              \"type\": \"text\",\n              \"value\": \"@\",\n            },\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"foo\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"span\",\n                \"hProperties\": Object {\n                  \"class\": \"ping-username\",\n                },\n              },\n              \"type\": \"emphasis\",\n            },\n          ],\n          \"data\": Object {\n            \"hName\": \"a\",\n            \"hProperties\": Object {\n              \"class\": \"ping ping-link\",\n              \"href\": \"/membres/voir/foo/\",\n              \"rel\": \"nofollow\",\n            },\n          },\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 5,\n              \"line\": 1,\n              \"offset\": 4,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 1,\n              \"offset\": 0,\n            },\n          },\n          \"type\": \"ping\",\n          \"url\": \"/membres/voir/foo/\",\n          \"username\": \"foo\",\n        },\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 6,\n              \"line\": 1,\n              \"offset\": 5,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 5,\n              \"line\": 1,\n              \"offset\": 4,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \" \",\n        },\n        Object {\n          \"children\": Array [\n            Object {\n              \"type\": \"text\",\n              \"value\": \"@\",\n            },\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"bar\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"span\",\n                \"hProperties\": Object {\n                  \"class\": \"ping-username\",\n                },\n              },\n              \"type\": \"emphasis\",\n            },\n          ],\n          \"data\": Object {\n            \"hName\": \"a\",\n            \"hProperties\": Object {\n              \"class\": \"ping ping-link\",\n              \"href\": \"/membres/voir/bar/\",\n              \"rel\": \"nofollow\",\n            },\n          },\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 10,\n              \"line\": 1,\n              \"offset\": 9,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 6,\n              \"line\": 1,\n              \"offset\": 5,\n            },\n          },\n          \"type\": \"ping\",\n          \"url\": \"/membres/voir/bar/\",\n          \"username\": \"bar\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 10,\n          \"line\": 1,\n          \"offset\": 9,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 1,\n          \"offset\": 0,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 9,\n              \"line\": 3,\n              \"offset\": 19,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 3,\n              \"offset\": 11,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"@baz baz\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 9,\n          \"line\": 3,\n          \"offset\": 19,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 3,\n          \"offset\": 11,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"children\": Array [\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"@\",\n                },\n                Object {\n                  \"children\": Array [\n                    Object {\n                      \"type\": \"text\",\n                      \"value\": \"baz baz\",\n                    },\n                  ],\n                  \"data\": Object {\n                    \"hName\": \"span\",\n                    \"hProperties\": Object {\n                      \"class\": \"ping-username\",\n                    },\n                  },\n                  \"type\": \"emphasis\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"a\",\n                \"hProperties\": Object {\n                  \"class\": \"ping ping-link\",\n                  \"href\": \"/membres/voir/baz baz/\",\n                  \"rel\": \"nofollow\",\n                },\n              },\n              \"position\": Position {\n                \"end\": Object {\n                  \"column\": 15,\n                  \"line\": 5,\n                  \"offset\": 35,\n                },\n                \"indent\": Array [],\n                \"start\": Object {\n                  \"column\": 3,\n                  \"line\": 5,\n                  \"offset\": 23,\n                },\n              },\n              \"type\": \"ping\",\n              \"url\": \"/membres/voir/baz baz/\",\n              \"username\": \"baz baz\",\n            },\n          ],\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 15,\n              \"line\": 5,\n              \"offset\": 35,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 3,\n              \"line\": 5,\n              \"offset\": 23,\n            },\n          },\n          \"type\": \"paragraph\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 15,\n          \"line\": 5,\n          \"offset\": 35,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 5,\n          \"offset\": 21,\n        },\n      },\n      \"type\": \"blockquote\",\n    },\n  ],\n  \"position\": Object {\n    \"end\": Object {\n      \"column\": 15,\n      \"line\": 5,\n      \"offset\": 35,\n    },\n    \"start\": Object {\n      \"column\": 1,\n      \"line\": 1,\n      \"offset\": 0,\n    },\n  },\n  \"type\": \"root\",\n}\n`;\n\nexports[`fixture suite 3 compiles to HTML: h3 1`] = `\n\"<p><a href=\\\\\"/membres/voir/Moté/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">Moté</span></a> @Phigger</p>\n<p><a href=\\\\\"/membres/voir/Phigger Moté/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">Phigger Moté</span></a></p>\n<p>@Digitals@m <a href=\\\\\"/membres/voir/Digitals@m/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">Digitals@m</span></a></p>\n<p><a href=\\\\\"/membres/voir/empty/\\\\\" rel=\\\\\"nofollow\\\\\" class=\\\\\"ping ping-link\\\\\">@<span class=\\\\\"ping-username\\\\\">empty</span></a> @</p>\"\n`;\n\nexports[`fixture suite 3 compiles to Markdown: m3 1`] = `\n\"@Moté @Phigger\n\n@**Phigger Moté**\n\n@Digitals@m @**Digitals@m**\n\n@empty @\n\"\n`;\n\nexports[`fixture suite 3 parses: f3 1`] = `\nObject {\n  \"children\": Array [\n    Object {\n      \"children\": Array [\n        Object {\n          \"children\": Array [\n            Object {\n              \"type\": \"text\",\n              \"value\": \"@\",\n            },\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"Moté\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"span\",\n                \"hProperties\": Object {\n                  \"class\": \"ping-username\",\n                },\n              },\n              \"type\": \"emphasis\",\n            },\n          ],\n          \"data\": Object {\n            \"hName\": \"a\",\n            \"hProperties\": Object {\n              \"class\": \"ping ping-link\",\n              \"href\": \"/membres/voir/Moté/\",\n              \"rel\": \"nofollow\",\n            },\n          },\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 6,\n              \"line\": 1,\n              \"offset\": 5,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 1,\n              \"offset\": 0,\n            },\n          },\n          \"type\": \"ping\",\n          \"url\": \"/membres/voir/Moté/\",\n          \"username\": \"Moté\",\n        },\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 15,\n              \"line\": 1,\n              \"offset\": 14,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 6,\n              \"line\": 1,\n              \"offset\": 5,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \" @Phigger\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 15,\n          \"line\": 1,\n          \"offset\": 14,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 1,\n          \"offset\": 0,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"children\": Array [\n            Object {\n              \"type\": \"text\",\n              \"value\": \"@\",\n            },\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"Phigger Moté\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"span\",\n                \"hProperties\": Object {\n                  \"class\": \"ping-username\",\n                },\n              },\n              \"type\": \"emphasis\",\n            },\n          ],\n          \"data\": Object {\n            \"hName\": \"a\",\n            \"hProperties\": Object {\n              \"class\": \"ping ping-link\",\n              \"href\": \"/membres/voir/Phigger Moté/\",\n              \"rel\": \"nofollow\",\n            },\n          },\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 18,\n              \"line\": 3,\n              \"offset\": 33,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 3,\n              \"offset\": 16,\n            },\n          },\n          \"type\": \"ping\",\n          \"url\": \"/membres/voir/Phigger Moté/\",\n          \"username\": \"Phigger Moté\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 18,\n          \"line\": 3,\n          \"offset\": 33,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 3,\n          \"offset\": 16,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 13,\n              \"line\": 5,\n              \"offset\": 47,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 5,\n              \"offset\": 35,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"@Digitals@m \",\n        },\n        Object {\n          \"children\": Array [\n            Object {\n              \"type\": \"text\",\n              \"value\": \"@\",\n            },\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"Digitals@m\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"span\",\n                \"hProperties\": Object {\n                  \"class\": \"ping-username\",\n                },\n              },\n              \"type\": \"emphasis\",\n            },\n          ],\n          \"data\": Object {\n            \"hName\": \"a\",\n            \"hProperties\": Object {\n              \"class\": \"ping ping-link\",\n              \"href\": \"/membres/voir/Digitals@m/\",\n              \"rel\": \"nofollow\",\n            },\n          },\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 28,\n              \"line\": 5,\n              \"offset\": 62,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 13,\n              \"line\": 5,\n              \"offset\": 47,\n            },\n          },\n          \"type\": \"ping\",\n          \"url\": \"/membres/voir/Digitals@m/\",\n          \"username\": \"Digitals@m\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 28,\n          \"line\": 5,\n          \"offset\": 62,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 5,\n          \"offset\": 35,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"children\": Array [\n            Object {\n              \"type\": \"text\",\n              \"value\": \"@\",\n            },\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"empty\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"span\",\n                \"hProperties\": Object {\n                  \"class\": \"ping-username\",\n                },\n              },\n              \"type\": \"emphasis\",\n            },\n          ],\n          \"data\": Object {\n            \"hName\": \"a\",\n            \"hProperties\": Object {\n              \"class\": \"ping ping-link\",\n              \"href\": \"/membres/voir/empty/\",\n              \"rel\": \"nofollow\",\n            },\n          },\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 7,\n              \"line\": 7,\n              \"offset\": 70,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 7,\n              \"offset\": 64,\n            },\n          },\n          \"type\": \"ping\",\n          \"url\": \"/membres/voir/empty/\",\n          \"username\": \"empty\",\n        },\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 9,\n              \"line\": 7,\n              \"offset\": 72,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 7,\n              \"line\": 7,\n              \"offset\": 70,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \" @\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 9,\n          \"line\": 7,\n          \"offset\": 72,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 7,\n          \"offset\": 64,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n  ],\n  \"position\": Object {\n    \"end\": Object {\n      \"column\": 9,\n      \"line\": 7,\n      \"offset\": 72,\n    },\n    \"start\": Object {\n      \"column\": 1,\n      \"line\": 1,\n      \"offset\": 0,\n    },\n  },\n  \"type\": \"root\",\n}\n`;\n"
  },
  {
    "path": "packages/remark-ping/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport remarkStringify from 'remark-stringify'\nimport remark2rehype from 'remark-rehype'\nimport rehypeStringify from 'rehype-stringify'\n\nimport plugin from '../src/'\n\nconst mockUsernames = [\n  'I AM CLEM',\n  'qux',\n  'foo',\n  'bar',\n  'baz baz',\n  'Moté',\n  'Phigger Moté',\n  'Digitals@m',\n  'empty',\n]\n\nfunction pingUsername (username) {\n  return mockUsernames.includes(username)\n}\nfunction userURL (username) {\n  return `/membres/voir/${username}/`\n}\n\nconst remark = text => unified()\n  .use(reParse)\n  .use(plugin, {pingUsername, userURL})\n  .parse(text)\n\nconst toHTML = text => unified()\n  .use(reParse)\n  .use(plugin, {pingUsername, userURL})\n  .use(remark2rehype)\n  .use(rehypeStringify)\n  .process(text)\n\nconst toMarkdown = text => unified()\n  .use(reParse)\n  .use(remarkStringify)\n  .use(plugin, {pingUsername, userURL})\n  .processSync(text)\n  .toString()\n\nconst fixtures = [\n  dedent`\n    ping @Clem\n\n    ping @**FOO BAR**\n\n    no ping @quxjhdshqjkhfyhefezhjzjhdsjlfjlsqjdfjhsd\n\n    ping [@**I AM CLEM**](http://example.com)\n\n    @**baz baz**\n  `,\n  dedent`\n    ## Test ping @**I AM CLEM**\n\n    > > no metadata output @**I AM CLEM**\n\n    > no metadata output @**I AM CLEM**\n\n    ping @**I AM CLEM**\n\n    ping _@**I AM CLEM**_\n\n    > no metadata output @**I AM CLEM**\n  `,\n  dedent`\n    @foo @bar\n\n    @baz baz\n\n    > @**baz baz**\n  `,\n  dedent`\n    @Moté @Phigger\n\n    @**Phigger Moté**\n\n    @Digitals@m @**Digitals@m**\n\n    @empty @\n  `,\n]\n\nconst pings = [\n  ['I AM CLEM', 'baz baz'],\n  ['I AM CLEM', 'I AM CLEM', 'I AM CLEM'],\n  ['foo', 'bar'],\n  ['Moté', 'Phigger Moté', 'Digitals@m', 'empty'],\n]\n\nfixtures.forEach((fixture, i) => {\n  describe(`fixture suite ${i}`, () => {\n    test('parses', () => {\n      expect(remark(fixture)).toMatchSnapshot(`f${i}`)\n    })\n\n    test('sets ping data on vfile', () => {\n      return expect(\n        toHTML(fixture).then(vfile => vfile.data.ping)\n      ).resolves.toEqual(pings[i])\n    })\n\n    test('compiles to HTML', () => {\n      return expect(\n        toHTML(fixture).then(vfile => vfile.contents)\n      ).resolves.toMatchSnapshot(`h${i}`)\n    })\n\n    test('compiles to Markdown', () => {\n      expect(toMarkdown(fixture)).toMatchSnapshot(`m${i}`)\n    })\n  })\n})\n\ntest('compiles to Markdown', () => {\n  const toMarkdown = text => unified()\n    .use(reParse)\n    .use(remarkStringify)\n    .use(plugin, {\n      pingUsername: 12,\n      userURL,\n    })\n    .processSync(text)\n    .toString()\n\n  expect(() => toMarkdown(dedent`\n    # foo\n    @**I AM CLEM**\n  `)).toThrowErrorMatchingSnapshot()\n})\n\ntest('do not create ping links in links', () => {\n  return expect(\n    toHTML(dedent`\n      [foo @**I AM CLEM** bar](http://example.com)\n    `).then(vfile => vfile.contents)\n  ).resolves.toBe(dedent`\n    <p><a href=\"http://example.com\">foo <span class=\"ping ping-in-link\">\\\n    @<span class=\"ping-username\">I AM CLEM</span></span> bar</a></p>`)\n})\n"
  },
  {
    "path": "packages/remark-ping/dist/index.js",
    "content": "\"use strict\";\n\nconst visit = require('unist-util-visit');\nconst interruptPunctuation = [require('@unicode/unicode-13.0.0/Binary_Property/White_Space/code-points'), require('@unicode/unicode-13.0.0/General_Category/Close_Punctuation/code-points'), require('@unicode/unicode-13.0.0/General_Category/Final_Punctuation/code-points'), require('@unicode/unicode-13.0.0/General_Category/Initial_Punctuation/code-points'), require('@unicode/unicode-13.0.0/General_Category/Open_Punctuation/code-points'), require('@unicode/unicode-13.0.0/General_Category/Other_Punctuation/code-points')].flat();\nconst isInterrupt = c => interruptPunctuation.includes(c.charCodeAt(0));\nconst containsInterrupt = str => {\n  for (let c = 0; c < str.length; c++) {\n    const char = str.charAt(c);\n    if (isInterrupt(char)) return true;\n  }\n  return false;\n};\nconst helpMsg = `remark-ping: expected configuration to be passed: {\n  pingUsername: (username) => bool,\\n  userURL: (username) => string\\n}`;\nmodule.exports = function plugin({\n  pingUsername,\n  userURL,\n  pingCharacter = '@',\n  fencedStartSequence = '**',\n  fencedEndSequence = '**'\n}) {\n  if (typeof pingUsername !== 'function' || typeof userURL !== 'function') {\n    throw new Error(helpMsg);\n  }\n  function inlineTokenizer(eat, value, silent) {\n    let isFenced = false;\n    let eaten = pingCharacter;\n    let username = '';\n    let c = 1;\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return silent;\n    if (value.charAt(0) !== pingCharacter) return;\n\n    // Check if we have a fenced sequence\n    if (value.substring(1).startsWith(fencedStartSequence)) {\n      eaten += fencedStartSequence;\n      isFenced = true;\n      c += 2;\n    }\n\n    // Iterate until:\n    //   - end of string;\n    //   - interrupt character for unfenced pings;\n    //   - trailing sequence for fenced pings.\n    while (value.charAt(c)) {\n      if (!isFenced && isInterrupt(value.charAt(c))) break;\n      if (isFenced && value.substring(c - 2).startsWith(fencedEndSequence) && isInterrupt(value.charAt(c))) break;\n      username += value.charAt(c++);\n    }\n    eaten += username;\n\n    // Remove trailing sequence\n    if (isFenced) {\n      if (!username.endsWith(fencedEndSequence)) return;\n      username = username.slice(0, -fencedEndSequence.length);\n    }\n    if (pingUsername(username) === true && username.trim() !== '') {\n      const url = userURL(username);\n      return eat(eaten)({\n        type: 'ping',\n        username,\n        url,\n        data: {\n          hName: 'a',\n          hProperties: {\n            href: url,\n            rel: 'nofollow',\n            class: 'ping ping-link'\n          }\n        },\n        children: [{\n          type: 'text',\n          value: '@'\n        }, {\n          type: 'emphasis',\n          data: {\n            hName: 'span',\n            hProperties: {\n              class: 'ping-username'\n            }\n          },\n          children: [{\n            type: 'text',\n            value: username\n          }]\n        }]\n      });\n    } else {\n      return eat(eaten.charAt(0))({\n        type: 'text',\n        value: eaten.charAt(0)\n      });\n    }\n  }\n  function locator(value, fromIndex) {\n    return value.indexOf('@', fromIndex);\n  }\n  inlineTokenizer.locator = locator;\n  const Parser = this.Parser;\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers;\n  const inlineMethods = Parser.prototype.inlineMethods;\n  inlineTokenizers.ping = inlineTokenizer;\n  inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'ping');\n  const Compiler = this.Compiler;\n\n  // Stringify\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors;\n    visitors.ping = node => {\n      if (!containsInterrupt(node.username)) {\n        return pingCharacter + node.username;\n      }\n      return pingCharacter + fencedStartSequence + node.username + fencedEndSequence;\n    };\n  }\n  return (tree, file) => {\n    // mark pings in blockquotes, later on we'll need that info to avoid pinging from quotes\n    visit(tree, 'blockquote', markInBlockquotes);\n    // remove ping links from pings already in links\n    visit(tree, 'link', node => {\n      visit(node, 'ping', (ping, index) => {\n        ping.data.hName = 'span';\n        ping.data.hProperties = {\n          class: 'ping ping-in-link'\n        };\n      });\n    });\n    visit(tree, 'ping', node => {\n      if (!node.__inBlockquote) {\n        if (!file.data[node.type]) {\n          file.data[node.type] = [];\n        }\n        // collect usernames to ping, they will be made available on the vfile\n        // for some backend to act on\n        file.data[node.type].push(node.username);\n      }\n    });\n  };\n};\nfunction markInBlockquotes(node) {\n  mark(node);\n  if (node.children) {\n    node.children.map((n, i) => markInBlockquotes(n));\n  }\n}\nfunction mark(node) {\n  if (node.type === 'ping') node.__inBlockquote = true;\n}"
  },
  {
    "path": "packages/remark-ping/package.json",
    "content": "{\n  \"name\": \"remark-ping\",\n  \"version\": \"2.3.2\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-ping\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\",\n    \"Titouan (Stalone) S. <talone@boxph.one>\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@unicode/unicode-13.0.0\": \"^1.1.0\",\n    \"unist-util-visit\": \"^2.0.3\"\n  }\n}\n"
  },
  {
    "path": "packages/remark-ping/src/index.js",
    "content": "const visit = require('unist-util-visit')\nconst interruptPunctuation = [\n  require('@unicode/unicode-13.0.0/Binary_Property/White_Space/code-points'),\n  require('@unicode/unicode-13.0.0/General_Category/Close_Punctuation/code-points'),\n  require('@unicode/unicode-13.0.0/General_Category/Final_Punctuation/code-points'),\n  require('@unicode/unicode-13.0.0/General_Category/Initial_Punctuation/code-points'),\n  require('@unicode/unicode-13.0.0/General_Category/Open_Punctuation/code-points'),\n  require('@unicode/unicode-13.0.0/General_Category/Other_Punctuation/code-points')\n].flat()\n\nconst isInterrupt = c => interruptPunctuation.includes(c.charCodeAt(0))\nconst containsInterrupt = str => {\n  for (let c = 0; c < str.length; c++) {\n    const char = str.charAt(c)\n\n    if (isInterrupt(char)) return true\n  }\n\n  return false\n}\n\nconst helpMsg = `remark-ping: expected configuration to be passed: {\n  pingUsername: (username) => bool,\\n  userURL: (username) => string\\n}`\n\nmodule.exports = function plugin ({\n  pingUsername,\n  userURL,\n  pingCharacter = '@',\n  fencedStartSequence = '**',\n  fencedEndSequence = '**'\n}) {\n  if (typeof pingUsername !== 'function' || typeof userURL !== 'function') {\n    throw new Error(helpMsg)\n  }\n\n  function inlineTokenizer (eat, value, silent) {\n    let isFenced = false\n    let eaten = pingCharacter\n    let username = ''\n    let c = 1\n\n    /* istanbul ignore if - never used (yet) */\n    if (silent) return silent\n    if (value.charAt(0) !== pingCharacter) return\n\n    // Check if we have a fenced sequence\n    if (value.substring(1).startsWith(fencedStartSequence)) {\n      eaten += fencedStartSequence\n      isFenced = true\n      c += 2\n    }\n\n    // Iterate until:\n    //   - end of string;\n    //   - interrupt character for unfenced pings;\n    //   - trailing sequence for fenced pings.\n    while (value.charAt(c)) {\n      if (!isFenced && isInterrupt(value.charAt(c))) break\n      if (isFenced &&\n          value.substring(c - 2).startsWith(fencedEndSequence) &&\n          isInterrupt(value.charAt(c))) break\n\n      username += value.charAt(c++)\n    }\n\n    eaten += username\n\n    // Remove trailing sequence\n    if (isFenced) {\n      if (!username.endsWith(fencedEndSequence)) return\n\n      username = username.slice(0, -fencedEndSequence.length)\n    }\n\n    if (pingUsername(username) === true && username.trim() !== '') {\n      const url = userURL(username)\n\n      return eat(eaten)({\n        type: 'ping',\n        username,\n        url,\n        data: {\n          hName: 'a',\n          hProperties: {\n            href: url,\n            rel: 'nofollow',\n            class: 'ping ping-link'\n          }\n        },\n        children: [{\n          type: 'text',\n          value: '@'\n        }, {\n          type: 'emphasis',\n          data: {\n            hName: 'span',\n            hProperties: {\n              class: 'ping-username'\n            }\n          },\n          children: [{\n            type: 'text',\n            value: username\n          }]\n        }]\n      })\n    } else {\n      return eat(eaten.charAt(0))({\n        type: 'text',\n        value: eaten.charAt(0)\n      })\n    }\n  }\n\n  function locator (value, fromIndex) {\n    return value.indexOf('@', fromIndex)\n  }\n\n  inlineTokenizer.locator = locator\n\n  const Parser = this.Parser\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers\n  const inlineMethods = Parser.prototype.inlineMethods\n  inlineTokenizers.ping = inlineTokenizer\n  inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'ping')\n\n  const Compiler = this.Compiler\n\n  // Stringify\n  if (Compiler) {\n    const visitors = Compiler.prototype.visitors\n\n    visitors.ping = (node) => {\n      if (!containsInterrupt(node.username)) {\n        return pingCharacter + node.username\n      }\n\n      return pingCharacter + fencedStartSequence + node.username + fencedEndSequence\n    }\n  }\n\n  return (tree, file) => {\n    // mark pings in blockquotes, later on we'll need that info to avoid pinging from quotes\n    visit(tree, 'blockquote', markInBlockquotes)\n    // remove ping links from pings already in links\n    visit(tree, 'link', (node) => {\n      visit(node, 'ping', (ping, index) => {\n        ping.data.hName = 'span'\n        ping.data.hProperties = { class: 'ping ping-in-link' }\n      })\n    })\n    visit(tree, 'ping', (node) => {\n      if (!node.__inBlockquote) {\n        if (!file.data[node.type]) {\n          file.data[node.type] = []\n        }\n        // collect usernames to ping, they will be made available on the vfile\n        // for some backend to act on\n        file.data[node.type].push(node.username)\n      }\n    })\n  }\n}\n\nfunction markInBlockquotes (node) {\n  mark(node)\n\n  if (node.children) {\n    node.children.map((n, i) => markInBlockquotes(n))\n  }\n}\n\nfunction mark (node) {\n  if (node.type === 'ping') node.__inBlockquote = true\n}\n"
  },
  {
    "path": "packages/remark-sub-super/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/remark-sub-super/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/remark-sub-super/README.md",
    "content": "# remark-sub-super [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nThis plugin parses custom Markdown syntax to handle subscript and superscript.\nIt adds new nodes types to the [mdast][mdast] produced by [remark][remark]:\n\n* `sub`\n* `sup`\n\nIf you are using [rehype][rehype], the stringified HTML result will be `sub` or `sup`.\n\n## Syntax\n\n```markdown\n~subscript~, e.g. a~i~\n\n^superscript^, e.g. e^x^\n```\n\n## AST (see [mdast][mdast] specification)\n\n`Sub` ([`Parent`][parent]) represents a subscript text.\n\n```javascript\ninterface Sub <: Parent {\n  type: \"sub\";\n}\n```\n\n`Sup` ([`Parent`][parent]) represents a superscript text.\n\n```javascript\ninterface Sup <: Parent {\n  type: \"sup\";\n}\n```\n\nFor example, the following markdown:\n\n```markdown\na^x^\n\nx~i~\n```\n\nYields:\n\n```javascript\n{\n  type: 'paragraph',\n  children: [{\n    type: 'text',\n    value: 'a',\n    children: [{\n      type: 'sup',\n      children: [{\n        type: 'text',\n        value: 'x'\n      }]\n    }]\n  }]\n},\n{\n  type: 'paragraph',\n  children: [{\n    type: 'text',\n    value: 'x',\n    children: [{\n      type: 'sub',\n      children: [{\n        type: 'text',\n        value: 'i'\n      }]\n    }]\n  }]\n}\n```\n\n## Rehype\n\nThis plugin is compatible with [rehype][rehype]. `Sub` mdast nodes will become `<sub>contents</sub>`, `Sup` mdast nodes will become `<sup>contents</sup>`.\n\n## Installation\n\n[npm][npm]:\n\n```bash\nnpm install remark-sub-super\n```\n\n## Usage\n\nDependencies:\n\n```javascript\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst stringify = require('rehype-stringify')\nconst remark2rehype = require('remark-rehype')\n\nconst remarkSubSuper = require('remark-sub-super')\n```\n\nUsage:\n\n```javascript\nunified()\n  .use(remarkParse)\n  .use(remarkSubSuper)\n  .use(remark2rehype)\n  .use(stringify)\n```\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/remark-sub-super/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/remark-sub-super\n\n[mdast]: https://github.com/syntax-tree/mdast/blob/master/readme.md\n\n[remark]: https://github.com/remarkjs/remark\n\n[rehype]: https://github.com/rehypejs/rehype\n\n[parent]: https://github.com/syntax-tree/unist#parent\n"
  },
  {
    "path": "packages/remark-sub-super/__tests__/__snapshots__/index.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`disallow empty tags 1`] = `\"<p>^<sup>foo</sup>^</p>\"`;\n\nexports[`regression 1 1`] = `\n\"<p>a<sup>b</sup> a<sup>b</sup> a<sup>b</sup> a<sup>b</sup> a<sup>b</sup></p>\n<p>a<sub>b</sub> a<sub>b</sub> a<sub>b</sub> a<sub>b</sub> a<sub>b</sub></p>\n<p>a<sub>b</sub> a<sup>b</sup> a<sub>b</sub> a<sup>b</sup> a<sub>b</sub> a<sup>b</sup></p>\n<p>a<sup>b</sup> a<sub>b</sub> a<sup>b</sup> a<sub>b</sub> a<sup>b</sup> a<sub>b</sub></p>\"\n`;\n\nexports[`regression 2 1`] = `\n\"<p>Literally s<sup>e</sup>lfies tbh lo-fi. Actually health go retro polaroidsriracha. Kogi live-edge <sup>mixtape</sup> marfa street <sub>art</sub> synth. Godardsynth truffaut selfies, vape fanny  subway tile. Stumptown af pabst,try-hard fam ethical actually four dollar toast. Microdosing <sup>kogi</sup>brooklyn, locavore jianbing etsy sartorial <em>YOLO</em>. Williamsburg salviaphoto<sup>a</sup> booth <sup>readymade</sup> listicle man braid. s<sup>e</sup>lfies</p>\n<p>Literally s<sup>e</sup>lfies tbh lo-fi. Actually health goa retro polaroid sriracha.Kogi live-edge <sup>mixtape</sup> marfa street <sub>art</sub> synth. Godard synth truffautselfies, vape fanny  subway tile. Stumptown af pabst, try-hard fam ethicalactually four dollar toast. Microdosing <sup>kogi</sup> brooklyn, locavore jianbingetsy sartorial <em>YOLO</em>. Williamsburg salvia photo<sup>a</sup> booth <sup>readymade</sup>listicle man braid. s<sup>e</sup>lfies</p>\"\n`;\n\nexports[`subscript 1`] = `\n\"<p>Foo <sub>sup</sub> kxcvj <sub>sup <em>string</em></sub> bar</p>\n<p>not ~ here</p>\n<p>neither ~ here ~ because it's escaped</p>\n<p>foo ^<sup>a</sup>^ bar</p>\"\n`;\n\nexports[`superscript 1`] = `\n\"<p>Foo <sup>sup</sup> kxcvj <sup>sup <em>string</em></sup> bar</p>\n<p>not ^ here</p>\n<p>neither ^ here ^ because it's escaped</p>\"\n`;\n"
  },
  {
    "path": "packages/remark-sub-super/__tests__/index.js",
    "content": "import dedent from 'dedent'\nimport unified from 'unified'\nimport reParse from 'remark-parse'\nimport rehypeStringify from 'rehype-stringify'\nimport remark2rehype from 'remark-rehype'\n\nimport plugin from '../src/'\n\nconst render = text => unified()\n  .use(reParse)\n  .use(remark2rehype)\n  .use(plugin)\n  .use(rehypeStringify)\n  .processSync(text)\n\n\ntest('superscript', () => {\n  const {contents} = render(dedent`\n    Foo ^sup^ kxcvj ^sup *string*^ bar\n\n    not ^ here\n\n    neither \\^ here ^ because it's escaped\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('subscript', () => {\n  const {contents} = render(dedent`\n    Foo ~sup~ kxcvj ~sup *string*~ bar\n\n    not ~ here\n\n    neither \\~ here ~ because it's escaped\n\n    foo ^^a^^ bar\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('regression 1', () => {\n  const {contents} = render(dedent`\n    a^b^ a^b^ a^b^ a^b^ a^b^\n\n    a~b~ a~b~ a~b~ a~b~ a~b~\n\n    a~b~ a^b^ a~b~ a^b^ a~b~ a^b^\n\n    a^b^ a~b~ a^b^ a~b~ a^b^ a~b~\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('regression 2', () => {\n  const {contents} = render(dedent`\n    Literally s^e^lfies tbh lo-fi. Actually health go retro polaroid\\\n    sriracha. Kogi live-edge ^mixtape^ marfa street ~art~ synth. Godard\\\n    synth truffaut selfies, vape fanny  subway tile. Stumptown af pabst,\\\n    try-hard fam ethical actually four dollar toast. Microdosing ^kogi^\\\n    brooklyn, locavore jianbing etsy sartorial _YOLO_. Williamsburg salvia\\\n    photo^a^ booth ^readymade^ listicle man braid. s^e^lfies\n\n    Literally s^e^lfies tbh lo-fi. Actually health goa retro polaroid sriracha.\\\n    Kogi live-edge ^mixtape^ marfa street ~art~ synth. Godard synth truffaut\\\n    selfies, vape fanny  subway tile. Stumptown af pabst, try-hard fam ethical\\\n    actually four dollar toast. Microdosing ^kogi^ brooklyn, locavore jianbing\\\n    etsy sartorial _YOLO_. Williamsburg salvia photo^a^ booth ^readymade^\\\n    listicle man braid. s^e^lfies\n  `)\n  expect(contents).toMatchSnapshot()\n})\n\ntest('disallow empty tags', () => {\n  const {contents} = render(dedent`\n    ^^foo^^\n  `)\n  expect(contents).toMatchSnapshot()\n})\n"
  },
  {
    "path": "packages/remark-sub-super/dist/index.js",
    "content": "\"use strict\";\n\nconst SPACE = ' ';\nconst markers = {\n  '~': 'sub',\n  '^': 'sup'\n};\nfunction locator(value, fromIndex) {\n  let index = -1;\n  const found = [];\n  for (const marker of Object.keys(markers)) {\n    index = value.indexOf(marker, fromIndex);\n    if (index !== -1) {\n      found.push(index);\n      continue;\n    }\n  }\n  if (found.length) {\n    found.sort((a, b) => a - b);\n    return found[0];\n  }\n  return -1;\n}\nfunction inlinePlugin() {\n  function inlineTokenizer(eat, value, silent) {\n    // allow escaping of all markers\n    for (const marker of Object.keys(markers)) {\n      if (!this.escape.includes(marker)) this.escape.push(marker);\n    }\n    const marker = value[0];\n    const now = eat.now();\n    now.column += 1;\n    now.offset += 1;\n    if (Object.prototype.hasOwnProperty.call(markers, marker) && !value.startsWith(marker + SPACE) && !value.startsWith(marker + marker)) {\n      let endMarkerIndex = 1;\n      for (; value[endMarkerIndex] !== marker && endMarkerIndex < value.length; endMarkerIndex++);\n\n      // if it's actually empty, don't tokenize (disallows e.g. <sup></sup>)\n      if (endMarkerIndex === value.length) return;\n\n      /* istanbul ignore if - never used (yet) */\n      if (silent) return true;\n      eat(value.substring(0, endMarkerIndex + 1))({\n        type: markers[marker],\n        children: this.tokenizeInline(value.substring(1, endMarkerIndex), now),\n        data: {\n          hName: markers[marker]\n        }\n      });\n    }\n  }\n  inlineTokenizer.locator = locator;\n  const Parser = this.Parser;\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers;\n  const inlineMethods = Parser.prototype.inlineMethods;\n  inlineTokenizers.sub_super = inlineTokenizer;\n  inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'sub_super');\n}\nmodule.exports = inlinePlugin;"
  },
  {
    "path": "packages/remark-sub-super/package.json",
    "content": "{\n  \"name\": \"remark-sub-super\",\n  \"version\": \"1.0.21\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/sub-super\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"remark\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/remark-sub-super/src/index.js",
    "content": "const SPACE = ' '\nconst markers = {\n  '~': 'sub',\n  '^': 'sup'\n}\n\nfunction locator (value, fromIndex) {\n  let index = -1\n  const found = []\n  for (const marker of Object.keys(markers)) {\n    index = value.indexOf(marker, fromIndex)\n    if (index !== -1) {\n      found.push(index)\n      continue\n    }\n  }\n\n  if (found.length) {\n    found.sort((a, b) => a - b)\n    return found[0]\n  }\n\n  return -1\n}\n\nfunction inlinePlugin () {\n  function inlineTokenizer (eat, value, silent) {\n    // allow escaping of all markers\n    for (const marker of Object.keys(markers)) {\n      if (!this.escape.includes(marker)) this.escape.push(marker)\n    }\n\n    const marker = value[0]\n    const now = eat.now()\n    now.column += 1\n    now.offset += 1\n\n    if (Object.prototype.hasOwnProperty.call(markers, marker) &&\n      !value.startsWith(marker + SPACE) &&\n      !value.startsWith(marker + marker)\n    ) {\n      let endMarkerIndex = 1\n      for (; value[endMarkerIndex] !== marker && endMarkerIndex < value.length; endMarkerIndex++);\n\n      // if it's actually empty, don't tokenize (disallows e.g. <sup></sup>)\n      if (endMarkerIndex === value.length) return\n\n      /* istanbul ignore if - never used (yet) */\n      if (silent) return true\n\n      eat(value.substring(0, endMarkerIndex + 1))({\n        type: markers[marker],\n        children: this.tokenizeInline(value.substring(1, endMarkerIndex), now),\n        data: {\n          hName: markers[marker]\n        }\n      })\n    }\n  }\n\n  inlineTokenizer.locator = locator\n\n  const Parser = this.Parser\n\n  // Inject inlineTokenizer\n  const inlineTokenizers = Parser.prototype.inlineTokenizers\n  const inlineMethods = Parser.prototype.inlineMethods\n  inlineTokenizers.sub_super = inlineTokenizer\n  inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'sub_super')\n}\n\nmodule.exports = inlinePlugin\n"
  },
  {
    "path": "packages/typographic-colon/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/typographic-colon/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/typographic-colon/README.md",
    "content": "# typographic-colon [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nMicro module to fix a common typographic issue that is hard to fix with most keyboard layouts.\n\nThis is mainly meant for French typography, it replaces the space preceding a colon by a _narrow no-break space_ ([en](http://www.fileformat.info/info/unicode/char/202f/index.htm), [fr](https://fr.wikipedia.org/wiki/Espace_fine_ins%C3%A9cable)).\n\nSubmit a PR to `src/db.js` to add support for your locale.\n\n## Install\n\n[npm][npm]:\n\n```sh\nnpm install --save typographic-colon\n```\n\n\n## Usage\n\n```js\nvar colon = require('typographic-colon')\n\ncolon(`Exemple : voici.`, { locale: 'fr' })\n// this char  ^ will be replaced by a narrow no-break space\n```\n\nThis module can also be used through [textr][textr].\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/typographic-colon/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/typographic-colon\n\n[textr]: https://github.com/A/textr\n"
  },
  {
    "path": "packages/typographic-colon/__tests__/index.js",
    "content": "/* eslint-disable no-irregular-whitespace */\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F',\n}\n\nconst american = {locale: 'en-us'}\nconst fr = {locale: 'fr'}\nconst frCH = {locale: 'fr-sw'}\n\nconst colon = require('../src')\n\ntest('should do nothing with no param at all', () => expect(colon()).toEqual(''))\n\ntest('should do nothing if locale is undefined', () =>\n  expect(colon(`foo : bar`)).toEqual(`foo : bar`))\n\ntest('should ignore locale not in DB', () =>\n  expect(colon(`foo : bar`, american)).toEqual(`foo : bar`))\n\ntest('should handle fr[-*]', () => {\n  expect(colon(`foo : bar`, fr)).toEqual(`foo${chars['NARROW NO-BREAK SPACE']}: bar`)\n  expect(colon(`foo : bar`, frCH)).toEqual(`foo${chars['NARROW NO-BREAK SPACE']}: bar`)\n})\n"
  },
  {
    "path": "packages/typographic-colon/dist/db.js",
    "content": "\"use strict\";\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n};\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n};"
  },
  {
    "path": "packages/typographic-colon/dist/index.js",
    "content": "\"use strict\";\n\nconst db = require('./db');\nmodule.exports = (input = '', {\n  locale\n} = {}) => {\n  if (!Object.keys(db).includes(locale)) return input;\n  const beforeColon = db[locale];\n  const pattern = / :(\\s|$)/gim;\n  const handleColon = (withColon, afterColon) => `${beforeColon}:${afterColon}`;\n  return input.replace(pattern, handleColon);\n};"
  },
  {
    "path": "packages/typographic-colon/package.json",
    "content": "{\n  \"name\": \"typographic-colon\",\n  \"version\": \"1.0.18\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/typographic-colon\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"textr\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/typographic-colon/src/db.js",
    "content": "const chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n}\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n}\n"
  },
  {
    "path": "packages/typographic-colon/src/index.js",
    "content": "const db = require('./db')\n\nmodule.exports = (input = '', { locale } = {}) => {\n  if (!Object.keys(db).includes(locale)) return input\n\n  const beforeColon = db[locale]\n\n  const pattern = / :(\\s|$)/gim\n  const handleColon = (withColon, afterColon) =>\n    `${beforeColon}:${afterColon}`\n\n  return input.replace(pattern, handleColon)\n}\n"
  },
  {
    "path": "packages/typographic-em-dash/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/typographic-em-dash/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/typographic-em-dash/README.md",
    "content": "# typographic-em-dash [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nMicro module to fix a common typographic issue that is hard to fix with most keyboard layouts.\n\nThis is mainly meant for French typography, it replaces _--_ by an _em dash_ ([en](http://www.fileformat.info/info/unicode/char/2014/index.htm), [fr](https://fr.wikipedia.org/wiki/Cadratin)). If the locale is French and we have a pair like _— foo —_, the first space after the first em dash and the space preceding the second dash will be a _narrow no-break space_ ([en](http://www.fileformat.info/info/unicode/char/202f/index.htm), [fr](https://fr.wikipedia.org/wiki/Espace_fine_ins%C3%A9cable)).\n\nSubmit a PR to `src/db.js` to add support for your locale.\n\n## Install\n\n[npm][npm]:\n\n```sh\nnpm install --save typographic-em-dash\n```\n\n\n## Usage\n\n```js\nvar dash = require('typographic-em-dash')\n\ndash(`--foo--`, { locale: 'fr' })\n// will be replaced by —foo—\ndash(`-- foo --`, { locale: 'fr' })\n// will be replaced by —NNBSfooNNBs— where NNBS is a narrow no-break space\ndash(`--foo--`, { locale: 'en' })\n// will be replaced by —foo—\ndash(`-- foo --`, { locale: 'en' })\n// will be replaced by — foo —\n```\n\nThis module can also be used through [textr][textr].\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/typographic-em-dash/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/typographic-em-dash\n\n[textr]: https://github.com/A/text\n"
  },
  {
    "path": "packages/typographic-em-dash/__tests__/index.js",
    "content": "import emDash from '../src/'\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F',\n  'EM DASH': '\\u2014',\n}\n\nconst american = {locale: 'en-us'}\nconst fr = {locale: 'fr'}\nconst frCH = {locale: 'fr-sw'}\n\nconst nnbs = chars['NARROW NO-BREAK SPACE']\nconst dashChar = chars['EM DASH']\n\ntest('should do nothing with no param at all', () => expect(emDash()).toEqual(''))\n\ntest('should only replace em dash if the locale is not in db', () => {\n  expect(emDash(`--foo bar--`)).toEqual(`${dashChar}foo bar${dashChar}`)\n  expect(emDash(`--foo bar--`, american)).toEqual(`${dashChar}foo bar${dashChar}`)\n})\n\ntest('should alse replace space for fr[-*]', () => {\n  expect(emDash(`-- foo`, fr)).toEqual(`${dashChar}${nnbs}foo`)\n  expect(emDash(` -- foo -- bar -- foo bar --`, fr)).toEqual(\n    ` ${dashChar}${nnbs}foo${nnbs}${dashChar} bar ${dashChar}${nnbs}foo bar${nnbs}${dashChar}`\n  )\n  expect(emDash(` -- foo -- bar -- foo bar --`, frCH)).toEqual(\n    ` ${dashChar}${nnbs}foo${nnbs}${dashChar} bar ${dashChar}${nnbs}foo bar${nnbs}${dashChar}`\n  )\n})\n"
  },
  {
    "path": "packages/typographic-em-dash/dist/db.js",
    "content": "\"use strict\";\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n};\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n};"
  },
  {
    "path": "packages/typographic-em-dash/dist/index.js",
    "content": "\"use strict\";\n\nconst db = require('./db');\nmodule.exports = (input = '', {\n  locale\n} = {}) => {\n  // Replace -- by \\u2013 for all locales\n  const dashChar = '\\u2014';\n  const dashPattern = /--/gm;\n  let result = input.replace(dashPattern, `${dashChar}`);\n\n  // nbsp inside em dash pairs\n  // (foo -- bar -- baz. -> foo1—2bar2—1baz. where 1 is and 2 is nbsp\n  if (Object.keys(db).includes(locale)) {\n    const separation = new RegExp(`(^|\\\\s)(${dashChar})(\\\\s|$)`);\n    const nnbs = db[locale];\n    let temp = result;\n    let isOpening = true;\n    let startPosition = separation.exec(temp);\n    result = '';\n    while (startPosition) {\n      result += temp.substring(0, startPosition.index);\n      const replacement = isOpening ? `$1$2${nnbs}` : `${nnbs}$2$3`;\n      result += startPosition[0].replace(separation, replacement);\n      temp = temp.substring(startPosition.index + startPosition[0].length, temp.length);\n      startPosition = separation.exec(temp);\n      isOpening = !isOpening;\n    }\n    result += temp;\n  }\n  return result;\n};"
  },
  {
    "path": "packages/typographic-em-dash/package.json",
    "content": "{\n  \"name\": \"typographic-em-dash\",\n  \"version\": \"1.0.17\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/typographic-em-dash\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"textr\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/typographic-em-dash/src/db.js",
    "content": "const chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n}\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n}\n"
  },
  {
    "path": "packages/typographic-em-dash/src/index.js",
    "content": "const db = require('./db')\n\nmodule.exports = (input = '', { locale } = {}) => {\n  // Replace -- by \\u2013 for all locales\n  const dashChar = '\\u2014'\n  const dashPattern = /--/gm\n  let result = input.replace(dashPattern, `${dashChar}`)\n\n  // nbsp inside em dash pairs\n  // (foo -- bar -- baz. -> foo1—2bar2—1baz. where 1 is and 2 is nbsp\n  if (Object.keys(db).includes(locale)) {\n    const separation = new RegExp(`(^|\\\\s)(${dashChar})(\\\\s|$)`)\n    const nnbs = db[locale]\n    let temp = result\n    let isOpening = true\n    let startPosition = separation.exec(temp)\n    result = ''\n    while (startPosition) {\n      result += temp.substring(0, startPosition.index)\n      const replacement = isOpening ? `$1$2${nnbs}` : `${nnbs}$2$3`\n      result += startPosition[0].replace(separation, replacement)\n      temp = temp.substring(startPosition.index + startPosition[0].length, temp.length)\n      startPosition = separation.exec(temp)\n      isOpening = !isOpening\n    }\n    result += temp\n  }\n\n  return result\n}\n"
  },
  {
    "path": "packages/typographic-exclamation-mark/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/typographic-exclamation-mark/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/typographic-exclamation-mark/README.md",
    "content": "# typographic-exclamation-mark [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nMicro module to fix a common typographic issue that is hard to fix with most keyboard layouts.\n\nThis is mainly meant for French typography, it replaces the space preceding an exclamation point by a _narrow no-break space_ ([en](http://www.fileformat.info/info/unicode/char/202f/index.htm), [fr](https://fr.wikipedia.org/wiki/Espace_fine_ins%C3%A9cable)).\n\nSubmit a PR to `src/db.js` to add support for your locale.\n\n## Install\n\n[npm][npm]:\n\n```sh\nnpm install --save typographic-exclamation-mark\n```\n\n\n## Usage\n\n```js\nvar exclamation = require('typographic-exclamation-mark')\n\nexclamation(`Exemple ! voici.`, { locale: 'fr' })\n// this char        ^ will be replaced by a narrow no-break space\n```\n\nThis module can also be used through [textr][textr].\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/typographic-exclamation-mark/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/typographic-exclamation-mark\n\n[textr]: https://github.com/A/textr\n"
  },
  {
    "path": "packages/typographic-exclamation-mark/__tests__/index.js",
    "content": "import exclamationMark from '../src/'\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F',\n}\n\nconst american = {locale: 'en-us'}\nconst fr = {locale: 'fr'}\nconst frCH = {locale: 'fr-sw'}\n\ntest('should do nothing with no param at all', () => expect(exclamationMark()).toEqual(''))\n\ntest('should do nothing if locale is undefined', () =>\n  expect(exclamationMark(`foo ! bar`)).toEqual(`foo ! bar`))\n\ntest('should ignore locale not in DB', () =>\n  expect(exclamationMark(`foo ! bar`, american)).toEqual(`foo ! bar`))\n\ntest('should handle fr[-*]', () => {\n  expect(exclamationMark(`foo ! bar`, fr)).toEqual(`foo${chars['NARROW NO-BREAK SPACE']}! bar`)\n  expect(exclamationMark(`foo ! bar`, frCH)).toEqual(`foo${chars['NARROW NO-BREAK SPACE']}! bar`)\n})\n"
  },
  {
    "path": "packages/typographic-exclamation-mark/dist/db.js",
    "content": "\"use strict\";\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n};\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n};"
  },
  {
    "path": "packages/typographic-exclamation-mark/dist/index.js",
    "content": "\"use strict\";\n\nconst db = require('./db');\nmodule.exports = (input = '', {\n  locale\n} = {}) => {\n  if (!Object.keys(db).includes(locale)) return input;\n  const beforeSemiColon = db[locale];\n  const pattern = / !(\\s|$)/gim;\n  const handleSemiColon = (withSemiColon, afterSemiColon) => `${beforeSemiColon}!${afterSemiColon}`;\n  return input.replace(pattern, handleSemiColon);\n};"
  },
  {
    "path": "packages/typographic-exclamation-mark/package.json",
    "content": "{\n  \"name\": \"typographic-exclamation-mark\",\n  \"version\": \"1.0.17\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/typographic-exclamation-mark\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"textr\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/typographic-exclamation-mark/src/db.js",
    "content": "const chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n}\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n}\n"
  },
  {
    "path": "packages/typographic-exclamation-mark/src/index.js",
    "content": "const db = require('./db')\n\nmodule.exports = (input = '', { locale } = {}) => {\n  if (!Object.keys(db).includes(locale)) return input\n\n  const beforeSemiColon = db[locale]\n\n  const pattern = / !(\\s|$)/gim\n  const handleSemiColon = (withSemiColon, afterSemiColon) =>\n    `${beforeSemiColon}!${afterSemiColon}`\n\n  return input.replace(pattern, handleSemiColon)\n}\n"
  },
  {
    "path": "packages/typographic-guillemets/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/typographic-guillemets/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/typographic-guillemets/README.md",
    "content": "# typographic-guillemets [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nMicro module to fix a common typographic issue that is hard to fix with most keyboard layouts.\n\nThis is mainly meant for French typography, where respectively << and >> should be replaced by a _left-pointing double angle quotation mark_ ([en](http://www.fileformat.info/info/unicode/char/00AB/index.htm), [en](https://en.wikipedia.org/wiki/Guillemet)) and a _right-pointing double angle quotation mark_([en](www.fileformat.info/info/unicode/char/00BB/index.htm)).\nThe left-pointing mark should be followed by a _narrow no-break space_ ([en](http://www.fileformat.info/info/unicode/char/202f/index.htm), [fr](https://fr.wikipedia.org/wiki/Espace_fine_ins%C3%A9cable)) and the right-pointing mark should be preceded by a _narrow no-break space_.\n\nSubmit a PR to `src/db.js` to add support for your locale.\n\n## Install\n\n[npm][npm]:\n\n```sh\nnpm install --save typographic-guillemets\n```\n\n\n## Usage\n\n```js\nvar guillemets = require('typographic-guillemets')\n\nguillemets(`<< here >>`, { locale: 'fr' })\n// will be replaced by «NNBShereNNBS» where NNBS is a narrow no-break space.\n```\n\nThis module can also be used through [textr][textr].\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/typographic-guillemets/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/typographic-guillemets\n\n[textr]: https://github.com/A/textr\n"
  },
  {
    "path": "packages/typographic-guillemets/__tests__/index.js",
    "content": "import guillemet from '../src/'\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F',\n  'LEFT-POINTING ANGLE QUOTATION MARK': '\\u00AB',\n  'RIGHT-POINTING ANGLE QUOTATION MARK': '\\u00BB',\n}\n\nconst american = {locale: 'en-us'}\nconst fr = {locale: 'fr'}\nconst frCH = {locale: 'fr-sw'}\n\ntest('should do nothing with no param at all', () => expect(guillemet()).toEqual(''))\n\ntest('should do nothing if locale is undefined', () =>\n  expect(guillemet(`<< a >>`)).toEqual(`<< a >>`))\n\ntest('should ignore locale not in DB', () =>\n  expect(guillemet(`<< a >>`, american)).toEqual(`<< a >>`))\n\ntest('should handle fr[-*]', () => {\n  const before = `${chars['LEFT-POINTING ANGLE QUOTATION MARK']}${chars['NARROW NO-BREAK SPACE']}`\n  const after = `${chars['NARROW NO-BREAK SPACE']}${chars['RIGHT-POINTING ANGLE QUOTATION MARK']}`\n  expect(guillemet(`<< a >>`, fr)).toEqual(`${before}a${after}`)\n  expect(guillemet(`<< a >>`, frCH)).toEqual(`${before}a${after}`)\n})\n"
  },
  {
    "path": "packages/typographic-guillemets/dist/db.js",
    "content": "\"use strict\";\n\nconst charsFr = {\n  'NARROW NO-BREAK SPACE': '\\u202F',\n  'LEFT-POINTING ANGLE QUOTATION MARK': '\\u00AB',\n  'RIGHT-POINTING ANGLE QUOTATION MARK': '\\u00BB'\n};\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: charsFr,\n  'fr-sw': charsFr\n};"
  },
  {
    "path": "packages/typographic-guillemets/dist/index.js",
    "content": "\"use strict\";\n\nconst db = require('./db');\nmodule.exports = (input = '', {\n  locale\n} = {}) => {\n  if (!Object.keys(db).includes(locale)) return input;\n  const chars = db[locale];\n  const leftMark = chars['LEFT-POINTING ANGLE QUOTATION MARK'];\n  const rightMark = chars['RIGHT-POINTING ANGLE QUOTATION MARK'];\n  const spaceChar = chars['NARROW NO-BREAK SPACE'];\n  const leftAnglePattern = /<<\\s*/gm;\n  const rightAnglePattern = /\\s*>>/gm;\n  return input.replace(leftAnglePattern, leftMark.concat(spaceChar)).replace(rightAnglePattern, spaceChar.concat(rightMark));\n};"
  },
  {
    "path": "packages/typographic-guillemets/package.json",
    "content": "{\n  \"name\": \"typographic-guillemets\",\n  \"version\": \"1.1.1\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/typographic-guillemets\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"textr\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/typographic-guillemets/src/db.js",
    "content": "const charsFr = {\n  'NARROW NO-BREAK SPACE': '\\u202F',\n  'LEFT-POINTING ANGLE QUOTATION MARK': '\\u00AB',\n  'RIGHT-POINTING ANGLE QUOTATION MARK': '\\u00BB'\n}\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: charsFr,\n  'fr-sw': charsFr\n}\n"
  },
  {
    "path": "packages/typographic-guillemets/src/index.js",
    "content": "const db = require('./db')\n\nmodule.exports = (input = '', { locale } = {}) => {\n  if (!Object.keys(db).includes(locale)) return input\n\n  const chars = db[locale]\n  const leftMark = chars['LEFT-POINTING ANGLE QUOTATION MARK']\n  const rightMark = chars['RIGHT-POINTING ANGLE QUOTATION MARK']\n  const spaceChar = chars['NARROW NO-BREAK SPACE']\n\n  const leftAnglePattern = /<<\\s*/gm\n  const rightAnglePattern = /\\s*>>/gm\n\n  return input\n    .replace(leftAnglePattern, leftMark.concat(spaceChar))\n    .replace(rightAnglePattern, spaceChar.concat(rightMark))\n}\n"
  },
  {
    "path": "packages/typographic-percent/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/typographic-percent/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/typographic-percent/README.md",
    "content": "# typographic-percent [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nMicro module to fix a common typographic issue that is hard to fix with most keyboard layouts.\n\nThis is mainly meant for French typography, it replaces the space preceding a percent sign by a _narrow no-break space_ ([en](http://www.fileformat.info/info/unicode/char/202f/index.htm), [fr](https://fr.wikipedia.org/wiki/Espace_fine_ins%C3%A9cable)).\n\nSubmit a PR to `src/db.js` to add support for your locale.\n\n## Install\n\n[npm][npm]:\n\n```sh\nnpm install --save typographic-percent\n```\n\n\n## Usage\n\n```js\nvar percent = require('typographic-percent')\n\npercent(`Exemple % voici.`, { locale: 'fr' })\n// this char    ^ will be replaced by a narrow no-break space\n```\n\nThis module can also be used through [textr][textr].\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/typographic-percent/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/typographic-percent\n\n[textr]: https://github.com/A/textr\n"
  },
  {
    "path": "packages/typographic-percent/__tests__/index.js",
    "content": "import percent from '../src/'\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F',\n}\n\nconst american = {locale: 'en-us'}\nconst fr = {locale: 'fr'}\nconst frCH = {locale: 'fr-sw'}\n\ntest('should do nothing with no param at all', () => expect(percent()).toEqual(''))\n\ntest('should do nothing if locale is undefined', () =>\n  expect(percent(`foo % bar`)).toEqual(`foo % bar`))\n\ntest('should ignore locale not in DB', () =>\n  expect(percent(`foo % bar`, american)).toEqual(`foo % bar`))\n\ntest('should handle fr[-*]', () => {\n  expect(percent(`foo % bar`, fr)).toEqual(`foo${chars['NARROW NO-BREAK SPACE']}% bar`)\n  expect(percent(`foo % bar`, frCH)).toEqual(`foo${chars['NARROW NO-BREAK SPACE']}% bar`)\n})\n"
  },
  {
    "path": "packages/typographic-percent/dist/db.js",
    "content": "\"use strict\";\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n};\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n};"
  },
  {
    "path": "packages/typographic-percent/dist/index.js",
    "content": "\"use strict\";\n\nconst db = require('./db');\nmodule.exports = (input = '', {\n  locale\n} = {}) => {\n  if (!Object.keys(db).includes(locale)) return input;\n  const beforeSemiColon = db[locale];\n  const pattern = / %(\\s|$)/gim;\n  const handleSemiColon = (withSemiColon, afterSemiColon) => `${beforeSemiColon}%${afterSemiColon}`;\n  return input.replace(pattern, handleSemiColon);\n};"
  },
  {
    "path": "packages/typographic-percent/package.json",
    "content": "{\n  \"name\": \"typographic-percent\",\n  \"version\": \"1.0.17\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/typographic-percent\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"textr\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/typographic-percent/src/db.js",
    "content": "const chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n}\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n}\n"
  },
  {
    "path": "packages/typographic-percent/src/index.js",
    "content": "const db = require('./db')\n\nmodule.exports = (input = '', { locale } = {}) => {\n  if (!Object.keys(db).includes(locale)) return input\n\n  const beforeSemiColon = db[locale]\n\n  const pattern = / %(\\s|$)/gim\n  const handleSemiColon = (withSemiColon, afterSemiColon) =>\n    `${beforeSemiColon}%${afterSemiColon}`\n\n  return input.replace(pattern, handleSemiColon)\n}\n"
  },
  {
    "path": "packages/typographic-permille/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/typographic-permille/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/typographic-permille/README.md",
    "content": "# typographic-permille [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nMicro module to replace `%o` with `‰` and optionally replace the preceding space.\n\nThis is meant for typography, where %o should be replaced by a per mille sign ([en](http://www.fileformat.info/info/unicode/char/2030/index.htm), [fr](https://fr.wikipedia.org/wiki/Pour_mille)).\nThis is mainly meant for French typography, it replaces the space preceding a per mille sign by a _narrow no-break space_ ([en](http://www.fileformat.info/info/unicode/char/202f/index.htm), [fr](https://fr.wikipedia.org/wiki/Espace_fine_ins%C3%A9cable)).\n\nSubmit a PR to `src/db.js` to add support for your locale.\n\n## Install\n\n[npm][npm]:\n\n```sh\nnpm install --save typographic-permille\n```\n\n\n## Usage\n\n```js\nvar permille = require('typographic-permille')\n\npermille(`Top 1%o.`, { locale: 'en' }) // Top 1‰\n\npermille(`Top 1 %o.`, { locale: 'fr' }) // Top 1 ‰\n// this char   ^ will be replaced by a narrow no-break space\n```\n\nThis module can also be used through [textr][textr].\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/typographic-permille/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/typographic-permille\n\n[textr]: https://github.com/A/textr\n"
  },
  {
    "path": "packages/typographic-permille/__tests__/index.js",
    "content": "import permille from '../src/'\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F',\n  'PER MILLE SIGN': '\\u2030',\n}\n\nconst american = {locale: 'en-us'}\nconst fr = {locale: 'fr'}\nconst frCH = {locale: 'fr-sw'}\n\ntest('should do nothing with no param at all', () => expect(permille()).toEqual(''))\n\ntest('should handle all locales', () => {\n  expect(permille(`foo %o`)).toEqual(`foo ${chars['PER MILLE SIGN']}`)\n  expect(permille(`foo %o`, american)).toEqual(`foo ${chars['PER MILLE SIGN']}`)\n  expect(permille(`foo %o`, american)).toEqual(`foo ${chars['PER MILLE SIGN']}`)\n  expect(permille(`%o`, american)).toEqual(`${chars['PER MILLE SIGN']}`)\n})\n\ntest('should handle fr[-*]', () => {\n  expect(permille(`foo %o`, fr))\n    .toEqual(`foo${chars['NARROW NO-BREAK SPACE']}${chars['PER MILLE SIGN']}`)\n  expect(permille(`foo %o`, frCH))\n    .toEqual(`foo${chars['NARROW NO-BREAK SPACE']}${chars['PER MILLE SIGN']}`)\n  expect(permille(`%o`, fr)).toEqual(`${chars['PER MILLE SIGN']}`)\n})\n"
  },
  {
    "path": "packages/typographic-permille/dist/db.js",
    "content": "\"use strict\";\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n};\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n};"
  },
  {
    "path": "packages/typographic-permille/dist/index.js",
    "content": "\"use strict\";\n\nconst db = require('./db');\nmodule.exports = (input = '', {\n  locale\n} = {}) => {\n  const chars = {\n    'PER MILLE SIGN': '\\u2030'\n  };\n  const permillePattern = /%o/gim;\n  const result = input.replace(permillePattern, chars['PER MILLE SIGN']);\n  if (Object.keys(db).includes(locale)) {\n    // If we need to replace space before per mille signs\n    const spaceBeforePermillePattern = /( )(\\u2030)/g;\n    return result.replace(spaceBeforePermillePattern, `${db[locale]}$2`);\n  }\n  return result;\n};"
  },
  {
    "path": "packages/typographic-permille/package.json",
    "content": "{\n  \"name\": \"typographic-permille\",\n  \"version\": \"1.0.17\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/typographic-permille\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"textr\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/typographic-permille/src/db.js",
    "content": "const chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n}\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n}\n"
  },
  {
    "path": "packages/typographic-permille/src/index.js",
    "content": "const db = require('./db')\n\nmodule.exports = (input = '', { locale } = {}) => {\n  const chars = {\n    'PER MILLE SIGN': '\\u2030'\n  }\n\n  const permillePattern = /%o/gim\n  const result = input.replace(permillePattern, chars['PER MILLE SIGN'])\n\n  if (Object.keys(db).includes(locale)) {\n    // If we need to replace space before per mille signs\n    const spaceBeforePermillePattern = /( )(\\u2030)/g\n    return result.replace(spaceBeforePermillePattern, `${db[locale]}$2`)\n  }\n\n  return result\n}\n"
  },
  {
    "path": "packages/typographic-question-mark/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/typographic-question-mark/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/typographic-question-mark/README.md",
    "content": "# typographic-question-mark [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nMicro module to fix a common typographic issue that is hard to fix with most keyboard layouts.\n\nThis is mainly meant for French typography, it replaces the space preceding an interrogation point by a _narrow no-break space_ ([en](http://www.fileformat.info/info/unicode/char/202f/index.htm), [fr](https://fr.wikipedia.org/wiki/Espace_fine_ins%C3%A9cable)).\n\nSubmit a PR to `src/db.js` to add support for your locale.\n\n## Install\n\n[npm][npm]:\n\n```sh\nnpm install --save typographic-question-mark\n```\n\n\n## Usage\n\n```js\nvar interrogation = require('typographic-question-mark')\n\ninterrogation(`Exemple ? voici.`, { locale: 'fr' })\n// this char          ^ will be replaced by a narrow no-break space\n```\n\nThis module can also be used through [textr][textr].\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/typographic-question-mark/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/typographic-question-mark\n\n[textr]: https://github.com/A/textr\n"
  },
  {
    "path": "packages/typographic-question-mark/__tests__/index.js",
    "content": "import questionMark from '../src/'\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F',\n}\n\nconst american = {locale: 'en-us'}\nconst fr = {locale: 'fr'}\nconst frCH = {locale: 'fr-sw'}\n\ntest('should do nothing with no param at all', () => expect(questionMark()).toEqual(''))\n\ntest('should do nothing if locale is undefined', () =>\n  expect(questionMark(`foo ? bar`)).toEqual(`foo ? bar`))\n\ntest('should ignore locale not in DB', () =>\n  expect(questionMark(`foo ? bar`, american)).toEqual(`foo ? bar`))\n\ntest('should handle fr[-*]', () => {\n  expect(questionMark(`foo ? bar`, fr)).toEqual(`foo${chars['NARROW NO-BREAK SPACE']}? bar`)\n  expect(questionMark(`foo ? bar`, frCH)).toEqual(`foo${chars['NARROW NO-BREAK SPACE']}? bar`)\n})\n"
  },
  {
    "path": "packages/typographic-question-mark/dist/db.js",
    "content": "\"use strict\";\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n};\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n};"
  },
  {
    "path": "packages/typographic-question-mark/dist/index.js",
    "content": "\"use strict\";\n\nconst db = require('./db');\nmodule.exports = (input = '', {\n  locale\n} = {}) => {\n  if (!Object.keys(db).includes(locale)) return input;\n  const beforeSemiColon = db[locale];\n  const pattern = / \\?(\\s|$)/gim;\n  const handleSemiColon = (withSemiColon, afterSemiColon) => `${beforeSemiColon}?${afterSemiColon}`;\n  return input.replace(pattern, handleSemiColon);\n};"
  },
  {
    "path": "packages/typographic-question-mark/package.json",
    "content": "{\n  \"name\": \"typographic-question-mark\",\n  \"version\": \"1.0.17\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/typographic-question-mark\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint .\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"textr\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/typographic-question-mark/src/db.js",
    "content": "const chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n}\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n}\n"
  },
  {
    "path": "packages/typographic-question-mark/src/index.js",
    "content": "const db = require('./db')\n\nmodule.exports = (input = '', { locale } = {}) => {\n  if (!Object.keys(db).includes(locale)) return input\n\n  const beforeSemiColon = db[locale]\n\n  const pattern = / \\?(\\s|$)/gim\n  const handleSemiColon = (withSemiColon, afterSemiColon) =>\n    `${beforeSemiColon}?${afterSemiColon}`\n\n  return input.replace(pattern, handleSemiColon)\n}\n"
  },
  {
    "path": "packages/typographic-semicolon/.npmignore",
    "content": "/index.js\n/__tests__\n/.npmignore\n/coverage\n*.log\n/src\n"
  },
  {
    "path": "packages/typographic-semicolon/LICENSE-MIT",
    "content": "Copyright (c) Zeste de Savoir (https://zestedesavoir.com)\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "packages/typographic-semicolon/README.md",
    "content": "# typographic-semicolon [![Build Status][build-badge]][build-status] [![Coverage Status][coverage-badge]][coverage-status]\n\nMicro module to fix a common typographic issue that is hard to fix with most keyboard layouts.\n\nThis is mainly meant for French typography, it replaces the space preceding a semicolon by a _narrow no-break space_ ([en](http://www.fileformat.info/info/unicode/char/202f/index.htm), [fr](https://fr.wikipedia.org/wiki/Espace_fine_ins%C3%A9cable)).\n\nSubmit a PR to `src/db.js` to add support for your locale.\n\n## Install\n\n[npm][npm]:\n\n```sh\nnpm install --save typographic-semicolon\n```\n\n\n## Usage\n\n```js\nvar semiColon = require('typographic-semicolon')\n\nsemiColon(`Exemple ; voici.`, { locale: 'fr' })\n// this char      ^ will be replaced by a narrow no-break space\n```\n\nThis module can also be used through [textr][textr].\n\n## License\n\n[MIT][license] © [Zeste de Savoir][zds]\n\n<!-- Definitions -->\n\n[build-badge]: https://img.shields.io/travis/zestedesavoir/zmarkdown.svg\n\n[build-status]: https://travis-ci.org/zestedesavoir/zmarkdown\n\n[coverage-badge]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown.svg\n\n[coverage-status]: https://coveralls.io/github/zestedesavoir/zmarkdown\n\n[license]: https://github.com/zestedesavoir/zmarkdown/blob/master/packages/typographic-semicolon/LICENSE-MIT\n\n[zds]: https://zestedesavoir.com\n\n[npm]: https://www.npmjs.com/package/typographic-semicolon\n\n[textr]: https://github.com/A/textr\n"
  },
  {
    "path": "packages/typographic-semicolon/__tests__/index.js",
    "content": "import semiColon from '../src/'\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F',\n}\n\nconst american = {locale: 'en-us'}\nconst fr = {locale: 'fr'}\nconst frCH = {locale: 'fr-sw'}\n\ntest('should do nothing with no param at all', () => expect(semiColon()).toEqual(''))\n\ntest('should do nothing if locale is undefined', () =>\n  expect(semiColon(`foo ; bar`)).toEqual(`foo ; bar`))\n\ntest('should ignore locale not in DB', () =>\n  expect(semiColon(`foo ; bar`, american)).toEqual(`foo ; bar`))\n\ntest('should handle fr[-*]', () => {\n  expect(semiColon(`foo ; bar`, fr)).toEqual(`foo${chars['NARROW NO-BREAK SPACE']}; bar`)\n  expect(semiColon(`foo ; bar`, frCH)).toEqual(`foo${chars['NARROW NO-BREAK SPACE']}; bar`)\n})\n"
  },
  {
    "path": "packages/typographic-semicolon/dist/db.js",
    "content": "\"use strict\";\n\nconst chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n};\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n};"
  },
  {
    "path": "packages/typographic-semicolon/dist/index.js",
    "content": "\"use strict\";\n\nconst db = require('./db');\nmodule.exports = (input = '', {\n  locale\n} = {}) => {\n  if (!Object.keys(db).includes(locale)) return input;\n  const beforeSemiColon = db[locale];\n  const pattern = / ;(\\s|$)/gim;\n  const handleSemiColon = (withSemiColon, afterSemiColon) => `${beforeSemiColon};${afterSemiColon}`;\n  return input.replace(pattern, handleSemiColon);\n};"
  },
  {
    "path": "packages/typographic-semicolon/package.json",
    "content": "{\n  \"name\": \"typographic-semicolon\",\n  \"version\": \"1.0.18\",\n  \"repository\": {\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/typographic-semicolon\",\n    \"type\": \"git\"\n  },\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\"\n  ],\n  \"scripts\": {\n    \"pretest\": \"eslint src\",\n    \"build\": \"babel --root-mode upward --delete-dir-on-start --env-name production --out-dir dist src\",\n    \"test\": \"jest\",\n    \"coverage\": \"jest --coverage\"\n  },\n  \"main\": \"dist/index.js\",\n  \"files\": [\n    \"LICENSE-MIT\",\n    \"dist\",\n    \"src\",\n    \"README.md\"\n  ],\n  \"keywords\": [\n    \"textr\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "packages/typographic-semicolon/src/db.js",
    "content": "const chars = {\n  'NARROW NO-BREAK SPACE': '\\u202F'\n}\n\n// Language codes:     https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\nmodule.exports = {\n  fr: chars['NARROW NO-BREAK SPACE'],\n  'fr-sw': chars['NARROW NO-BREAK SPACE']\n}\n"
  },
  {
    "path": "packages/typographic-semicolon/src/index.js",
    "content": "const db = require('./db')\n\nmodule.exports = (input = '', { locale } = {}) => {\n  if (!Object.keys(db).includes(locale)) return input\n\n  const beforeSemiColon = db[locale]\n\n  const pattern = / ;(\\s|$)/gim\n  const handleSemiColon = (withSemiColon, afterSemiColon) =>\n    `${beforeSemiColon};${afterSemiColon}`\n\n  return input.replace(pattern, handleSemiColon)\n}\n"
  },
  {
    "path": "packages/zmarkdown/.gitignore",
    "content": "client/dist/"
  },
  {
    "path": "packages/zmarkdown/README.md",
    "content": "# zmarkdown\n\n  [![NPM Version][npm-image]][npm-url]\n  [![Test Coverage][coveralls-image]][coveralls-url]\n\nThis project is an **HTTP Server API** providing fast and extensible **markdown parser**. It is the Markdown engine powering [Zeste de Savoir][zds].\n\nIt is a small express server leveraging the [**remark**\nprocessor][processor] and its [**MDAST**][mdast] syntax tree, [**rehype**][rehype] (for HTML processing) and [**textr**][textr] (text transformation framework). It also provides [**MDAST**][mdast] to LaTeX compilation via [**rebber**][rebber] (and its [plugins][rebber-plugins]).\n\n```log\ncurl -H \"Content-Type: application/json\" -X POST -d '{\"md\":\"Hello word\"}' http://localhost:27272/html\n#return: [\"<p>Hello word</p>\",{\"disableToc\":true,\"languages\":[],\"depth\":1},[]]\n```\n\n[npm-image]: https://img.shields.io/npm/v/zmarkdown.svg\n[npm-url]: https://npmjs.org/package/zmarkdown\n[downloads-image]: https://img.shields.io/npm/dm/zmarkdown.svg\n[downloads-url]: https://npmjs.org/package/zmarkdown\n[travis-image]: https://img.shields.io/travis/zestedesavoir/zmarkdown/master.svg?label=linux\n[travis-url]: https://travis-ci.com/zestedesavoir/zmarkdown\n[coveralls-image]: https://img.shields.io/coveralls/zestedesavoir/zmarkdown/master.svg\n[coveralls-url]: https://coveralls.io/r/zestedesavoir/zmarkdown?branch=master\n\n[zds]: https://zestedesavoir.com\n[processor]: https://github.com/remarkjs/remark/blob/master/packages/remark\n[mdast]: https://github.com/wooorm/mdast\n[rehype]: https://github.com/rehypejs/rehype\n[textr]: https://github.com/A/textr\n[rebber]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/rebber#rebber--\n[rebber-plugins]: https://github.com/zestedesavoir/zmarkdown/tree/master/packages/rebber-plugins#rebber-plugins--\n\n## Features\n\n - Convert Markdown to HTML ;\n - Convert Markdown to EPUB compatible HTML ;\n - Convert Markdown to LaTeX ;\n - Convert Markdown to TEX file;\n - Convert ordered list of Markdown extracts into one of the above formats.\n\n## Installation\n\nThis is a [Node.js](https://nodejs.org/en/) module available through the [npm registry][npm-url]. Install with npm:\n\n```\nnpm install zmarkdown\n```\n\n## Getting started\n\n 1. Start your zmarkdown server `npm run server`\n 2. Send a `POST` request to `http://localhost:27272/{endpoint}`\n \n`pm2 monit`: provides a realtime dashboard that fits directly into your terminal, it is a [simple way to monitor][pm2-monit] the resource usage of you server.\n\n[pm2-monit]:http://pm2.keymetrics.io/docs/usage/monitoring/\n\n### Limit the resource usage of your server\n\nYou can change the number of threads (default: `3`) and the max-memory of each thread (default: `150M`) in your package.json at `scripts.server` :\n\n```json\n    \"server\": \"pm2 start -f server/index.js -i 3 --max-memory-restart 150M\",\n```\n\n## Requests\nAll endpoints respond to `HTTP POST`. The request body must be JSON with a required `md` key. An optional `opts` key can be provided, the value of which depends on the endpoint.\n\n### URL\n\n```\nPOST http://localhost:27272/{endpoint}\n```\n\n### Body\n\n#### Required Body JSON Value\n\n| Name | Type | Description |\n| - | - | - |\n| `md` | string | markdown source string or ordered list of Markdown extracts (see below) |\n\n#### Optional Body JSON Value\n\n| Name | Type | Description |\n| - | - | - |\n| `opts` | JSON | Options specific to this endpoint. This object is documented in the **Request** section of each endpoint. |\n\n### Response\n\nAll endpoints return `[contents, metadata, messages]` as JSON.\n\n| Name | Type | Description |\n| - | - | - |\n| `contents` | string | the rendered HTML or LaTeX. |\n| `metadata` | object | depends on request options. This object is documented in the **Response** section of each endpoint. |\n| `messages` | string[] | info/debug/errors from parsers, plugins, compilers, etc. |\n\nOnly `metadata` is described in the **Response** sections below.\n\n# Endpoints \n\n[ref-epub]: #epub\n[ref-html]: #html\n[ref-latex]: #latex\n[ref-tex]: #tex\n\n## epub\n\nMarkdown to EPUB compatible HTML\n\n### URL\n\n```\nPOST http://localhost:27272/epub\n```\n\n### Request `opts` values\n\n| Name | Type | Description |\n| - | - | - |\n| `opts.images_download_dir` | bool | [see `/latex`][ref-latex] |\n| `opts.local_url_to_local_path` | string | [see `/latex`][ref-latex] |\n\n### Response `metadata` values\n\n| Name | Type | Description |\n| - | - | - |\n| `metadata.disableToc` | bool | Whether or not the input Markdown did **not** contain headings (`#`, `##`, …). This property is named that way because we use it to disable Table of Contents generation when no headings were found.<br>- `disableToc: true` means *no headings*<br>- `disableToc: false` means at least one *heading*. |\n\n## html\n\nMarkdown to HTML\n\n### URL\n\n```\nPOST http://localhost:27272/html\n```\n\n### Request `opts` values\n\n| Name | Type | Description |\n| - | - | - |\n| `opts.disable_ping` | bool | default: `false`, [pings][ping] won't get parsed. |\n| `opts.disable_jsfiddle` | bool |  default: `false`, JSFiddle [iframes][iframes] are disabled. |\n| `opts.inline` | bool | default: `false`, Only parse inline Markdown elements (such as links and emphasis, unlike lists and fenced code blocks). |\n| `opts.stats` | bool | default: `false`, Will compute and return statistics about markdown text. |\n\n### Response `metadata` values\n\n| Name | Type | Description |\n| - | - | - |\n| `metadata.disableToc` | bool | Whether or not the input Markdown did **not** contain headings (`#`, `##`, …). This property is named that way because we use it to disable Table of Contents generation when no headings were found.<br>`disableToc: true` means *no headings*<br>`disableToc: false` means at least one *heading* |\n| `metadata.ping` | string[] | undefined if `opts.disable_ping: true`<br>The list of nicknames returned by `remark-ping`. Can be used to send \"ping\" notifications to the corresponding users.<br>Note: this is fully customizable, `remark-ping` can validate potential *ping*s by any means, including sending an HTTP request (we recommend `HEAD`) to a REST API to make sure this username actually exists. |\n| `metadata.languages` | string[] | A list of unique languages used in GitHub Flavoured Markdown fences with a flag. |\n| `metadata.stats` | object | stats about the parsed text:<br>- `signs`: number of chars, spaces included.<br>- ` words`: number of words. |\n\n### Example\n\nHere is a quick example of the request to be made to the `http://localhost:27272/html` endpoint, using the software of your choice:\n\n```json\n{\n  \"md\": \"# Hello\\n\\nThis is @zmarkdown, a wonderful [Markdown](https://fr.wikipedia.org/wiki/Markdown) parser. You can **embed** code in it:\\n\\n```js\\n\\nconst zmd = require('zmarkdown/modules/common')\\n\\n\\n\\nconst globalParser = common(opts, processor)\\n\\n```\\n\\n- Oh wait, this is *Mise en abyme*, isn't it?\\n\\n- Of course it is, you @silly.\\n\\n- Silly, me? Let me remind you that the main usage of this module is to launch the server directly, not using this Node.js crap:\\n\\n```bash\\n\\nnpm -g install pm2 && npm install zmarkdown\\ncd ./node_modules/zmarkdown && npm run server\\n\\n```\\n\\nNow you know how it works, at least for the API endpoint, but we do support a lot more syntax, if you want.\",\n  \"opts\": {\n    \"stats\": true\n  }\n}\n```\n\nThis request will trigger the following response from the server:\n\n```json\n[\n  \"<h3 id=\\\"hello\\\">Hello<a aria-hidden=\\\"true\\\" href=\\\"#hello\\\"><span class=\\\"icon icon-link\\\"></span></a></h3>\\n<p>This is <a href=\\\"/@zmarkdown\\\" rel=\\\"nofollow\\\" class=\\\"ping ping-link\\\">@<span class=\\\"ping-username\\\">zmarkdown</span></a>, a wonderful <a href=\\\"https://fr.wikipedia.org/wiki/Markdown\\\">Markdown</a> parser. You can <strong>embed</strong> code in it:</p>\\n<div class=\\\"hljs-code-div\\\"><div class=\\\"hljs-line-numbers\\\"><span></span><span></span><span></span><span></span><span></span></div><pre><code class=\\\"hljs language-js\\\"><span class=\\\"hljs-keyword\\\">const</span> zmd = <span class=\\\"hljs-built_in\\\">require</span>(<span class=\\\"hljs-string\\\">'zmarkdown/modules/common'</span>)\\n\\n\\n\\n<span class=\\\"hljs-keyword\\\">const</span> globalParser = common(opts, processor)\\n</code></pre></div>\\n<ul>\\n<li>\\n<p>Oh wait, this is <em>Mise en abyme</em>, isn’t it?</p>\\n</li>\\n<li>\\n<p>Of course it is, you <a href=\\\"/@silly\\\" rel=\\\"nofollow\\\" class=\\\"ping ping-link\\\">@<span class=\\\"ping-username\\\">silly</span></a>.</p>\\n</li>\\n<li>\\n<p>Silly, me? Let me remind you that the main usage of this module is to launch the server directly, not using this Node.js crap:</p>\\n</li>\\n</ul>\\n<div class=\\\"hljs-code-div\\\"><div class=\\\"hljs-line-numbers\\\"><span></span><span></span></div><pre><code class=\\\"hljs language-bash\\\">npm -g install pm2 &#x26;&#x26; npm install zmarkdown\\n<span class=\\\"hljs-built_in\\\">cd</span> ./node_modules/zmarkdown &#x26;&#x26; npm run server\\n</code></pre></div>\\n<p>Now you know how it works, at least for the API endpoint, but we do support a lot more syntax, if you want.<p>\",\n  {\n    \"ping\": [\n      \"zmarkdown\",\n      \"silly\"\n    ],\n    \"disableToc\": false,\n    \"languages\": [\n      \"js\",\n      \"bash\"\n    ],\n    \"depth\": 5,\n    \"stats\": {\n      \"signs\": 386,\n      \"words\": 78\n    }\n  },\n  []\n]\n```\n\n## LaTeX\n\nMarkdown to LaTeX\n\n### URL\n\n```\nPOST http://localhost:27272/latex\n```\n\n### Request `opts` values\n\n| Name | Type | Description |\n| - | - | - |\n| `opts.disable_images_download` | bool | Default: `false`, does not download images. |\n| `opts.images_download_dir` | string | Where to download the images to. |\n| `opts.images_download_default` | string | Default: `black.png`, image used when the distant image is not found. |\n| `opts.images_download_timeout` | number | Default: `5000` ms. HTTP request timeout for each image, in milliseconds. |\n| `opts.local_url_to_local_path` | - | [see below](#optslocal_url_to_local_path) this table. |\n| `opts.disable_jsfiddle` | bool | [see `/html`][ref-html] |\n\n### opts.local_url_to_local_path\n\n - \\[from: string, to: string\\], default: `<none>`\n\n   If provided, local images referenced in Markdown source (such as `![](/img/example.png)`)\n   will be copied to `images_download_dir` after replacing the string `from` with `to` using\n   the following RegExp:\n\n   ```js\n   '/img/example.png'.replace(new RegExp(`^${from}`), to)\n   ```\n\n### Response `metadata` values\n\nThis endpoint only returns `{}` as metadata, i.e. an empty object.\n\n## TeX\n\nMarkdown to TEX file\n\n### URL\n\n```\nPOST http://localhost:27272/latex-document\n```\n\n### Request required `opts` values\n\nThese values are **required**.\n\n| Name | Type | Description |\n| - | - | - |\n| `opts.content_type` | string | (**required**) Will be interpolated in `\\documentclass[${content_type}]{zmdocument}` |\n| `opts.title` | string | (**required**) Will be interpolated in `\\title{${title}}` |\n| `opts.authors`, | string[] | (**required**) Will be interpolated in `\\author{${authors.join(', ')}}` |\n| `opts.license` | string | (**required**) E.g. `CC-BY-SA` will be displayed as-is, using `${license_directory}/by-sa.svg` as license icon with a link to `https://creativecommons.org/licenses/by-sa/4.0/legalcode` |\n| `opts.license_directory` | string | (**required**) Path to the directory where CC license SVG icons are stored, see `license` above. |\n| `opts.smileys_directory` | string | (**required**) Path to the directory where smileys are stored. |\n  \n### Request `opts` values\n\n| Name | Type | Description |\n| - | - | - |\n| `opts.disable_images_download` | bool | [see `/latex`][ref-latex] |\n| `opts.images_download_dir` | string | [see `/latex`][ref-latex] |\n| `opts.images_download_default` | string | [see `/latex`][ref-latex] |\n| `opts.local_url_to_local_path` | string | [see `/latex`][ref-latex] |\n| `opts.disable_jsfiddle` | bool | [see `/html`][ref-html] |\n\n### Response `metadata` values\n\nThis endpoint only returns `{}` as metadata, i.e. an empty object.\n\n## Manifest rendering\n\nSince version 10.0.0, ZMarkdown supports *manifest rendering*, which means it is capable of processing asynchronously an ordered list of Markdown extracts, and assembling them back together. Manifest rendering works with all the four endpoints described above. Let's take an example with HTML; the following request body:\n\n```json\n{\n  \"md\": {\"text\":\"# foo\\n\\nHello @you\", \"children\": [{\"text\": \"Foobar\"}, {\"text\": \"Barfoo\"}]},\n  \"opts\": {\n    \"stats\": true\n  }\n}\n```\n\nWill lead to the following response from the server:\n\n```json\n[\n  {\n    \"text\": \"<h2 id=\\\"foo\\\">foo<a aria-hidden=\\\"true\\\" tabindex=\\\"-1\\\" href=\\\"#foo\\\"><span class=\\\"icon icon-link\\\"></span></a></h2>\\n<p>Hello <a href=\\\"/@you\\\" rel=\\\"nofollow\\\" class=\\\"ping ping-link\\\">@<span class=\\\"ping-username\\\">you</span></a><p>\",\n    \"children\": [\n      {\n        \"text\": \"<p>Foobar</p>\"\n      },\n      {\n        \"text\": \"<p>Barfoo</p>\"\n      }\n    ]\n  },\n  {\n    \"ping\": [\n      \"you\"\n    ],\n    \"stats\": {\n      \"signs\": 24,\n      \"words\": 5\n    },\n    \"depth\": 1,\n    \"disableToc\": false,\n    \"languages\": []\n  },\n  []\n]\n```\n\nAs you can see, the extracts are positionned in the right order, and VFiles are automatically assembled. Calling the `latex-document` endpoint will also concatenate the extracts and produce a complete document.\n\n## Client Architecture\n\nFour client builds are currently available (starting from version 9.0.0), they can all be found in the `client/dist` folder:\n\n- `zmarkdown-zmdast` compiles Markdown to MDAST and return the result, and optionally an inspector to get a pretty output;\n- `zmarkdown-zhtml` compiles Markdown to HTML, using the same modules as the server, but this renderer is quite huge (1.8 MB), so it is not recommended for use in a web browser;\n- `zmarkdown-zhlite` is a browser-friendly version of the MD-to-HTML renderer; it has the same capabilities, except for KaTeX and highlight.js, so you'll need to provide yourself if you want to use them;\n- `zmarkdown-zlatex` compiles Markdown to LaTeX, using the same modules as the server.\n\n### Getting started\n\nSimply import one of the three files mentionned above, it will expose a `ZMarkdownZ*`, depending on the imported file. For instance, `zhlite` exposes a `ZMarkdownZHLITE` object. This exported object have a `render` method, that takes the input string and a callback.\n\n### Example\n\n```javascript\nZMarkdownZHTML.render(\"# Hello\", (err, vFile) => {\n  console.log(vFile.contents);\n  // will display: \"<h1 id=\"title\">Title<a aria-hidden=\"true\" href=\"#title\"><span class=\"icon icon-link\"></span></a></h1>\"\n});\n```\n\n### Specific MDAST renderer\n\nThe MDAST renderer is synchronous, unlike the other renderers, so it will return instead of requiring a callback. Moreover, this renderer exposes an `inspect` method, from [unist-util-inspect].\n\n## Builds\n\n### Dev build\n\nIf you want to watch the local files while working zmarkdown, you can use `npm run watch:client`. Run the client by opening `./public/index.html`.\n\n*Note: the current implementation (parallel-webpack) doesn't support hot-reload, you will have to manually refresh the webpage after each change*.\n\n### Production build\n\nTo build for production, just run `npm run release`. Generated files are located in `./dist`.\n\n[ping]: https://www.npmjs.com/package/remark-ping\n[iframes]: https://www.npmjs.com/package/remark-iframes\n[unist-util-inspect]: https://www.npmjs.com/package/unist-util-inspect\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/__snapshots__/api.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`html can take custom config 1`] = `\n\"<h1 id=\\\\\"some-md\\\\\">some md<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#some-md\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\n<div class=\\\\\"hljs-code-div\\\\\"><pre><code class=\\\\\"hljs language-latex\\\\\">Some LaTeX\n</code></pre></div>\"\n`;\n\nexports[`html uses default config 1`] = `\n\"<h1 id=\\\\\"some-md\\\\\">some md<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#some-md\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\n<div class=\\\\\"hljs-code-div hljs-code-latex\\\\\"><pre><code class=\\\\\"hljs language-latex\\\\\">Some LaTeX\n</code></pre></div>\"\n`;\n\nexports[`latex can take custom config 1`] = `\"\\\\\\\\thisIsNotATitle{some md}\"`;\n\nexports[`latex uses default config 1`] = `\"\\\\\\\\levelOneTitle{some md}\"`;\n\nexports[`mdast can take custom config 1`] = `\nObject {\n  \"children\": Array [\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 10,\n              \"line\": 1,\n              \"offset\": 9,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 3,\n              \"line\": 1,\n              \"offset\": 2,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"some md\",\n        },\n      ],\n      \"depth\": 1,\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 10,\n          \"line\": 1,\n          \"offset\": 9,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 1,\n          \"offset\": 0,\n        },\n      },\n      \"type\": \"heading\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 7,\n              \"line\": 3,\n              \"offset\": 17,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 3,\n              \"offset\": 11,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"@hello\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 7,\n          \"line\": 3,\n          \"offset\": 17,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 3,\n          \"offset\": 11,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n  ],\n  \"position\": Object {\n    \"end\": Object {\n      \"column\": 7,\n      \"line\": 3,\n      \"offset\": 17,\n    },\n    \"start\": Object {\n      \"column\": 1,\n      \"line\": 1,\n      \"offset\": 0,\n    },\n  },\n  \"type\": \"root\",\n}\n`;\n\nexports[`mdast uses default config 1`] = `\nObject {\n  \"children\": Array [\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 10,\n              \"line\": 1,\n              \"offset\": 9,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 3,\n              \"line\": 1,\n              \"offset\": 2,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"some md\",\n        },\n      ],\n      \"depth\": 1,\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 10,\n          \"line\": 1,\n          \"offset\": 9,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 1,\n          \"offset\": 0,\n        },\n      },\n      \"type\": \"heading\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"children\": Array [\n            Object {\n              \"type\": \"text\",\n              \"value\": \"@\",\n            },\n            Object {\n              \"children\": Array [\n                Object {\n                  \"type\": \"text\",\n                  \"value\": \"hello\",\n                },\n              ],\n              \"data\": Object {\n                \"hName\": \"span\",\n                \"hProperties\": Object {\n                  \"class\": \"ping-username\",\n                },\n              },\n              \"type\": \"emphasis\",\n            },\n          ],\n          \"data\": Object {\n            \"hName\": \"a\",\n            \"hProperties\": Object {\n              \"class\": \"ping ping-link\",\n              \"href\": \"/@hello\",\n              \"rel\": \"nofollow\",\n            },\n          },\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 7,\n              \"line\": 3,\n              \"offset\": 17,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 3,\n              \"offset\": 11,\n            },\n          },\n          \"type\": \"ping\",\n          \"url\": \"/@hello\",\n          \"username\": \"hello\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 7,\n          \"line\": 3,\n          \"offset\": 17,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 3,\n          \"offset\": 11,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n  ],\n  \"position\": Object {\n    \"end\": Object {\n      \"column\": 7,\n      \"line\": 3,\n      \"offset\": 17,\n    },\n    \"start\": Object {\n      \"column\": 1,\n      \"line\": 1,\n      \"offset\": 0,\n    },\n  },\n  \"type\": \"root\",\n}\n`;\n\nexports[`misc can use callback 1`] = `\"\\\\\\\\levelOneTitle{some md}\"`;\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/__snapshots__/html-suite.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Sanitize HTML to prevent XSS advanced XSS 1`] = `\"<p>This is [not obvious](   lives\\\\\\\\0cript:promp('It works !')) !</p>\"`;\n\nexports[`code highlight special cases discards unused attributes 1`] = `\n\"<div class=\\\\\"hljs-code-div hljs-code-python\\\\\"><div class=\\\\\"hljs-line-numbers\\\\\"><span data-count=\\\\\"1\\\\\"></span><span data-count=\\\\\"2\\\\\"></span><span data-count=\\\\\"3\\\\\"></span><span data-count=\\\\\"4\\\\\"></span><span data-count=\\\\\"5\\\\\"></span></div><pre><code class=\\\\\"hljs language-python\\\\\"><span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">main</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'It\\\\\\\\'s amazing!'</span>)\n\n<span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">unused</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'Please use me!'</span>)\n</code></pre></div>\"\n`;\n\nexports[`code highlight special cases does not count one-liners 1`] = `\n\"<div class=\\\\\"hljs-code-div hljs-code-js\\\\\"><pre><code class=\\\\\"hljs language-js\\\\\"><span class=\\\\\"hljs-keyword\\\\\">const</span> a = <span class=\\\\\"hljs-number\\\\\">1</span>\n</code></pre></div>\"\n`;\n\nexports[`code highlight special cases does not highlight console 1`] = `\n\"<div class=\\\\\"hljs-code-div hljs-code-console\\\\\"><pre><code class=\\\\\"language-console\\\\\">echo \\\\\"Hello world\\\\\"\n</code></pre></div>\"\n`;\n\nexports[`code highlight special cases highlights latex 1`] = `\n\"<div class=\\\\\"hljs-code-div hljs-code-latex\\\\\"><div class=\\\\\"hljs-line-numbers\\\\\"><span data-count=\\\\\"1\\\\\"></span><span data-count=\\\\\"2\\\\\"></span><span data-count=\\\\\"3\\\\\"></span><span data-count=\\\\\"4\\\\\"></span></div><pre><code class=\\\\\"hljs language-latex\\\\\"><span class=\\\\\"hljs-keyword\\\\\">\\\\\\\\usepackage</span>{inputenc}[utf8]\n<span class=\\\\\"hljs-keyword\\\\\">\\\\\\\\begin</span>{document}\n<span class=\\\\\"hljs-keyword\\\\\">\\\\\\\\texttt</span>{code}\n<span class=\\\\\"hljs-keyword\\\\\">\\\\\\\\end</span>{document}\n</code></pre></div>\"\n`;\n\nexports[`code highlight special cases supports both hl_lines and linenostart 1`] = `\n\"<div class=\\\\\"hljs-code-div hljs-code-python\\\\\"><div class=\\\\\"hljs-line-numbers\\\\\"><span data-count=\\\\\"3\\\\\"></span><span data-count=\\\\\"4\\\\\" class=\\\\\"hll\\\\\"></span><span data-count=\\\\\"5\\\\\"></span><span data-count=\\\\\"6\\\\\"></span><span data-count=\\\\\"7\\\\\"></span></div><pre><code class=\\\\\"hljs language-python\\\\\"><span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">main</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'It\\\\\\\\'s amazing!'</span>)\n\n<span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">unused</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'Please use me!'</span>)\n</code></pre></div>\"\n`;\n\nexports[`code highlight special cases supports hl_lines - comma syntax 1`] = `\n\"<div class=\\\\\"hljs-code-div hljs-code-python\\\\\"><div class=\\\\\"hljs-line-numbers\\\\\"><span data-count=\\\\\"1\\\\\"></span><span data-count=\\\\\"2\\\\\"></span><span data-count=\\\\\"3\\\\\"></span><span data-count=\\\\\"4\\\\\" class=\\\\\"hll\\\\\"></span><span data-count=\\\\\"5\\\\\" class=\\\\\"hll\\\\\"></span></div><pre><code class=\\\\\"hljs language-python\\\\\"><span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">main</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'It\\\\\\\\'s amazing!'</span>)\n\n<span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">unused</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'Please use me!'</span>)\n</code></pre></div>\"\n`;\n\nexports[`code highlight special cases supports hl_lines - interval syntax 1`] = `\n\"<div class=\\\\\"hljs-code-div hljs-code-python\\\\\"><div class=\\\\\"hljs-line-numbers\\\\\"><span data-count=\\\\\"1\\\\\" class=\\\\\"hll\\\\\"></span><span data-count=\\\\\"2\\\\\" class=\\\\\"hll\\\\\"></span><span data-count=\\\\\"3\\\\\" class=\\\\\"hll\\\\\"></span><span data-count=\\\\\"4\\\\\"></span><span data-count=\\\\\"5\\\\\"></span></div><pre><code class=\\\\\"hljs language-python\\\\\"><span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">main</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'It\\\\\\\\'s amazing!'</span>)\n\n<span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">unused</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'Please use me!'</span>)\n</code></pre></div>\"\n`;\n\nexports[`code highlight special cases supports hl_lines - interval syntax reversed 1`] = `\n\"<div class=\\\\\"hljs-code-div hljs-code-python\\\\\"><div class=\\\\\"hljs-line-numbers\\\\\"><span data-count=\\\\\"1\\\\\" class=\\\\\"hll\\\\\"></span><span data-count=\\\\\"2\\\\\" class=\\\\\"hll\\\\\"></span><span data-count=\\\\\"3\\\\\" class=\\\\\"hll\\\\\"></span><span data-count=\\\\\"4\\\\\"></span><span data-count=\\\\\"5\\\\\"></span></div><pre><code class=\\\\\"hljs language-python\\\\\"><span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">main</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'It\\\\\\\\'s amazing!'</span>)\n\n<span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">unused</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'Please use me!'</span>)\n</code></pre></div>\"\n`;\n\nexports[`code highlight special cases supports hl_lines - spaced syntax 1`] = `\n\"<div class=\\\\\"hljs-code-div hljs-code-python\\\\\"><div class=\\\\\"hljs-line-numbers\\\\\"><span data-count=\\\\\"1\\\\\"></span><span data-count=\\\\\"2\\\\\"></span><span data-count=\\\\\"3\\\\\"></span><span data-count=\\\\\"4\\\\\" class=\\\\\"hll\\\\\"></span><span data-count=\\\\\"5\\\\\" class=\\\\\"hll\\\\\"></span></div><pre><code class=\\\\\"hljs language-python\\\\\"><span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">main</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'It\\\\\\\\'s amazing!'</span>)\n\n<span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">unused</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'Please use me!'</span>)\n</code></pre></div>\"\n`;\n\nexports[`code highlight special cases supports linenostart 1`] = `\n\"<div class=\\\\\"hljs-code-div hljs-code-python\\\\\"><div class=\\\\\"hljs-line-numbers\\\\\"><span data-count=\\\\\"3\\\\\"></span><span data-count=\\\\\"4\\\\\"></span><span data-count=\\\\\"5\\\\\"></span><span data-count=\\\\\"6\\\\\"></span><span data-count=\\\\\"7\\\\\"></span></div><pre><code class=\\\\\"hljs language-python\\\\\"><span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">main</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'It\\\\\\\\'s amazing!'</span>)\n\n<span class=\\\\\"hljs-function\\\\\"><span class=\\\\\"hljs-keyword\\\\\">def</span> <span class=\\\\\"hljs-title\\\\\">unused</span>():</span>\n  <span class=\\\\\"hljs-built_in\\\\\">print</span>(<span class=\\\\\"hljs-string\\\\\">'Please use me!'</span>)\n</code></pre></div>\"\n`;\n\nexports[`images become figures: does not apply when a caption is present 1`] = `\n\"<figure><img src=\\\\\"http://example.com\\\\\" alt=\\\\\"foo\\\\\" loading=\\\\\"lazy\\\\\"><figcaption>foo</figcaption></figure>\n<figure><img src=\\\\\"http://example.com\\\\\" loading=\\\\\"lazy\\\\\"><figcaption>Caption</figcaption></figure>\n<figure><img src=\\\\\"http://example.com\\\\\" alt=\\\\\"foo\\\\\" loading=\\\\\"lazy\\\\\"><figcaption>Caption</figcaption></figure>\n<figure><img src=\\\\\"http://example.com\\\\\" loading=\\\\\"lazy\\\\\"><figcaption></figcaption></figure>\"\n`;\n\nexports[`images become figures: works with only an image 1`] = `\"<figure><img src=\\\\\"http://blabla.fr\\\\\" alt=\\\\\"wrapped into _figure_\\\\\" loading=\\\\\"lazy\\\\\"><figcaption>wrapped into _figure_</figcaption></figure>\"`;\n\nexports[`pedantic mode disabled unordered lists markers 1`] = `\n\"<ul>\n<li>a</li>\n</ul>\n<ul>\n<li>b</li>\n</ul>\n<ul>\n<li>c</li>\n</ul>\"\n`;\n\nexports[`smileys translates >_< 1`] = `\"<p>This is funny <img src=\\\\\"/static/smileys/svg/pinch.svg\\\\\" alt=\\\\\">_<\\\\\" class=\\\\\"smiley\\\\\"></p>\"`;\n\nexports[`smileys translates X/ 1`] = `\"<p>This is funny <img src=\\\\\"/static/smileys/svg/pinch.svg\\\\\" alt=\\\\\"X/\\\\\" class=\\\\\"smiley\\\\\"></p>\"`;\n\nexports[`smileys translates cthulhu 1`] = `\"<p><img src=\\\\\"/static/smileys/svg/cthulhu.svg\\\\\" alt=\\\\\"^(;,;)^\\\\\" class=\\\\\"smiley\\\\\"></p>\"`;\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/__snapshots__/latex-suite.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`blockquote 1`] = `\n\"\\\\\\\\begin{Quotation}\na quote\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\na\nmultiline\nquote\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\na quote\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}\na\nmultiline\nquote\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`code 1`] = `\n\"\\\\\\\\begin{CodeBlock}{python}\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}[][1,2]{python}\nprint('bla')\nprint('bla')\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}[][][10]{python}\nprint('bla')\nprint('bla')\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}[][1,2][10]{python}\nprint('bla')\nprint('bla')\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}[][2]{css}\n.tmp {\n  font-weight: bold;\n}\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}[][1,3]{css}\n.tmp {\n  font-weight: bold;\n}\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\na code without lang\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`code+caption 1`] = `\n\"\\\\\\\\begin{CodeBlock}{python}\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\\\\\\\\captionof{listing}{With Source}\n\n\n\n\\\\\\\\begin{CodeBlock}[][1,2]{python}\nprint('bla')\nprint('bla')\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\\\\\\\\captionof{listing}{With Source}\"\n`;\n\nexports[`code+reversed-hl 1`] = `\n\"\\\\\\\\begin{CodeBlock}[][2-3]{python}\nprint('bla')\nprint('bla')\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{CodeBlock}[][1-2,3-4]{python}\nprint('bla')\nprint('bla')\nprint('bla')\nprint('bla')\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`codes in notes 1`] = `\n\"hello \\\\\\\\textsuperscript{\\\\\\\\footnotemark[1]}\\\\\\\\textsuperscript{\\\\\\\\footnotemark[2]}\n\n\n\n\\\\\\\\footnotetext[1]{test\n\n\\\\\\\\hyperref[appendix-1]{Annexe de code 1}}\n\n\\\\\\\\footnotetext[2]{test\n\n\\\\\\\\hyperref[appendix-3]{Annexe de code 3}}\n\n\\\\\\\\begin{appendices}\n\\\\\\\\levelOneTitle{\\\\\\\\label{appendix-1}Annexes 1}\n\n\\\\\\\\begin{CodeBlock}{javascript}\nconsole.log('hello')\n\\\\\\\\end{CodeBlock}\n\n\\\\\\\\levelOneTitle{\\\\\\\\label{appendix-3}Annexes 3}\n\n\\\\\\\\begin{CodeBlock}{javascript}\nconsole.log('hello')\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{appendices}\"\n`;\n\nexports[`custom-blocks 1`] = `\n\"\\\\\\\\begin{Information}\ninfo\n\\\\\\\\end{Information}\n\n\n\\\\\\\\begin{Warning}\nwarning\n\\\\\\\\end{Warning}\n\n\n\\\\\\\\begin{Spoiler}\nsecret\n\\\\\\\\end{Spoiler}\n\n\n\\\\\\\\begin{Spoiler}\nimbricated spoilers\n\nand another\n\nand that's it\n\\\\\\\\end{Spoiler}\n\n\n\\\\\\\\begin{Spoiler}\nimbricated spoilers\n\nsecond level\n\nsecond level too\n\\\\\\\\end{Spoiler}\n\n\n\\\\\\\\begin{Spoiler}\nimbricated spoilers\n\nsecond level\n\nwith text in between\n\nsecond level too\n\\\\\\\\end{Spoiler}\n\n\n\\\\\\\\begin{Spoiler}\nimbricated spoilers\n\n\\\\\\\\begin{CodeBlock}{markdown}\nand here is some code\n\\\\\\\\end{CodeBlock}\n\nsecond level\n\\\\\\\\end{Spoiler}\n\n\n\\\\\\\\begin{Spoiler}\ndo not over-flattenize\n\nexpected to be flattened\n\nfirst level\n\n\\\\\\\\begin{Question}\nthis remains a question\n\\\\\\\\end{Question}\n\\\\\\\\end{Spoiler}\n\n\n\\\\\\\\begin{Spoiler}\nflattenize children of children\n\n\\\\\\\\begin{Question}\nthis remains a question\n\nbut the content in it is flattened to the question\n\\\\\\\\end{Question}\n\\\\\\\\end{Spoiler}\n\n\n\\\\\\\\begin{Question}\nquestion \\\\\\\\CodeInline{coded}\n\\\\\\\\end{Question}\n\n\n\\\\\\\\begin{Error}\n\\\\\\\\textbf{error}\nfoo bar \\\\\\\\\\\\\\\\\nbaz\n\\\\\\\\end{Error}\"\n`;\n\nexports[`emoticon 1`] = `\"foo \\\\\\\\smiley{langue.svg} bar \\\\\\\\smiley{smile.svg}\"`;\n\nexports[`figure+caption 1`] = `\n\"\\\\\\\\begin{Quotation}[With Source]\na\nmultiline\nquote\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`footnotes 1`] = `\n\"\\\\\\\\levelOneTitle{mytitle A\\\\\\\\textsuperscript{\\\\\\\\protect\\\\\\\\footnotemark[1]}}\n\n\n\\\\\\\\footnotetext[1]{reference in title}\n\n\\\\\\\\levelOneTitle{mytitle B\\\\\\\\textsuperscript{\\\\\\\\protect\\\\\\\\footnotemark[2]}\\\\\\\\protect\\\\\\\\footnotetext[2]{footnoterawhead inner}}\n\n\n\\\\\\\\levelOneTitle{myti\\\\\\\\textit{tle C\\\\\\\\textsuperscript{\\\\\\\\protect\\\\\\\\footnotemark[3]}\\\\\\\\protect\\\\\\\\footnotetext[3]{foo inner}}}\n\n\na paragraph\\\\\\\\textsuperscript{\\\\\\\\footnotemark[4]}\\\\\\\\footnotetext[4]{footnoteRawPar inner}\"\n`;\n\nexports[`heading 1`] = `\n\"\\\\\\\\levelOneTitle{first level title}\n\n\n\\\\\\\\levelTwoTitle{second level title}\n\n\n\\\\\\\\levelThreeTitle{third level title}\n\n\n\\\\\\\\levelFourTitle{fourth level title}\n\n\n\\\\\\\\levelFiveTitle{fifth level title}\n\n\n\\\\\\\\levelSixTitle{sixth level title}\n\n\n\\\\\\\\levelOneTitle{a \\\\\\\\textbackslash{} b}\n\n\n\\\\\\\\levelOneTitle{a \\\\\\\\} b}\n\n\n\\\\\\\\levelOneTitle{a \\\\\\\\} \\\\\\\\textbackslash{} b}\n\n\n\\\\\\\\levelOneTitle{a \\\\\\\\} b}\"\n`;\n\nexports[`html nodes 1`] = `\n\"\\\\\\\\levelOneTitle{foo}\n\n\n\\\\\\\\textbf{something <a> else}\"\n`;\n\nexports[`inline-code 1`] = `\n\"a paragraph \\\\\\\\CodeInline{with inline code}.\n\n\n\n\\\\\\\\CodeInline{a\nmultiline\ninlinecode}\n\n\n\n\\\\\\\\CodeInline{a code with \\\\\\\\textbackslash{} }\n\n\n\n\\\\\\\\CodeInline{a \\\\\\\\textbackslash{}text in \\\\\\\\textbackslash{}LaTeX \\\\\\\\textbackslash{}\\\\\\\\textbackslash{}}\"\n`;\n\nexports[`link 1`] = `\n\"\\\\\\\\externalLink{an external link}{https://wikipedia.com}\n\n\n\n\\\\\\\\externalLink{an internal link}{http://zestedesavoir.com/forums}\n\n\n\n\\\\\\\\externalLink{an \\\\\\\\CodeInline{external} link}{https://wikipedia.com}\"\n`;\n\nexports[`link with special characters 1`] = `\"\\\\\\\\externalLink{foo}{http://example.com?a=b\\\\\\\\%c\\\\\\\\textasciicircum{}\\\\\\\\{\\\\\\\\}\\\\\\\\#foo}\"`;\n\nexports[`list 1`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax an\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textbf{unordered}\n\\\\\\\\item\\\\\\\\relax list\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax an\n\\\\\\\\item\\\\\\\\relax \\\\\\\\CodeInline{ordered}\n\\\\\\\\item\\\\\\\\relax list\n\\\\\\\\end{enumerate}\"\n`;\n\nexports[`math 1`] = `\n\"A sentence ($S$) with \\\\\\\\textit{italic} and inline math ($C_L$) and $$b$$ another.\n\n\n\n\\\\\\\\[ L = \\\\\\\\frac{1}{2} \\\\\\\\rho v^2 S C_L \\\\\\\\]\n\n\n\nThis should be escaped: $\\\\\\\\pink{\\\\\\\\text{I love \\\\\\\\LaTeX}   {ls / > outputrce}  {outputrce}}$.\n\n\n\nhehe\"\n`;\n\nexports[`mix-1 1`] = `\n\"(for convenience,   are replaced with simple single spaces in the tests)\n\n\n\n\\\\\\\\levelOneTitle{first 1}\n\n\nfoo \\\\\\\\\\\\\\\\\nbar\n\n\n\nDisrupt \\\\\\\\sout{asymmetrical} unicorn, pok pok kale chips umami selfies gastropub food truck flannel. Blue \\\\\\\\textbf{bottle craft} beer hexagon artisan. Chia gochujang crucifix, \\\\\\\\textsuperscript{ready} \\\\\\\\textsuperscript{made} hammock \\\\\\\\textit{blog succulents} sriracha raw denim scenester cray typewriter fashion axe \\\\\\\\textsubscript{art} \\\\\\\\textit{party}. Schlitz tacos tilde intelligentsia, unicorn fixie adaptogen beard 8-bit street \\\\\\\\textsubscript{art} typewriter.\n\n\n\n\\\\\\\\levelTwoTitle{\\\\\\\\textit{second} 1}\n\n\n\\\\\\\\textbf{Literally selfies tbh lo-fi. Actually health goth ennui, brooklyn retro polaroid sriracha. Kogi live-edge mixtape marfa street \\\\\\\\textsubscript{art} synth. Godard synth truffaut selfies, vape fanny \\\\\\\\sout{pack} subway tile. Stumptown af pabst, try-hard fam ethical actually four dollar toast. Microdosing kogi brooklyn, locavore jianbing etsy sartorial \\\\\\\\textit{YOLO}. Williamsburg salvia photo booth \\\\\\\\textsuperscript{readymade} listicle man braid.}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{Quotation}[Guru]\nMarfa pickled helvetica put a bird on it hot chicken williamsburg.\nEdison bulb asymmetrical \\\\\\\\CodeInline{keffiyeh} schlitz iceland put a bird on it hoodie affogato.\n\nTofu tote bag distillery viral knausgaard, health goth asymmetrical.\n\\\\\\\\end{Quotation}\n\n\n\nAsymmetrical pug scenester sustainable enamel pin distillery quinoa keffiyeh. Flannel humblebrag PBR\\\\\\\\&B polaroid banh mi wolf. Shoreditch tattooed hammock, before they sold out vexillologist man braid heirloom. Activated charcoal craft beer cloud bread meh biodiesel pabst.\n\n\n\n\\\\\\\\levelThreeTitle{\\\\\\\\sout{third} 1}\n\n\nArt party keytar godard iceland neutra cronut. Austin \\\\\\\\textsuperscript{readymade} semiotics, edison bulb cloud bread adaptogen blue bottle jean shorts DIY. Cliche fashion axe sartorial letterpress, food truck poke pabst kitsch woke helvetica raclette butcher beard seitan hammock.\n\n\n\n\\\\\\\\CodeInline{foo\nbar}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\CodeInline{fo\\\\\\\\textbackslash{}o\nbar}\n\\\\\\\\end{Quotation}\n\n\n\nHexagon lo-fi seitan you probably haven't heard of them, bicycle rights small batch meditation try-hard green juice banh mi keffiyeh. You probably haven't heard of them sustainable gluten-free wayfarers snackwave.\n\n\n\n\\\\\\\\levelThreeTitle{third 2}\n\n\n\\\\\\\\levelFourTitle{\\\\\\\\sout{fo}u\\\\\\\\textbf{r}t\\\\\\\\textit{h} \\\\\\\\textit{1}}\n\n\nMumblecore kombucha offal, health goth next level before they sold out gluten-free chicharrones keffiyeh. Mumblecore kickstarter hoodie fixie keffiyeh. Microdosing lo-fi taiyaki irony pok pok. Banjo brooklyn umami succulents flexitarian. Swag sartorial scenester synth viral.\n\n\n\n\\\\\\\\levelFiveTitle{fifth 1}\n\n\nBanjo bespoke subway tile, street \\\\\\\\textsubscript{a\\\\\\\\textit{r}}\\\\\\\\textsuperscript{t} drinking vinegar offal franzen. Pour-over green juice vaporware kale chips. Meggings cronut affogato PBR\\\\\\\\&B, \\\\\\\\textsubscript{art} party unicorn dreamcatcher schlitz yuccie mixtape 90's thundercats air plant. Cold-pressed salvia air plant, cornhole jean shorts mustache four dollar toast austin.\n\n\n\n\\\\\\\\levelThreeTitle{third 3}\n\n\nMeditation heirloom chicharrones, sartorial man braid hot chicken sustainable. Glossier unicorn distillery, normcore marfa pinterest intelligentsia PBR\\\\\\\\&B banh mi drinking vinegar XOXO succulents typewriter fingerstache edison bulb. Meditation ethical cronut glossier cliche kickstarter.\n\n\n\n\\\\\\\\levelFourTitle{fourth 2}\n\n\nVenmo bushwick food truck chartreuse fam. Everyday carry gastropub glossier, cold-pressed salvia migas keytar. Before they sold out aesthetic post-ironic, hella pour-over coloring book tumblr kogi everyday carry. Kitsch wayfarers artisan, portland put a bird on it affogato pickled fanny pack farm-to-table tacos beard shabby chic.\n\n\n\n\\\\\\\\levelFourTitle{fourth 3}\n\n\nChambray intelligentsia vape listicle. Pok pok snackwave cronut retro hot chicken, trust fund master cleanse keytar forage dreamcatcher. Taiyaki actually deep v, godard small batch irony lumbersexual unicorn cardigan af. Irony lumbersexual salvia, pitchfork fam snackwave man bun. Kitsch jianbing intelligentsia freegan, waistcoat raw denim cloud bread vice cray etsy listicle skateboard jean shorts.\n\n\n\n\\\\\\\\levelFiveTitle{fifth 2}\n\n\nAsymmetrical normcore portland, vaporware viral tote bag DIY slow-carb kogi fanny pack. Keffiyeh ennui church-key, irony VHS man bun edison bulb listicle cloud bread try-hard cred lumbersexual lo-fi glossier.\n\n\n\n\\\\\\\\levelOneTitle{first 2}\n\n\n\\\\\\\\levelTwoTitle{second 2}\n\n\n\\\\\\\\levelFiveTitle{fifth 3}\n\n\nMessenger bag locavore swag raclette brunch whatever, portland food truck. PBR\\\\\\\\&B cred mlkshk, poke letterpress waistcoat celiac. La croix letterpress forage keffiyeh.\"\n`;\n\nexports[`mix-2 1`] = `\n\"(for convenience,   are replaced with simple single spaces in the tests)\n\n\n\n\\\\\\\\levelOneTitle{first 1}\n\n\n\\\\\\\\begin{Quotation}[Quotation Source]\nCode inside quote\n\n\\\\\\\\begin{CodeBlock}{python}\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\\\\\\\\captionof{listing}{code source}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{CodeBlock}{python}\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\\\\\\\\captionof{listing}{First \\\\\\\\keys{CTRL}+\\\\\\\\keys{S}}\n\n\n\nCode: Second\n\n\n\n\\\\\\\\begin{CodeBlock}{python}\nprint('code without caption')\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`mix-3 1`] = `\n\"\\\\\\\\levelOneTitle{right-aligned list}\n\n\n\n{\\\\\\\\raggedleft\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{itemize}\n}\n\n\n\\\\\\\\levelOneTitle{centered list}\n\n\n\n{\\\\\\\\centering \\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{itemize}\n}\n\n\n\\\\\\\\levelOneTitle{left list}\n\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\item\\\\\\\\relax item\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`mix-4 1`] = `\n\"\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nSub & Headings & \\\\\\\\abbr{ABBR}{abbreviation} \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} cell \\\\\\\\endgraf spans \\\\\\\\endgraf rows & \\\\\\\\SetCell[c=2]{l} column spanning &  \\\\\\\\\\\\\\\\\n & normal & cell \\\\\\\\\\\\\\\\\nmulti \\\\\\\\endgraf line \\\\\\\\endgraf \\\\\\\\endgraf cells \\\\\\\\endgraf too & \\\\\\\\SetCell[c=2]{l} cells can be \\\\\\\\endgraf \\\\\\\\textit{formatted} \\\\\\\\endgraf \\\\\\\\textbf{paragraphs} &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\\\\\\\\captionof{table}{The new table \\\\\\\\abbr{ABBR}{abbreviation} \\\\\\\\textsuperscript{\\\\\\\\protect\\\\\\\\footnotemark[1]} with \\\\\\\\keys{CTRL} + \\\\\\\\keys{S}}\n\n\n\n\\\\\\\\footnotetext[1]{a foot}\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\ntitle & image \\\\\\\\\\\\\\\\\nspace & \\\\\\\\image{https://i.ytimg.com/vi/lt0WQ8JzLz4/maxresdefault.jpg}[space] \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\ntitle & code \\\\\\\\\\\\\\\\\ninline & \\\\\\\\CodeInline{inline} br \\\\\\\\endgraf \\\\\\\\CodeInline{inline} \\\\\\\\\\\\\\\\\nblock & \\\\\\\\hyperref[appendix-1]{Annexe de code 1} \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{appendices}\n\\\\\\\\levelOneTitle{\\\\\\\\label{appendix-1}Annexes 1}\n\n\\\\\\\\begin{CodeBlock}{python}\nprint('bla')\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{appendices}\"\n`;\n\nexports[`mix-5 1`] = `\n\"\\\\\\\\image{http://www.numerama.com/content/uploads/2016/07/espace.jpg}[espace\\\\\\\\textsuperscript{\\\\\\\\protect\\\\\\\\footnotemark[1]}]\n\n\n\\\\\\\\footnotetext[1]{Two things are infinite: the universe and human stupidity.}\"\n`;\n\nexports[`mix-6 1`] = `\n\"\\\\\\\\iframe{https://www.youtube.com/embed/8TQIvdFl4aU?feature=oembed}[Video][a caption]\n\n\\\\\\\\iframe{https://www.youtube.com/embed/8TQIvdFl4aU?feature=oembed}[Video][]\n\nno caption\"\n`;\n\nexports[`paragraph 1`] = `\n\"\\\\\\\\levelOneTitle{first 1}\n\n\nDisrupt asymmetrical unicorn, pok pok kale chips umami selfies gastropub food truck flannel. Blue bottle craft beer hexagon artisan. Chia gochujang crucifix, readymade hammock blog succulents sriracha raw denim scenester cray typewriter fashion axe art party. Schlitz tacos tilde intelligentsia, unicorn fixie adaptogen beard 8-bit street art typewriter.\n\n\n\n\\\\\\\\levelTwoTitle{second 1}\n\n\nLiterally selfies tbh lo-fi. Actually health goth ennui, brooklyn retro polaroid sriracha. Kogi live-edge mixtape marfa street art synth. Godard synth truffaut selfies, vape fanny pack subway tile. Stumptown af pabst, try-hard fam ethical actually four dollar toast. Microdosing kogi brooklyn, locavore jianbing etsy sartorial YOLO. Williamsburg salvia photo booth readymade listicle man braid.\n\n\n\nMarfa pickled helvetica put a bird on it hot chicken williamsburg. Edison bulb asymmetrical keffiyeh schlitz iceland put a bird on it hoodie affogato. Tofu tote bag distillery viral knausgaard, health goth asymmetrical.\n\n\n\nAsymmetrical pug scenester sustainable enamel pin distillery quinoa keffiyeh. Flannel humblebrag PBR\\\\\\\\&B polaroid banh mi wolf. Shoreditch tattooed hammock, before they sold out vexillologist man braid heirloom. Activated charcoal craft beer cloud bread meh biodiesel pabst.\n\n\n\n\\\\\\\\levelThreeTitle{third 1}\n\n\nArt party keytar godard iceland neutra cronut. Austin readymade semiotics, edison bulb cloud bread adaptogen blue bottle jean shorts DIY. Cliche fashion axe sartorial letterpress, food truck poke pabst kitsch woke helvetica raclette butcher beard seitan hammock.\n\n\n\nHexagon lo-fi seitan you probably haven't heard of them, bicycle rights small batch meditation try-hard green juice banh mi keffiyeh. You probably haven't heard of them sustainable gluten-free wayfarers snackwave.\n\n\n\n\\\\\\\\levelThreeTitle{third 2}\n\n\n\\\\\\\\levelFourTitle{fourth 1}\n\n\nMumblecore kombucha offal, health goth next level before they sold out gluten-free chicharrones keffiyeh. Mumblecore kickstarter hoodie fixie keffiyeh. Microdosing lo-fi taiyaki irony pok pok. Banjo brooklyn umami succulents flexitarian. Swag sartorial scenester synth viral.\n\n\n\n\\\\\\\\levelFiveTitle{fifth 1}\n\n\nBanjo bespoke subway tile, street art drinking vinegar offal franzen. Pour-over green juice vaporware kale chips. Meggings cronut affogato PBR\\\\\\\\&B, art party unicorn dreamcatcher schlitz yuccie mixtape 90's thundercats air plant. Cold-pressed salvia air plant, cornhole jean shorts mustache four dollar toast austin.\n\n\n\n\\\\\\\\levelThreeTitle{third 3}\n\n\nMeditation heirloom chicharrones, sartorial man braid hot chicken sustainable. Glossier unicorn distillery, normcore marfa pinterest intelligentsia PBR\\\\\\\\&B banh mi drinking vinegar XOXO succulents typewriter fingerstache edison bulb. Meditation ethical cronut glossier cliche kickstarter.\n\n\n\n\\\\\\\\levelFourTitle{fourth 2}\n\n\nVenmo bushwick food truck chartreuse fam. Everyday carry gastropub glossier, cold-pressed salvia migas keytar. Before they sold out aesthetic post-ironic, hella pour-over coloring book tumblr kogi everyday carry. Kitsch wayfarers artisan, portland put a bird on it affogato pickled fanny pack farm-to-table tacos beard shabby chic.\n\n\n\n\\\\\\\\levelFourTitle{fourth 3}\n\n\nChambray intelligentsia vape listicle. Pok pok snackwave cronut retro hot chicken, trust fund master cleanse keytar forage dreamcatcher. Taiyaki actually deep v, godard small batch irony lumbersexual unicorn cardigan af. Irony lumbersexual salvia, pitchfork fam snackwave man bun. Kitsch jianbing intelligentsia freegan, waistcoat raw denim cloud bread vice cray etsy listicle skateboard jean shorts.\n\n\n\n\\\\\\\\levelFiveTitle{fifth 2}\n\n\nAsymmetrical normcore portland, vaporware viral tote bag DIY slow-carb kogi fanny pack. Keffiyeh ennui church-key, irony VHS man bun edison bulb listicle cloud bread try-hard cred lumbersexual lo-fi glossier.\n\n\n\n\\\\\\\\levelOneTitle{first 2}\n\n\n\\\\\\\\levelTwoTitle{second 2}\n\n\n\\\\\\\\levelFiveTitle{fifth 3}\n\n\nMessenger bag locavore swag raclette brunch whatever, portland food truck. PBR\\\\\\\\&B cred mlkshk, poke letterpress waistcoat celiac. La croix letterpress forage keffiyeh.\"\n`;\n\nexports[`ping 1`] = `\"Hello \\\\\\\\ping{you} and \\\\\\\\ping{you_too}, and \\\\\\\\ping{also you}\"`;\n\nexports[`quizz with answers 1`] = `\n\"\\\\\\\\begin{Neutral}[{{question}}]\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax bad answer\n\\\\\\\\item\\\\\\\\relax good answer\n\\\\\\\\item\\\\\\\\relax other bad answer\n\\\\\\\\end{itemize}\n\\\\\\\\end{Neutral}\n\n\n\\\\\\\\begin{Spoiler}[{{Correction}}]\n\\\\\\\\begin{itemize}\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax bad answer\n\\\\\\\\item[$\\\\\\\\boxtimes$]\\\\\\\\relax good answer\n\\\\\\\\item[$\\\\\\\\square$]\\\\\\\\relax other bad answer\n\\\\\\\\end{itemize}\nthe good answer is \\\\\"good answer\\\\\" as it better matches the philosophy\nof what good is for answers\n\\\\\\\\end{Spoiler}\"\n`;\n\nexports[`regression: code block without language 1`] = `\n\"\\\\\\\\begin{CodeBlock}{text}\na\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`table 1`] = `\n\"\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\n1 & 2 \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\n1 & 2 & 3 \\\\\\\\\\\\\\\\\n1 & 2 \\\\\\\\\\\\\\\\\n1 & 2 & 3 \\\\\\\\\\\\\\\\\n1 & 2 & 3 \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\"\n`;\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/__snapshots__/legacy-suite.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`basic renders amps-and-angle-encoding.txt 1`] = `\n\"<p>AT&#x26;T has an ampersand in their name.</p>\n<p>AT&#x26;amp;T is another way to write it.</p>\n<p>This &#x26; that.</p>\n<p>4 &#x3C; 5.</p>\n<p>6 > 5.</p>\n<p>Here's a <a href=\\\\\"http://example.com/?foo=1&#x26;bar=2\\\\\">link</a> with an ampersand in the URL.</p>\n<p>Here's a link with an amersand in the link text: <a href=\\\\\"http://att.com/\\\\\" title=\\\\\"AT&#x26;T\\\\\">AT&#x26;T</a>.</p>\n<p>Here's an inline <a href=\\\\\"/script?foo=1&#x26;bar=2\\\\\">link</a>.</p>\n<p>Here's an inline <a href=\\\\\"/script?foo=1&#x26;bar=2\\\\\">link</a>.</p>\"\n`;\n\nexports[`basic renders amps-and-angle-encoding.txt 2`] = `\n\"AT\\\\\\\\&T has an ampersand in their name.\n\n\n\nAT\\\\\\\\&amp;T is another way to write it.\n\n\n\nThis \\\\\\\\& that.\n\n\n\n4 < 5.\n\n\n\n6 > 5.\n\n\n\nHere's a \\\\\\\\hyperref[1]{link} with an ampersand in the URL.\n\n\n\nHere's a link with an amersand in the link text: \\\\\\\\hyperref[2]{AT\\\\\\\\&T}.\n\n\n\nHere's an inline \\\\\\\\externalLink{link}{http://zestedesavoir.com/script?foo=1\\\\\\\\&bar=2}.\n\n\n\nHere's an inline \\\\\\\\externalLink{link}{http://zestedesavoir.com/script?foo=1\\\\\\\\&bar=2}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{http://example.com/?foo=1\\\\\\\\&bar=2}{http://example.com/?foo=1\\\\\\\\&bar=2}}\n\n\\\\\\\\footnote{\\\\\\\\label{2}\\\\\\\\externalLink{http://att.com/}{http://att.com/}}\"\n`;\n\nexports[`basic renders angle-links-and-img.txt 1`] = `\n\"<p><a href=\\\\\"simple%20link\\\\\" title=\\\\\"my title\\\\\">link</a>\n<img src=\\\\\"http://example.com/image.jpg\\\\\" alt=\\\\\"image\\\\\" loading=\\\\\"lazy\\\\\">\n<a href=\\\\\"http://example.com/(()((())923)(\\\\\">link</a>\n<img src=\\\\\"link(()))(\\\\\" alt=\\\\\"image\\\\\" loading=\\\\\"lazy\\\\\"></p>\"\n`;\n\nexports[`basic renders angle-links-and-img.txt 2`] = `\n\"\\\\\\\\externalLink{link}{simple link}\n\\\\\\\\inlineImage{http://example.com/image.jpg}\n\\\\\\\\externalLink{link}{http://example.com/(()((())923)(}\n\\\\\\\\inlineImage{link(()))(}\"\n`;\n\nexports[`basic renders auto-links.txt 1`] = `\n\"<p>Link: <a href=\\\\\"http://example.com/\\\\\">http://example.com/</a>.</p>\n<p>Https link: <a href=\\\\\"https://example.com\\\\\">https://example.com</a></p>\n<p>Ftp link: <a href=\\\\\"ftp://example.com\\\\\">ftp://example.com</a></p>\n<p>With an ampersand: <a href=\\\\\"http://example.com/?foo=1&#x26;bar=2\\\\\">http://example.com/?foo=1&#x26;bar=2</a></p>\n<ul>\n<li>In a list?</li>\n<li><a href=\\\\\"http://example.com/\\\\\">http://example.com/</a></li>\n<li>It should.</li>\n</ul>\n<blockquote>\n<p>Blockquoted: <a href=\\\\\"http://example.com/\\\\\">http://example.com/</a></p>\n</blockquote>\n<p>Auto-links should not occur here: <code>&#x3C;http://example.com/></code></p>\n<pre><code>or here: &#x3C;http://example.com/>\n</code></pre>\"\n`;\n\nexports[`basic renders auto-links.txt 2`] = `\n\"Link: \\\\\\\\externalLink{http://example.com/}{http://example.com/}.\n\n\n\nHttps link: \\\\\\\\externalLink{https://example.com}{https://example.com}\n\n\n\nFtp link: \\\\\\\\externalLink{ftp://example.com}{ftp://example.com}\n\n\n\nWith an ampersand: \\\\\\\\externalLink{http://example.com/?foo=1\\\\\\\\&bar=2}{http://example.com/?foo=1\\\\\\\\&bar=2}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax In a list?\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{http://example.com/}{http://example.com/}\n\\\\\\\\item\\\\\\\\relax It should.\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{Quotation}\nBlockquoted: \\\\\\\\externalLink{http://example.com/}{http://example.com/}\n\\\\\\\\end{Quotation}\n\n\n\nAuto-links should not occur here: \\\\\\\\CodeInline{<http://example.com/>}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nor here: <http://example.com/>\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`basic renders backlash-escapes.txt 1`] = `\n\"<p>These should all get escaped:</p>\n<p>Backslash: \\\\\\\\</p>\n<p>Backtick: \\`</p>\n<p>Asterisk: *</p>\n<p>Underscore: _</p>\n<p>Left brace: {</p>\n<p>Right brace: }</p>\n<p>Left bracket: [</p>\n<p>Right bracket: ]</p>\n<p>Left paren: (</p>\n<p>Right paren: )</p>\n<p>Greater-than: ></p>\n<p>Hash: #</p>\n<p>Period: .</p>\n<p>Bang: !</p>\n<p>Plus: +</p>\n<p>Minus: -</p>\n<p>These should not, because they occur within a code block:</p>\n<pre><code>Backslash: \\\\\\\\\\\\\\\\\n\nBacktick: \\\\\\\\\\`\n\nAsterisk: \\\\\\\\*\n\nUnderscore: \\\\\\\\_\n\nLeft brace: \\\\\\\\{\n\nRight brace: \\\\\\\\}\n\nLeft bracket: \\\\\\\\[\n\nRight bracket: \\\\\\\\]\n\nLeft paren: \\\\\\\\(\n\nRight paren: \\\\\\\\)\n\nGreater-than: \\\\\\\\>\n\nHash: \\\\\\\\#\n\nPeriod: \\\\\\\\.\n\nBang: \\\\\\\\!\n\nPlus: \\\\\\\\+\n\nMinus: \\\\\\\\-\n</code></pre>\n<p>Nor should these, which occur in code spans:</p>\n<p>Backslash: <code>\\\\\\\\\\\\\\\\</code></p>\n<p>Backtick: <code>\\\\\\\\\\`</code></p>\n<p>Asterisk: <code>\\\\\\\\*</code></p>\n<p>Underscore: <code>\\\\\\\\_</code></p>\n<p>Left brace: <code>\\\\\\\\{</code></p>\n<p>Right brace: <code>\\\\\\\\}</code></p>\n<p>Left bracket: <code>\\\\\\\\[</code></p>\n<p>Right bracket: <code>\\\\\\\\]</code></p>\n<p>Left paren: <code>\\\\\\\\(</code></p>\n<p>Right paren: <code>\\\\\\\\)</code></p>\n<p>Greater-than: <code>\\\\\\\\></code></p>\n<p>Hash: <code>\\\\\\\\#</code></p>\n<p>Period: <code>\\\\\\\\.</code></p>\n<p>Bang: <code>\\\\\\\\!</code></p>\n<p>Plus: <code>\\\\\\\\+</code></p>\n<p>Minus: <code>\\\\\\\\-</code></p>\"\n`;\n\nexports[`basic renders backlash-escapes.txt 2`] = `\n\"These should all get escaped:\n\n\n\nBackslash: \\\\\\\\textbackslash{}\n\n\n\nBacktick: \\`\n\n\n\nAsterisk: *\n\n\n\nUnderscore: \\\\\\\\_\n\n\n\nLeft brace: \\\\\\\\{\n\n\n\nRight brace: \\\\\\\\}\n\n\n\nLeft bracket: [\n\n\n\nRight bracket: ]\n\n\n\nLeft paren: (\n\n\n\nRight paren: )\n\n\n\nGreater-than: >\n\n\n\nHash: \\\\\\\\#\n\n\n\nPeriod: .\n\n\n\nBang: !\n\n\n\nPlus: +\n\n\n\nMinus: -\n\n\n\nThese should not, because they occur within a code block:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nBackslash: \\\\\\\\\\\\\\\\\n\nBacktick: \\\\\\\\\\`\n\nAsterisk: \\\\\\\\*\n\nUnderscore: \\\\\\\\_\n\nLeft brace: \\\\\\\\{\n\nRight brace: \\\\\\\\}\n\nLeft bracket: \\\\\\\\[\n\nRight bracket: \\\\\\\\]\n\nLeft paren: \\\\\\\\(\n\nRight paren: \\\\\\\\)\n\nGreater-than: \\\\\\\\>\n\nHash: \\\\\\\\#\n\nPeriod: \\\\\\\\.\n\nBang: \\\\\\\\!\n\nPlus: \\\\\\\\+\n\nMinus: \\\\\\\\-\n\\\\\\\\end{CodeBlock}\n\n\n\nNor should these, which occur in code spans:\n\n\n\nBackslash: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}\\\\\\\\textbackslash{}}\n\n\n\nBacktick: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}\\`}\n\n\n\nAsterisk: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}*}\n\n\n\nUnderscore: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}\\\\\\\\_}\n\n\n\nLeft brace: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}\\\\\\\\{}\n\n\n\nRight brace: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}\\\\\\\\}}\n\n\n\nLeft bracket: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}[}\n\n\n\nRight bracket: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}]}\n\n\n\nLeft paren: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}(}\n\n\n\nRight paren: \\\\\\\\CodeInline{\\\\\\\\textbackslash{})}\n\n\n\nGreater-than: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}>}\n\n\n\nHash: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}\\\\\\\\#}\n\n\n\nPeriod: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}.}\n\n\n\nBang: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}!}\n\n\n\nPlus: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}+}\n\n\n\nMinus: \\\\\\\\CodeInline{\\\\\\\\textbackslash{}-}\"\n`;\n\nexports[`basic renders blockquotes-with-code-blocks.txt 1`] = `\n\"<blockquote>\n<p>Example:</p>\n<pre><code>sub status {\n    print \\\\\"working\\\\\";\n}\n</code></pre>\n<p>Or:</p>\n<pre><code>sub status {\n    return \\\\\"working\\\\\";\n}\n</code></pre>\n</blockquote>\"\n`;\n\nexports[`basic renders blockquotes-with-code-blocks.txt 2`] = `\n\"\\\\\\\\begin{Quotation}\nExample:\n\n\\\\\\\\begin{CodeBlock}{text}\nsub status {\n    print \\\\\"working\\\\\";\n}\n\\\\\\\\end{CodeBlock}\n\nOr:\n\n\\\\\\\\begin{CodeBlock}{text}\nsub status {\n    return \\\\\"working\\\\\";\n}\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`basic renders codeblock-in-list.txt 1`] = `\n\"<ul>\n<li>\n<p>A list item with a code block</p>\n<pre><code>  Some *code*\n</code></pre>\n</li>\n<li>\n<p>Another list item</p>\n<pre><code>  More code\n\n  And more code\n</code></pre>\n</li>\n</ul>\"\n`;\n\nexports[`basic renders codeblock-in-list.txt 2`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax A list item with a code block\n\n\\\\\\\\begin{CodeBlock}{text}\n  Some *code*\n\\\\\\\\end{CodeBlock}\n\\\\\\\\item\\\\\\\\relax Another list item\n\n\\\\\\\\begin{CodeBlock}{text}\n  More code\n\n  And more code\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`basic renders hard-wrapped.txt 1`] = `\n\"<p>In Markdown 1.0.0 and earlier. Version\n8. This line turns into a list item.\nBecause a hard-wrapped line in the\nmiddle of a paragraph looked like a\nlist item.</p>\n<p>Here's one with a bullet.</p>\n<ul>\n<li>criminey.</li>\n</ul>\"\n`;\n\nexports[`basic renders hard-wrapped.txt 2`] = `\n\"In Markdown 1.0.0 and earlier. Version\n8. This line turns into a list item.\nBecause a hard-wrapped line in the\nmiddle of a paragraph looked like a\nlist item.\n\n\n\nHere's one with a bullet.\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax criminey.\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`basic renders horizontal-rules.txt 1`] = `\n\"<p>Dashes:</p>\n<hr>\n<hr>\n<hr>\n<hr>\n<pre><code>---\n</code></pre>\n<hr>\n<hr>\n<hr>\n<hr>\n<pre><code>- - -\n</code></pre>\n<p>Asterisks:</p>\n<hr>\n<hr>\n<hr>\n<hr>\n<pre><code>***\n</code></pre>\n<hr>\n<hr>\n<hr>\n<hr>\n<pre><code>* * *\n</code></pre>\n<p>Underscores:</p>\n<hr>\n<hr>\n<hr>\n<hr>\n<pre><code>___\n</code></pre>\n<hr>\n<hr>\n<hr>\n<hr>\n<pre><code>_ _ _\n</code></pre>\"\n`;\n\nexports[`basic renders horizontal-rules.txt 2`] = `\n\"Dashes:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n---\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n- - -\n\\\\\\\\end{CodeBlock}\n\n\n\nAsterisks:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n***\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n* * *\n\\\\\\\\end{CodeBlock}\n\n\n\nUnderscores:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n___\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n_ _ _\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`basic renders inline-html-advanced.txt 1`] = `\n\"<p>Simple block on one line:</p>\n<p>&#x3C;div>foo&#x3C;/div></p>\n<p>And nested without indentation:</p>\n<p>&#x3C;div>\n&#x3C;div>\n&#x3C;div>\nfoo\n&#x3C;/div>\n&#x3C;/div>\n&#x3C;div>bar&#x3C;/div>\n&#x3C;/div></p>\"\n`;\n\nexports[`basic renders inline-html-advanced.txt 2`] = `\n\"Simple block on one line:\n\n\n\n<div>foo</div>\n\n\n\nAnd nested without indentation:\n\n\n\n<div>\n<div>\n<div>\nfoo\n</div>\n</div>\n<div>bar</div>\n</div>\"\n`;\n\nexports[`basic renders inline-html-comments.txt 1`] = `\n\"<p>Paragraph one.</p>\n<p>&#x3C;!-- This is a simple comment --></p>\n<p>&#x3C;!--\n\tThis is another comment.\n--></p>\n<p>Paragraph two.</p>\n<p>&#x3C;!-- one comment block -- -- with two comments --></p>\n<p>The end.</p>\"\n`;\n\nexports[`basic renders inline-html-comments.txt 2`] = `\n\"Paragraph one.\n\n\n\n<!-- This is a simple comment -->\n\n<!--\n\tThis is another comment.\n-->\n\nParagraph two.\n\n\n\n<!-- one comment block -- -- with two comments -->\n\nThe end.\"\n`;\n\nexports[`basic renders inline-html-simple.txt 1`] = `\n\"<p>Here's a simple block:</p>\n<p>&#x3C;div>\n\tfoo\n&#x3C;/div></p>\n<p>This should be a code block, though:</p>\n<pre><code>&#x3C;div>\n\tfoo\n&#x3C;/div>\n</code></pre>\n<p>As should this:</p>\n<pre><code>&#x3C;div>foo&#x3C;/div>\n</code></pre>\n<p>Now, nested:</p>\n<p>&#x3C;div>\n\t&#x3C;div>\n\t\t&#x3C;div>\n\t\t\tfoo\n\t\t&#x3C;/div>\n\t&#x3C;/div>\n&#x3C;/div></p>\n<p>This should just be an HTML comment:</p>\n<p>&#x3C;!-- Comment --></p>\n<p>Multiline:</p>\n<p>&#x3C;!--\nBlah\nBlah\n--></p>\n<p>Code block:</p>\n<pre><code>&#x3C;!-- Comment -->\n</code></pre>\n<p>Just plain comment, with trailing spaces on the line:</p>\n<p>&#x3C;!-- foo -->   </p>\n<p>Code:</p>\n<pre><code>&#x3C;hr />\n</code></pre>\n<p>Hr's:</p>\n<p>&#x3C;hr></p>\n<p>&#x3C;hr/></p>\n<p>&#x3C;hr /></p>\n<p>&#x3C;hr>   </p>\n<p>&#x3C;hr/>  </p>\n<p>&#x3C;hr /> </p>\n<p>&#x3C;hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" /></p>\n<p>&#x3C;hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\"/></p>\n<p>&#x3C;hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" ></p>\n<p>&#x3C;some <a href=\\\\\"http://example.com\\\\\">weird</a> stuff></p>\"\n`;\n\nexports[`basic renders inline-html-simple.txt 2`] = `\n\"Here's a simple block:\n\n\n\n<div>\n\tfoo\n</div>\n\nThis should be a code block, though:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<div>\n\tfoo\n</div>\n\\\\\\\\end{CodeBlock}\n\n\n\nAs should this:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<div>foo</div>\n\\\\\\\\end{CodeBlock}\n\n\n\nNow, nested:\n\n\n\n<div>\n\t<div>\n\t\t<div>\n\t\t\tfoo\n\t\t</div>\n\t</div>\n</div>\n\nThis should just be an HTML comment:\n\n\n\n<!-- Comment -->\n\nMultiline:\n\n\n\n<!--\nBlah\nBlah\n-->\n\nCode block:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<!-- Comment -->\n\\\\\\\\end{CodeBlock}\n\n\n\nJust plain comment, with trailing spaces on the line:\n\n\n\n<!-- foo -->   \n\nCode:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<hr />\n\\\\\\\\end{CodeBlock}\n\n\n\nHr's:\n\n\n\n<hr>\n\n<hr/>\n\n<hr />\n\n<hr>   \n\n<hr/>  \n\n<hr /> \n\n<hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" />\n\n<hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\"/>\n\n<hr class=\\\\\"foo\\\\\" id=\\\\\"bar\\\\\" >\n\n<some \\\\\\\\externalLink{weird}{http://example.com} stuff>\"\n`;\n\nexports[`basic renders links-inline.txt 1`] = `\n\"<p>Just a <a href=\\\\\"/url/\\\\\">URL</a>.</p>\n<p><a href=\\\\\"/url/\\\\\" title=\\\\\"title\\\\\">URL and title</a>.</p>\n<p><a href=\\\\\"/url/\\\\\" title=\\\\\"title preceded by two spaces\\\\\">URL and title</a>.</p>\n<p><a href=\\\\\"/url/\\\\\" title=\\\\\"title preceded by a tab\\\\\">URL and title</a>.</p>\n<p><a href=\\\\\"\\\\\">Empty</a>.</p>\"\n`;\n\nexports[`basic renders links-inline.txt 2`] = `\n\"Just a \\\\\\\\externalLink{URL}{http://zestedesavoir.com/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{http://zestedesavoir.com/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{http://zestedesavoir.com/url/}.\n\n\n\n\\\\\\\\externalLink{URL and title}{http://zestedesavoir.com/url/}.\n\n\n\n.\"\n`;\n\nexports[`basic renders links-reference.txt 1`] = `\n\"<p>Foo <a href=\\\\\"/url/\\\\\" title=\\\\\"Title\\\\\">bar</a>.</p>\n<p>Foo <a href=\\\\\"/url/\\\\\" title=\\\\\"Title\\\\\">bar</a>.</p>\n<p>Foo <a href=\\\\\"/url/\\\\\" title=\\\\\"Title\\\\\">bar</a>.</p>\n<p>With <a href=\\\\\"/url/\\\\\">embedded [brackets]</a>.</p>\n<p>Indented <a href=\\\\\"/url\\\\\">once</a>.</p>\n<p>Indented <a href=\\\\\"/url\\\\\">twice</a>.</p>\n<p>Indented <a href=\\\\\"/url\\\\\">thrice</a>.</p>\n<p>Indented [four][] times.</p>\n<pre><code>[four]: /url\n</code></pre>\n<p>With <a href=\\\\\"http://example.com/\\\\\" title=\\\\\"Angle Brackets\\\\\">angle brackets</a>.</p>\n<p>And <a href=\\\\\"http://example.com/\\\\\" title=\\\\\"Without angle brackets.\\\\\">without</a>.</p>\n<p>With <a href=\\\\\"http://example.com\\\\\" title=\\\\\"Yes this works\\\\\">line\nbreaks</a></p>\n<p>and <a href=\\\\\"http://example.com\\\\\" title=\\\\\"Yes this works\\\\\">line\nbreaks</a> with one space.</p>\n<p>and [line<br>\nbreaks[] with two spaces.</p>\n<p><a href=\\\\\"http://example.com\\\\\" title=\\\\\"No more hanging empty bracket!\\\\\">short ref</a></p>\n<p><a href=\\\\\"http://example.com\\\\\" title=\\\\\"No more hanging empty bracket!\\\\\">short\nref</a></p>\n<p><a href=\\\\\"http://example.com\\\\\" title=\\\\\"Title on next line.\\\\\">a ref</a></p>\"\n`;\n\nexports[`basic renders links-reference.txt 2`] = `\n\"Foo \\\\\\\\hyperref[1]{bar}.\n\n\n\nFoo \\\\\\\\hyperref[1]{bar}.\n\n\n\nFoo \\\\\\\\hyperref[1]{bar}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{/url/}{http://zestedesavoir.com/url/}}\n\nWith \\\\\\\\hyperref[b]{embedded [brackets]}.\n\n\n\nIndented \\\\\\\\hyperref[once]{once}.\n\n\n\nIndented \\\\\\\\hyperref[twice]{twice}.\n\n\n\nIndented \\\\\\\\hyperref[thrice]{thrice}.\n\n\n\nIndented [four] times.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{once}\\\\\\\\externalLink{/url}{http://zestedesavoir.com/url}}\n\n\\\\\\\\footnote{\\\\\\\\label{twice}\\\\\\\\externalLink{/url}{http://zestedesavoir.com/url}}\n\n\\\\\\\\footnote{\\\\\\\\label{thrice}\\\\\\\\externalLink{/url}{http://zestedesavoir.com/url}}\n\n\\\\\\\\begin{CodeBlock}{text}\n[four]: /url\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{b}\\\\\\\\externalLink{/url/}{http://zestedesavoir.com/url/}}\n\nWith \\\\\\\\hyperref[angle brackets]{angle brackets}.\n\n\n\nAnd \\\\\\\\hyperref[without]{without}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{angle brackets}\\\\\\\\externalLink{http://example.com/}{http://example.com/}}\n\n\\\\\\\\footnote{\\\\\\\\label{without}\\\\\\\\externalLink{http://example.com/}{http://example.com/}}\n\nWith \\\\\\\\hyperref[line breaks]{line\nbreaks}\n\n\n\nand \\\\\\\\hyperref[line breaks]{line\nbreaks} with one space.\n\n\n\nand [line \\\\\\\\\\\\\\\\\nbreaks[] with two spaces.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{line breaks}\\\\\\\\externalLink{http://example.com}{http://example.com}}\n\n\\\\\\\\hyperref[short ref]{short ref}\n\n\n\n\\\\\\\\hyperref[short ref]{short\nref}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{short ref}\\\\\\\\externalLink{http://example.com}{http://example.com}}\n\n\\\\\\\\hyperref[a ref]{a ref}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{a ref}\\\\\\\\externalLink{http://example.com}{http://example.com}}\"\n`;\n\nexports[`basic renders nested-blockquotes.txt 1`] = `\n\"<blockquote>\n<p>foo</p>\n<blockquote>\n<p>bar</p>\n</blockquote>\n<p>foo</p>\n</blockquote>\"\n`;\n\nexports[`basic renders nested-blockquotes.txt 2`] = `\n\"\\\\\\\\begin{Quotation}\nfoo\n\n\\\\\\\\begin{Quotation}\nbar\n\\\\\\\\end{Quotation}\n\nfoo\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`basic renders ordered-and-unordered-list.txt 1`] = `\n\"<p>Unordered</p>\n<p>Asterisks tight:</p>\n<ul>\n<li>asterisk 1</li>\n<li>asterisk 2</li>\n<li>asterisk 3</li>\n</ul>\n<p>Asterisks loose:</p>\n<ul>\n<li>\n<p>asterisk 1</p>\n</li>\n<li>\n<p>asterisk 2</p>\n</li>\n<li>\n<p>asterisk 3</p>\n</li>\n</ul>\n<hr>\n<p>Pluses tight:</p>\n<ul>\n<li>Plus 1</li>\n<li>Plus 2</li>\n<li>Plus 3</li>\n</ul>\n<p>Pluses loose:</p>\n<ul>\n<li>\n<p>Plus 1</p>\n</li>\n<li>\n<p>Plus 2</p>\n</li>\n<li>\n<p>Plus 3</p>\n</li>\n</ul>\n<hr>\n<p>Minuses tight:</p>\n<ul>\n<li>Minus 1</li>\n<li>Minus 2</li>\n<li>Minus 3</li>\n</ul>\n<p>Minuses loose:</p>\n<ul>\n<li>\n<p>Minus 1</p>\n</li>\n<li>\n<p>Minus 2</p>\n</li>\n<li>\n<p>Minus 3</p>\n</li>\n</ul>\n<hr>\n<p>Ordered</p>\n<p>Tight:</p>\n<ol>\n<li>First</li>\n<li>Second</li>\n<li>Third</li>\n</ol>\n<p>and:</p>\n<ol>\n<li>One</li>\n<li>Two</li>\n<li>Three</li>\n</ol>\n<p>Loose using tabs:</p>\n<ol>\n<li>\n<p>First</p>\n</li>\n<li>\n<p>Second</p>\n</li>\n<li>\n<p>Third</p>\n</li>\n</ol>\n<p>and using spaces:</p>\n<ol>\n<li>\n<p>One</p>\n</li>\n<li>\n<p>Two</p>\n</li>\n<li>\n<p>Three</p>\n</li>\n</ol>\n<p>Multiple paragraphs:</p>\n<ol>\n<li>\n<p>Item 1, graf one.</p>\n<p>Item 2. graf two. The quick brown fox jumped over the lazy dog's\nback.</p>\n</li>\n<li>\n<p>Item 2.</p>\n</li>\n<li>\n<p>Item 3.</p>\n</li>\n</ol>\n<hr>\n<p>Nested</p>\n<ul>\n<li>Tab\n<ul>\n<li>Tab\n<ul>\n<li>Tab</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n<p>Here's another:</p>\n<ol>\n<li>First</li>\n<li>Second:\n<ul>\n<li>Fee</li>\n<li>Fie</li>\n<li>Foe</li>\n</ul>\n</li>\n<li>Third</li>\n</ol>\n<p>Same thing but with paragraphs:</p>\n<ol>\n<li>\n<p>First</p>\n</li>\n<li>\n<p>Second:</p>\n<ul>\n<li>Fee</li>\n<li>Fie</li>\n<li>Foe</li>\n</ul>\n</li>\n<li>\n<p>Third</p>\n</li>\n</ol>\"\n`;\n\nexports[`basic renders ordered-and-unordered-list.txt 2`] = `\n\"Unordered\n\n\n\nAsterisks tight:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax asterisk 1\n\\\\\\\\item\\\\\\\\relax asterisk 2\n\\\\\\\\item\\\\\\\\relax asterisk 3\n\\\\\\\\end{itemize}\n\n\nAsterisks loose:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax asterisk 1\n\\\\\\\\item\\\\\\\\relax asterisk 2\n\\\\\\\\item\\\\\\\\relax asterisk 3\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nPluses tight:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Plus 1\n\\\\\\\\item\\\\\\\\relax Plus 2\n\\\\\\\\item\\\\\\\\relax Plus 3\n\\\\\\\\end{itemize}\n\n\nPluses loose:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Plus 1\n\\\\\\\\item\\\\\\\\relax Plus 2\n\\\\\\\\item\\\\\\\\relax Plus 3\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nMinuses tight:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Minus 1\n\\\\\\\\item\\\\\\\\relax Minus 2\n\\\\\\\\item\\\\\\\\relax Minus 3\n\\\\\\\\end{itemize}\n\n\nMinuses loose:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Minus 1\n\\\\\\\\item\\\\\\\\relax Minus 2\n\\\\\\\\item\\\\\\\\relax Minus 3\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nOrdered\n\n\n\nTight:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nand:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax One\n\\\\\\\\item\\\\\\\\relax Two\n\\\\\\\\item\\\\\\\\relax Three\n\\\\\\\\end{enumerate}\n\n\nLoose using tabs:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nand using spaces:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax One\n\\\\\\\\item\\\\\\\\relax Two\n\\\\\\\\item\\\\\\\\relax Three\n\\\\\\\\end{enumerate}\n\n\nMultiple paragraphs:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax Item 1, graf one.\n\nItem 2. graf two. The quick brown fox jumped over the lazy dog's\nback.\n\\\\\\\\item\\\\\\\\relax Item 2.\n\\\\\\\\item\\\\\\\\relax Item 3.\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\horizontalLine\n\n\n\nNested\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Tab\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Tab\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Tab\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\n\nHere's another:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Fee\n\\\\\\\\item\\\\\\\\relax Fie\n\\\\\\\\item\\\\\\\\relax Foe\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nSame thing but with paragraphs:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Fee\n\\\\\\\\item\\\\\\\\relax Fie\n\\\\\\\\item\\\\\\\\relax Foe\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\"\n`;\n\nexports[`basic renders strong-and-em-together.txt 1`] = `\n\"<p><strong><em>This is strong and em.</em></strong></p>\n<p>So is <strong><em>this</em></strong> word.</p>\n<p><strong><em>This is strong and em.</em></strong></p>\n<p>So is <strong><em>this</em></strong> word.</p>\"\n`;\n\nexports[`basic renders strong-and-em-together.txt 2`] = `\n\"\\\\\\\\textbf{\\\\\\\\textit{This is strong and em.}}\n\n\n\nSo is \\\\\\\\textbf{\\\\\\\\textit{this}} word.\n\n\n\n\\\\\\\\textbf{\\\\\\\\textit{This is strong and em.}}\n\n\n\nSo is \\\\\\\\textbf{\\\\\\\\textit{this}} word.\"\n`;\n\nexports[`basic renders tabs.txt 1`] = `\n\"<ul>\n<li>\n<p>this is a list item\nindented with tabs</p>\n</li>\n<li>\n<p>this is a list item\nindented with spaces</p>\n</li>\n</ul>\n<p>Code:</p>\n<pre><code>this code block is indented by one tab\n</code></pre>\n<p>And:</p>\n<pre><code>\tthis code block is indented by two tabs\n</code></pre>\n<p>And:</p>\n<pre><code>+\tthis is an example list item\n\tindented with tabs\n\n+   this is an example list item\n    indented with spaces\n</code></pre>\"\n`;\n\nexports[`basic renders tabs.txt 2`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax this is a list item\nindented with tabs\n\\\\\\\\item\\\\\\\\relax this is a list item\nindented with spaces\n\\\\\\\\end{itemize}\n\n\nCode:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nthis code block is indented by one tab\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\tthis code block is indented by two tabs\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n+\tthis is an example list item\n\tindented with tabs\n\n+   this is an example list item\n    indented with spaces\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`basic renders tidyness.txt 1`] = `\n\"<blockquote>\n<p>A list within a blockquote:</p>\n<ul>\n<li>asterisk 1</li>\n<li>asterisk 2</li>\n<li>asterisk 3</li>\n</ul>\n</blockquote>\"\n`;\n\nexports[`basic renders tidyness.txt 2`] = `\n\"\\\\\\\\begin{Quotation}\nA list within a blockquote:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax asterisk 1\n\\\\\\\\item\\\\\\\\relax asterisk 2\n\\\\\\\\item\\\\\\\\relax asterisk 3\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`extensions renders abbr.txt 1`] = `\n\"<p>An <abbr title=\\\\\"Abbreviation\\\\\">ABBR</abbr>: \\\\\"<abbr title=\\\\\"Reference\\\\\">REF</abbr>\\\\\".\nref and REFERENCE should be ignored.</p>\n<p>The <abbr title=\\\\\"Hyper Text Markup Language\\\\\">HTML</abbr> specification\nis maintained by the <abbr title=\\\\\"World Wide Web Consortium\\\\\">W3C</abbr>.</p>\"\n`;\n\nexports[`extensions renders abbr.txt 2`] = `\n\"An \\\\\\\\abbr{ABBR}{Abbreviation}: \\\\\"\\\\\\\\abbr{REF}{Reference}\\\\\".\nref and REFERENCE should be ignored.\n\n\n\nThe \\\\\\\\abbr{HTML}{Hyper Text Markup Language} specification\nis maintained by the \\\\\\\\abbr{W3C}{World Wide Web Consortium}.\"\n`;\n\nexports[`extensions renders fenced_code.txt 1`] = `\n\"<p>index 0000000..6e956a9</p>\n<pre><code>--- /dev/null\n+++ b/test/data/stripped_text/mike-30-lili\n@@ -0,0 +1,27 @@\n+Summary:\n+ drift_mod.py |    1 +\n+ 1 files changed, 1 insertions(+), 0 deletions(-)\n+\n+commit da4bfb04debdd994683740878d09988b2641513d\n+Author: Mike Dirolf &#x3C;mike@dirolf.com>\n+Date:   Tue Jan 17 13:42:28 2012 -0500\n+\n+\\`\\`\\`\n+minor: just wanted to push something.\n+\\`\\`\\`\n+\n+diff --git a/drift_mod.py b/drift_mod.py\n+index 34dfba6..8a88a69 100644\n+\n+\\`\\`\\`\n+--- a/drift_mod.py\n++++ b/drift_mod.py\n+@@ -281,6 +281,7 @@ CONTEXT_DIFF_LINE_PATTERN = re.compile(r'^('\n+                                        '|\\\\\\\\+ .*'\n+                                        '|- .*'\n+                                        ')$')\n++\n+ def wrap_context_diffs(message_text):\n+     return _wrap_diff(CONTEXT_DIFF_HEADER_PATTERN,\n+                       CONTEXT_DIFF_LINE_PATTERN,\n+\\`\\`\\`\n</code></pre>\"\n`;\n\nexports[`extensions renders fenced_code.txt 2`] = `\n\"index 0000000..6e956a9\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n--- /dev/null\n+++ b/test/data/stripped_text/mike-30-lili\n@@ -0,0 +1,27 @@\n+Summary:\n+ drift_mod.py |    1 +\n+ 1 files changed, 1 insertions(+), 0 deletions(-)\n+\n+commit da4bfb04debdd994683740878d09988b2641513d\n+Author: Mike Dirolf <mike@dirolf.com>\n+Date:   Tue Jan 17 13:42:28 2012 -0500\n+\n+\\`\\`\\`\n+minor: just wanted to push something.\n+\\`\\`\\`\n+\n+diff --git a/drift_mod.py b/drift_mod.py\n+index 34dfba6..8a88a69 100644\n+\n+\\`\\`\\`\n+--- a/drift_mod.py\n++++ b/drift_mod.py\n+@@ -281,6 +281,7 @@ CONTEXT_DIFF_LINE_PATTERN = re.compile(r'^('\n+                                        '|\\\\\\\\+ .*'\n+                                        '|- .*'\n+                                        ')$')\n++\n+ def wrap_context_diffs(message_text):\n+     return _wrap_diff(CONTEXT_DIFF_HEADER_PATTERN,\n+                       CONTEXT_DIFF_LINE_PATTERN,\n+\\`\\`\\`\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`extensions renders footnote.txt 1`] = `\n\"<p>This is the body with a footnote<sup id=\\\\\"fnref-1-shortId\\\\\"><a href=\\\\\"#fn-1-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup> or two<sup id=\\\\\"fnref-2-shortId\\\\\"><a href=\\\\\"#fn-2-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup> or more<sup id=\\\\\"fnref-3-shortId\\\\\"><a href=\\\\\"#fn-3-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup> <sup id=\\\\\"fnref-4-shortId\\\\\"><a href=\\\\\"#fn-4-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup> <sup id=\\\\\"fnref-5-shortId\\\\\"><a href=\\\\\"#fn-5-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup>.</p>\n<p>Also a reference that does not exist<sup id=\\\\\"fnref-6-shortId\\\\\"><a href=\\\\\"#fn-6-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup>.</p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-shortId\\\\\">\n<p>Footnote that ends with a list:</p>\n<ul>\n<li>item 1</li>\n<li>item 2</li>\n</ul>\n<p><a href=\\\\\"#fnref-1-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 1\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-2-shortId\\\\\">\n<blockquote>\n<p>This footnote is a blockquote.</p>\n</blockquote>\n<p><a href=\\\\\"#fnref-2-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 2\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-3-shortId\\\\\">\n<p>A simple oneliner.<a href=\\\\\"#fnref-3-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 3\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-4-shortId\\\\\">\n<p>A footnote with multiple paragraphs.</p>\n<p>Paragraph two.<a href=\\\\\"#fnref-4-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 4\\\\\">↩</a></p>\n</li>\n<li id=\\\\\"fn-5-shortId\\\\\">\n<p>First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...<a href=\\\\\"#fnref-5-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 5\\\\\">↩</a></p>\n</li>\n</ol>\n</div>\"\n`;\n\nexports[`extensions renders footnote.txt 2`] = `\n\"This is the body with a footnote\\\\\\\\textsuperscript{\\\\\\\\footnotemark[1]} or two\\\\\\\\textsuperscript{\\\\\\\\footnotemark[2]} or more\\\\\\\\textsuperscript{\\\\\\\\footnotemark[3]} \\\\\\\\textsuperscript{\\\\\\\\footnotemark[4]} \\\\\\\\textsuperscript{\\\\\\\\footnotemark[5]}.\n\n\n\nAlso a reference that does not exist\\\\\\\\textsuperscript{\\\\\\\\footnotemark[6]}.\n\n\n\n\\\\\\\\footnotetext[1]{Footnote that ends with a list:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item 1\n\\\\\\\\item\\\\\\\\relax item 2\n\\\\\\\\end{itemize}}\n\n\\\\\\\\footnotetext[2]{\\\\\\\\begin{Quotation}\nThis footnote is a blockquote.\n\\\\\\\\end{Quotation}}\n\n\\\\\\\\footnotetext[3]{A simple oneliner.}\n\n\\\\\\\\footnotetext[4]{A footnote with multiple paragraphs.\n\nParagraph two.}\n\n\\\\\\\\footnotetext[5]{First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...}\"\n`;\n\nexports[`extensions renders footnote_many_footnotes.txt 1`] = `\n\"<p>Something<sup id=\\\\\"fnref-1-shortId\\\\\"><a href=\\\\\"#fn-1-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">1</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-2-shortId\\\\\"><a href=\\\\\"#fn-2-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">2</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-3-shortId\\\\\"><a href=\\\\\"#fn-3-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">3</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-4-shortId\\\\\"><a href=\\\\\"#fn-4-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">4</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-5-shortId\\\\\"><a href=\\\\\"#fn-5-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">5</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-6-shortId\\\\\"><a href=\\\\\"#fn-6-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">6</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-7-shortId\\\\\"><a href=\\\\\"#fn-7-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">7</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-8-shortId\\\\\"><a href=\\\\\"#fn-8-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">8</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-9-shortId\\\\\"><a href=\\\\\"#fn-9-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">9</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-10-shortId\\\\\"><a href=\\\\\"#fn-10-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">10</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-11-shortId\\\\\"><a href=\\\\\"#fn-11-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">11</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-12-shortId\\\\\"><a href=\\\\\"#fn-12-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">12</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-13-shortId\\\\\"><a href=\\\\\"#fn-13-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">13</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-14-shortId\\\\\"><a href=\\\\\"#fn-14-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">14</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-15-shortId\\\\\"><a href=\\\\\"#fn-15-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">15</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-16-shortId\\\\\"><a href=\\\\\"#fn-16-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">16</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-17-shortId\\\\\"><a href=\\\\\"#fn-17-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">17</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-18-shortId\\\\\"><a href=\\\\\"#fn-18-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">18</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-19-shortId\\\\\"><a href=\\\\\"#fn-19-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">19</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-20-shortId\\\\\"><a href=\\\\\"#fn-20-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">20</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-21-shortId\\\\\"><a href=\\\\\"#fn-21-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">21</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-22-shortId\\\\\"><a href=\\\\\"#fn-22-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">22</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-23-shortId\\\\\"><a href=\\\\\"#fn-23-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">23</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-24-shortId\\\\\"><a href=\\\\\"#fn-24-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">24</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-25-shortId\\\\\"><a href=\\\\\"#fn-25-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">25</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-26-shortId\\\\\"><a href=\\\\\"#fn-26-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">26</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-27-shortId\\\\\"><a href=\\\\\"#fn-27-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">27</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-28-shortId\\\\\"><a href=\\\\\"#fn-28-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">28</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-29-shortId\\\\\"><a href=\\\\\"#fn-29-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">29</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-30-shortId\\\\\"><a href=\\\\\"#fn-30-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">30</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-31-shortId\\\\\"><a href=\\\\\"#fn-31-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">31</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-32-shortId\\\\\"><a href=\\\\\"#fn-32-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">32</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-33-shortId\\\\\"><a href=\\\\\"#fn-33-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">33</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-34-shortId\\\\\"><a href=\\\\\"#fn-34-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">34</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-35-shortId\\\\\"><a href=\\\\\"#fn-35-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">35</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-36-shortId\\\\\"><a href=\\\\\"#fn-36-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">36</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-37-shortId\\\\\"><a href=\\\\\"#fn-37-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">37</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-38-shortId\\\\\"><a href=\\\\\"#fn-38-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">38</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-39-shortId\\\\\"><a href=\\\\\"#fn-39-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">39</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-40-shortId\\\\\"><a href=\\\\\"#fn-40-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">40</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-41-shortId\\\\\"><a href=\\\\\"#fn-41-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">41</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-42-shortId\\\\\"><a href=\\\\\"#fn-42-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">42</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-43-shortId\\\\\"><a href=\\\\\"#fn-43-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">43</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-44-shortId\\\\\"><a href=\\\\\"#fn-44-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">44</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-45-shortId\\\\\"><a href=\\\\\"#fn-45-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">45</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-46-shortId\\\\\"><a href=\\\\\"#fn-46-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">46</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-47-shortId\\\\\"><a href=\\\\\"#fn-47-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">47</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-48-shortId\\\\\"><a href=\\\\\"#fn-48-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">48</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-49-shortId\\\\\"><a href=\\\\\"#fn-49-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">49</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-50-shortId\\\\\"><a href=\\\\\"#fn-50-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">50</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-51-shortId\\\\\"><a href=\\\\\"#fn-51-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">51</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-52-shortId\\\\\"><a href=\\\\\"#fn-52-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">52</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-53-shortId\\\\\"><a href=\\\\\"#fn-53-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">53</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-54-shortId\\\\\"><a href=\\\\\"#fn-54-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">54</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-55-shortId\\\\\"><a href=\\\\\"#fn-55-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">55</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-56-shortId\\\\\"><a href=\\\\\"#fn-56-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">56</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-57-shortId\\\\\"><a href=\\\\\"#fn-57-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">57</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-58-shortId\\\\\"><a href=\\\\\"#fn-58-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">58</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-59-shortId\\\\\"><a href=\\\\\"#fn-59-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">59</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-60-shortId\\\\\"><a href=\\\\\"#fn-60-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">60</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-61-shortId\\\\\"><a href=\\\\\"#fn-61-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">61</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-62-shortId\\\\\"><a href=\\\\\"#fn-62-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">62</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-63-shortId\\\\\"><a href=\\\\\"#fn-63-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">63</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-64-shortId\\\\\"><a href=\\\\\"#fn-64-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">64</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-65-shortId\\\\\"><a href=\\\\\"#fn-65-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">65</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-66-shortId\\\\\"><a href=\\\\\"#fn-66-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">66</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-67-shortId\\\\\"><a href=\\\\\"#fn-67-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">67</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-68-shortId\\\\\"><a href=\\\\\"#fn-68-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">68</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-69-shortId\\\\\"><a href=\\\\\"#fn-69-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">69</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-70-shortId\\\\\"><a href=\\\\\"#fn-70-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">70</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-71-shortId\\\\\"><a href=\\\\\"#fn-71-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">71</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-72-shortId\\\\\"><a href=\\\\\"#fn-72-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">72</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-73-shortId\\\\\"><a href=\\\\\"#fn-73-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">73</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-74-shortId\\\\\"><a href=\\\\\"#fn-74-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">74</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-75-shortId\\\\\"><a href=\\\\\"#fn-75-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">75</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-76-shortId\\\\\"><a href=\\\\\"#fn-76-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">76</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-77-shortId\\\\\"><a href=\\\\\"#fn-77-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">77</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-78-shortId\\\\\"><a href=\\\\\"#fn-78-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">78</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-79-shortId\\\\\"><a href=\\\\\"#fn-79-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">79</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-80-shortId\\\\\"><a href=\\\\\"#fn-80-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">80</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-81-shortId\\\\\"><a href=\\\\\"#fn-81-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">81</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-82-shortId\\\\\"><a href=\\\\\"#fn-82-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">82</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-83-shortId\\\\\"><a href=\\\\\"#fn-83-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">83</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-84-shortId\\\\\"><a href=\\\\\"#fn-84-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">84</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-85-shortId\\\\\"><a href=\\\\\"#fn-85-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">85</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-86-shortId\\\\\"><a href=\\\\\"#fn-86-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">86</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-87-shortId\\\\\"><a href=\\\\\"#fn-87-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">87</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-88-shortId\\\\\"><a href=\\\\\"#fn-88-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">88</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-89-shortId\\\\\"><a href=\\\\\"#fn-89-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">89</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-90-shortId\\\\\"><a href=\\\\\"#fn-90-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">90</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-91-shortId\\\\\"><a href=\\\\\"#fn-91-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">91</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-92-shortId\\\\\"><a href=\\\\\"#fn-92-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">92</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-93-shortId\\\\\"><a href=\\\\\"#fn-93-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">93</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-94-shortId\\\\\"><a href=\\\\\"#fn-94-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">94</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-95-shortId\\\\\"><a href=\\\\\"#fn-95-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">95</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-96-shortId\\\\\"><a href=\\\\\"#fn-96-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">96</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-97-shortId\\\\\"><a href=\\\\\"#fn-97-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">97</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-98-shortId\\\\\"><a href=\\\\\"#fn-98-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">98</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-99-shortId\\\\\"><a href=\\\\\"#fn-99-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">99</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-100-shortId\\\\\"><a href=\\\\\"#fn-100-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">100</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-101-shortId\\\\\"><a href=\\\\\"#fn-101-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">101</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-102-shortId\\\\\"><a href=\\\\\"#fn-102-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">102</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-103-shortId\\\\\"><a href=\\\\\"#fn-103-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">103</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-104-shortId\\\\\"><a href=\\\\\"#fn-104-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">104</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-105-shortId\\\\\"><a href=\\\\\"#fn-105-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">105</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-106-shortId\\\\\"><a href=\\\\\"#fn-106-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">106</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-107-shortId\\\\\"><a href=\\\\\"#fn-107-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">107</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-108-shortId\\\\\"><a href=\\\\\"#fn-108-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">108</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-109-shortId\\\\\"><a href=\\\\\"#fn-109-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">109</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-110-shortId\\\\\"><a href=\\\\\"#fn-110-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">110</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-111-shortId\\\\\"><a href=\\\\\"#fn-111-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">111</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-112-shortId\\\\\"><a href=\\\\\"#fn-112-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">112</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-113-shortId\\\\\"><a href=\\\\\"#fn-113-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">113</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-114-shortId\\\\\"><a href=\\\\\"#fn-114-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">114</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-115-shortId\\\\\"><a href=\\\\\"#fn-115-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">115</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-116-shortId\\\\\"><a href=\\\\\"#fn-116-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">116</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-117-shortId\\\\\"><a href=\\\\\"#fn-117-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">117</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-118-shortId\\\\\"><a href=\\\\\"#fn-118-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">118</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-119-shortId\\\\\"><a href=\\\\\"#fn-119-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">119</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-120-shortId\\\\\"><a href=\\\\\"#fn-120-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">120</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-121-shortId\\\\\"><a href=\\\\\"#fn-121-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">121</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-122-shortId\\\\\"><a href=\\\\\"#fn-122-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">122</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-123-shortId\\\\\"><a href=\\\\\"#fn-123-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">123</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-124-shortId\\\\\"><a href=\\\\\"#fn-124-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">124</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-125-shortId\\\\\"><a href=\\\\\"#fn-125-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">125</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-126-shortId\\\\\"><a href=\\\\\"#fn-126-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">126</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-127-shortId\\\\\"><a href=\\\\\"#fn-127-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">127</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-128-shortId\\\\\"><a href=\\\\\"#fn-128-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">128</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-129-shortId\\\\\"><a href=\\\\\"#fn-129-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">129</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-130-shortId\\\\\"><a href=\\\\\"#fn-130-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">130</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-131-shortId\\\\\"><a href=\\\\\"#fn-131-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">131</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-132-shortId\\\\\"><a href=\\\\\"#fn-132-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">132</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-133-shortId\\\\\"><a href=\\\\\"#fn-133-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">133</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-134-shortId\\\\\"><a href=\\\\\"#fn-134-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">134</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-135-shortId\\\\\"><a href=\\\\\"#fn-135-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">135</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-136-shortId\\\\\"><a href=\\\\\"#fn-136-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">136</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-137-shortId\\\\\"><a href=\\\\\"#fn-137-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">137</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-138-shortId\\\\\"><a href=\\\\\"#fn-138-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">138</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-139-shortId\\\\\"><a href=\\\\\"#fn-139-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">139</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-140-shortId\\\\\"><a href=\\\\\"#fn-140-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">140</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-141-shortId\\\\\"><a href=\\\\\"#fn-141-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">141</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-142-shortId\\\\\"><a href=\\\\\"#fn-142-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">142</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-143-shortId\\\\\"><a href=\\\\\"#fn-143-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">143</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-144-shortId\\\\\"><a href=\\\\\"#fn-144-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">144</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-145-shortId\\\\\"><a href=\\\\\"#fn-145-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">145</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-146-shortId\\\\\"><a href=\\\\\"#fn-146-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">146</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-147-shortId\\\\\"><a href=\\\\\"#fn-147-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">147</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-148-shortId\\\\\"><a href=\\\\\"#fn-148-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">148</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-149-shortId\\\\\"><a href=\\\\\"#fn-149-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">149</a></sup></p>\n<p>Something<sup id=\\\\\"fnref-150-shortId\\\\\"><a href=\\\\\"#fn-150-shortId\\\\\" class=\\\\\"footnote-ref\\\\\">150</a></sup></p>\n<div class=\\\\\"footnotes\\\\\">\n<hr>\n<ol>\n<li id=\\\\\"fn-1-shortId\\\\\">Another thing<a href=\\\\\"#fnref-1-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 1\\\\\">↩</a></li>\n<li id=\\\\\"fn-2-shortId\\\\\">Another thing<a href=\\\\\"#fnref-2-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 2\\\\\">↩</a></li>\n<li id=\\\\\"fn-3-shortId\\\\\">Another thing<a href=\\\\\"#fnref-3-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 3\\\\\">↩</a></li>\n<li id=\\\\\"fn-4-shortId\\\\\">Another thing<a href=\\\\\"#fnref-4-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 4\\\\\">↩</a></li>\n<li id=\\\\\"fn-5-shortId\\\\\">Another thing<a href=\\\\\"#fnref-5-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 5\\\\\">↩</a></li>\n<li id=\\\\\"fn-6-shortId\\\\\">Another thing<a href=\\\\\"#fnref-6-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 6\\\\\">↩</a></li>\n<li id=\\\\\"fn-7-shortId\\\\\">Another thing<a href=\\\\\"#fnref-7-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 7\\\\\">↩</a></li>\n<li id=\\\\\"fn-8-shortId\\\\\">Another thing<a href=\\\\\"#fnref-8-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 8\\\\\">↩</a></li>\n<li id=\\\\\"fn-9-shortId\\\\\">Another thing<a href=\\\\\"#fnref-9-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 9\\\\\">↩</a></li>\n<li id=\\\\\"fn-10-shortId\\\\\">Another thing<a href=\\\\\"#fnref-10-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 10\\\\\">↩</a></li>\n<li id=\\\\\"fn-11-shortId\\\\\">Another thing<a href=\\\\\"#fnref-11-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 11\\\\\">↩</a></li>\n<li id=\\\\\"fn-12-shortId\\\\\">Another thing<a href=\\\\\"#fnref-12-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 12\\\\\">↩</a></li>\n<li id=\\\\\"fn-13-shortId\\\\\">Another thing<a href=\\\\\"#fnref-13-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 13\\\\\">↩</a></li>\n<li id=\\\\\"fn-14-shortId\\\\\">Another thing<a href=\\\\\"#fnref-14-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 14\\\\\">↩</a></li>\n<li id=\\\\\"fn-15-shortId\\\\\">Another thing<a href=\\\\\"#fnref-15-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 15\\\\\">↩</a></li>\n<li id=\\\\\"fn-16-shortId\\\\\">Another thing<a href=\\\\\"#fnref-16-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 16\\\\\">↩</a></li>\n<li id=\\\\\"fn-17-shortId\\\\\">Another thing<a href=\\\\\"#fnref-17-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 17\\\\\">↩</a></li>\n<li id=\\\\\"fn-18-shortId\\\\\">Another thing<a href=\\\\\"#fnref-18-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 18\\\\\">↩</a></li>\n<li id=\\\\\"fn-19-shortId\\\\\">Another thing<a href=\\\\\"#fnref-19-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 19\\\\\">↩</a></li>\n<li id=\\\\\"fn-20-shortId\\\\\">Another thing<a href=\\\\\"#fnref-20-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 20\\\\\">↩</a></li>\n<li id=\\\\\"fn-21-shortId\\\\\">Another thing<a href=\\\\\"#fnref-21-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 21\\\\\">↩</a></li>\n<li id=\\\\\"fn-22-shortId\\\\\">Another thing<a href=\\\\\"#fnref-22-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 22\\\\\">↩</a></li>\n<li id=\\\\\"fn-23-shortId\\\\\">Another thing<a href=\\\\\"#fnref-23-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 23\\\\\">↩</a></li>\n<li id=\\\\\"fn-24-shortId\\\\\">Another thing<a href=\\\\\"#fnref-24-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 24\\\\\">↩</a></li>\n<li id=\\\\\"fn-25-shortId\\\\\">Another thing<a href=\\\\\"#fnref-25-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 25\\\\\">↩</a></li>\n<li id=\\\\\"fn-26-shortId\\\\\">Another thing<a href=\\\\\"#fnref-26-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 26\\\\\">↩</a></li>\n<li id=\\\\\"fn-27-shortId\\\\\">Another thing<a href=\\\\\"#fnref-27-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 27\\\\\">↩</a></li>\n<li id=\\\\\"fn-28-shortId\\\\\">Another thing<a href=\\\\\"#fnref-28-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 28\\\\\">↩</a></li>\n<li id=\\\\\"fn-29-shortId\\\\\">Another thing<a href=\\\\\"#fnref-29-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 29\\\\\">↩</a></li>\n<li id=\\\\\"fn-30-shortId\\\\\">Another thing<a href=\\\\\"#fnref-30-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 30\\\\\">↩</a></li>\n<li id=\\\\\"fn-31-shortId\\\\\">Another thing<a href=\\\\\"#fnref-31-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 31\\\\\">↩</a></li>\n<li id=\\\\\"fn-32-shortId\\\\\">Another thing<a href=\\\\\"#fnref-32-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 32\\\\\">↩</a></li>\n<li id=\\\\\"fn-33-shortId\\\\\">Another thing<a href=\\\\\"#fnref-33-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 33\\\\\">↩</a></li>\n<li id=\\\\\"fn-34-shortId\\\\\">Another thing<a href=\\\\\"#fnref-34-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 34\\\\\">↩</a></li>\n<li id=\\\\\"fn-35-shortId\\\\\">Another thing<a href=\\\\\"#fnref-35-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 35\\\\\">↩</a></li>\n<li id=\\\\\"fn-36-shortId\\\\\">Another thing<a href=\\\\\"#fnref-36-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 36\\\\\">↩</a></li>\n<li id=\\\\\"fn-37-shortId\\\\\">Another thing<a href=\\\\\"#fnref-37-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 37\\\\\">↩</a></li>\n<li id=\\\\\"fn-38-shortId\\\\\">Another thing<a href=\\\\\"#fnref-38-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 38\\\\\">↩</a></li>\n<li id=\\\\\"fn-39-shortId\\\\\">Another thing<a href=\\\\\"#fnref-39-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 39\\\\\">↩</a></li>\n<li id=\\\\\"fn-40-shortId\\\\\">Another thing<a href=\\\\\"#fnref-40-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 40\\\\\">↩</a></li>\n<li id=\\\\\"fn-41-shortId\\\\\">Another thing<a href=\\\\\"#fnref-41-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 41\\\\\">↩</a></li>\n<li id=\\\\\"fn-42-shortId\\\\\">Another thing<a href=\\\\\"#fnref-42-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 42\\\\\">↩</a></li>\n<li id=\\\\\"fn-43-shortId\\\\\">Another thing<a href=\\\\\"#fnref-43-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 43\\\\\">↩</a></li>\n<li id=\\\\\"fn-44-shortId\\\\\">Another thing<a href=\\\\\"#fnref-44-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 44\\\\\">↩</a></li>\n<li id=\\\\\"fn-45-shortId\\\\\">Another thing<a href=\\\\\"#fnref-45-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 45\\\\\">↩</a></li>\n<li id=\\\\\"fn-46-shortId\\\\\">Another thing<a href=\\\\\"#fnref-46-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 46\\\\\">↩</a></li>\n<li id=\\\\\"fn-47-shortId\\\\\">Another thing<a href=\\\\\"#fnref-47-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 47\\\\\">↩</a></li>\n<li id=\\\\\"fn-48-shortId\\\\\">Another thing<a href=\\\\\"#fnref-48-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 48\\\\\">↩</a></li>\n<li id=\\\\\"fn-49-shortId\\\\\">Another thing<a href=\\\\\"#fnref-49-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 49\\\\\">↩</a></li>\n<li id=\\\\\"fn-50-shortId\\\\\">Another thing<a href=\\\\\"#fnref-50-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 50\\\\\">↩</a></li>\n<li id=\\\\\"fn-51-shortId\\\\\">Another thing<a href=\\\\\"#fnref-51-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 51\\\\\">↩</a></li>\n<li id=\\\\\"fn-52-shortId\\\\\">Another thing<a href=\\\\\"#fnref-52-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 52\\\\\">↩</a></li>\n<li id=\\\\\"fn-53-shortId\\\\\">Another thing<a href=\\\\\"#fnref-53-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 53\\\\\">↩</a></li>\n<li id=\\\\\"fn-54-shortId\\\\\">Another thing<a href=\\\\\"#fnref-54-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 54\\\\\">↩</a></li>\n<li id=\\\\\"fn-55-shortId\\\\\">Another thing<a href=\\\\\"#fnref-55-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 55\\\\\">↩</a></li>\n<li id=\\\\\"fn-56-shortId\\\\\">Another thing<a href=\\\\\"#fnref-56-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 56\\\\\">↩</a></li>\n<li id=\\\\\"fn-57-shortId\\\\\">Another thing<a href=\\\\\"#fnref-57-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 57\\\\\">↩</a></li>\n<li id=\\\\\"fn-58-shortId\\\\\">Another thing<a href=\\\\\"#fnref-58-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 58\\\\\">↩</a></li>\n<li id=\\\\\"fn-59-shortId\\\\\">Another thing<a href=\\\\\"#fnref-59-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 59\\\\\">↩</a></li>\n<li id=\\\\\"fn-60-shortId\\\\\">Another thing<a href=\\\\\"#fnref-60-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 60\\\\\">↩</a></li>\n<li id=\\\\\"fn-61-shortId\\\\\">Another thing<a href=\\\\\"#fnref-61-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 61\\\\\">↩</a></li>\n<li id=\\\\\"fn-62-shortId\\\\\">Another thing<a href=\\\\\"#fnref-62-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 62\\\\\">↩</a></li>\n<li id=\\\\\"fn-63-shortId\\\\\">Another thing<a href=\\\\\"#fnref-63-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 63\\\\\">↩</a></li>\n<li id=\\\\\"fn-64-shortId\\\\\">Another thing<a href=\\\\\"#fnref-64-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 64\\\\\">↩</a></li>\n<li id=\\\\\"fn-65-shortId\\\\\">Another thing<a href=\\\\\"#fnref-65-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 65\\\\\">↩</a></li>\n<li id=\\\\\"fn-66-shortId\\\\\">Another thing<a href=\\\\\"#fnref-66-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 66\\\\\">↩</a></li>\n<li id=\\\\\"fn-67-shortId\\\\\">Another thing<a href=\\\\\"#fnref-67-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 67\\\\\">↩</a></li>\n<li id=\\\\\"fn-68-shortId\\\\\">Another thing<a href=\\\\\"#fnref-68-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 68\\\\\">↩</a></li>\n<li id=\\\\\"fn-69-shortId\\\\\">Another thing<a href=\\\\\"#fnref-69-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 69\\\\\">↩</a></li>\n<li id=\\\\\"fn-70-shortId\\\\\">Another thing<a href=\\\\\"#fnref-70-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 70\\\\\">↩</a></li>\n<li id=\\\\\"fn-71-shortId\\\\\">Another thing<a href=\\\\\"#fnref-71-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 71\\\\\">↩</a></li>\n<li id=\\\\\"fn-72-shortId\\\\\">Another thing<a href=\\\\\"#fnref-72-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 72\\\\\">↩</a></li>\n<li id=\\\\\"fn-73-shortId\\\\\">Another thing<a href=\\\\\"#fnref-73-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 73\\\\\">↩</a></li>\n<li id=\\\\\"fn-74-shortId\\\\\">Another thing<a href=\\\\\"#fnref-74-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 74\\\\\">↩</a></li>\n<li id=\\\\\"fn-75-shortId\\\\\">Another thing<a href=\\\\\"#fnref-75-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 75\\\\\">↩</a></li>\n<li id=\\\\\"fn-76-shortId\\\\\">Another thing<a href=\\\\\"#fnref-76-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 76\\\\\">↩</a></li>\n<li id=\\\\\"fn-77-shortId\\\\\">Another thing<a href=\\\\\"#fnref-77-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 77\\\\\">↩</a></li>\n<li id=\\\\\"fn-78-shortId\\\\\">Another thing<a href=\\\\\"#fnref-78-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 78\\\\\">↩</a></li>\n<li id=\\\\\"fn-79-shortId\\\\\">Another thing<a href=\\\\\"#fnref-79-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 79\\\\\">↩</a></li>\n<li id=\\\\\"fn-80-shortId\\\\\">Another thing<a href=\\\\\"#fnref-80-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 80\\\\\">↩</a></li>\n<li id=\\\\\"fn-81-shortId\\\\\">Another thing<a href=\\\\\"#fnref-81-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 81\\\\\">↩</a></li>\n<li id=\\\\\"fn-82-shortId\\\\\">Another thing<a href=\\\\\"#fnref-82-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 82\\\\\">↩</a></li>\n<li id=\\\\\"fn-83-shortId\\\\\">Another thing<a href=\\\\\"#fnref-83-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 83\\\\\">↩</a></li>\n<li id=\\\\\"fn-84-shortId\\\\\">Another thing<a href=\\\\\"#fnref-84-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 84\\\\\">↩</a></li>\n<li id=\\\\\"fn-85-shortId\\\\\">Another thing<a href=\\\\\"#fnref-85-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 85\\\\\">↩</a></li>\n<li id=\\\\\"fn-86-shortId\\\\\">Another thing<a href=\\\\\"#fnref-86-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 86\\\\\">↩</a></li>\n<li id=\\\\\"fn-87-shortId\\\\\">Another thing<a href=\\\\\"#fnref-87-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 87\\\\\">↩</a></li>\n<li id=\\\\\"fn-88-shortId\\\\\">Another thing<a href=\\\\\"#fnref-88-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 88\\\\\">↩</a></li>\n<li id=\\\\\"fn-89-shortId\\\\\">Another thing<a href=\\\\\"#fnref-89-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 89\\\\\">↩</a></li>\n<li id=\\\\\"fn-90-shortId\\\\\">Another thing<a href=\\\\\"#fnref-90-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 90\\\\\">↩</a></li>\n<li id=\\\\\"fn-91-shortId\\\\\">Another thing<a href=\\\\\"#fnref-91-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 91\\\\\">↩</a></li>\n<li id=\\\\\"fn-92-shortId\\\\\">Another thing<a href=\\\\\"#fnref-92-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 92\\\\\">↩</a></li>\n<li id=\\\\\"fn-93-shortId\\\\\">Another thing<a href=\\\\\"#fnref-93-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 93\\\\\">↩</a></li>\n<li id=\\\\\"fn-94-shortId\\\\\">Another thing<a href=\\\\\"#fnref-94-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 94\\\\\">↩</a></li>\n<li id=\\\\\"fn-95-shortId\\\\\">Another thing<a href=\\\\\"#fnref-95-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 95\\\\\">↩</a></li>\n<li id=\\\\\"fn-96-shortId\\\\\">Another thing<a href=\\\\\"#fnref-96-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 96\\\\\">↩</a></li>\n<li id=\\\\\"fn-97-shortId\\\\\">Another thing<a href=\\\\\"#fnref-97-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 97\\\\\">↩</a></li>\n<li id=\\\\\"fn-98-shortId\\\\\">Another thing<a href=\\\\\"#fnref-98-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 98\\\\\">↩</a></li>\n<li id=\\\\\"fn-99-shortId\\\\\">Another thing<a href=\\\\\"#fnref-99-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 99\\\\\">↩</a></li>\n<li id=\\\\\"fn-100-shortId\\\\\">Another thing<a href=\\\\\"#fnref-100-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 100\\\\\">↩</a></li>\n<li id=\\\\\"fn-101-shortId\\\\\">Another thing<a href=\\\\\"#fnref-101-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 101\\\\\">↩</a></li>\n<li id=\\\\\"fn-102-shortId\\\\\">Another thing<a href=\\\\\"#fnref-102-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 102\\\\\">↩</a></li>\n<li id=\\\\\"fn-103-shortId\\\\\">Another thing<a href=\\\\\"#fnref-103-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 103\\\\\">↩</a></li>\n<li id=\\\\\"fn-104-shortId\\\\\">Another thing<a href=\\\\\"#fnref-104-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 104\\\\\">↩</a></li>\n<li id=\\\\\"fn-105-shortId\\\\\">Another thing<a href=\\\\\"#fnref-105-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 105\\\\\">↩</a></li>\n<li id=\\\\\"fn-106-shortId\\\\\">Another thing<a href=\\\\\"#fnref-106-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 106\\\\\">↩</a></li>\n<li id=\\\\\"fn-107-shortId\\\\\">Another thing<a href=\\\\\"#fnref-107-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 107\\\\\">↩</a></li>\n<li id=\\\\\"fn-108-shortId\\\\\">Another thing<a href=\\\\\"#fnref-108-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 108\\\\\">↩</a></li>\n<li id=\\\\\"fn-109-shortId\\\\\">Another thing<a href=\\\\\"#fnref-109-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 109\\\\\">↩</a></li>\n<li id=\\\\\"fn-110-shortId\\\\\">Another thing<a href=\\\\\"#fnref-110-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 110\\\\\">↩</a></li>\n<li id=\\\\\"fn-111-shortId\\\\\">Another thing<a href=\\\\\"#fnref-111-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 111\\\\\">↩</a></li>\n<li id=\\\\\"fn-112-shortId\\\\\">Another thing<a href=\\\\\"#fnref-112-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 112\\\\\">↩</a></li>\n<li id=\\\\\"fn-113-shortId\\\\\">Another thing<a href=\\\\\"#fnref-113-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 113\\\\\">↩</a></li>\n<li id=\\\\\"fn-114-shortId\\\\\">Another thing<a href=\\\\\"#fnref-114-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 114\\\\\">↩</a></li>\n<li id=\\\\\"fn-115-shortId\\\\\">Another thing<a href=\\\\\"#fnref-115-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 115\\\\\">↩</a></li>\n<li id=\\\\\"fn-116-shortId\\\\\">Another thing<a href=\\\\\"#fnref-116-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 116\\\\\">↩</a></li>\n<li id=\\\\\"fn-117-shortId\\\\\">Another thing<a href=\\\\\"#fnref-117-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 117\\\\\">↩</a></li>\n<li id=\\\\\"fn-118-shortId\\\\\">Another thing<a href=\\\\\"#fnref-118-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 118\\\\\">↩</a></li>\n<li id=\\\\\"fn-119-shortId\\\\\">Another thing<a href=\\\\\"#fnref-119-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 119\\\\\">↩</a></li>\n<li id=\\\\\"fn-120-shortId\\\\\">Another thing<a href=\\\\\"#fnref-120-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 120\\\\\">↩</a></li>\n<li id=\\\\\"fn-121-shortId\\\\\">Another thing<a href=\\\\\"#fnref-121-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 121\\\\\">↩</a></li>\n<li id=\\\\\"fn-122-shortId\\\\\">Another thing<a href=\\\\\"#fnref-122-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 122\\\\\">↩</a></li>\n<li id=\\\\\"fn-123-shortId\\\\\">Another thing<a href=\\\\\"#fnref-123-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 123\\\\\">↩</a></li>\n<li id=\\\\\"fn-124-shortId\\\\\">Another thing<a href=\\\\\"#fnref-124-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 124\\\\\">↩</a></li>\n<li id=\\\\\"fn-125-shortId\\\\\">Another thing<a href=\\\\\"#fnref-125-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 125\\\\\">↩</a></li>\n<li id=\\\\\"fn-126-shortId\\\\\">Another thing<a href=\\\\\"#fnref-126-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 126\\\\\">↩</a></li>\n<li id=\\\\\"fn-127-shortId\\\\\">Another thing<a href=\\\\\"#fnref-127-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 127\\\\\">↩</a></li>\n<li id=\\\\\"fn-128-shortId\\\\\">Another thing<a href=\\\\\"#fnref-128-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 128\\\\\">↩</a></li>\n<li id=\\\\\"fn-129-shortId\\\\\">Another thing<a href=\\\\\"#fnref-129-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 129\\\\\">↩</a></li>\n<li id=\\\\\"fn-130-shortId\\\\\">Another thing<a href=\\\\\"#fnref-130-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 130\\\\\">↩</a></li>\n<li id=\\\\\"fn-131-shortId\\\\\">Another thing<a href=\\\\\"#fnref-131-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 131\\\\\">↩</a></li>\n<li id=\\\\\"fn-132-shortId\\\\\">Another thing<a href=\\\\\"#fnref-132-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 132\\\\\">↩</a></li>\n<li id=\\\\\"fn-133-shortId\\\\\">Another thing<a href=\\\\\"#fnref-133-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 133\\\\\">↩</a></li>\n<li id=\\\\\"fn-134-shortId\\\\\">Another thing<a href=\\\\\"#fnref-134-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 134\\\\\">↩</a></li>\n<li id=\\\\\"fn-135-shortId\\\\\">Another thing<a href=\\\\\"#fnref-135-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 135\\\\\">↩</a></li>\n<li id=\\\\\"fn-136-shortId\\\\\">Another thing<a href=\\\\\"#fnref-136-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 136\\\\\">↩</a></li>\n<li id=\\\\\"fn-137-shortId\\\\\">Another thing<a href=\\\\\"#fnref-137-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 137\\\\\">↩</a></li>\n<li id=\\\\\"fn-138-shortId\\\\\">Another thing<a href=\\\\\"#fnref-138-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 138\\\\\">↩</a></li>\n<li id=\\\\\"fn-139-shortId\\\\\">Another thing<a href=\\\\\"#fnref-139-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 139\\\\\">↩</a></li>\n<li id=\\\\\"fn-140-shortId\\\\\">Another thing<a href=\\\\\"#fnref-140-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 140\\\\\">↩</a></li>\n<li id=\\\\\"fn-141-shortId\\\\\">Another thing<a href=\\\\\"#fnref-141-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 141\\\\\">↩</a></li>\n<li id=\\\\\"fn-142-shortId\\\\\">Another thing<a href=\\\\\"#fnref-142-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 142\\\\\">↩</a></li>\n<li id=\\\\\"fn-143-shortId\\\\\">Another thing<a href=\\\\\"#fnref-143-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 143\\\\\">↩</a></li>\n<li id=\\\\\"fn-144-shortId\\\\\">Another thing<a href=\\\\\"#fnref-144-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 144\\\\\">↩</a></li>\n<li id=\\\\\"fn-145-shortId\\\\\">Another thing<a href=\\\\\"#fnref-145-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 145\\\\\">↩</a></li>\n<li id=\\\\\"fn-146-shortId\\\\\">Another thing<a href=\\\\\"#fnref-146-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 146\\\\\">↩</a></li>\n<li id=\\\\\"fn-147-shortId\\\\\">Another thing<a href=\\\\\"#fnref-147-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 147\\\\\">↩</a></li>\n<li id=\\\\\"fn-148-shortId\\\\\">Another thing<a href=\\\\\"#fnref-148-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 148\\\\\">↩</a></li>\n<li id=\\\\\"fn-149-shortId\\\\\">Another thing<a href=\\\\\"#fnref-149-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 149\\\\\">↩</a></li>\n<li id=\\\\\"fn-150-shortId\\\\\">Another thing<a href=\\\\\"#fnref-150-shortId\\\\\" class=\\\\\"footnote-backref\\\\\" title=\\\\\"Retourner au texte de la note 150\\\\\">↩</a></li>\n</ol>\n</div>\"\n`;\n\nexports[`extensions renders footnote_many_footnotes.txt 2`] = `\n\"Something\\\\\\\\textsuperscript{\\\\\\\\footnotemark[1]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[2]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[3]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[4]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[5]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[6]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[7]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[8]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[9]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[10]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[11]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[12]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[13]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[14]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[15]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[16]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[17]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[18]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[19]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[20]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[21]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[22]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[23]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[24]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[25]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[26]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[27]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[28]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[29]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[30]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[31]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[32]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[33]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[34]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[35]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[36]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[37]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[38]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[39]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[40]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[41]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[42]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[43]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[44]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[45]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[46]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[47]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[48]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[49]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[50]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[51]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[52]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[53]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[54]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[55]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[56]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[57]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[58]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[59]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[60]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[61]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[62]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[63]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[64]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[65]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[66]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[67]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[68]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[69]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[70]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[71]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[72]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[73]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[74]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[75]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[76]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[77]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[78]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[79]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[80]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[81]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[82]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[83]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[84]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[85]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[86]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[87]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[88]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[89]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[90]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[91]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[92]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[93]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[94]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[95]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[96]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[97]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[98]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[99]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[100]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[101]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[102]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[103]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[104]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[105]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[106]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[107]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[108]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[109]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[110]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[111]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[112]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[113]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[114]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[115]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[116]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[117]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[118]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[119]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[120]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[121]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[122]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[123]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[124]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[125]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[126]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[127]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[128]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[129]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[130]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[131]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[132]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[133]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[134]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[135]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[136]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[137]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[138]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[139]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[140]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[141]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[142]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[143]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[144]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[145]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[146]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[147]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[148]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[149]}\n\n\n\nSomething\\\\\\\\textsuperscript{\\\\\\\\footnotemark[150]}\n\n\n\n\\\\\\\\footnotetext[1]{Another thing}\n\n\\\\\\\\footnotetext[2]{Another thing}\n\n\\\\\\\\footnotetext[3]{Another thing}\n\n\\\\\\\\footnotetext[4]{Another thing}\n\n\\\\\\\\footnotetext[5]{Another thing}\n\n\\\\\\\\footnotetext[6]{Another thing}\n\n\\\\\\\\footnotetext[7]{Another thing}\n\n\\\\\\\\footnotetext[8]{Another thing}\n\n\\\\\\\\footnotetext[9]{Another thing}\n\n\\\\\\\\footnotetext[10]{Another thing}\n\n\\\\\\\\footnotetext[11]{Another thing}\n\n\\\\\\\\footnotetext[12]{Another thing}\n\n\\\\\\\\footnotetext[13]{Another thing}\n\n\\\\\\\\footnotetext[14]{Another thing}\n\n\\\\\\\\footnotetext[15]{Another thing}\n\n\\\\\\\\footnotetext[16]{Another thing}\n\n\\\\\\\\footnotetext[17]{Another thing}\n\n\\\\\\\\footnotetext[18]{Another thing}\n\n\\\\\\\\footnotetext[19]{Another thing}\n\n\\\\\\\\footnotetext[20]{Another thing}\n\n\\\\\\\\footnotetext[21]{Another thing}\n\n\\\\\\\\footnotetext[22]{Another thing}\n\n\\\\\\\\footnotetext[23]{Another thing}\n\n\\\\\\\\footnotetext[24]{Another thing}\n\n\\\\\\\\footnotetext[25]{Another thing}\n\n\\\\\\\\footnotetext[26]{Another thing}\n\n\\\\\\\\footnotetext[27]{Another thing}\n\n\\\\\\\\footnotetext[28]{Another thing}\n\n\\\\\\\\footnotetext[29]{Another thing}\n\n\\\\\\\\footnotetext[30]{Another thing}\n\n\\\\\\\\footnotetext[31]{Another thing}\n\n\\\\\\\\footnotetext[32]{Another thing}\n\n\\\\\\\\footnotetext[33]{Another thing}\n\n\\\\\\\\footnotetext[34]{Another thing}\n\n\\\\\\\\footnotetext[35]{Another thing}\n\n\\\\\\\\footnotetext[36]{Another thing}\n\n\\\\\\\\footnotetext[37]{Another thing}\n\n\\\\\\\\footnotetext[38]{Another thing}\n\n\\\\\\\\footnotetext[39]{Another thing}\n\n\\\\\\\\footnotetext[40]{Another thing}\n\n\\\\\\\\footnotetext[41]{Another thing}\n\n\\\\\\\\footnotetext[42]{Another thing}\n\n\\\\\\\\footnotetext[43]{Another thing}\n\n\\\\\\\\footnotetext[44]{Another thing}\n\n\\\\\\\\footnotetext[45]{Another thing}\n\n\\\\\\\\footnotetext[46]{Another thing}\n\n\\\\\\\\footnotetext[47]{Another thing}\n\n\\\\\\\\footnotetext[48]{Another thing}\n\n\\\\\\\\footnotetext[49]{Another thing}\n\n\\\\\\\\footnotetext[50]{Another thing}\n\n\\\\\\\\footnotetext[51]{Another thing}\n\n\\\\\\\\footnotetext[52]{Another thing}\n\n\\\\\\\\footnotetext[53]{Another thing}\n\n\\\\\\\\footnotetext[54]{Another thing}\n\n\\\\\\\\footnotetext[55]{Another thing}\n\n\\\\\\\\footnotetext[56]{Another thing}\n\n\\\\\\\\footnotetext[57]{Another thing}\n\n\\\\\\\\footnotetext[58]{Another thing}\n\n\\\\\\\\footnotetext[59]{Another thing}\n\n\\\\\\\\footnotetext[60]{Another thing}\n\n\\\\\\\\footnotetext[61]{Another thing}\n\n\\\\\\\\footnotetext[62]{Another thing}\n\n\\\\\\\\footnotetext[63]{Another thing}\n\n\\\\\\\\footnotetext[64]{Another thing}\n\n\\\\\\\\footnotetext[65]{Another thing}\n\n\\\\\\\\footnotetext[66]{Another thing}\n\n\\\\\\\\footnotetext[67]{Another thing}\n\n\\\\\\\\footnotetext[68]{Another thing}\n\n\\\\\\\\footnotetext[69]{Another thing}\n\n\\\\\\\\footnotetext[70]{Another thing}\n\n\\\\\\\\footnotetext[71]{Another thing}\n\n\\\\\\\\footnotetext[72]{Another thing}\n\n\\\\\\\\footnotetext[73]{Another thing}\n\n\\\\\\\\footnotetext[74]{Another thing}\n\n\\\\\\\\footnotetext[75]{Another thing}\n\n\\\\\\\\footnotetext[76]{Another thing}\n\n\\\\\\\\footnotetext[77]{Another thing}\n\n\\\\\\\\footnotetext[78]{Another thing}\n\n\\\\\\\\footnotetext[79]{Another thing}\n\n\\\\\\\\footnotetext[80]{Another thing}\n\n\\\\\\\\footnotetext[81]{Another thing}\n\n\\\\\\\\footnotetext[82]{Another thing}\n\n\\\\\\\\footnotetext[83]{Another thing}\n\n\\\\\\\\footnotetext[84]{Another thing}\n\n\\\\\\\\footnotetext[85]{Another thing}\n\n\\\\\\\\footnotetext[86]{Another thing}\n\n\\\\\\\\footnotetext[87]{Another thing}\n\n\\\\\\\\footnotetext[88]{Another thing}\n\n\\\\\\\\footnotetext[89]{Another thing}\n\n\\\\\\\\footnotetext[90]{Another thing}\n\n\\\\\\\\footnotetext[91]{Another thing}\n\n\\\\\\\\footnotetext[92]{Another thing}\n\n\\\\\\\\footnotetext[93]{Another thing}\n\n\\\\\\\\footnotetext[94]{Another thing}\n\n\\\\\\\\footnotetext[95]{Another thing}\n\n\\\\\\\\footnotetext[96]{Another thing}\n\n\\\\\\\\footnotetext[97]{Another thing}\n\n\\\\\\\\footnotetext[98]{Another thing}\n\n\\\\\\\\footnotetext[99]{Another thing}\n\n\\\\\\\\footnotetext[100]{Another thing}\n\n\\\\\\\\footnotetext[101]{Another thing}\n\n\\\\\\\\footnotetext[102]{Another thing}\n\n\\\\\\\\footnotetext[103]{Another thing}\n\n\\\\\\\\footnotetext[104]{Another thing}\n\n\\\\\\\\footnotetext[105]{Another thing}\n\n\\\\\\\\footnotetext[106]{Another thing}\n\n\\\\\\\\footnotetext[107]{Another thing}\n\n\\\\\\\\footnotetext[108]{Another thing}\n\n\\\\\\\\footnotetext[109]{Another thing}\n\n\\\\\\\\footnotetext[110]{Another thing}\n\n\\\\\\\\footnotetext[111]{Another thing}\n\n\\\\\\\\footnotetext[112]{Another thing}\n\n\\\\\\\\footnotetext[113]{Another thing}\n\n\\\\\\\\footnotetext[114]{Another thing}\n\n\\\\\\\\footnotetext[115]{Another thing}\n\n\\\\\\\\footnotetext[116]{Another thing}\n\n\\\\\\\\footnotetext[117]{Another thing}\n\n\\\\\\\\footnotetext[118]{Another thing}\n\n\\\\\\\\footnotetext[119]{Another thing}\n\n\\\\\\\\footnotetext[120]{Another thing}\n\n\\\\\\\\footnotetext[121]{Another thing}\n\n\\\\\\\\footnotetext[122]{Another thing}\n\n\\\\\\\\footnotetext[123]{Another thing}\n\n\\\\\\\\footnotetext[124]{Another thing}\n\n\\\\\\\\footnotetext[125]{Another thing}\n\n\\\\\\\\footnotetext[126]{Another thing}\n\n\\\\\\\\footnotetext[127]{Another thing}\n\n\\\\\\\\footnotetext[128]{Another thing}\n\n\\\\\\\\footnotetext[129]{Another thing}\n\n\\\\\\\\footnotetext[130]{Another thing}\n\n\\\\\\\\footnotetext[131]{Another thing}\n\n\\\\\\\\footnotetext[132]{Another thing}\n\n\\\\\\\\footnotetext[133]{Another thing}\n\n\\\\\\\\footnotetext[134]{Another thing}\n\n\\\\\\\\footnotetext[135]{Another thing}\n\n\\\\\\\\footnotetext[136]{Another thing}\n\n\\\\\\\\footnotetext[137]{Another thing}\n\n\\\\\\\\footnotetext[138]{Another thing}\n\n\\\\\\\\footnotetext[139]{Another thing}\n\n\\\\\\\\footnotetext[140]{Another thing}\n\n\\\\\\\\footnotetext[141]{Another thing}\n\n\\\\\\\\footnotetext[142]{Another thing}\n\n\\\\\\\\footnotetext[143]{Another thing}\n\n\\\\\\\\footnotetext[144]{Another thing}\n\n\\\\\\\\footnotetext[145]{Another thing}\n\n\\\\\\\\footnotetext[146]{Another thing}\n\n\\\\\\\\footnotetext[147]{Another thing}\n\n\\\\\\\\footnotetext[148]{Another thing}\n\n\\\\\\\\footnotetext[149]{Another thing}\n\n\\\\\\\\footnotetext[150]{Another thing}\"\n`;\n\nexports[`extensions renders github_flavored.txt 1`] = `\n\"<p>index 0000000..6e956a9</p>\n<pre><code class=\\\\\"language-diff\\\\\">--- /dev/null\n+++ b/test/data/stripped_text/mike-30-lili\n@@ -0,0 +1,27 @@\n+Summary:\n+ drift_mod.py |    1 +\n+ 1 files changed, 1 insertions(+), 0 deletions(-)\n+\n+commit da4bfb04debdd994683740878d09988b2641513d\n+Author: Mike Dirolf &#x3C;mike@dirolf.com>\n+Date:   Tue Jan 17 13:42:28 2012 -0500\n+\n+\\`\\`\\`\n+minor: just wanted to push something.\n+\\`\\`\\`\n+\n+diff --git a/drift_mod.py b/drift_mod.py\n+index 34dfba6..8a88a69 100644\n+\n+\\`\\`\\`\n+--- a/drift_mod.py\n++++ b/drift_mod.py\n+@@ -281,6 +281,7 @@ CONTEXT_DIFF_LINE_PATTERN = re.compile(r'^('\n+                                        '|\\\\\\\\+ .*'\n+                                        '|- .*'\n+                                        ')$')\n++\n+ def wrap_context_diffs(message_text):\n+     return _wrap_diff(CONTEXT_DIFF_HEADER_PATTERN,\n+                       CONTEXT_DIFF_LINE_PATTERN,\n+\\`\\`\\`\n</code></pre>\n<p>Test support for foo+bar lexer names.</p>\n<pre><code class=\\\\\"language-html+jinja\\\\\">&#x3C;title>{% block title %}{% endblock %}&#x3C;/title>\n&#x3C;ul>\n{% for user in users %}\n  &#x3C;li>&#x3C;a href=\\\\\"{{ user.url }}\\\\\">{{ user.username }}&#x3C;/a>&#x3C;/li>\n{% endfor %}\n&#x3C;/ul>\n</code></pre>\n<p>Test support for foo+bar lexer names in citation.</p>\n<blockquote>\n<pre><code class=\\\\\"language-html+jinja\\\\\">&#x3C;title>{% block title %}{% endblock %}&#x3C;/title>\n&#x3C;ul>\n\n{% for user in users %}\n  &#x3C;li>&#x3C;a href=\\\\\"{{ user.url }}\\\\\">{{ user.username }}&#x3C;/a>&#x3C;/li>\n{% endfor %}\n\n&#x3C;/ul>\n</code></pre>\n</blockquote>\n<p>Test support for foo+bar lexer names with hightlight.</p>\n<pre><code class=\\\\\"language-html+jinja\\\\\">&#x3C;title>{% block title %}{% endblock %}&#x3C;/title>\n&#x3C;ul>\n\n{% for user in users %}\n  &#x3C;li>&#x3C;a href=\\\\\"{{ user.url }}\\\\\">{{ user.username }}&#x3C;/a>&#x3C;/li>\n{% endfor %}\n\n&#x3C;/ul>\n</code></pre>\n<p>Test support for foo+bar lexer names with linenostart.</p>\n<pre><code class=\\\\\"language-html+jinja\\\\\">&#x3C;title>{% block title %}{% endblock %}&#x3C;/title>\n&#x3C;ul>\n\n{% for user in users %}\n  &#x3C;li>&#x3C;a href=\\\\\"{{ user.url }}\\\\\">{{ user.username }}&#x3C;/a>&#x3C;/li>\n{% endfor %}\n\n&#x3C;/ul>\n</code></pre>\n<p>Test support for foo+bar lexer names with both.</p>\n<pre><code class=\\\\\"language-html+jinja\\\\\">&#x3C;title>{% block title %}{% endblock %}&#x3C;/title>\n&#x3C;ul>\n{% for user in users %}\n  &#x3C;li>&#x3C;a href=\\\\\"{{ user.url }}\\\\\">{{ user.username }}&#x3C;/a>&#x3C;/li>\n{% endfor %}\n&#x3C;/ul>\n</code></pre>\n<p>Code without matching end</p>\n<pre><code class=\\\\\"language-html\\\\\">\n~~~\n\nCode into paragraph\n\\`\\`\\`html+jinja hl_lines= \\\\\"2-4\\\\\" linenostart=10\n&#x3C;title>{% block title %}{% endblock %}&#x3C;/title>\n&#x3C;ul>\n{% for user in users %}\n  &#x3C;li>&#x3C;a href=\\\\\"{{ user.url }}\\\\\">{{ user.username }}&#x3C;/a>&#x3C;/li>\n{% endfor %}\n&#x3C;/ul>\n\\`\\`\\`\nwith end\n\n</code></pre>\"\n`;\n\nexports[`extensions renders github_flavored.txt 2`] = `\n\"index 0000000..6e956a9\n\n\n\n\\\\\\\\begin{CodeBlock}{diff}\n--- /dev/null\n+++ b/test/data/stripped_text/mike-30-lili\n@@ -0,0 +1,27 @@\n+Summary:\n+ drift_mod.py |    1 +\n+ 1 files changed, 1 insertions(+), 0 deletions(-)\n+\n+commit da4bfb04debdd994683740878d09988b2641513d\n+Author: Mike Dirolf <mike@dirolf.com>\n+Date:   Tue Jan 17 13:42:28 2012 -0500\n+\n+\\`\\`\\`\n+minor: just wanted to push something.\n+\\`\\`\\`\n+\n+diff --git a/drift_mod.py b/drift_mod.py\n+index 34dfba6..8a88a69 100644\n+\n+\\`\\`\\`\n+--- a/drift_mod.py\n++++ b/drift_mod.py\n+@@ -281,6 +281,7 @@ CONTEXT_DIFF_LINE_PATTERN = re.compile(r'^('\n+                                        '|\\\\\\\\+ .*'\n+                                        '|- .*'\n+                                        ')$')\n++\n+ def wrap_context_diffs(message_text):\n+     return _wrap_diff(CONTEXT_DIFF_HEADER_PATTERN,\n+                       CONTEXT_DIFF_LINE_PATTERN,\n+\\`\\`\\`\n\\\\\\\\end{CodeBlock}\n\n\n\nTest support for foo+bar lexer names.\n\n\n\n\\\\\\\\begin{CodeBlock}{html+jinja}\n<title>{% block title %}{% endblock %}</title>\n<ul>\n{% for user in users %}\n  <li><a href=\\\\\"{{ user.url }}\\\\\">{{ user.username }}</a></li>\n{% endfor %}\n</ul>\n\\\\\\\\end{CodeBlock}\n\n\n\nTest support for foo+bar lexer names in citation.\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{CodeBlock}{html+jinja}\n<title>{% block title %}{% endblock %}</title>\n<ul>\n\n{% for user in users %}\n  <li><a href=\\\\\"{{ user.url }}\\\\\">{{ user.username }}</a></li>\n{% endfor %}\n\n</ul>\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\n\n\n\nTest support for foo+bar lexer names with hightlight.\n\n\n\n\\\\\\\\begin{CodeBlock}[][2-4]{html+jinja}\n<title>{% block title %}{% endblock %}</title>\n<ul>\n\n{% for user in users %}\n  <li><a href=\\\\\"{{ user.url }}\\\\\">{{ user.username }}</a></li>\n{% endfor %}\n\n</ul>\n\\\\\\\\end{CodeBlock}\n\n\n\nTest support for foo+bar lexer names with linenostart.\n\n\n\n\\\\\\\\begin{CodeBlock}[][][10]{html+jinja}\n<title>{% block title %}{% endblock %}</title>\n<ul>\n\n{% for user in users %}\n  <li><a href=\\\\\"{{ user.url }}\\\\\">{{ user.username }}</a></li>\n{% endfor %}\n\n</ul>\n\\\\\\\\end{CodeBlock}\n\n\n\nTest support for foo+bar lexer names with both.\n\n\n\n\\\\\\\\begin{CodeBlock}[][2-4][10]{html+jinja}\n<title>{% block title %}{% endblock %}</title>\n<ul>\n{% for user in users %}\n  <li><a href=\\\\\"{{ user.url }}\\\\\">{{ user.username }}</a></li>\n{% endfor %}\n</ul>\n\\\\\\\\end{CodeBlock}\n\n\n\nCode without matching end\n\n\n\n\\\\\\\\begin{CodeBlock}{html}\n\n~~~\n\nCode into paragraph\n\\`\\`\\`html+jinja hl_lines= \\\\\"2-4\\\\\" linenostart=10\n<title>{% block title %}{% endblock %}</title>\n<ul>\n{% for user in users %}\n  <li><a href=\\\\\"{{ user.url }}\\\\\">{{ user.username }}</a></li>\n{% endfor %}\n</ul>\n\\`\\`\\`\nwith end\n\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`extensions renders tables.txt 1`] = `\n\"<div class=\\\\\"table-wrapper\\\\\"><table>\n<thead>\n<tr>\n<th>First Header</th>\n<th>Second Header</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Content Cell</td>\n<td>Content Cell</td>\n</tr>\n<tr>\n<td>Content Cell</td>\n<td>Content Cell</td>\n</tr>\n</tbody>\n</table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table>\n<thead>\n<tr>\n<th>First Header</th>\n<th>Second Header</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Content Cell</td>\n<td>Content Cell</td>\n</tr>\n<tr>\n<td>Content Cell</td>\n<td>Content Cell</td>\n</tr>\n</tbody>\n</table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table>\n<thead>\n<tr>\n<th align=\\\\\"left\\\\\">Item</th>\n<th align=\\\\\"right\\\\\">Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\\\\\"left\\\\\">Computer</td>\n<td align=\\\\\"right\\\\\">$1600</td>\n</tr>\n<tr>\n<td align=\\\\\"left\\\\\">Phone</td>\n<td align=\\\\\"right\\\\\">$12</td>\n</tr>\n<tr>\n<td align=\\\\\"left\\\\\">Pipe</td>\n<td align=\\\\\"right\\\\\">$1</td>\n</tr>\n</tbody>\n</table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table>\n<thead>\n<tr>\n<th>Function name</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>help()</code></td>\n<td>Display the help window.</td>\n</tr>\n<tr>\n<td><code>destroy()</code></td>\n<td><strong>Destroy your computer!</strong></td>\n</tr>\n</tbody>\n</table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table>\n<thead>\n<tr>\n<th align=\\\\\"left\\\\\">foo</th>\n<th align=\\\\\"center\\\\\">bar</th>\n<th align=\\\\\"right\\\\\">baz</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\\\\\"left\\\\\"></td>\n<td align=\\\\\"center\\\\\">Q</td>\n<td align=\\\\\"right\\\\\"></td>\n</tr>\n<tr>\n<td align=\\\\\"left\\\\\">W</td>\n<td align=\\\\\"center\\\\\"></td>\n<td align=\\\\\"right\\\\\">W</td>\n</tr>\n</tbody>\n</table></div>\n<p>Three spaces in front of a table:</p>\n<div class=\\\\\"table-wrapper\\\\\"><table>\n<thead>\n<tr>\n<th>First Header</th>\n<th>Second Header</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Content Cell</td>\n<td>Content Cell</td>\n</tr>\n<tr>\n<td>Content Cell</td>\n<td>Content Cell</td>\n</tr>\n</tbody>\n</table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table>\n<thead>\n<tr>\n<th>First Header</th>\n<th>Second Header</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Content Cell</td>\n<td>Content Cell</td>\n</tr>\n<tr>\n<td>Content Cell</td>\n<td>Content Cell</td>\n</tr>\n</tbody>\n</table></div>\n<p>Four spaces is a code block:</p>\n<pre><code>First Header | Second Header\n------------ | -------------\nContent Cell | Content Cell\nContent Cell | Content Cell\n</code></pre>\"\n`;\n\nexports[`extensions renders tables.txt 2`] = `\n\"\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nFirst Header & Second Header \\\\\\\\\\\\\\\\\nContent Cell & Content Cell \\\\\\\\\\\\\\\\\nContent Cell & Content Cell \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nFirst Header & Second Header \\\\\\\\\\\\\\\\\nContent Cell & Content Cell \\\\\\\\\\\\\\\\\nContent Cell & Content Cell \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nItem & Value \\\\\\\\\\\\\\\\\nComputer & \\\\\\\\$1600 \\\\\\\\\\\\\\\\\nPhone & \\\\\\\\$12 \\\\\\\\\\\\\\\\\nPipe & \\\\\\\\$1 \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nFunction name & Description \\\\\\\\\\\\\\\\\n\\\\\\\\CodeInline{help()} & Display the help window. \\\\\\\\\\\\\\\\\n\\\\\\\\CodeInline{destroy()} & \\\\\\\\textbf{Destroy your computer!} \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nfoo & bar & baz \\\\\\\\\\\\\\\\\n & Q &  \\\\\\\\\\\\\\\\\nW &  & W \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\nThree spaces in front of a table:\n\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nFirst Header & Second Header \\\\\\\\\\\\\\\\\nContent Cell & Content Cell \\\\\\\\\\\\\\\\\nContent Cell & Content Cell \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nFirst Header & Second Header \\\\\\\\\\\\\\\\\nContent Cell & Content Cell \\\\\\\\\\\\\\\\\nContent Cell & Content Cell \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\nFour spaces is a code block:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nFirst Header | Second Header\n------------ | -------------\nContent Cell | Content Cell\nContent Cell | Content Cell\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`extensions renders tables-2.txt 1`] = `\n\"<div class=\\\\\"table-wrapper\\\\\"><table>\n<thead>\n<tr>\n<th>foo</th>\n<th>bar</th>\n<th>baz</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Q</td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td>W</td>\n<td></td>\n<td>W</td>\n</tr>\n</tbody>\n</table></div>\"\n`;\n\nexports[`extensions renders tables-2.txt 2`] = `\n\"\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nfoo & bar & baz \\\\\\\\\\\\\\\\\nQ \\\\\\\\\\\\\\\\\nW &  & W \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\"\n`;\n\nexports[`heading-shift shifts before range 1`] = `\"<h1 id=\\\\\"should-be-h1\\\\\">should be h1<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#should-be-h1\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\"`;\n\nexports[`heading-shift shifts before range 2`] = `\"\\\\\\\\levelOneTitle{should be h1}\"`;\n\nexports[`heading-shift shifts in range 1`] = `\"<h4 id=\\\\\"should-be-h4\\\\\">should be h4<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#should-be-h4\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h4>\"`;\n\nexports[`heading-shift shifts in range 2`] = `\"\\\\\\\\levelFourTitle{should be h4}\"`;\n\nexports[`heading-shift shifts past range 1`] = `\"<h6 id=\\\\\"should-be-h6\\\\\">should be h6<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#should-be-h6\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h6>\"`;\n\nexports[`heading-shift shifts past range 2`] = `\"\\\\\\\\levelSixTitle{should be h6}\"`;\n\nexports[`misc renders CRLF_line_ends.txt 1`] = `\n\"<p>foo</p>\n<p>&#x3C;div>\nbar\n&#x3C;/div></p>\"\n`;\n\nexports[`misc renders CRLF_line_ends.txt 2`] = `\n\"foo\n\n\n\n<div>\nbar\n</div>\"\n`;\n\nexports[`misc renders adjacent-headers.txt 1`] = `\n\"<h1 id=\\\\\"this-is-a-huge-header\\\\\">this is a huge header<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#this-is-a-huge-header\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\n<h2 id=\\\\\"this-is-a-smaller-header\\\\\">this is a smaller header<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#this-is-a-smaller-header\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h2>\"\n`;\n\nexports[`misc renders adjacent-headers.txt 2`] = `\n\"\\\\\\\\levelOneTitle{this is a huge header}\n\n\n\\\\\\\\levelTwoTitle{this is a smaller header}\"\n`;\n\nexports[`misc renders amp-in-url.txt 1`] = `\"<p><a href=\\\\\"http://www.freewisdom.org/this&#x26;that\\\\\">link</a></p>\"`;\n\nexports[`misc renders amp-in-url.txt 2`] = `\"\\\\\\\\externalLink{link}{http://www.freewisdom.org/this\\\\\\\\&that}\"`;\n\nexports[`misc renders ampersand.txt 1`] = `\n\"<p>&#x26;</p>\n<p>AT&#x26;T</p>\"\n`;\n\nexports[`misc renders ampersand.txt 2`] = `\n\"\\\\\\\\&\n\n\n\nAT\\\\\\\\&T\"\n`;\n\nexports[`misc renders arabic.txt 1`] = `\n\"<h1 id=\\\\\"بايثون\\\\\">بايثون<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#بايثون\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\n<p><strong>بايثون</strong> لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (OOP) وقابلة للتطوير بالإضافة إلى أنها مجانية و مفتوحة المصدر. صُنفت بالأساس كلغة تفسيرية ، بايثون مصممة أصلاً للأداء بعض المهام الخاصة أو المحدودة. إلا أنه يمكن استخدامها بايثون لإنجاز المشاريع الضخمه كأي لغة برمجية أخرى،  غالباً ما يُنصح المبتدئين في ميدان البرمجة بتعلم هذه اللغة لأنها من بين أسهل اللغات البرمجية تعلماً.</p>\n<p>نشأت بايثون في مركز CWI (مركز العلوم والحاسب الآلي) بأمستردام على يد جويدو فان رُزوم. تم تطويرها بلغة C. أطلق فان رُزوم اسم \\\\\"بايثون\\\\\" على لغته تعبيرًا عن إعجابه بفِرقَة مسرحية هزلية شهيرة من بريطانيا، كانت تطلق على نفسها اسم مونتي بايثون Monty Python.</p>\n<p>تتميز بايثون بمجتمعها النشط ، كما أن لها الكثير من المكتبات البرمجية ذات الأغراض الخاصة والتي برمجها أشخاص من مجتمع هذه اللغة ، مثلاً مكتبة PyGame التي توفر مجموعه من الوظائف من اجل برمجة الالعاب. ويمكن لبايثون التعامل مع العديد من أنواع قواعد البيانات مثل MySQL وغيره.</p>\n<h2 id=\\\\\"أمثلة\\\\\">أمثلة<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#أمثلة\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h2>\n<p>مثال Hello World!</p>\n<pre><code>print \\\\\"Hello World!\\\\\"\n</code></pre>\n<p>مثال لاستخراج المضروب Factorial :</p>\n<pre><code>num = 1\nx = raw_input('Insert the number please ')\nx = int(x)\n\nif x > 69:\n print 'Math Error !'\nelse:\n while x > 1:\n  num *= x\n  x = x-1\n\n print num\n</code></pre>\n<h2 id=\\\\\"وصلات-خارجية\\\\\">وصلات خارجية<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#وصلات-خارجية\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h2>\n<ul>\n<li>\n<p><a href=\\\\\"http://www.python.org\\\\\">الموقع الرسمي للغة بايثون</a></p>\n<p>بذرة حاس</p>\n</li>\n</ul>\"\n`;\n\nexports[`misc renders arabic.txt 2`] = `\n\"\\\\\\\\levelOneTitle{بايثون}\n\n\n\\\\\\\\textbf{بايثون} لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (OOP) وقابلة للتطوير بالإضافة إلى أنها مجانية و مفتوحة المصدر. صُنفت بالأساس كلغة تفسيرية ، بايثون مصممة أصلاً للأداء بعض المهام الخاصة أو المحدودة. إلا أنه يمكن استخدامها بايثون لإنجاز المشاريع الضخمه كأي لغة برمجية أخرى،  غالباً ما يُنصح المبتدئين في ميدان البرمجة بتعلم هذه اللغة لأنها من بين أسهل اللغات البرمجية تعلماً.\n\n\n\nنشأت بايثون في مركز CWI (مركز العلوم والحاسب الآلي) بأمستردام على يد جويدو فان رُزوم. تم تطويرها بلغة C. أطلق فان رُزوم اسم \\\\\"بايثون\\\\\" على لغته تعبيرًا عن إعجابه بفِرقَة مسرحية هزلية شهيرة من بريطانيا، كانت تطلق على نفسها اسم مونتي بايثون Monty Python.\n\n\n\nتتميز بايثون بمجتمعها النشط ، كما أن لها الكثير من المكتبات البرمجية ذات الأغراض الخاصة والتي برمجها أشخاص من مجتمع هذه اللغة ، مثلاً مكتبة PyGame التي توفر مجموعه من الوظائف من اجل برمجة الالعاب. ويمكن لبايثون التعامل مع العديد من أنواع قواعد البيانات مثل MySQL وغيره.\n\n\n\n\\\\\\\\levelTwoTitle{أمثلة}\n\n\nمثال Hello World!\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nprint \\\\\"Hello World!\\\\\"\n\\\\\\\\end{CodeBlock}\n\n\n\nمثال لاستخراج المضروب Factorial :\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nnum = 1\nx = raw_input('Insert the number please ')\nx = int(x)\n\nif x > 69:\n print 'Math Error !'\nelse:\n while x > 1:\n  num *= x\n  x = x-1\n\n print num\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\levelTwoTitle{وصلات خارجية}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{الموقع الرسمي للغة بايثون}{http://www.python.org}\n\nبذرة حاس\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`misc renders autolinks_with_asterisks.txt 1`] = `\"<p><a href=\\\\\"http://some.site/weird*url*thing\\\\\">http://some.site/weird*url*thing</a></p>\"`;\n\nexports[`misc renders backtick-escape.txt 1`] = `\n\"<p>\\`This also should not be in code.\\`\n\\\\\\\\<code>This should be in code.\\\\\\\\\\\\\\\\</code>\n\\`And finally this should not be in code.\\`</p>\"\n`;\n\nexports[`misc renders backtick-escape.txt 2`] = `\n\"\\`This also should not be in code.\\`\n\\\\\\\\textbackslash{}\\\\\\\\CodeInline{This should be in code.\\\\\\\\textbackslash{}\\\\\\\\textbackslash{}}\n\\`And finally this should not be in code.\\`\"\n`;\n\nexports[`misc renders blank_lines_in_codeblocks.txt 1`] = `\n\"<p>Preserve blank lines in code blocks with tabs:</p>\n<pre><code>a code block\n\ntwo tabbed lines\n\n\nthree tabbed lines\n\n\n\nfour tabbed lines\n\n\n\n\nfive tabbed lines\n\n\n\n\n\nsix tabbed lines\n\n\n\n\n\n\nEnd of tabbed block\n</code></pre>\n<p>And without tabs:</p>\n<pre><code>a code block\n\ntwo blank lines\n\n\nthree blank lines\n\n\n\nfour blank lines\n\n\n\n\nfive blank lines\n\n\n\n\n\nsix blank lines\n\n\n\n\n\n\nEnd of block\n</code></pre>\n<p>End of document</p>\"\n`;\n\nexports[`misc renders blank_lines_in_codeblocks.txt 2`] = `\n\"Preserve blank lines in code blocks with tabs:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\na code block\n\ntwo tabbed lines\n\n\nthree tabbed lines\n\n\n\nfour tabbed lines\n\n\n\n\nfive tabbed lines\n\n\n\n\n\nsix tabbed lines\n\n\n\n\n\n\nEnd of tabbed block\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd without tabs:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\na code block\n\ntwo blank lines\n\n\nthree blank lines\n\n\n\nfour blank lines\n\n\n\n\nfive blank lines\n\n\n\n\n\nsix blank lines\n\n\n\n\n\n\nEnd of block\n\\\\\\\\end{CodeBlock}\n\n\n\nEnd of document\"\n`;\n\nexports[`misc renders blank-block-quote.txt 1`] = `\n\"<p>aaaaaaaaaaa</p>\n<blockquote>\n</blockquote>\n<p>bbbbbbbbbbb</p>\"\n`;\n\nexports[`misc renders blank-block-quote.txt 2`] = `\n\"aaaaaaaaaaa\n\n\n\n\\\\\\\\begin{Quotation}\n\n\\\\\\\\end{Quotation}\n\n\n\nbbbbbbbbbbb\"\n`;\n\nexports[`misc renders block_html_attr.txt 1`] = `\n\"<p>&#x3C;blockquote>\nRaw HTML processing should not confuse this with the blockquote below\n&#x3C;/blockquote>\n&#x3C;div id=\\\\\"current-content\\\\\">\n    &#x3C;div id=\\\\\"primarycontent\\\\\" class=\\\\\"hfeed\\\\\">\n        &#x3C;div id=\\\\\"post-\\\\\">\n            &#x3C;div class=\\\\\"page-head\\\\\">\n                &#x3C;h2>Header2&#x3C;/h2>\n            &#x3C;/div>\n            &#x3C;div class=\\\\\"entry-content\\\\\">\n                &#x3C;h3>Header3&#x3C;/h3>\n                    &#x3C;p>Paragraph&#x3C;/p>\n                &#x3C;h3>Header3&#x3C;/h3>\n                    &#x3C;p>Paragraph&#x3C;/p>\n                    &#x3C;blockquote>\n                        &#x3C;p>Paragraph&#x3C;/p>\n                    &#x3C;/blockquote>\n                    &#x3C;p>Paragraph&#x3C;/p>\n                    &#x3C;p>&#x3C;a href=\\\\\"/somelink\\\\\">linktext&#x3C;/a>&#x3C;/p>\n            &#x3C;/div>\n        &#x3C;/div>&#x3C;!-- #post-ID -->\n        &#x3C;!-- add contact form here -->\n    &#x3C;/div>&#x3C;!-- #primarycontent -->\n&#x3C;/div>&#x3C;!-- #current-content --></p>\"\n`;\n\nexports[`misc renders block_html_attr.txt 2`] = `\n\"<blockquote>\nRaw HTML processing should not confuse this with the blockquote below\n</blockquote>\n<div id=\\\\\"current-content\\\\\">\n    <div id=\\\\\"primarycontent\\\\\" class=\\\\\"hfeed\\\\\">\n        <div id=\\\\\"post-\\\\\">\n            <div class=\\\\\"page-head\\\\\">\n                <h2>Header2</h2>\n            </div>\n            <div class=\\\\\"entry-content\\\\\">\n                <h3>Header3</h3>\n                    <p>Paragraph</p>\n                <h3>Header3</h3>\n                    <p>Paragraph</p>\n                    <blockquote>\n                        <p>Paragraph</p>\n                    </blockquote>\n                    <p>Paragraph</p>\n                    <p><a href=\\\\\"/somelink\\\\\">linktext</a></p>\n            </div>\n        </div><!-- #post-ID -->\n        <!-- add contact form here -->\n    </div><!-- #primarycontent -->\n</div><!-- #current-content -->\"\n`;\n\nexports[`misc renders block_html_simple.txt 1`] = `\n\"<p>&#x3C;p>foo&#x3C;/p>\n&#x3C;ul>\n&#x3C;li>\n&#x3C;p>bar&#x3C;/p>\n&#x3C;/li>\n&#x3C;li>\n&#x3C;p>baz&#x3C;/p>\n&#x3C;/li>\n&#x3C;/ul></p>\"\n`;\n\nexports[`misc renders block_html_simple.txt 2`] = `\n\"<p>foo</p>\n<ul>\n<li>\n<p>bar</p>\n</li>\n<li>\n<p>baz</p>\n</li>\n</ul>\"\n`;\n\nexports[`misc renders block_html5.txt 1`] = `\n\"<p>&#x3C;section>\n    &#x3C;header>\n        &#x3C;hgroup>\n            &#x3C;h1>Hello :-)&#x3C;/h1>\n        &#x3C;/hgroup>\n    &#x3C;/header>\n    &#x3C;figure>\n        &#x3C;img src=\\\\\"image.png\\\\\" alt=\\\\\"\\\\\" />\n        &#x3C;figcaption>Caption&#x3C;/figcaption>\n    &#x3C;/figure>\n    &#x3C;footer>\n        &#x3C;p>Some footer&#x3C;/p>\n    &#x3C;/footer>\n&#x3C;/section>&#x3C;figure>&#x3C;/figure></p>\"\n`;\n\nexports[`misc renders block_html5.txt 2`] = `\n\"<section>\n    <header>\n        <hgroup>\n            <h1>Hello :-)</h1>\n        </hgroup>\n    </header>\n    <figure>\n        <img src=\\\\\"image.png\\\\\" alt=\\\\\"\\\\\" />\n        <figcaption>Caption</figcaption>\n    </figure>\n    <footer>\n        <p>Some footer</p>\n    </footer>\n</section><figure></figure>\"\n`;\n\nexports[`misc renders blockquote.txt 1`] = `\n\"<blockquote>\n<p>blockquote with no whitespace before <code>></code>.</p>\n</blockquote>\n<p>foo</p>\n<blockquote>\n<p>blockquote with one space before the <code>></code>.</p>\n</blockquote>\n<p>bar</p>\n<blockquote>\n<p>blockquote with 2 spaces.</p>\n</blockquote>\n<p>baz</p>\n<blockquote>\n<p>this has three spaces so its a paragraph.</p>\n</blockquote>\n<p>blah</p>\n<pre><code>> this one had four so it's a code block.\n</code></pre>\n<blockquote>\n<blockquote>\n<p>this nested blockquote has 0 on level one and 3 (one after the first <code>></code> + 2 more) on level 2.</p>\n</blockquote>\n</blockquote>\n<blockquote>\n<blockquote>\n<p>and this has 4 on level 2 - another code block.</p>\n</blockquote>\n</blockquote>\"\n`;\n\nexports[`misc renders blockquote.txt 2`] = `\n\"\\\\\\\\begin{Quotation}\nblockquote with no whitespace before \\\\\\\\CodeInline{>}.\n\\\\\\\\end{Quotation}\n\n\n\nfoo\n\n\n\n\\\\\\\\begin{Quotation}\nblockquote with one space before the \\\\\\\\CodeInline{>}.\n\\\\\\\\end{Quotation}\n\n\n\nbar\n\n\n\n\\\\\\\\begin{Quotation}\nblockquote with 2 spaces.\n\\\\\\\\end{Quotation}\n\n\n\nbaz\n\n\n\n\\\\\\\\begin{Quotation}\nthis has three spaces so its a paragraph.\n\\\\\\\\end{Quotation}\n\n\n\nblah\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n> this one had four so it's a code block.\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{Quotation}\nthis nested blockquote has 0 on level one and 3 (one after the first \\\\\\\\CodeInline{>} + 2 more) on level 2.\n\\\\\\\\end{Quotation}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{Quotation}\nand this has 4 on level 2 - another code block.\n\\\\\\\\end{Quotation}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`misc renders blockquote-below-paragraph.txt 1`] = `\n\"<p>Paragraph</p>\n<blockquote>\n<p>Block quote\nYep</p>\n</blockquote>\n<p>Paragraph</p>\n<blockquote>\n<p>no space\nNope</p>\n</blockquote>\n<p>Paragraph one</p>\n<blockquote>\n<p>blockquote\nMore blockquote.</p>\n</blockquote>\"\n`;\n\nexports[`misc renders blockquote-below-paragraph.txt 2`] = `\n\"Paragraph\n\n\n\n\\\\\\\\begin{Quotation}\nBlock quote\nYep\n\\\\\\\\end{Quotation}\n\n\n\nParagraph\n\n\n\n\\\\\\\\begin{Quotation}\nno space\nNope\n\\\\\\\\end{Quotation}\n\n\n\nParagraph one\n\n\n\n\\\\\\\\begin{Quotation}\nblockquote\nMore blockquote.\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`misc renders blockquote-hr.txt 1`] = `\n\"<p>This is a paragraph.</p>\n<hr>\n<blockquote>\n<p>Block quote with horizontal lines.</p>\n<hr>\n<blockquote>\n<p>Double block quote.</p>\n<hr>\n<p>End of the double block quote.</p>\n</blockquote>\n</blockquote>\n<blockquote>\n<p>A new paragraph.\nWith multiple lines.\nEven a lazy line.</p>\n<hr>\n<p>The last line.</p>\n</blockquote>\"\n`;\n\nexports[`misc renders bold_links.txt 1`] = `\"<p><strong>bold <a href=\\\\\"http://example.com\\\\\">link</a></strong></p>\"`;\n\nexports[`misc renders bold_links.txt 2`] = `\"\\\\\\\\textbf{bold \\\\\\\\externalLink{link}{http://example.com}}\"`;\n\nexports[`misc renders br.txt 1`] = `\n\"<p>Output:</p>\n<pre><code>&#x3C;p>Some of these words &#x3C;em>are emphasized&#x3C;/em>.\nSome of these words &#x3C;em>are emphasized also&#x3C;/em>.&#x3C;/p>\n\n&#x3C;p>Use two asterisks for &#x3C;strong>strong emphasis&#x3C;/strong>.\nOr, if you prefer, &#x3C;strong>use two underscores instead&#x3C;/strong>.&#x3C;/p>\n</code></pre>\n<p>Unordered (bulleted) lists use asterisks, pluses, and hyphens (<code>*</code>,\n<code>+</code>, and <code>-</code>) as list markers. These three markers are\ninterchangable; this:</p>\"\n`;\n\nexports[`misc renders br.txt 2`] = `\n\"Output:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n<p>Some of these words <em>are emphasized</em>.\nSome of these words <em>are emphasized also</em>.</p>\n\n<p>Use two asterisks for <strong>strong emphasis</strong>.\nOr, if you prefer, <strong>use two underscores instead</strong>.</p>\n\\\\\\\\end{CodeBlock}\n\n\n\nUnordered (bulleted) lists use asterisks, pluses, and hyphens (\\\\\\\\CodeInline{*},\n\\\\\\\\CodeInline{+}, and \\\\\\\\CodeInline{-}) as list markers. These three markers are\ninterchangable; this:\"\n`;\n\nexports[`misc renders bracket_re.txt 1`] = `\n\"<p>[x\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx</p>\"\n`;\n\nexports[`misc renders bracket_re.txt 2`] = `\n\"[x\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\"\n`;\n\nexports[`misc renders brackets-in-img-title.txt 1`] = `\n\"<p><img src=\\\\\"local-img.jpg\\\\\" alt=\\\\\"alt\\\\\" loading=\\\\\"lazy\\\\\">\n<img src=\\\\\"local-img.jpg\\\\\" alt=\\\\\"alt\\\\\" loading=\\\\\"lazy\\\\\">\n<img src=\\\\\"local-img.jpg\\\\\" alt=\\\\\"alt\\\\\" title=\\\\\"normal title\\\\\" loading=\\\\\"lazy\\\\\"></p>\n<p><img src=\\\\\"local-img.jpg\\\\\" alt=\\\\\"alt\\\\\" title=\\\\\"(just title in brackets)\\\\\" loading=\\\\\"lazy\\\\\">\n<img src=\\\\\"local-img.jpg\\\\\" alt=\\\\\"alt\\\\\" title=\\\\\"title with brackets (I think)\\\\\" loading=\\\\\"lazy\\\\\"></p>\n<p><img src=\\\\\"local-img.jpg\\\\\" alt=\\\\\"alt\\\\\" title=\\\\\"(\\\\\" loading=\\\\\"lazy\\\\\">\n<img src=\\\\\"local-img.jpg\\\\\" alt=\\\\\"alt\\\\\" title=\\\\\"(open only\\\\\" loading=\\\\\"lazy\\\\\">\n<img src=\\\\\"local-img.jpg\\\\\" alt=\\\\\"alt\\\\\" title=\\\\\")\\\\\" loading=\\\\\"lazy\\\\\">\n<img src=\\\\\"local-img.jpg\\\\\" alt=\\\\\"alt\\\\\" title=\\\\\"close only)\\\\\" loading=\\\\\"lazy\\\\\"></p>\"\n`;\n\nexports[`misc renders code-first-line.txt 1`] = `\n\"<pre><code>print \\\\\"This is a code block.\\\\\"\n</code></pre>\"\n`;\n\nexports[`misc renders code-first-line.txt 2`] = `\n\"\\\\\\\\begin{CodeBlock}{text}\nprint \\\\\"This is a code block.\\\\\"\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`misc renders comments.txt 1`] = `\n\"<p>X&#x3C;0</p>\n<p>X>0</p>\n<p>&#x3C;!-- A comment --></p>\n<p>&#x3C;div>as if&#x3C;/div></p>\n<p>&#x3C;!-- comment --></p>\n<p><strong>no blank line</strong></p>\"\n`;\n\nexports[`misc renders comments.txt 2`] = `\n\"X<0\n\n\n\nX>0\n\n\n\n<!-- A comment -->\n\n<div>as if</div>\n\n\n\n<!-- comment -->\n\n\\\\\\\\textbf{no blank line}\"\n`;\n\nexports[`misc renders div.txt 1`] = `\n\"<p>&#x3C;div id=\\\\\"sidebar\\\\\"></p>\n<p>   <em>foo</em></p>\n<p>&#x3C;/div></p>\n<p>And now in uppercase:</p>\n<p>&#x3C;DIV>\nfoo\n&#x3C;/DIV></p>\"\n`;\n\nexports[`misc renders div.txt 2`] = `\n\"<div id=\\\\\"sidebar\\\\\">\n\n\\\\\\\\textit{foo}\n\n\n\n</div>\n\nAnd now in uppercase:\n\n\n\n<DIV>\nfoo\n</DIV>\"\n`;\n\nexports[`misc renders em_strong.txt 1`] = `\n\"<p>One asterisk: *</p>\n<p>One underscore: _</p>\n<p>Two asterisks: **</p>\n<p>With spaces: * *</p>\n<p>Two underscores __</p>\n<p>with spaces: _ _</p>\n<p>three asterisks: ***</p>\n<p>with spaces: * * *</p>\n<p>three underscores: ___</p>\n<p>with spaces: _ _ _</p>\n<p>One char: <em>a</em></p>\"\n`;\n\nexports[`misc renders em_strong.txt 2`] = `\n\"One asterisk: *\n\n\n\nOne underscore: \\\\\\\\_\n\n\n\nTwo asterisks: **\n\n\n\nWith spaces: * *\n\n\n\nTwo underscores \\\\\\\\_\\\\\\\\_\n\n\n\nwith spaces: \\\\\\\\_ \\\\\\\\_\n\n\n\nthree asterisks: ***\n\n\n\nwith spaces: * * *\n\n\n\nthree underscores: \\\\\\\\_\\\\\\\\_\\\\\\\\_\n\n\n\nwith spaces: \\\\\\\\_ \\\\\\\\_ \\\\\\\\_\n\n\n\nOne char: \\\\\\\\textit{a}\"\n`;\n\nexports[`misc renders em-around-links.txt 1`] = `\n\"<ul>\n<li><em><a href=\\\\\"https://pythonhosted.org/Markdown/\\\\\">Python in Markdown</a> by some\ngreat folks</em> - This <em>does</em> work as expected.</li>\n<li><em><a href=\\\\\"https://pythonhosted.org/Markdown/\\\\\">Python in Markdown</a> by some\ngreat folks</em> - This <em>does</em> work as expected.</li>\n<li><a href=\\\\\"https://pythonhosted.org/Markdown/\\\\\"><em>Python in Markdown</em></a> by some\ngreat folks - This <em>does</em> work as expected.</li>\n<li><a href=\\\\\"https://pythonhosted.org/Markdown/\\\\\"><em>Python in Markdown</em></a> <em>by some\ngreat folks</em> - This <em>does</em> work as expected.</li>\n</ul>\n<p><em><a href=\\\\\"https://pythonhosted.org/Markdown/\\\\\">Python in Markdown</a> by some\ngreat folks</em> - This <em>does</em> work as expected.</p>\"\n`;\n\nexports[`misc renders em-around-links.txt 2`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textit{\\\\\\\\externalLink{Python in Markdown}{https://pythonhosted.org/Markdown/} by some\ngreat folks} - This \\\\\\\\textit{does} work as expected.\n\\\\\\\\item\\\\\\\\relax \\\\\\\\textit{\\\\\\\\externalLink{Python in Markdown}{https://pythonhosted.org/Markdown/} by some\ngreat folks} - This \\\\\\\\textit{does} work as expected.\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{\\\\\\\\textit{Python in Markdown}}{https://pythonhosted.org/Markdown/} by some\ngreat folks - This \\\\\\\\textit{does} work as expected.\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{\\\\\\\\textit{Python in Markdown}}{https://pythonhosted.org/Markdown/} \\\\\\\\textit{by some\ngreat folks} - This \\\\\\\\textit{does} work as expected.\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\textit{\\\\\\\\externalLink{Python in Markdown}{https://pythonhosted.org/Markdown/} by some\ngreat folks} - This \\\\\\\\textit{does} work as expected.\"\n`;\n\nexports[`misc renders email.txt 1`] = `\n\"<p>asdfasdfadsfasd <a href=\\\\\"mailto:yuri@freewisdom.org\\\\\">yuri@freewisdom.org</a> or you can say\ninstead <a href=\\\\\"mailto:yuri@freewisdom.org\\\\\">yuri@freewisdom.org</a></p>\n<p><a href=\\\\\"mailto:bob&#x26;sue@example.com\\\\\">bob&#x26;sue@example.com</a></p>\"\n`;\n\nexports[`misc renders email.txt 2`] = `\n\"asdfasdfadsfasd \\\\\\\\externalLink{yuri@freewisdom.org}{mailto:yuri@freewisdom.org} or you can say\ninstead \\\\\\\\externalLink{yuri@freewisdom.org}{mailto:yuri@freewisdom.org}\n\n\n\n\\\\\\\\externalLink{bob\\\\\\\\&sue@example.com}{mailto:bob\\\\\\\\&sue@example.com}\"\n`;\n\nexports[`misc renders escaped_chars_in_js.txt 1`] = `\n\"<p>&#x3C;span id=\\\\\"e116142240\\\\\">[javascript protected email address]&#x3C;/span></p>\n<p>&#x3C;script type=\\\\\"text/javascript\\\\\">\n    var a=\\\\\"gqMjyw7lZCaKk6p0J3uAUYS1.dbIW2hXzDHmiVNotOPRe_Ev@c4Gs58+LBr-F9QTfxn\\\\\";\n    var b=a.split(\\\\\"\\\\\").sort().join(\\\\\"\\\\\");\n    var c=\\\\\"F_-F6F_-FMe_\\\\\";\n    var d=\\\\\"\\\\\";\n    for(var e=0;e&#x3C;c.length;e++)\n    d+=b.charAt(a.indexOf(c.charAt(e)));\n        document\n            .getElementById(\\\\\"e116142240\\\\\")\n            .innerHTML=\\\\\"&#x3C;a href=\\\\\\\\\\\\\"mailto:\\\\\"+d+\\\\\"\\\\\\\\\\\\\">\\\\\"+d+\\\\\"&#x3C;/a>\\\\\";\n&#x3C;/script></p>\"\n`;\n\nexports[`misc renders escaped_chars_in_js.txt 2`] = `\n\"<span id=\\\\\"e116142240\\\\\">[javascript protected email address]</span>\n\n\n\n<script type=\\\\\"text/javascript\\\\\">\n    var a=\\\\\"gqMjyw7lZCaKk6p0J3uAUYS1.dbIW2hXzDHmiVNotOPRe_Ev@c4Gs58+LBr-F9QTfxn\\\\\";\n    var b=a.split(\\\\\"\\\\\").sort().join(\\\\\"\\\\\");\n    var c=\\\\\"F_-F6F_-FMe_\\\\\";\n    var d=\\\\\"\\\\\";\n    for(var e=0;e<c.length;e++)\n    d+=b.charAt(a.indexOf(c.charAt(e)));\n        document\n            .getElementById(\\\\\"e116142240\\\\\")\n            .innerHTML=\\\\\"<a href=\\\\\\\\\\\\\"mailto:\\\\\"+d+\\\\\"\\\\\\\\\\\\\">\\\\\"+d+\\\\\"</a>\\\\\";\n</script>\"\n`;\n\nexports[`misc renders h1.txt 1`] = `\n\"<h2 id=\\\\\"header\\\\\">Header<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#header\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h2>\n<h1 id=\\\\\"header-2\\\\\">Header 2<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#header-2\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\n<h3 id=\\\\\"h3\\\\\">H3<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#h3\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h3>\n<h1 id=\\\\\"h1\\\\\">H1<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#h1\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\n<h2 id=\\\\\"h2\\\\\">H2<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#h2\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h2>\"\n`;\n\nexports[`misc renders h1.txt 2`] = `\n\"\\\\\\\\levelTwoTitle{Header}\n\n\n\\\\\\\\levelOneTitle{Header 2}\n\n\n\\\\\\\\levelThreeTitle{H3}\n\n\n\\\\\\\\levelOneTitle{H1}\n\n\n\\\\\\\\levelTwoTitle{H2}\"\n`;\n\nexports[`misc renders image.txt 1`] = `\n\"<figure><img src=\\\\\"http://humane_man.jpg\\\\\" alt=\\\\\"Poster\\\\\" title=\\\\\"The most humane man.\\\\\" loading=\\\\\"lazy\\\\\"><figcaption>Poster</figcaption></figure>\n<p><img src=\\\\\"http://humane_man.jpg\\\\\" alt=\\\\\"Poster\\\\\" title=\\\\\"The most humane man.\\\\\" loading=\\\\\"lazy\\\\\"></p>\n<figure><img src=\\\\\"\\\\\" alt=\\\\\"Blank\\\\\"><figcaption>Blank</figcaption></figure>\"\n`;\n\nexports[`misc renders image.txt 2`] = `\n\"\\\\\\\\image{http://humane_man.jpg}[Poster]\n\n\n\\\\\\\\image{http://humane_man.jpg}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{poster}\\\\\\\\externalLink{http://humane\\\\\\\\_man.jpg}{http://humane\\\\\\\\_man.jpg}}\n\n\\\\\\\\image{}[Blank]\"\n`;\n\nexports[`misc renders image_in_links.txt 1`] = `\"<p><a href=\\\\\"path/to/image.png\\\\\"><img src=\\\\\"path/to/img_thumb.png\\\\\" alt=\\\\\"altname\\\\\" loading=\\\\\"lazy\\\\\"></a></p>\"`;\n\nexports[`misc renders image_in_links.txt 2`] = `\"\\\\\\\\externalLink{\\\\\\\\image{path/to/img_thumb.png}}{path/to/image.png}\"`;\n\nexports[`misc renders image-2.txt 1`] = `\n\"<p><a href=\\\\\"http://src.com/\\\\\"><em>link!</em></a></p>\n<p><em><a href=\\\\\"http://www.freewisdom.org\\\\\">link</a></em></p>\"\n`;\n\nexports[`misc renders image-2.txt 2`] = `\n\"\\\\\\\\externalLink{\\\\\\\\textit{link!}}{http://src.com/}\n\n\n\n\\\\\\\\textit{\\\\\\\\externalLink{link}{http://www.freewisdom.org}}\"\n`;\n\nexports[`misc renders ins-at-start-of-paragraph.txt 1`] = `\"<p>&#x3C;ins>Hello, fellow developer&#x3C;/ins> this ins should be wrapped in a p.</p>\"`;\n\nexports[`misc renders ins-at-start-of-paragraph.txt 2`] = `\"<ins>Hello, fellow developer</ins> this ins should be wrapped in a p.\"`;\n\nexports[`misc renders inside_html.txt 1`] = `\"<p>&#x3C;a href=\\\\\"stuff\\\\\"> <strong>ok</strong>? &#x3C;/a></p>\"`;\n\nexports[`misc renders inside_html.txt 2`] = `\"<a href=\\\\\"stuff\\\\\"> \\\\\\\\textbf{ok}? </a>\"`;\n\nexports[`misc renders lazy-block-quote.txt 1`] = `\n\"<blockquote>\n<p>Line one of lazy block quote.\nLine two of lazy block quote.</p>\n</blockquote>\n<blockquote>\n<p>Line one of paragraph two.\nLine two of paragraph two.</p>\n</blockquote>\"\n`;\n\nexports[`misc renders lazy-block-quote.txt 2`] = `\n\"\\\\\\\\begin{Quotation}\nLine one of lazy block quote.\nLine two of lazy block quote.\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nLine one of paragraph two.\nLine two of paragraph two.\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`misc renders link-with-parenthesis.txt 1`] = `\"<p><a href=\\\\\"http://en.wikipedia.org/wiki/ZIP_(file_format)\\\\\" title=\\\\\"ZIP (file format) - Wikipedia, the free encyclopedia\\\\\">ZIP archives</a></p>\"`;\n\nexports[`misc renders link-with-parenthesis.txt 2`] = `\"\\\\\\\\externalLink{ZIP archives}{http://en.wikipedia.org/wiki/ZIP\\\\\\\\_(file\\\\\\\\_format)}\"`;\n\nexports[`misc renders lists.txt 1`] = `\n\"<ul>\n<li>A multi-paragraph list,\nunindented.</li>\n</ul>\n<p>Simple tight list</p>\n<ul>\n<li>Uno</li>\n<li>Due</li>\n<li>Tri</li>\n</ul>\n<p>A singleton tight list:</p>\n<ul>\n<li>Uno</li>\n</ul>\n<p>A lose list:</p>\n<ul>\n<li>\n<p>One</p>\n</li>\n<li>\n<p>Two</p>\n</li>\n<li>\n<p>Three</p>\n</li>\n</ul>\n<p>A lose list with paragraphs</p>\n<ul>\n<li>\n<p>One one one one</p>\n<p>  one one one one</p>\n</li>\n<li>\n<p>Two two two two</p>\n</li>\n</ul>\"\n`;\n\nexports[`misc renders lists.txt 2`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax A multi-paragraph list,\nunindented.\n\\\\\\\\end{itemize}\n\n\nSimple tight list\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Uno\n\\\\\\\\item\\\\\\\\relax Due\n\\\\\\\\item\\\\\\\\relax Tri\n\\\\\\\\end{itemize}\n\n\nA singleton tight list:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Uno\n\\\\\\\\end{itemize}\n\n\nA lose list:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax One\n\\\\\\\\item\\\\\\\\relax Two\n\\\\\\\\item\\\\\\\\relax Three\n\\\\\\\\end{itemize}\n\n\nA lose list with paragraphs\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax One one one one\n\none one one one\n\\\\\\\\item\\\\\\\\relax Two two two two\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`misc renders lists2.txt 1`] = `\n\"<ul>\n<li>blah blah blah\nsdf asdf asdf asdf asdf\nasda asdf asdfasd</li>\n</ul>\"\n`;\n\nexports[`misc renders lists2.txt 2`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax blah blah blah\nsdf asdf asdf asdf asdf\nasda asdf asdfasd\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`misc renders lists3.txt 1`] = `\n\"<ul>\n<li>blah blah blah\nsdf asdf asdf asdf asdf\nasda asdf asdfasd</li>\n</ul>\"\n`;\n\nexports[`misc renders lists3.txt 2`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax blah blah blah\nsdf asdf asdf asdf asdf\nasda asdf asdfasd\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`misc renders lists4.txt 1`] = `\n\"<ul>\n<li>item1</li>\n<li>item2\n<ol>\n<li>Number 1</li>\n<li>Number 2</li>\n</ol>\n</li>\n</ul>\"\n`;\n\nexports[`misc renders lists4.txt 2`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax item1\n\\\\\\\\item\\\\\\\\relax item2\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax Number 1\n\\\\\\\\item\\\\\\\\relax Number 2\n\\\\\\\\end{enumerate}\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`misc renders lists5.txt 1`] = `\n\"<blockquote>\n<p>This is a test of a block quote\nWith just two lines</p>\n</blockquote>\n<p>A paragraph</p>\n<blockquote>\n<p>This is a more difficult case\nWith a list item inside the quote</p>\n<ul>\n<li>Alpha</li>\n<li>Beta\nEtc.</li>\n</ul>\n</blockquote>\"\n`;\n\nexports[`misc renders lists5.txt 2`] = `\n\"\\\\\\\\begin{Quotation}\nThis is a test of a block quote\nWith just two lines\n\\\\\\\\end{Quotation}\n\n\n\nA paragraph\n\n\n\n\\\\\\\\begin{Quotation}\nThis is a more difficult case\nWith a list item inside the quote\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Alpha\n\\\\\\\\item\\\\\\\\relax Beta\nEtc.\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`misc renders lists6.txt 1`] = `\n\"<p>Test five or more spaces as start of list:</p>\n<ul>\n<li>\n<pre><code>five spaces\n</code></pre>\n</li>\n</ul>\n<p>not first item:</p>\n<ul>\n<li>one space</li>\n<li>\n<pre><code>five spaces\n</code></pre>\n</li>\n</ul>\n<p>loose list:</p>\n<ul>\n<li>\n<p>one space</p>\n</li>\n<li>\n<pre><code>five spaces\n</code></pre>\n</li>\n</ul>\"\n`;\n\nexports[`misc renders lists8.txt 1`] = `\n\"<ol>\n<li>\n<blockquote>\n<p>Four-score and seven years ago...</p>\n</blockquote>\n</li>\n<li>\n<blockquote>\n<p>We have nothing to fear...</p>\n</blockquote>\n</li>\n<li>\n<blockquote>\n<p>This is it...</p>\n</blockquote>\n</li>\n</ol>\n<hr>\n<ul>\n<li>\n<blockquote>\n<p>Four-score and sever years ago\nour fathers brought forth</p>\n</blockquote>\n</li>\n<li>\n<blockquote>\n<p>We have nothing to fear\nbut fear itself</p>\n</blockquote>\n</li>\n<li>\n<blockquote>\n<p>This is it\nas far as I'm concerned</p>\n</blockquote>\n</li>\n</ul>\"\n`;\n\nexports[`misc renders lists8.txt 2`] = `\n\"\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{Quotation}\nFour-score and seven years ago...\n\\\\\\\\end{Quotation}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{Quotation}\nWe have nothing to fear...\n\\\\\\\\end{Quotation}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{Quotation}\nThis is it...\n\\\\\\\\end{Quotation}\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{Quotation}\nFour-score and sever years ago\nour fathers brought forth\n\\\\\\\\end{Quotation}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{Quotation}\nWe have nothing to fear\nbut fear itself\n\\\\\\\\end{Quotation}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\begin{Quotation}\nThis is it\nas far as I'm concerned\n\\\\\\\\end{Quotation}\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`misc renders mismatched-tags.txt 1`] = `\n\"<p>&#x3C;p>Some text&#x3C;/p>&#x3C;div>some more text&#x3C;/div></p>\n<p>and a bit more</p>\n<p>&#x3C;p>And this output&#x3C;/p> <em>Compatible with PHP Markdown Extra 1.2.2 and Markdown.pl1.0.2b8:</em></p>\n<p>&#x3C;!-- comment -->&#x3C;p>&#x3C;div>text&#x3C;/div>&#x3C;br />&#x3C;/p>&#x3C;br /></p>\n<p>Should be in p</p>\"\n`;\n\nexports[`misc renders mismatched-tags.txt 2`] = `\n\"<p>Some text</p><div>some more text</div>\n\n\n\nand a bit more\n\n\n\n<p>And this output</p> \\\\\\\\textit{Compatible with PHP Markdown Extra 1.2.2 and Markdown.pl1.0.2b8:}\n\n\n\n<!-- comment --><p><div>text</div><br /></p><br />\n\nShould be in p\"\n`;\n\nexports[`misc renders missing-link-def.txt 1`] = `\"<p>This is a [missing link][empty] and a <a href=\\\\\"http://example.com\\\\\">valid</a> and [missing][again].</p>\"`;\n\nexports[`misc renders multi-line-tags.txt 1`] = `\n\"<p>&#x3C;div></p>\n<p>asdf asdfasd</p>\n<p>&#x3C;/div></p>\n<p>&#x3C;div></p>\n<p>foo bar</p>\n<p>&#x3C;/div>\nNo blank line.</p>\"\n`;\n\nexports[`misc renders multi-line-tags.txt 2`] = `\n\"<div>\n\nasdf asdfasd\n\n\n\n</div>\n\n<div>\n\nfoo bar\n\n\n\n</div>\nNo blank line.\"\n`;\n\nexports[`misc renders multi-paragraph-block-quote.txt 1`] = `\n\"<blockquote>\n<p>This is line one of paragraph one\nThis is line two of paragraph one</p>\n</blockquote>\n<blockquote>\n<p>This is line one of paragraph two</p>\n</blockquote>\n<blockquote>\n<p>This is another blockquote.</p>\n</blockquote>\"\n`;\n\nexports[`misc renders multi-paragraph-block-quote.txt 2`] = `\n\"\\\\\\\\begin{Quotation}\nThis is line one of paragraph one\nThis is line two of paragraph one\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nThis is line one of paragraph two\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Quotation}\nThis is another blockquote.\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`misc renders nested-lists.txt 1`] = `\n\"<ul>\n<li>\n<p>item 1</p>\n<p>  paragraph 2</p>\n</li>\n<li>\n<p>item 2</p>\n<ul>\n<li>\n<p>item 2-1</p>\n</li>\n<li>\n<p>item 2-2</p>\n<ul>\n<li>item 2-2-1</li>\n</ul>\n</li>\n<li>\n<p>item 2-3</p>\n<ul>\n<li>item 2-3-1</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p>item 3</p>\n</li>\n</ul>\n<p>plain text</p>\n<ul>\n<li>\n<p>item 1</p>\n<ul>\n<li>item 1-1</li>\n<li>item 1-2\n<ul>\n<li>item 1-2-1</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>\n<p>item 2</p>\n</li>\n<li>\n<p>item 3</p>\n</li>\n<li>\n<p>item 4</p>\n<ul>\n<li>\n<p>item 4-1</p>\n</li>\n<li>\n<p>item 4-2</p>\n</li>\n<li>\n<p>item 4-3</p>\n<pre><code>Code under item 4-3\n</code></pre>\n<p>Paragraph under item 4</p>\n</li>\n</ul>\n</li>\n</ul>\"\n`;\n\nexports[`misc renders nested-patterns.txt 1`] = `\n\"<p><strong><em><a href=\\\\\"http://example.com\\\\\">link</a></em></strong>\n<strong><em><a href=\\\\\"http://example.com\\\\\">link</a></em></strong>\n<strong><a href=\\\\\"http://example.com\\\\\"><em>link</em></a></strong>\n<strong><a href=\\\\\"http://example.com\\\\\"><em>link</em></a></strong>\n<strong><a href=\\\\\"http://example.com\\\\\"><em>link</em></a></strong>\n<strong><a href=\\\\\"http://example.com\\\\\"><em>link</em></a></strong>\n<a href=\\\\\"http://example.com\\\\\"><strong><em>link</em></strong></a></p>\n<p><strong><em>I am <strong><em>italic</em> and</strong> bold</em> I am <code>just</code> bold</strong></p>\n<p>Example <strong><em>bold italic</em></strong> on the same line <strong><em>bold italic</em></strong>.</p>\n<p>Example <strong><em>bold italic</em></strong> on the same line <strong><em>bold italic</em></strong>.</p>\"\n`;\n\nexports[`misc renders nested-patterns.txt 2`] = `\n\"\\\\\\\\textbf{\\\\\\\\textit{\\\\\\\\externalLink{link}{http://example.com}}}\n\\\\\\\\textbf{\\\\\\\\textit{\\\\\\\\externalLink{link}{http://example.com}}}\n\\\\\\\\textbf{\\\\\\\\externalLink{\\\\\\\\textit{link}}{http://example.com}}\n\\\\\\\\textbf{\\\\\\\\externalLink{\\\\\\\\textit{link}}{http://example.com}}\n\\\\\\\\textbf{\\\\\\\\externalLink{\\\\\\\\textit{link}}{http://example.com}}\n\\\\\\\\textbf{\\\\\\\\externalLink{\\\\\\\\textit{link}}{http://example.com}}\n\\\\\\\\externalLink{\\\\\\\\textbf{\\\\\\\\textit{link}}}{http://example.com}\n\n\n\n\\\\\\\\textbf{\\\\\\\\textit{I am \\\\\\\\textbf{\\\\\\\\textit{italic} and} bold} I am \\\\\\\\CodeInline{just} bold}\n\n\n\nExample \\\\\\\\textbf{\\\\\\\\textit{bold italic}} on the same line \\\\\\\\textbf{\\\\\\\\textit{bold italic}}.\n\n\n\nExample \\\\\\\\textbf{\\\\\\\\textit{bold italic}} on the same line \\\\\\\\textbf{\\\\\\\\textit{bold italic}}.\"\n`;\n\nexports[`misc renders normalize.txt 1`] = `\"<p><a href=\\\\\"http://www.stuff.com/q?x=1&#x26;y=2%3C%3E\\\\\">Link</a></p>\"`;\n\nexports[`misc renders normalize.txt 2`] = `\"\\\\\\\\externalLink{Link}{http://www.stuff.com/q?x=1\\\\\\\\&y=2<>}\"`;\n\nexports[`misc renders numeric-entity.txt 1`] = `\n\"<p><a href=\\\\\"mailto:user@gmail.com\\\\\">user@gmail.com</a></p>\n<p>This is an entity: &#x26;#234; </p>\"\n`;\n\nexports[`misc renders numeric-entity.txt 2`] = `\n\"\\\\\\\\externalLink{user@gmail.com}{mailto:user@gmail.com}\n\n\n\nThis is an entity: \\\\\\\\&\\\\\\\\#234;\"\n`;\n\nexports[`misc renders para-with-hr.txt 1`] = `\n\"<p>Here is a paragraph, followed by a horizontal rule.</p>\n<hr>\n<p>Followed by another paragraph.</p>\n<p>Here is another paragraph, followed by:\n*** not an HR.\nFollowed by more of the same paragraph.</p>\"\n`;\n\nexports[`misc renders para-with-hr.txt 2`] = `\n\"Here is a paragraph, followed by a horizontal rule.\n\n\n\n\\\\\\\\horizontalLine\n\n\n\nFollowed by another paragraph.\n\n\n\nHere is another paragraph, followed by:\n*** not an HR.\nFollowed by more of the same paragraph.\"\n`;\n\nexports[`misc renders php.txt 1`] = `\n\"<p>&#x3C;!DOCTYPE HTML PUBLIC \\\\\"-//W3C//DTD HTML 4.01//EN\\\\\"\n            \\\\\"http://www.w3.org/TR/html4/strict.dtd\\\\\"></p>\n<p>&#x3C;b>This should have a p tag&#x3C;/b></p>\n<p>&#x3C;!--This is a comment --></p>\n<p>&#x3C;div>This shouldn't&#x3C;/div></p>\n<p>&#x3C;?php echo \\\\\"block_level\\\\\";?></p>\n<p> &#x3C;?php echo \\\\\"not_block_level\\\\\";?></p>\"\n`;\n\nexports[`misc renders php.txt 2`] = `\n\"<!DOCTYPE HTML PUBLIC \\\\\"-//W3C//DTD HTML 4.01//EN\\\\\"\n            \\\\\"http://www.w3.org/TR/html4/strict.dtd\\\\\">\n\n<b>This should have a p tag</b>\n\n\n\n<!--This is a comment -->\n\n<div>This shouldn't</div>\n\n\n\n<?php echo \\\\\"block_level\\\\\";?>\n\n <?php echo \\\\\"not_block_level\\\\\";?>\"\n`;\n\nexports[`misc renders smart_em.txt 1`] = `\n\"<p><em>emphasis</em></p>\n<p>this_is_not_emphasis</p>\n<p>[<em>punctuation with emphasis</em>]</p>\n<p>[<em>punctuation_with_emphasis</em>]</p>\n<p>[punctuation_without_emphasis]</p>\"\n`;\n\nexports[`misc renders smart_em.txt 2`] = `\n\"\\\\\\\\textit{emphasis}\n\n\n\nthis\\\\\\\\_is\\\\\\\\_not\\\\\\\\_emphasis\n\n\n\n[\\\\\\\\textit{punctuation with emphasis}]\n\n\n\n[\\\\\\\\textit{punctuation\\\\\\\\_with\\\\\\\\_emphasis}]\n\n\n\n[punctuation\\\\\\\\_without\\\\\\\\_emphasis]\"\n`;\n\nexports[`misc renders span.txt 1`] = `\n\"<p>&#x3C;span id=\\\\\"someId\\\\\"> Foo <em>bar</em> Baz &#x3C;/span></p>\n<p>&#x3C;div>&#x3C;b><em>foo</em>&#x3C;/b>&#x3C;/div></p>\n<p>&#x3C;div id=\\\\\"someId\\\\\"> Foo <em>bar</em> Baz &#x3C;/div></p>\n<p>&#x3C;baza id=\\\\\"someId\\\\\"> Foo <em>bar</em> Baz &#x3C;/baza></p>\"\n`;\n\nexports[`misc renders span.txt 2`] = `\n\"<span id=\\\\\"someId\\\\\"> Foo \\\\\\\\textit{bar} Baz </span>\n\n\n\n<div><b>\\\\\\\\textit{foo}</b></div>\n\n\n\n<div id=\\\\\"someId\\\\\"> Foo \\\\\\\\textit{bar} Baz </div>\n\n\n\n<baza id=\\\\\"someId\\\\\"> Foo \\\\\\\\textit{bar} Baz </baza>\"\n`;\n\nexports[`misc renders strong-with-underscores.txt 1`] = `\"<p><strong>this_is_strong</strong></p>\"`;\n\nexports[`misc renders strong-with-underscores.txt 2`] = `\"\\\\\\\\textbf{this\\\\\\\\_is\\\\\\\\_strong}\"`;\n\nexports[`misc renders strongintags.txt 1`] = `\n\"<p>this is a <a href=\\\\\"http://example.com/\\\\\"><strong>test</strong></a></p>\n<p>this is a second <strong><a href=\\\\\"http://example.com\\\\\">test</a></strong></p>\n<p>reference <strong>[test][]</strong>\nreference [<strong>test</strong>][]</p>\"\n`;\n\nexports[`misc renders underscores.txt 1`] = `\n\"<p>THIS_SHOULD_STAY_AS_IS</p>\n<p>Here is some <em>emphasis</em>, ok?</p>\n<p>Ok, at least <em>this</em> should work.</p>\n<p>THIS<strong>SHOULD</strong>STAY</p>\n<p>Here is some <strong>strong</strong> stuff.</p>\n<p>THIS<strong><em>SHOULD</em></strong>STAY?</p>\"\n`;\n\nexports[`misc renders underscores.txt 2`] = `\n\"THIS\\\\\\\\_SHOULD\\\\\\\\_STAY\\\\\\\\_AS\\\\\\\\_IS\n\n\n\nHere is some \\\\\\\\textit{emphasis}, ok?\n\n\n\nOk, at least \\\\\\\\textit{this} should work.\n\n\n\nTHIS\\\\\\\\textbf{SHOULD}STAY\n\n\n\nHere is some \\\\\\\\textbf{strong} stuff.\n\n\n\nTHIS\\\\\\\\textbf{\\\\\\\\textit{SHOULD}}STAY?\"\n`;\n\nexports[`options renders no-attributes.txt 1`] = `\n\"<p>Regression <em>test</em> for issue 87</p>\n<p>It's run with enable_attributes=False so this {@id=explanation} should not become an attribute</p>\"\n`;\n\nexports[`options renders no-attributes.txt 2`] = `\n\"Regression \\\\\\\\textit{test} for issue 87\n\n\n\nIt's run with enable\\\\\\\\_attributes=False so this \\\\\\\\{@id=explanation\\\\\\\\} should not become an attribute\"\n`;\n\nexports[`php renders Code Spans.txt 1`] = `\n\"<p>From <code>&#x3C;!--</code> to <code>--></code>\non two lines.</p>\n<p>From <code>&#x3C;!--</code>\nto <code>--></code>\non three lines.</p>\"\n`;\n\nexports[`php renders Code Spans.txt 2`] = `\n\"From \\\\\\\\CodeInline{<!--} to \\\\\\\\CodeInline{-->}\non two lines.\n\n\n\nFrom \\\\\\\\CodeInline{<!--}\nto \\\\\\\\CodeInline{-->}\non three lines.\"\n`;\n\nexports[`php renders Code block on second line.txt 1`] = `\n\"<pre><code>Codeblock on second line\n</code></pre>\"\n`;\n\nexports[`php renders Code block on second line.txt 2`] = `\n\"\\\\\\\\begin{CodeBlock}{text}\nCodeblock on second line\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`php renders Horizontal Rules.txt 1`] = `\n\"<p>Horizontal rules:</p>\n<hr>\n<hr>\n<hr>\n<hr>\n<hr>\n<p>Not horizontal rules (testing for a bug in 1.0.1j):</p>\n<p>+++</p>\n<p>,,,</p>\n<p>===</p>\n<p>???</p>\n<p>AAA</p>\n<p>jjj</p>\n<p>j j j</p>\n<p>n n n</p>\"\n`;\n\nexports[`php renders Horizontal Rules.txt 2`] = `\n\"Horizontal rules:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\nNot horizontal rules (testing for a bug in 1.0.1j):\n\n\n\n+++\n\n\n\n,,,\n\n\n\n===\n\n\n\n???\n\n\n\nAAA\n\n\n\njjj\n\n\n\nj j j\n\n\n\nn n n\"\n`;\n\nexports[`php renders Inline HTML comments.txt 1`] = `\n\"<p>Paragraph one.</p>\n<p>&#x3C;!-- double--dash (invalid SGML comment) --></p>\n<p>Paragraph two.</p>\n<p>&#x3C;!-- enclosed tag &#x3C;/div> --></p>\n<p>The end.</p>\"\n`;\n\nexports[`php renders Inline HTML comments.txt 2`] = `\n\"Paragraph one.\n\n\n\n<!-- double--dash (invalid SGML comment) -->\n\nParagraph two.\n\n\n\n<!-- enclosed tag </div> -->\n\nThe end.\"\n`;\n\nexports[`php renders MD5 Hashes.txt 1`] = `\n\"<p>The MD5 value for <code>+</code> is \\\\\"26b17225b626fb9238849fd60eabdf60\\\\\".</p>\n<p>&#x3C;p>test&#x3C;/p></p>\n<p>The MD5 value for <code>&#x3C;p>test&#x3C;/p></code> is:</p>\n<p>6205333b793f34273d75379350b36826</p>\"\n`;\n\nexports[`php renders MD5 Hashes.txt 2`] = `\n\"The MD5 value for \\\\\\\\CodeInline{+} is \\\\\"26b17225b626fb9238849fd60eabdf60\\\\\".\n\n\n\n<p>test</p>\n\n\n\nThe MD5 value for \\\\\\\\CodeInline{<p>test</p>} is:\n\n\n\n6205333b793f34273d75379350b36826\"\n`;\n\nexports[`pl renders Amps and angle encoding.txt 1`] = `\n\"<p>AT&#x26;T has an ampersand in their name.</p>\n<p>AT&#x26;amp;T is another way to write it.</p>\n<p>This &#x26; that.</p>\n<p>4 &#x3C; 5.</p>\n<p>6 > 5.</p>\n<p>Here's a <a href=\\\\\"http://example.com/?foo=1&#x26;bar=2\\\\\">link</a> with an ampersand in the URL.</p>\n<p>Here's a link with an amersand in the link text: <a href=\\\\\"http://att.com/\\\\\" title=\\\\\"AT&#x26;T\\\\\">AT&#x26;T</a>.</p>\n<p>Here's an inline <a href=\\\\\"/script?foo=1&#x26;bar=2\\\\\">link</a>.</p>\n<p>Here's an inline <a href=\\\\\"/script?foo=1&#x26;bar=2\\\\\">link</a>.</p>\"\n`;\n\nexports[`pl renders Amps and angle encoding.txt 2`] = `\n\"AT\\\\\\\\&T has an ampersand in their name.\n\n\n\nAT\\\\\\\\&amp;T is another way to write it.\n\n\n\nThis \\\\\\\\& that.\n\n\n\n4 < 5.\n\n\n\n6 > 5.\n\n\n\nHere's a \\\\\\\\hyperref[1]{link} with an ampersand in the URL.\n\n\n\nHere's a link with an amersand in the link text: \\\\\\\\hyperref[2]{AT\\\\\\\\&T}.\n\n\n\nHere's an inline \\\\\\\\externalLink{link}{http://zestedesavoir.com/script?foo=1\\\\\\\\&bar=2}.\n\n\n\nHere's an inline \\\\\\\\externalLink{link}{http://zestedesavoir.com/script?foo=1\\\\\\\\&bar=2}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{1}\\\\\\\\externalLink{http://example.com/?foo=1\\\\\\\\&bar=2}{http://example.com/?foo=1\\\\\\\\&bar=2}}\n\n\\\\\\\\footnote{\\\\\\\\label{2}\\\\\\\\externalLink{http://att.com/}{http://att.com/}}\"\n`;\n\nexports[`pl renders Auto links.txt 1`] = `\n\"<p>Link: <a href=\\\\\"http://example.com/\\\\\">http://example.com/</a>.</p>\n<p>With an ampersand: <a href=\\\\\"http://example.com/?foo=1&#x26;bar=2\\\\\">http://example.com/?foo=1&#x26;bar=2</a></p>\n<ul>\n<li>In a list?</li>\n<li><a href=\\\\\"http://example.com/\\\\\">http://example.com/</a></li>\n<li>It should.</li>\n</ul>\n<blockquote>\n<p>Blockquoted: <a href=\\\\\"http://example.com/\\\\\">http://example.com/</a></p>\n</blockquote>\n<p>Auto-links should not occur here: <code>&#x3C;http://example.com/></code></p>\n<pre><code>or here: &#x3C;http://example.com/>\n</code></pre>\"\n`;\n\nexports[`pl renders Auto links.txt 2`] = `\n\"Link: \\\\\\\\externalLink{http://example.com/}{http://example.com/}.\n\n\n\nWith an ampersand: \\\\\\\\externalLink{http://example.com/?foo=1\\\\\\\\&bar=2}{http://example.com/?foo=1\\\\\\\\&bar=2}\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax In a list?\n\\\\\\\\item\\\\\\\\relax \\\\\\\\externalLink{http://example.com/}{http://example.com/}\n\\\\\\\\item\\\\\\\\relax It should.\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\begin{Quotation}\nBlockquoted: \\\\\\\\externalLink{http://example.com/}{http://example.com/}\n\\\\\\\\end{Quotation}\n\n\n\nAuto-links should not occur here: \\\\\\\\CodeInline{<http://example.com/>}\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nor here: <http://example.com/>\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`pl renders Blockquotes with code blocks.txt 1`] = `\n\"<blockquote>\n<p>Example:</p>\n<pre><code>sub status {\n    print \\\\\"working\\\\\";\n}\n</code></pre>\n<p>Or:</p>\n<pre><code>sub status {\n    return \\\\\"working\\\\\";\n}\n</code></pre>\n</blockquote>\"\n`;\n\nexports[`pl renders Blockquotes with code blocks.txt 2`] = `\n\"\\\\\\\\begin{Quotation}\nExample:\n\n\\\\\\\\begin{CodeBlock}{text}\nsub status {\n    print \\\\\"working\\\\\";\n}\n\\\\\\\\end{CodeBlock}\n\nOr:\n\n\\\\\\\\begin{CodeBlock}{text}\nsub status {\n    return \\\\\"working\\\\\";\n}\n\\\\\\\\end{CodeBlock}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`pl renders Horizontal rules.txt 1`] = `\n\"<p>Dashes:</p>\n<hr>\n<hr>\n<hr>\n<hr>\n<pre><code>---\n</code></pre>\n<hr>\n<hr>\n<hr>\n<hr>\n<pre><code>- - -\n</code></pre>\n<p>Asterisks:</p>\n<hr>\n<hr>\n<hr>\n<hr>\n<pre><code>***\n</code></pre>\n<hr>\n<hr>\n<hr>\n<hr>\n<pre><code>* * *\n</code></pre>\n<p>Underscores:</p>\n<hr>\n<hr>\n<hr>\n<hr>\n<pre><code>___\n</code></pre>\n<hr>\n<hr>\n<hr>\n<hr>\n<pre><code>_ _ _\n</code></pre>\"\n`;\n\nexports[`pl renders Horizontal rules.txt 2`] = `\n\"Dashes:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n---\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n- - -\n\\\\\\\\end{CodeBlock}\n\n\n\nAsterisks:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n***\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n* * *\n\\\\\\\\end{CodeBlock}\n\n\n\nUnderscores:\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n___\n\\\\\\\\end{CodeBlock}\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\horizontalLine\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n_ _ _\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`pl renders Inline HTML comments.txt 1`] = `\n\"<p>Paragraph one.</p>\n<p>&#x3C;!-- This is a simple comment --></p>\n<p>&#x3C;!--\n\tThis is another comment.\n--></p>\n<p>Paragraph two.</p>\n<p>&#x3C;!-- one comment block -- -- with two comments --></p>\n<p>The end.</p>\"\n`;\n\nexports[`pl renders Inline HTML comments.txt 2`] = `\n\"Paragraph one.\n\n\n\n<!-- This is a simple comment -->\n\n<!--\n\tThis is another comment.\n-->\n\nParagraph two.\n\n\n\n<!-- one comment block -- -- with two comments -->\n\nThe end.\"\n`;\n\nexports[`pl renders Links, shortcut references.txt 1`] = `\n\"<p>This is the <a href=\\\\\"/simple\\\\\">simple case</a>.</p>\n<p>This one has a <a href=\\\\\"/foo\\\\\">line\nbreak</a>.</p>\n<p>This one has a <a href=\\\\\"/foo\\\\\">line\nbreak</a> with a line-ending space.</p>\n<p><a href=\\\\\"/that\\\\\">this</a> and the <a href=\\\\\"/other\\\\\">other</a></p>\"\n`;\n\nexports[`pl renders Links, shortcut references.txt 2`] = `\n\"This is the \\\\\\\\hyperref[simple case]{simple case}.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{simple case}\\\\\\\\externalLink{/simple}{http://zestedesavoir.com/simple}}\n\nThis one has a \\\\\\\\hyperref[line break]{line\nbreak}.\n\n\n\nThis one has a \\\\\\\\hyperref[line break]{line\nbreak} with a line-ending space.\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{line break}\\\\\\\\externalLink{/foo}{http://zestedesavoir.com/foo}}\n\n\\\\\\\\hyperref[that]{this} and the \\\\\\\\hyperref[other]{other}\n\n\n\n\\\\\\\\footnote{\\\\\\\\label{this}\\\\\\\\externalLink{/this}{http://zestedesavoir.com/this}}\n\n\\\\\\\\footnote{\\\\\\\\label{that}\\\\\\\\externalLink{/that}{http://zestedesavoir.com/that}}\n\n\\\\\\\\footnote{\\\\\\\\label{other}\\\\\\\\externalLink{/other}{http://zestedesavoir.com/other}}\"\n`;\n\nexports[`pl renders Nested blockquotes.txt 1`] = `\n\"<blockquote>\n<p>foo</p>\n<blockquote>\n<p>bar</p>\n</blockquote>\n<p>foo</p>\n</blockquote>\"\n`;\n\nexports[`pl renders Nested blockquotes.txt 2`] = `\n\"\\\\\\\\begin{Quotation}\nfoo\n\n\\\\\\\\begin{Quotation}\nbar\n\\\\\\\\end{Quotation}\n\nfoo\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`pl renders Ordered and unordered lists.txt 1`] = `\n\"<p>Asterisks tight:</p>\n<ul>\n<li>asterisk 1</li>\n<li>asterisk 2</li>\n<li>asterisk 3</li>\n</ul>\n<p>Asterisks loose:</p>\n<ul>\n<li>\n<p>asterisk 1</p>\n</li>\n<li>\n<p>asterisk 2</p>\n</li>\n<li>\n<p>asterisk 3</p>\n</li>\n</ul>\n<hr>\n<p>Pluses tight:</p>\n<ul>\n<li>Plus 1</li>\n<li>Plus 2</li>\n<li>Plus 3</li>\n</ul>\n<p>Pluses loose:</p>\n<ul>\n<li>\n<p>Plus 1</p>\n</li>\n<li>\n<p>Plus 2</p>\n</li>\n<li>\n<p>Plus 3</p>\n</li>\n</ul>\n<hr>\n<p>Minuses tight:</p>\n<ul>\n<li>Minus 1</li>\n<li>Minus 2</li>\n<li>Minus 3</li>\n</ul>\n<p>Minuses loose:</p>\n<ul>\n<li>\n<p>Minus 1</p>\n</li>\n<li>\n<p>Minus 2</p>\n</li>\n<li>\n<p>Minus 3</p>\n</li>\n</ul>\n<p>Tight:</p>\n<ol>\n<li>First</li>\n<li>Second</li>\n<li>Third</li>\n</ol>\n<p>and:</p>\n<ol>\n<li>One</li>\n<li>Two</li>\n<li>Three</li>\n</ol>\n<p>Loose using tabs:</p>\n<ol>\n<li>\n<p>First</p>\n</li>\n<li>\n<p>Second</p>\n</li>\n<li>\n<p>Third</p>\n</li>\n</ol>\n<p>and using spaces:</p>\n<ol>\n<li>\n<p>One</p>\n</li>\n<li>\n<p>Two</p>\n</li>\n<li>\n<p>Three</p>\n</li>\n</ol>\n<p>Multiple paragraphs:</p>\n<ol>\n<li>\n<p>Item 1, graf one.</p>\n<p>Item 2. graf two. The quick brown fox jumped over the lazy dog's\nback.</p>\n</li>\n<li>\n<p>Item 2.</p>\n</li>\n<li>\n<p>Item 3.</p>\n</li>\n</ol>\n<ul>\n<li>Tab\n<ul>\n<li>Tab\n<ul>\n<li>Tab</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n<p>Here's another:</p>\n<ol>\n<li>First</li>\n<li>Second:\n<ul>\n<li>Fee</li>\n<li>Fie</li>\n<li>Foe</li>\n</ul>\n</li>\n<li>Third</li>\n</ol>\n<p>Same thing but with paragraphs:</p>\n<ol>\n<li>\n<p>First</p>\n</li>\n<li>\n<p>Second:</p>\n<ul>\n<li>Fee</li>\n<li>Fie</li>\n<li>Foe</li>\n</ul>\n</li>\n<li>\n<p>Third</p>\n</li>\n</ol>\n<p>This was an error in Markdown 1.0.1:</p>\n<ul>\n<li>\n<p>this</p>\n<ul>\n<li>sub</li>\n</ul>\n<p>that</p>\n</li>\n</ul>\"\n`;\n\nexports[`pl renders Ordered and unordered lists.txt 2`] = `\n\"Asterisks tight:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax asterisk 1\n\\\\\\\\item\\\\\\\\relax asterisk 2\n\\\\\\\\item\\\\\\\\relax asterisk 3\n\\\\\\\\end{itemize}\n\n\nAsterisks loose:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax asterisk 1\n\\\\\\\\item\\\\\\\\relax asterisk 2\n\\\\\\\\item\\\\\\\\relax asterisk 3\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nPluses tight:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Plus 1\n\\\\\\\\item\\\\\\\\relax Plus 2\n\\\\\\\\item\\\\\\\\relax Plus 3\n\\\\\\\\end{itemize}\n\n\nPluses loose:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Plus 1\n\\\\\\\\item\\\\\\\\relax Plus 2\n\\\\\\\\item\\\\\\\\relax Plus 3\n\\\\\\\\end{itemize}\n\n\n\\\\\\\\horizontalLine\n\n\n\nMinuses tight:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Minus 1\n\\\\\\\\item\\\\\\\\relax Minus 2\n\\\\\\\\item\\\\\\\\relax Minus 3\n\\\\\\\\end{itemize}\n\n\nMinuses loose:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Minus 1\n\\\\\\\\item\\\\\\\\relax Minus 2\n\\\\\\\\item\\\\\\\\relax Minus 3\n\\\\\\\\end{itemize}\n\n\nTight:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nand:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax One\n\\\\\\\\item\\\\\\\\relax Two\n\\\\\\\\item\\\\\\\\relax Three\n\\\\\\\\end{enumerate}\n\n\nLoose using tabs:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nand using spaces:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax One\n\\\\\\\\item\\\\\\\\relax Two\n\\\\\\\\item\\\\\\\\relax Three\n\\\\\\\\end{enumerate}\n\n\nMultiple paragraphs:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax Item 1, graf one.\n\nItem 2. graf two. The quick brown fox jumped over the lazy dog's\nback.\n\\\\\\\\item\\\\\\\\relax Item 2.\n\\\\\\\\item\\\\\\\\relax Item 3.\n\\\\\\\\end{enumerate}\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Tab\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Tab\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Tab\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\\\\\\\\end{itemize}\n\n\nHere's another:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Fee\n\\\\\\\\item\\\\\\\\relax Fie\n\\\\\\\\item\\\\\\\\relax Foe\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nSame thing but with paragraphs:\n\n\n\n\\\\\\\\begin{enumerate}\n\\\\\\\\item\\\\\\\\relax First\n\\\\\\\\item\\\\\\\\relax Second:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax Fee\n\\\\\\\\item\\\\\\\\relax Fie\n\\\\\\\\item\\\\\\\\relax Foe\n\\\\\\\\end{itemize}\n\\\\\\\\item\\\\\\\\relax Third\n\\\\\\\\end{enumerate}\n\n\nThis was an error in Markdown 1.0.1:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax this\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax sub\n\\\\\\\\end{itemize}\nthat\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`pl renders Strong and em together.txt 1`] = `\n\"<p><strong><em>This is strong and em.</em></strong></p>\n<p>So is <strong><em>this</em></strong> word.</p>\n<p><strong><em>This is strong and em.</em></strong></p>\n<p>So is <strong><em>this</em></strong> word.</p>\"\n`;\n\nexports[`pl renders Strong and em together.txt 2`] = `\n\"\\\\\\\\textbf{\\\\\\\\textit{This is strong and em.}}\n\n\n\nSo is \\\\\\\\textbf{\\\\\\\\textit{this}} word.\n\n\n\n\\\\\\\\textbf{\\\\\\\\textit{This is strong and em.}}\n\n\n\nSo is \\\\\\\\textbf{\\\\\\\\textit{this}} word.\"\n`;\n\nexports[`pl renders Tabs.txt 1`] = `\n\"<ul>\n<li>\n<p>this is a list item\nindented with tabs</p>\n</li>\n<li>\n<p>this is a list item\nindented with spaces</p>\n</li>\n</ul>\n<p>Code:</p>\n<pre><code>this code block is indented by one tab\n</code></pre>\n<p>And:</p>\n<pre><code>\tthis code block is indented by two tabs\n</code></pre>\n<p>And:</p>\n<pre><code>+\tthis is an example list item\n\tindented with tabs\n\n+   this is an example list item\n    indented with spaces\n</code></pre>\"\n`;\n\nexports[`pl renders Tabs.txt 2`] = `\n\"\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax this is a list item\nindented with tabs\n\\\\\\\\item\\\\\\\\relax this is a list item\nindented with spaces\n\\\\\\\\end{itemize}\n\n\nCode:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nthis code block is indented by one tab\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n\tthis code block is indented by two tabs\n\\\\\\\\end{CodeBlock}\n\n\n\nAnd:\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\n+\tthis is an example list item\n\tindented with tabs\n\n+   this is an example list item\n    indented with spaces\n\\\\\\\\end{CodeBlock}\"\n`;\n\nexports[`pl renders Tidyness.txt 1`] = `\n\"<blockquote>\n<p>A list within a blockquote:</p>\n<ul>\n<li>asterisk 1</li>\n<li>asterisk 2</li>\n<li>asterisk 3</li>\n</ul>\n</blockquote>\"\n`;\n\nexports[`pl renders Tidyness.txt 2`] = `\n\"\\\\\\\\begin{Quotation}\nA list within a blockquote:\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax asterisk 1\n\\\\\\\\item\\\\\\\\relax asterisk 2\n\\\\\\\\item\\\\\\\\relax asterisk 3\n\\\\\\\\end{itemize}\n\\\\\\\\end{Quotation}\"\n`;\n\nexports[`zds renders align.txt 1`] = `\n\"<p>A simple paragraph</p>\n<div class=\\\\\"align-center\\\\\"><p>A centered paragraph</p></div>\n<p>a simple paragraph</p>\n<div class=\\\\\"align-right\\\\\"><p>A right aligned paragraph</p></div>\n<p>an other simple paragraph</p>\n<p>A simple paragraph</p>\n<div class=\\\\\"align-center\\\\\"><p>A centered paragraph</p></div>\n<p>a simple paragraph</p>\n<div class=\\\\\"align-right\\\\\"><p>A right aligned paragraph</p></div>\n<p>an other simple paragraph</p>\n<div class=\\\\\"align-center\\\\\"><p>A centered paragraph.</p><p>Containing two paragraph</p></div>\n<p>an other simple paragraph</p>\n<div class=\\\\\"align-center\\\\\"><p>A right aligned paragraph.</p><p>Containing two paragraph</p></div>\n<p>an other simple paragraph</p>\n<div class=\\\\\"align-center\\\\\"><p>A centered paragraph.</p><p>An other centered paragraph.</p></div>\n<p>a simple paragraph</p>\n<p>->A started block without end.</p>\"\n`;\n\nexports[`zds renders align.txt 2`] = `\n\"A simple paragraph\n\n\n\n\n{\\\\\\\\centering A centered paragraph\n\n}\n\n\na simple paragraph\n\n\n\n\n{\\\\\\\\raggedleft\nA right aligned paragraph\n\n}\n\n\nan other simple paragraph\n\n\n\nA simple paragraph\n\n\n\n\n{\\\\\\\\centering A centered paragraph\n\n}\n\n\na simple paragraph\n\n\n\n\n{\\\\\\\\raggedleft\nA right aligned paragraph\n\n}\n\n\nan other simple paragraph\n\n\n\n\n{\\\\\\\\centering A centered paragraph.\n\nContaining two paragraph\n\n}\n\n\nan other simple paragraph\n\n\n\n\n{\\\\\\\\centering A right aligned paragraph.\n\nContaining two paragraph\n\n}\n\n\nan other simple paragraph\n\n\n\n\n{\\\\\\\\centering A centered paragraph.\n\nAn other centered paragraph.\n\n}\n\n\na simple paragraph\n\n\n\n->A started block without end.\"\n`;\n\nexports[`zds renders comments.txt 1`] = `\n\"<p>BlablaBalbla</p>\n<pre><code>Blabla&#x3C;--COMMENTS hahaha COMMENTS-->Balbla\n</code></pre>\n<p>&#x3C;--COMMENTS Unfinished block</p>\"\n`;\n\nexports[`zds renders comments.txt 2`] = `\n\"Blabla\\\\\\\\begin{comment}\nhahaha\n\\\\\\\\end{comment}\nBalbla\n\n\n\n\\\\\\\\begin{CodeBlock}{text}\nBlabla<--COMMENTS hahaha COMMENTS-->Balbla\n\\\\\\\\end{CodeBlock}\n\n\n\n<--COMMENTS Unfinished block\"\n`;\n\nexports[`zds renders customblock.txt 1`] = `\n\"<details class=\\\\\"custom-block custom-block-spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Secret Block</p></div></details>\n<details class=\\\\\"custom-block custom-block-spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Secret Block</p></div></details>\n<details class=\\\\\"custom-block custom-block-spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>another</p></div></details>\n<blockquote>\n<details class=\\\\\"custom-block custom-block-spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><blockquote>\n<p>Blockquote in secret block in blockquote</p>\n</blockquote></div></details>\n</blockquote>\n<div class=\\\\\"custom-block custom-block-information\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Information Block</p></div></div>\n<div class=\\\\\"custom-block custom-block-information\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>an other</p></div></div>\n<div class=\\\\\"custom-block custom-block-question\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Question Block</p></div></div>\n<div class=\\\\\"custom-block custom-block-question\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>an other</p></div></div>\n<div class=\\\\\"custom-block custom-block-warning\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Attention Block</p></div></div>\n<div class=\\\\\"custom-block custom-block-warning\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>an other</p></div></div>\n<div class=\\\\\"custom-block custom-block-error\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Erreur Block</p></div></div>\n<div class=\\\\\"custom-block custom-block-error\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>an other</p></div></div>\n<p>[[se]]\n| not a block</p>\n<p>[[secretsecret]]\n| not a block</p>\n<p>[[SECRET]]\n| not a block</p>\n<details class=\\\\\"custom-block custom-block-spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>Multiline block</p><blockquote>\n<p>with blockquote !</p>\n</blockquote></div></details>\n<p>| Not a block</p>\n<p>content before</p>\n<details class=\\\\\"custom-block custom-block-spoiler\\\\\"><div class=\\\\\"custom-block-body\\\\\"><p>A Block</p></div></details>\n<p>with content after</p>\n<div class=\\\\\"custom-block custom-block-error\\\\\"><div class=\\\\\"custom-block-heading\\\\\">a <strong>title</strong></div><div class=\\\\\"custom-block-body\\\\\"><p>content</p></div></div>\n<div class=\\\\\"custom-block custom-block-neutral\\\\\"><div class=\\\\\"custom-block-heading\\\\\">a <strong>title</strong></div><div class=\\\\\"custom-block-body\\\\\"><p>content</p></div></div>\"\n`;\n\nexports[`zds renders customblock.txt 2`] = `\n\"\\\\\\\\begin{Spoiler}\nSecret Block\n\\\\\\\\end{Spoiler}\n\n\n\\\\\\\\begin{Spoiler}\nSecret Block\n\\\\\\\\end{Spoiler}\n\n\n\\\\\\\\begin{Spoiler}\nanother\n\\\\\\\\end{Spoiler}\n\n\n\\\\\\\\begin{Quotation}\n\\\\\\\\begin{Spoiler}\n\\\\\\\\begin{Quotation}\nBlockquote in secret block in blockquote\n\\\\\\\\end{Quotation}\n\\\\\\\\end{Spoiler}\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\begin{Information}\nInformation Block\n\\\\\\\\end{Information}\n\n\n\\\\\\\\begin{Information}\nan other\n\\\\\\\\end{Information}\n\n\n\\\\\\\\begin{Question}\nQuestion Block\n\\\\\\\\end{Question}\n\n\n\\\\\\\\begin{Question}\nan other\n\\\\\\\\end{Question}\n\n\n\\\\\\\\begin{Warning}\nAttention Block\n\\\\\\\\end{Warning}\n\n\n\\\\\\\\begin{Warning}\nan other\n\\\\\\\\end{Warning}\n\n\n\\\\\\\\begin{Error}\nErreur Block\n\\\\\\\\end{Error}\n\n\n\\\\\\\\begin{Error}\nan other\n\\\\\\\\end{Error}\n\n\n[[se]]\n| not a block\n\n\n\n[[secretsecret]]\n| not a block\n\n\n\n[[SECRET]]\n| not a block\n\n\n\n\\\\\\\\begin{Spoiler}\nMultiline block\n\n\\\\\\\\begin{Quotation}\nwith blockquote !\n\\\\\\\\end{Quotation}\n\\\\\\\\end{Spoiler}\n\n\n| Not a block\n\n\n\ncontent before\n\n\n\n\\\\\\\\begin{Spoiler}\nA Block\n\\\\\\\\end{Spoiler}\n\n\nwith content after\n\n\n\n\\\\\\\\begin{Error}[{{a \\\\\\\\textbf{title}}}]\ncontent\n\\\\\\\\end{Error}\n\n\n\\\\\\\\begin{Neutral}[{{a \\\\\\\\textbf{title}}}]\ncontent\n\\\\\\\\end{Neutral}\"\n`;\n\nexports[`zds renders delext.txt 1`] = `\n\"<p>Blabla <del>truc</del> kxcvj <del>sdv sd</del> sdff</p>\n<p>sdf <del></del> df</p>\n<p>sfdgs ~ ~ dfg ~~ dgsg ~ qs</p>\"\n`;\n\nexports[`zds renders delext.txt 2`] = `\n\"Blabla \\\\\\\\sout{truc} kxcvj \\\\\\\\sout{sdv sd} sdff\n\n\n\nsdf \\\\\\\\sout{} df\n\n\n\nsfdgs \\\\\\\\textasciitilde{} \\\\\\\\textasciitilde{} dfg \\\\\\\\textasciitilde{}\\\\\\\\textasciitilde{} dgsg \\\\\\\\textasciitilde{} qs\"\n`;\n\nexports[`zds renders emoticons.txt 1`] = `\n\"<p>Lolilol <img src=\\\\\"/static/smileys/svg/smile.svg\\\\\" alt=\\\\\":)\\\\\" class=\\\\\"smiley\\\\\"> Hey <img src=\\\\\"/static/smileys/svg/heureux.svg\\\\\" alt=\\\\\":D\\\\\" class=\\\\\"smiley\\\\\"></p>\n<p><img src=\\\\\"/static/smileys/svg/smile.svg\\\\\" alt=\\\\\":)\\\\\" class=\\\\\"smiley\\\\\"></p>\n<blockquote>\n<p>Citation</p>\n</blockquote>\n<p><img src=\\\\\"/static/smileys/svg/heureux.svg\\\\\" alt=\\\\\":D\\\\\" class=\\\\\"smiley\\\\\"> Ce n'est pas une légende</p>\n<figure><img src=\\\\\"https://zestedesavoir.com/media/galleries/3014/bee33fae-2216-463a-8b85-d1d9efe2c374.png\\\\\" alt=\\\\\"toto\\\\\" loading=\\\\\"lazy\\\\\"><figcaption>toto</figcaption></figure>\n<p><img src=\\\\\"/static/smileys/svg/heureux.svg\\\\\" alt=\\\\\":D\\\\\" class=\\\\\"smiley\\\\\"> ce n'est pas une légende non plus</p>\"\n`;\n\nexports[`zds renders emoticons.txt 2`] = `\n\"Lolilol \\\\\\\\smiley{smile.svg} Hey \\\\\\\\smiley{heureux.svg}\n\n\n\n\\\\\\\\smiley{smile.svg}\n\n\n\n\\\\\\\\begin{Quotation}\nCitation\n\\\\\\\\end{Quotation}\n\n\n\n\\\\\\\\smiley{heureux.svg} Ce n'est pas une légende\n\n\n\n\\\\\\\\image{https://zestedesavoir.com/media/galleries/3014/bee33fae-2216-463a-8b85-d1d9efe2c374.png}[toto]\n\n\n\\\\\\\\smiley{heureux.svg} ce n'est pas une légende non plus\"\n`;\n\nexports[`zds renders grid_tables.txt 1`] = `\n\"<h1 id=\\\\\"grid-table\\\\\">Grid table<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#grid-table\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\n<h2 id=\\\\\"basic-example\\\\\">Basic example<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#basic-example\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h2>\n<div class=\\\\\"table-wrapper\\\\\"><table><thead><tr><th colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>Table Headings</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Here</p></th></tr><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Sub</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Headings</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Too</p></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>cell\nspans\nrows</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>column spanning</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>normal</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>cell</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>multi\nline</p><p>cells\ntoo</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>cells can be\n<em>formatted</em>\n<strong>paragraphs</strong></p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><thead><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>D</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"3\\\\\"><p>A</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"3\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>D</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"4\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>G</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>H</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>I</p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"4\\\\\"><p>C</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>F</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></td><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"3\\\\\"><p>A</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"2\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"3\\\\\"><p>F</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>H</p></td></tr><tr><td colspan=\\\\\"6\\\\\" rowspan=\\\\\"1\\\\\"><p>I</p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><thead><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></th><th colspan=\\\\\"6\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"4\\\\\"><p>C</p></td><td colspan=\\\\\"6\\\\\" rowspan=\\\\\"4\\\\\"><div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>H</p></td></tr></tbody></table></div></td></tr><tr></tr><tr></tr><tr></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>H</p></td><td colspan=\\\\\"16\\\\\" rowspan=\\\\\"1\\\\\"></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>He</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Li</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Be</p></td><td colspan=\\\\\"10\\\\\" rowspan=\\\\\"2\\\\\"></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>N</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>O</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ne</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Na</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Mg</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Al</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Si</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>P</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>S</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cl</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ar</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>K</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ca</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Sc</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ti</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>V</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cr</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Mn</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Fe</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Co</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ni</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cu</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Zn</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ga</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ge</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>As</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Se</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Br</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Kr</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Rb</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Sr</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Y</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Zr</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Nb</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Mo</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Tc</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ru</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Rh</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pd</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ag</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cd</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>In</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Sn</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Sb</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Te</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>I</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Xe</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cs</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ba</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>LAN</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Hf</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ta</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>W</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Re</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Os</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ir</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pt</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Au</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Hg</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Tl</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pb</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Bi</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Po</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>At</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Rn</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Fr</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ra</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>ACT</p></td><td colspan=\\\\\"15\\\\\" rowspan=\\\\\"1\\\\\"></td></tr><tr><td colspan=\\\\\"18\\\\\" rowspan=\\\\\"1\\\\\"></td></tr><tr><td colspan=\\\\\"3\\\\\" rowspan=\\\\\"1\\\\\"><p>Lanthanide</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>La</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ce</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pr</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Nd</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pm</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Sm</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Eu</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Gd</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Tb</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Dy</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ho</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Er</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Tm</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Yb</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Lu</p></td></tr><tr><td colspan=\\\\\"3\\\\\" rowspan=\\\\\"1\\\\\"><p>Actinide</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Ac</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Th</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pa</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>U</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Np</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Pu</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Am</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cm</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Bk</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Cf</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Es</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Fm</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Md</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>No</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>Lw</p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td></tr></tbody></table></div>\n<p>Text at the end</p>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td></tr></tbody></table></div>\n<p>Text at the</p>\n<h2 id=\\\\\"specific-tests\\\\\">specific tests<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#specific-tests\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h2>\n<p>In this examples, the second row should always be a full-cell</p>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>B | C</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td><td colspan=\\\\\"3\\\\\" rowspan=\\\\\"1\\\\\"></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>B | C</p></td></tr><tr><td colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>D   E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>B | C</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table></div>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>A</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>B</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>C</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td></tr><tr><td colspan=\\\\\"4\\\\\" rowspan=\\\\\"1\\\\\"><p>B  | C</p></td></tr><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>D</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>E</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>F</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>G</p></td></tr></tbody></table></div>\n<h2 id=\\\\\"failing-example\\\\\">Failing example<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#failing-example\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h2>\n<p>+--- A ---+</p>\n<p>+---------+\n+---------+</p>\n<p>+---------+\n| A       |\n|         |</p>\n<p>+---------+\n| A       |\n+=========+\n| B       |\n+=========+</p>\n<p>+--- A ---+\n|         |</p>\n<div class=\\\\\"table-wrapper\\\\\"><table><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"></td></tr></tbody></table></div>\n<p>Bug #107</p>\n<div class=\\\\\"table-wrapper\\\\\"><table><thead><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"></th><th colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>case1</p></th><th colspan=\\\\\"2\\\\\" rowspan=\\\\\"1\\\\\"><p>case2</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>case3</p></th></tr><tr><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>case4</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>case5</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>case6</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>case7</p></th><th colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"></th></tr></thead><tbody><tr><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>X</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>X</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>X</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>X</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>X</p></td><td colspan=\\\\\"1\\\\\" rowspan=\\\\\"1\\\\\"><p>X</p></td></tr></tbody></table></div>\"\n`;\n\nexports[`zds renders grid_tables.txt 2`] = `\n\"\\\\\\\\levelOneTitle{Grid table}\n\n\n\\\\\\\\levelTwoTitle{Basic example}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=2,row{1,2}={font=\\\\\\\\bfseries}}\n\\\\\\\\SetCell[c=2]{l} Table Headings &  & Here \\\\\\\\\\\\\\\\\nSub & Headings & Too \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} cell \\\\\\\\endgraf spans \\\\\\\\endgraf rows & \\\\\\\\SetCell[c=2]{l} column spanning &  \\\\\\\\\\\\\\\\\n & normal & cell \\\\\\\\\\\\\\\\\nmulti \\\\\\\\endgraf line \\\\\\\\endgraf \\\\\\\\endgraf cells \\\\\\\\endgraf too & \\\\\\\\SetCell[c=2]{l} cells can be \\\\\\\\endgraf \\\\\\\\textit{formatted} \\\\\\\\endgraf \\\\\\\\textbf{paragraphs} &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & B & C \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} D & \\\\\\\\SetCell[c=2]{l} E &  \\\\\\\\\\\\\\\\\n & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1]}}\n\\\\\\\\SetCell[r=3]{l} A & \\\\\\\\SetCell[c=2]{l} B &  \\\\\\\\\\\\\\\\\n & C & D \\\\\\\\\\\\\\\\\n & \\\\\\\\SetCell[c=2]{l} E &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1]}}\n\\\\\\\\SetCell[c=3]{l} A &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} B & C & \\\\\\\\SetCell[r=2]{l} D \\\\\\\\\\\\\\\\\nE &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1]}}\n\\\\\\\\SetCell[r=4]{l} C & \\\\\\\\SetCell[r=2]{l} D & E \\\\\\\\\\\\\\\\\nF &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=2]{l} G & H \\\\\\\\\\\\\\\\\n & I \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1]}}\nA & \\\\\\\\SetCell[r=2]{l} B & \\\\\\\\SetCell[r=4]{l} C \\\\\\\\\\\\\\\\\nD &  \\\\\\\\\\\\\\\\\nE & \\\\\\\\SetCell[r=2]{l} F &  \\\\\\\\\\\\\\\\\nG &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\nA & B & C & D \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=2]{l} E &  & \\\\\\\\SetCell[c=2]{l} F &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=4]{l} G &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\n\\\\\\\\SetCell[c=4]{l} A &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=2]{l} B &  & \\\\\\\\SetCell[c=2]{l} C &  \\\\\\\\\\\\\\\\\nD & E & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\n\\\\\\\\SetCell[r=3]{l} A & \\\\\\\\SetCell[r=2]{l} B & C & D & \\\\\\\\SetCell[r=2]{l} E & \\\\\\\\SetCell[r=3]{l} F \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=2]{l} G &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=4]{l} H &  &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=6]{l} I &  &  &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]},rowhead=1,row{1}={font=\\\\\\\\bfseries}}\nA & \\\\\\\\SetCell[c=6]{l} B &  &  &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[r=4]{l} C & \\\\\\\\SetCell[r=4]{l} \\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\nD & E & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=4]{l} H &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr} &  &  &  &  &  \\\\\\\\\\\\\\\\\n &  &  &  &  &  \\\\\\\\\\\\\\\\\n &  &  &  &  &  \\\\\\\\\\\\\\\\\n &  &  &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\nH & \\\\\\\\SetCell[c=16]{l}  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  & He \\\\\\\\\\\\\\\\\nLi & Be & \\\\\\\\SetCell[r=2]{l}  &  &  &  &  &  &  &  &  &  & B & C & N & O & F & Ne \\\\\\\\\\\\\\\\\nNa & Mg &  &  &  &  &  &  &  &  &  &  & Al & Si & P & S & Cl & Ar \\\\\\\\\\\\\\\\\nK & Ca & Sc & Ti & V & Cr & Mn & Fe & Co & Ni & Cu & Zn & Ga & Ge & As & Se & Br & Kr \\\\\\\\\\\\\\\\\nRb & Sr & Y & Zr & Nb & Mo & Tc & Ru & Rh & Pd & Ag & Cd & In & Sn & Sb & Te & I & Xe \\\\\\\\\\\\\\\\\nCs & Ba & LAN & Hf & Ta & W & Re & Os & Ir & Pt & Au & Hg & Tl & Pb & Bi & Po & At & Rn \\\\\\\\\\\\\\\\\nFr & Ra & ACT & \\\\\\\\SetCell[c=15]{l}  &  &  &  &  &  &  &  &  &  &  &  &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=18]{l}  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=3]{l} Lanthanide &  &  & La & Ce & Pr & Nd & Pm & Sm & Eu & Gd & Tb & Dy & Ho & Er & Tm & Yb & Lu \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=3]{l} Actinide &  &  & Ac & Th & Pa & U & Np & Pu & Am & Cm & Bk & Cf & Es & Fm & Md & No & Lw \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1]}}\nA \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\nText at the end\n\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1]}}\nA \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\nText at the\n\n\n\n\\\\\\\\levelTwoTitle{specific tests}\n\n\nIn this examples, the second row should always be a full-cell\n\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\n\\\\\\\\SetCell[c=4]{l} A &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=4]{l} B | C &  &  &  \\\\\\\\\\\\\\\\\nD & E & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\nA & \\\\\\\\SetCell[c=3]{l}  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=4]{l} B | C &  &  &  \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=2]{l} D   E &  & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\nA & B & C & D \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=4]{l} B | C &  &  &  \\\\\\\\\\\\\\\\\nD & E & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]}}\nA & B & C & D \\\\\\\\\\\\\\\\\n\\\\\\\\SetCell[c=4]{l} B  | C &  &  &  \\\\\\\\\\\\\\\\\nD & E & F & G \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\n\\\\\\\\levelTwoTitle{Failing example}\n\n\n+--- A ---+\n\n\n\n+---------+\n+---------+\n\n\n\n+---------+\n| A       |\n|         |\n\n\n\n+---------+\n| A       |\n+=========+\n| B       |\n+=========+\n\n\n\n+--- A ---+\n|         |\n\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1]}}\n \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\n\n\nBug \\\\\\\\#107\n\n\n\n\\\\\\\\begin{zdstblr}{colspec={X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1] X[-1]},rowhead=2,row{1,2}={font=\\\\\\\\bfseries}}\n & \\\\\\\\SetCell[c=2]{l} case1 &  & \\\\\\\\SetCell[c=2]{l} case2 &  & case3 \\\\\\\\\\\\\\\\\n & case4 & case5 & case6 & case7 &  \\\\\\\\\\\\\\\\\nX & X & X & X & X & X \\\\\\\\\\\\\\\\\n\\\\\\\\end{zdstblr}\"\n`;\n\nexports[`zds renders kbd.txt 1`] = `\n\"<p>Blabla <kbd>ok</kbd> kxcvj <kbd>ok foo</kbd> sdff</p>\n<p>sdf |||| df</p>\n<p>sfdgs | | dfg || dgsg | qs</p>\n<p>With two pipes: ||key|| you'll get <kbd>key</kbd>.</p>\n<p>It parses inline elements inside:</p>\n<ul>\n<li><kbd>hell<a href=\\\\\"#he\\\\\"><del>o</del></a>?</kbd></li>\n</ul>\n<p>but not block elements inside:</p>\n<ul>\n<li><kbd>hello: [[secret]]?</kbd></li>\n</ul>\"\n`;\n\nexports[`zds renders kbd.txt 2`] = `\n\"Blabla \\\\\\\\keys{ok} kxcvj \\\\\\\\keys{ok foo} sdff\n\n\n\nsdf |||| df\n\n\n\nsfdgs | | dfg || dgsg | qs\n\n\n\nWith two pipes: ||key|| you'll get \\\\\\\\keys{key}.\n\n\n\nIt parses inline elements inside:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\keys{hell\\\\\\\\externalLink{\\\\\\\\sout{o}}{\\\\\\\\#he}?}\n\\\\\\\\end{itemize}\n\n\nbut not block elements inside:\n\n\n\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax \\\\\\\\keys{hello: [[secret]]?}\n\\\\\\\\end{itemize}\"\n`;\n\nexports[`zds renders subsuperscript.txt 1`] = `\n\"<p>Foo <sup>sup</sup> kxcvj <sup>sup <em>string</em></sup> bar</p>\n<p>not ^ here</p>\n<p>neither ^ here ^ because it's escaped</p>\n<p>Foo <sub>sup</sub> kxcvj <sub>sup <em>string</em></sub> bar</p>\n<p>not ~ here</p>\n<p>neither ~ here ~ because it's escaped</p>\n<p>foo ^<sup>a</sup>^ bar</p>\"\n`;\n\nexports[`zds renders subsuperscript.txt 2`] = `\n\"Foo \\\\\\\\textsuperscript{sup} kxcvj \\\\\\\\textsuperscript{sup \\\\\\\\textit{string}} bar\n\n\n\nnot \\\\\\\\textasciicircum{} here\n\n\n\nneither \\\\\\\\textasciicircum{} here \\\\\\\\textasciicircum{} because it's escaped\n\n\n\nFoo \\\\\\\\textsubscript{sup} kxcvj \\\\\\\\textsubscript{sup \\\\\\\\textit{string}} bar\n\n\n\nnot \\\\\\\\textasciitilde{} here\n\n\n\nneither \\\\\\\\textasciitilde{} here \\\\\\\\textasciitilde{} because it's escaped\n\n\n\nfoo \\\\\\\\textasciicircum{}\\\\\\\\textsuperscript{a}\\\\\\\\textasciicircum{} bar\"\n`;\n\nexports[`zds renders urlize.txt 1`] = `\n\"<p><a href=\\\\\"http://www.google.fr\\\\\">http://www.google.fr</a></p>\n<p><a href=\\\\\"https://www.google.fr\\\\\">https://www.google.fr</a></p>\n<p><a href=\\\\\"http://www.google.fr\\\\\">www.google.fr</a></p>\n<p>google.fr</p>\n<p><a href=\\\\\"http://www.google.fr\\\\\">http://www.google.fr</a></p>\n<p>Voici mon super lien qui termine une phrase <a href=\\\\\"http://www.google.fr\\\\\">http://www.google.fr</a>.</p>\n<p><a href=\\\\\"https://fr.wikipedia.org/wiki/Compactifi%C3%A9_d&#x27;Alexandrov\\\\\">https://fr.wikipedia.org/wiki/Compactifié_d'Alexandrov</a></p>\n<p><a href=\\\\\"https://fr.wikipedia.org/wiki/Compactifi%C3%A9_d%27Alexandrov\\\\\">https://fr.wikipedia.org/wiki/Compactifi%C3%A9_d%27Alexandrov</a></p>\n<p>javascript:alert%28'Hello%20world!'%29</p>\n<p>vbscript:msgbox%28%22Hello%20world!%22%29</p>\n<p>livescript:alert%28'Hello%20world!'%29</p>\n<p>mocha:[code])</p>\n<p>jAvAsCrIpT:alert%28'Hello%20world!'%29</p>\n<p>ja&#x26;#32;vas&#x26;#32;cr&#x26;#32;ipt:alert%28'Hello%20world!'%29</p>\n<p>ja&#x26;#00032;vas&#x26;#32;cr&#x26;#32;ipt:alert%28'Hello%20world!'%29</p>\n<p>ja&#x26;#x00020;vas&#x26;#32;cr&#x26;#32;ipt:alert%28'Hello%20world!'%29</p>\n<p>ja%09&#x26;#x20;%0Avas&#x26;#32;cr&#x26;#x0a;ipt:alert%28'Hello%20world!'%29</p>\n<p>ja%20vas%20cr%20ipt:alert%28'Hello%20world!'%29</p>\n<p>live%20script:alert%28'Hello%20world!'%29</p>\n<p>javascript:alert%29'XSS'%29</p>\n<p><a href=\\\\\"https://isocpp.org/std/status\\\\\">sur isocpp.org</a></p>\"\n`;\n\nexports[`zds renders urlize.txt 2`] = `\n\"\\\\\\\\externalLink{http://www.google.fr}{http://www.google.fr}\n\n\n\n\\\\\\\\externalLink{https://www.google.fr}{https://www.google.fr}\n\n\n\n\\\\\\\\externalLink{www.google.fr}{http://www.google.fr}\n\n\n\ngoogle.fr\n\n\n\n\\\\\\\\externalLink{http://www.google.fr}{http://www.google.fr}\n\n\n\nVoici mon super lien qui termine une phrase \\\\\\\\externalLink{http://www.google.fr}{http://www.google.fr}.\n\n\n\n\\\\\\\\externalLink{https://fr.wikipedia.org/wiki/Compactifié\\\\\\\\_d'Alexandrov}{https://fr.wikipedia.org/wiki/Compactifié\\\\\\\\_d'Alexandrov}\n\n\n\n\\\\\\\\externalLink{https://fr.wikipedia.org/wiki/Compactifi\\\\\\\\%C3\\\\\\\\%A9\\\\\\\\_d\\\\\\\\%27Alexandrov}{https://fr.wikipedia.org/wiki/Compactifi\\\\\\\\%C3\\\\\\\\%A9\\\\\\\\_d\\\\\\\\%27Alexandrov}\n\n\n\njavascript:alert\\\\\\\\%28'Hello\\\\\\\\%20world!'\\\\\\\\%29\n\n\n\nvbscript:msgbox\\\\\\\\%28\\\\\\\\%22Hello\\\\\\\\%20world!\\\\\\\\%22\\\\\\\\%29\n\n\n\nlivescript:alert\\\\\\\\%28'Hello\\\\\\\\%20world!'\\\\\\\\%29\n\n\n\nmocha:[code])\n\n\n\njAvAsCrIpT:alert\\\\\\\\%28'Hello\\\\\\\\%20world!'\\\\\\\\%29\n\n\n\nja\\\\\\\\&\\\\\\\\#32;vas\\\\\\\\&\\\\\\\\#32;cr\\\\\\\\&\\\\\\\\#32;ipt:alert\\\\\\\\%28'Hello\\\\\\\\%20world!'\\\\\\\\%29\n\n\n\nja\\\\\\\\&\\\\\\\\#00032;vas\\\\\\\\&\\\\\\\\#32;cr\\\\\\\\&\\\\\\\\#32;ipt:alert\\\\\\\\%28'Hello\\\\\\\\%20world!'\\\\\\\\%29\n\n\n\nja\\\\\\\\&\\\\\\\\#x00020;vas\\\\\\\\&\\\\\\\\#32;cr\\\\\\\\&\\\\\\\\#32;ipt:alert\\\\\\\\%28'Hello\\\\\\\\%20world!'\\\\\\\\%29\n\n\n\nja\\\\\\\\%09\\\\\\\\&\\\\\\\\#x20;\\\\\\\\%0Avas\\\\\\\\&\\\\\\\\#32;cr\\\\\\\\&\\\\\\\\#x0a;ipt:alert\\\\\\\\%28'Hello\\\\\\\\%20world!'\\\\\\\\%29\n\n\n\nja\\\\\\\\%20vas\\\\\\\\%20cr\\\\\\\\%20ipt:alert\\\\\\\\%28'Hello\\\\\\\\%20world!'\\\\\\\\%29\n\n\n\nlive\\\\\\\\%20script:alert\\\\\\\\%28'Hello\\\\\\\\%20world!'\\\\\\\\%29\n\n\n\njavascript:alert\\\\\\\\%29'XSS'\\\\\\\\%29\n\n\n\n\\\\\\\\externalLink{sur isocpp.org}{https://isocpp.org/std/status}\"\n`;\n\nexports[`zds renders video.txt 1`] = `\n\"<div class=\\\\\"video-container\\\\\"><div class=\\\\\"video-wrapper\\\\\"><iframe src=\\\\\"https://www.youtube.com/embed/FdltlrKFr1w?feature=oembed\\\\\" width=\\\\\"560\\\\\" height=\\\\\"315\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe></div></div>\n<div class=\\\\\"video-container\\\\\"><div class=\\\\\"video-wrapper\\\\\"><iframe src=\\\\\"https://geo.dailymotion.com/player.html?video=x2y6lhm&#x26;\\\\\" width=\\\\\"480\\\\\" height=\\\\\"270\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe></div></div>\n<div class=\\\\\"video-container\\\\\"><div class=\\\\\"video-wrapper\\\\\"><iframe src=\\\\\"https://player.vimeo.com/video/133693532?app_id=122963\\\\\" width=\\\\\"500\\\\\" height=\\\\\"281\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe></div></div>\n<p>!(https://screen.yahoo.com/weatherman-gives-forecast-using-taylor-191821481.html)</p>\n<div class=\\\\\"video-container\\\\\"><div class=\\\\\"video-wrapper\\\\\"><iframe src=\\\\\"https://www.youtube.com/embed/FdltlrKFr1w?feature=oembed\\\\\" width=\\\\\"560\\\\\" height=\\\\\"315\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe></div></div>\n<div class=\\\\\"video-container\\\\\"><div class=\\\\\"video-wrapper\\\\\"><iframe src=\\\\\"https://www.youtube.com/embed/FdltlrKFr1w?feature=oembed\\\\\" width=\\\\\"560\\\\\" height=\\\\\"315\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe></div></div>\n<div class=\\\\\"iframe-wrapper\\\\\"><iframe src=\\\\\"https://jsfiddle.net/Sandhose/BcKhe/1/embedded/result,js,html,css/\\\\\" width=\\\\\"560\\\\\" height=\\\\\"560\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe></div>\n<div class=\\\\\"iframe-wrapper\\\\\"><iframe src=\\\\\"https://jsfiddle.net/zgjhjv9j/embedded/result,js,html,css/\\\\\" width=\\\\\"560\\\\\" height=\\\\\"560\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe></div>\n<div class=\\\\\"iframe-wrapper\\\\\"><iframe src=\\\\\"https://jsfiddle.net/zgjhjv9j/1/embedded/result,js,html,css/\\\\\" width=\\\\\"560\\\\\" height=\\\\\"560\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe></div>\n<div class=\\\\\"video-container\\\\\"><div class=\\\\\"video-wrapper\\\\\"><iframe src=\\\\\"https://www.youtube.com/embed/1Bh4DZ2xGmw?feature=oembed\\\\\" width=\\\\\"560\\\\\" height=\\\\\"315\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe></div></div>\n<div class=\\\\\"iframe-wrapper\\\\\"><iframe src=\\\\\"http://player.ina.fr/player/embed/MAN9062216517/1/1b0bd203fbcd702f9bc9b10ac3d0fc21/560/315/1/148db8\\\\\" width=\\\\\"620\\\\\" height=\\\\\"349\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe></div>\n<p>This one should not be allowed:</p>\n<p>!(http://jsfiddle.net/Sandhose/BcKhe/)</p>\n<div class=\\\\\"video-container\\\\\"><div class=\\\\\"video-wrapper\\\\\"><iframe src=\\\\\"https://www.youtube.com/embed/FdltlrKFr1w?feature=oembed\\\\\" width=\\\\\"560\\\\\" height=\\\\\"315\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></iframe></div></div>\n<p>with text after</p>\"\n`;\n\nexports[`zds renders video.txt 2`] = `\n\"\\\\\\\\iframe{https://www.youtube.com/embed/FdltlrKFr1w?feature=oembed}[Video][]\n\n\\\\\\\\iframe{https://geo.dailymotion.com/player.html?video=x2y6lhm&}[Video][]\n\n\\\\\\\\iframe{https://player.vimeo.com/video/133693532?app_id=122963}[Video][]\n\n!(https://screen.yahoo.com/weatherman-gives-forecast-using-taylor-191821481.html)\n\n\n\n\\\\\\\\iframe{https://www.youtube.com/embed/FdltlrKFr1w?feature=oembed}[Video][]\n\n\\\\\\\\iframe{https://www.youtube.com/embed/FdltlrKFr1w?feature=oembed}[Video][]\n\n\\\\\\\\iframe{https://jsfiddle.net/Sandhose/BcKhe/1/embedded/result,js,html,css/}[Code][]\n\n\\\\\\\\iframe{https://jsfiddle.net/zgjhjv9j/embedded/result,js,html,css/}[Code][]\n\n\\\\\\\\iframe{https://jsfiddle.net/zgjhjv9j/1/embedded/result,js,html,css/}[Code][]\n\n\\\\\\\\iframe{https://www.youtube.com/embed/1Bh4DZ2xGmw?feature=oembed}[Video][]\n\n\\\\\\\\iframe{http://player.ina.fr/player/embed/MAN9062216517/1/1b0bd203fbcd702f9bc9b10ac3d0fc21/560/315/1/148db8}[Video][]\n\nThis one should not be allowed:\n\n\n\n!(http://jsfiddle.net/Sandhose/BcKhe/)\n\n\n\n\\\\\\\\iframe{https://www.youtube.com/embed/FdltlrKFr1w?feature=oembed}[Video][]\n\nwith text after\"\n`;\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/__snapshots__/mdast-suite.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`renders correctly 1`] = `\nObject {\n  \"children\": Array [\n    Object {\n      \"children\": Array [\n        Object {\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 6,\n              \"line\": 1,\n              \"offset\": 5,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 3,\n              \"line\": 1,\n              \"offset\": 2,\n            },\n          },\n          \"type\": \"text\",\n          \"value\": \"foo\",\n        },\n      ],\n      \"depth\": 1,\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 6,\n          \"line\": 1,\n          \"offset\": 5,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 1,\n          \"offset\": 0,\n        },\n      },\n      \"type\": \"heading\",\n    },\n    Object {\n      \"children\": Array [\n        Object {\n          \"children\": Array [\n            Object {\n              \"position\": Position {\n                \"end\": Object {\n                  \"column\": 17,\n                  \"line\": 2,\n                  \"offset\": 22,\n                },\n                \"indent\": Array [],\n                \"start\": Object {\n                  \"column\": 3,\n                  \"line\": 2,\n                  \"offset\": 8,\n                },\n              },\n              \"type\": \"text\",\n              \"value\": \"something else\",\n            },\n          ],\n          \"position\": Position {\n            \"end\": Object {\n              \"column\": 19,\n              \"line\": 2,\n              \"offset\": 24,\n            },\n            \"indent\": Array [],\n            \"start\": Object {\n              \"column\": 1,\n              \"line\": 2,\n              \"offset\": 6,\n            },\n          },\n          \"type\": \"strong\",\n        },\n      ],\n      \"position\": Position {\n        \"end\": Object {\n          \"column\": 19,\n          \"line\": 2,\n          \"offset\": 24,\n        },\n        \"indent\": Array [],\n        \"start\": Object {\n          \"column\": 1,\n          \"line\": 2,\n          \"offset\": 6,\n        },\n      },\n      \"type\": \"paragraph\",\n    },\n  ],\n  \"position\": Object {\n    \"end\": Object {\n      \"column\": 19,\n      \"line\": 2,\n      \"offset\": 24,\n    },\n    \"start\": Object {\n      \"column\": 1,\n      \"line\": 1,\n      \"offset\": 0,\n    },\n  },\n  \"type\": \"root\",\n}\n`;\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/__snapshots__/misc.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`sanitizer do not oversanitize math - test color 1`] = `\"<p><span class=\\\\\"math math-inline math-display\\\\\"><span class=\\\\\"katex-display\\\\\"><span class=\\\\\"katex\\\\\"><span class=\\\\\"katex-mathml\\\\\"><math xmlns=\\\\\"http://www.w3.org/1998/Math/MathML\\\\\"><semantics><mrow><mstyle mathcolor=\\\\\"red\\\\\"><mi>x</mi></mstyle></mrow><annotation encoding=\\\\\"application/x-tex\\\\\">\\\\\\\\color{red}{x}</annotation></semantics></math></span><span class=\\\\\"katex-html\\\\\" aria-hidden=\\\\\"true\\\\\"><span class=\\\\\"base\\\\\"><span class=\\\\\"strut\\\\\" style=\\\\\"height:0.43056em;vertical-align:0em;\\\\\"></span><span class=\\\\\"mord\\\\\" style=\\\\\"color:red;\\\\\"><span class=\\\\\"mord mathdefault\\\\\" style=\\\\\"color:red;\\\\\">x</span></span></span></span></span></span></span></p>\"`;\n\nexports[`sanitizer do not oversanitize math - test frac 1`] = `\"<p><span class=\\\\\"math math-inline math-display\\\\\"><span class=\\\\\"katex-display\\\\\"><span class=\\\\\"katex\\\\\"><span class=\\\\\"katex-mathml\\\\\"><math xmlns=\\\\\"http://www.w3.org/1998/Math/MathML\\\\\"><semantics><mrow><mfrac><mrow><mn>1</mn><mo>+</mo><mn>1</mn></mrow><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow></mfrac></mrow><annotation encoding=\\\\\"application/x-tex\\\\\">\\\\\\\\frac{1+1}{x+y}</annotation></semantics></math></span><span class=\\\\\"katex-html\\\\\" aria-hidden=\\\\\"true\\\\\"><span class=\\\\\"base\\\\\"><span class=\\\\\"strut\\\\\" style=\\\\\"height:2.20188em;vertical-align:-0.8804400000000001em;\\\\\"></span><span class=\\\\\"mord\\\\\"><span class=\\\\\"mopen nulldelimiter\\\\\"></span><span class=\\\\\"mfrac\\\\\"><span class=\\\\\"vlist-t vlist-t2\\\\\"><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:1.32144em;\\\\\"><span style=\\\\\"top:-2.314em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:3em;\\\\\"></span><span class=\\\\\"mord\\\\\"><span class=\\\\\"mord mathdefault\\\\\">x</span><span class=\\\\\"mspace\\\\\" style=\\\\\"margin-right:0.2222222222222222em;\\\\\"></span><span class=\\\\\"mbin\\\\\">+</span><span class=\\\\\"mspace\\\\\" style=\\\\\"margin-right:0.2222222222222222em;\\\\\"></span><span class=\\\\\"mord mathdefault\\\\\" style=\\\\\"margin-right:0.03588em;\\\\\">y</span></span></span><span style=\\\\\"top:-3.23em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:3em;\\\\\"></span><span class=\\\\\"frac-line\\\\\" style=\\\\\"border-bottom-width:0.04em;\\\\\"></span></span><span style=\\\\\"top:-3.677em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:3em;\\\\\"></span><span class=\\\\\"mord\\\\\"><span class=\\\\\"mord\\\\\">1</span><span class=\\\\\"mspace\\\\\" style=\\\\\"margin-right:0.2222222222222222em;\\\\\"></span><span class=\\\\\"mbin\\\\\">+</span><span class=\\\\\"mspace\\\\\" style=\\\\\"margin-right:0.2222222222222222em;\\\\\"></span><span class=\\\\\"mord\\\\\">1</span></span></span></span><span class=\\\\\"vlist-s\\\\\">​</span></span><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:0.8804400000000001em;\\\\\"><span></span></span></span></span></span><span class=\\\\\"mclose nulldelimiter\\\\\"></span></span></span></span></span></span></span></p>\"`;\n\nexports[`sanitizer do not oversanitize math - test notin 1`] = `\"<p><span class=\\\\\"math math-inline math-display\\\\\"><span class=\\\\\"katex-display\\\\\"><span class=\\\\\"katex\\\\\"><span class=\\\\\"katex-mathml\\\\\"><math xmlns=\\\\\"http://www.w3.org/1998/Math/MathML\\\\\"><semantics><mrow><mo mathvariant=\\\\\"normal\\\\\">∉</mo></mrow><annotation encoding=\\\\\"application/x-tex\\\\\">\\\\\\\\notin</annotation></semantics></math></span><span class=\\\\\"katex-html\\\\\" aria-hidden=\\\\\"true\\\\\"><span class=\\\\\"base\\\\\"><span class=\\\\\"strut\\\\\" style=\\\\\"height:1em;vertical-align:-0.25em;\\\\\"></span><span class=\\\\\"mrel\\\\\"><span class=\\\\\"mord\\\\\"><span class=\\\\\"mrel\\\\\">∈</span></span><span class=\\\\\"mord\\\\\"><span class=\\\\\"vlist-t vlist-t2\\\\\"><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:0.75em;\\\\\"><span style=\\\\\"top:-3em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:3em;\\\\\"></span><span class=\\\\\"llap\\\\\"><span class=\\\\\"strut\\\\\" style=\\\\\"height:1em;vertical-align:-0.25em;\\\\\"></span><span class=\\\\\"inner\\\\\"><span class=\\\\\"mord\\\\\"><span class=\\\\\"mord\\\\\">/</span><span class=\\\\\"mspace\\\\\" style=\\\\\"margin-right:0.05555555555555555em;\\\\\"></span></span></span><span class=\\\\\"fix\\\\\"></span></span></span></span><span class=\\\\\"vlist-s\\\\\">​</span></span><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:0.25em;\\\\\"><span></span></span></span></span></span></span></span></span></span></span></span></p>\"`;\n\nexports[`sanitizer do not oversanitize math - test overrightarrow 1`] = `\n\"<p><span class=\\\\\"math math-inline math-display\\\\\"><span class=\\\\\"katex-display\\\\\"><span class=\\\\\"katex\\\\\"><span class=\\\\\"katex-mathml\\\\\"><math xmlns=\\\\\"http://www.w3.org/1998/Math/MathML\\\\\"><semantics><mrow><mover accent=\\\\\"true\\\\\"><mrow><mi>A</mi><mi>B</mi></mrow><mo stretchy=\\\\\"true\\\\\">→</mo></mover></mrow><annotation encoding=\\\\\"application/x-tex\\\\\">\\\\\\\\overrightarrow{AB}</annotation></semantics></math></span><span class=\\\\\"katex-html\\\\\" aria-hidden=\\\\\"true\\\\\"><span class=\\\\\"base\\\\\"><span class=\\\\\"strut\\\\\" style=\\\\\"height:1.20533em;vertical-align:0em;\\\\\"></span><span class=\\\\\"mord accent\\\\\"><span class=\\\\\"vlist-t\\\\\"><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:1.20533em;\\\\\"><span style=\\\\\"top:-3em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:3em;\\\\\"></span><span class=\\\\\"mord\\\\\"><span class=\\\\\"mord mathdefault\\\\\">A</span><span class=\\\\\"mord mathdefault\\\\\" style=\\\\\"margin-right:0.05017em;\\\\\">B</span></span></span><span class=\\\\\"svg-align\\\\\" style=\\\\\"top:-3.6833299999999998em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:3em;\\\\\"></span><span class=\\\\\"hide-tail\\\\\" style=\\\\\"height:0.522em;min-width:0.888em;\\\\\"><svg width=\\\\\"400em\\\\\" height=\\\\\"0.522em\\\\\" viewBox=\\\\\"0 0 400000 522\\\\\" preserveAspectRatio=\\\\\"xMaxYMin slice\\\\\"><path d=\\\\\"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z\\\\\"></path></svg></span></span></span></span></span></span></span></span></span></span></span></p>\"\n`;\n\nexports[`sanitizer do not oversanitize math - test sqrt 1`] = `\n\"<p><span class=\\\\\"math math-inline math-display\\\\\"><span class=\\\\\"katex-display\\\\\"><span class=\\\\\"katex\\\\\"><span class=\\\\\"katex-mathml\\\\\"><math xmlns=\\\\\"http://www.w3.org/1998/Math/MathML\\\\\"><semantics><mrow><mroot><mrow><msup><mi>x</mi><mn>3</mn></msup><mo>+</mo><msup><mi>y</mi><mn>3</mn></msup><mo>+</mo><msup><mi>z</mi><mn>3</mn></msup></mrow><mn>3</mn></mroot></mrow><annotation encoding=\\\\\"application/x-tex\\\\\">\\\\\\\\sqrt[3]{x^3 + y^3 + z^3}</annotation></semantics></math></span><span class=\\\\\"katex-html\\\\\" aria-hidden=\\\\\"true\\\\\"><span class=\\\\\"base\\\\\"><span class=\\\\\"strut\\\\\" style=\\\\\"height:1.24em;vertical-align:-0.23329099999999992em;\\\\\"></span><span class=\\\\\"mord sqrt\\\\\"><span class=\\\\\"root\\\\\"><span class=\\\\\"vlist-t\\\\\"><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:0.7862708em;\\\\\"><span style=\\\\\"top:-2.9640508em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:2.5em;\\\\\"></span><span class=\\\\\"sizing reset-size6 size1 mtight\\\\\"><span class=\\\\\"mord mtight\\\\\"><span class=\\\\\"mord mtight\\\\\">3</span></span></span></span></span></span></span></span><span class=\\\\\"vlist-t vlist-t2\\\\\"><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:1.006709em;\\\\\"><span class=\\\\\"svg-align\\\\\" style=\\\\\"top:-3.2em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:3.2em;\\\\\"></span><span class=\\\\\"mord\\\\\" style=\\\\\"padding-left:1em;\\\\\"><span class=\\\\\"mord\\\\\"><span class=\\\\\"mord mathdefault\\\\\">x</span><span class=\\\\\"msupsub\\\\\"><span class=\\\\\"vlist-t\\\\\"><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:0.740108em;\\\\\"><span style=\\\\\"top:-2.9890000000000003em;margin-right:0.05em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:2.7em;\\\\\"></span><span class=\\\\\"sizing reset-size6 size3 mtight\\\\\"><span class=\\\\\"mord mtight\\\\\">3</span></span></span></span></span></span></span></span><span class=\\\\\"mspace\\\\\" style=\\\\\"margin-right:0.2222222222222222em;\\\\\"></span><span class=\\\\\"mbin\\\\\">+</span><span class=\\\\\"mspace\\\\\" style=\\\\\"margin-right:0.2222222222222222em;\\\\\"></span><span class=\\\\\"mord\\\\\"><span class=\\\\\"mord mathdefault\\\\\" style=\\\\\"margin-right:0.03588em;\\\\\">y</span><span class=\\\\\"msupsub\\\\\"><span class=\\\\\"vlist-t\\\\\"><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:0.740108em;\\\\\"><span style=\\\\\"top:-2.9890000000000003em;margin-right:0.05em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:2.7em;\\\\\"></span><span class=\\\\\"sizing reset-size6 size3 mtight\\\\\"><span class=\\\\\"mord mtight\\\\\">3</span></span></span></span></span></span></span></span><span class=\\\\\"mspace\\\\\" style=\\\\\"margin-right:0.2222222222222222em;\\\\\"></span><span class=\\\\\"mbin\\\\\">+</span><span class=\\\\\"mspace\\\\\" style=\\\\\"margin-right:0.2222222222222222em;\\\\\"></span><span class=\\\\\"mord\\\\\"><span class=\\\\\"mord mathdefault\\\\\" style=\\\\\"margin-right:0.04398em;\\\\\">z</span><span class=\\\\\"msupsub\\\\\"><span class=\\\\\"vlist-t\\\\\"><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:0.740108em;\\\\\"><span style=\\\\\"top:-2.9890000000000003em;margin-right:0.05em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:2.7em;\\\\\"></span><span class=\\\\\"sizing reset-size6 size3 mtight\\\\\"><span class=\\\\\"mord mtight\\\\\">3</span></span></span></span></span></span></span></span></span></span><span style=\\\\\"top:-2.9667090000000003em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:3.2em;\\\\\"></span><span class=\\\\\"hide-tail\\\\\" style=\\\\\"min-width:1.02em;height:1.28em;\\\\\"><svg width=\\\\\"400em\\\\\" height=\\\\\"1.28em\\\\\" viewBox=\\\\\"0 0 400000 1296\\\\\" preserveAspectRatio=\\\\\"xMinYMin slice\\\\\"><path d=\\\\\"M263,681c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl0 -0\nc4.7,-7.3,11,-11,19,-11\nH40000v40H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM1001 80h400000v40h-400000z\\\\\"></path></svg></span></span></span><span class=\\\\\"vlist-s\\\\\">​</span></span><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:0.23329099999999992em;\\\\\"><span></span></span></span></span></span></span></span></span></span></span></p>\"\n`;\n\nexports[`sanitizer do not oversanitize math - test sub/sup 1`] = `\"<p><span class=\\\\\"math math-inline math-display\\\\\"><span class=\\\\\"katex-display\\\\\"><span class=\\\\\"katex\\\\\"><span class=\\\\\"katex-mathml\\\\\"><math xmlns=\\\\\"http://www.w3.org/1998/Math/MathML\\\\\"><semantics><mrow><msub><mn>1</mn><mi>n</mi></msub><mo>+</mo><msup><mn>1</mn><mi>n</mi></msup></mrow><annotation encoding=\\\\\"application/x-tex\\\\\">1_n + 1^n</annotation></semantics></math></span><span class=\\\\\"katex-html\\\\\" aria-hidden=\\\\\"true\\\\\"><span class=\\\\\"base\\\\\"><span class=\\\\\"strut\\\\\" style=\\\\\"height:0.79444em;vertical-align:-0.15em;\\\\\"></span><span class=\\\\\"mord\\\\\"><span class=\\\\\"mord\\\\\">1</span><span class=\\\\\"msupsub\\\\\"><span class=\\\\\"vlist-t vlist-t2\\\\\"><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:0.151392em;\\\\\"><span style=\\\\\"top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:2.7em;\\\\\"></span><span class=\\\\\"sizing reset-size6 size3 mtight\\\\\"><span class=\\\\\"mord mathdefault mtight\\\\\">n</span></span></span></span><span class=\\\\\"vlist-s\\\\\">​</span></span><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:0.15em;\\\\\"><span></span></span></span></span></span></span><span class=\\\\\"mspace\\\\\" style=\\\\\"margin-right:0.2222222222222222em;\\\\\"></span><span class=\\\\\"mbin\\\\\">+</span><span class=\\\\\"mspace\\\\\" style=\\\\\"margin-right:0.2222222222222222em;\\\\\"></span></span><span class=\\\\\"base\\\\\"><span class=\\\\\"strut\\\\\" style=\\\\\"height:0.7143919999999999em;vertical-align:0em;\\\\\"></span><span class=\\\\\"mord\\\\\"><span class=\\\\\"mord\\\\\">1</span><span class=\\\\\"msupsub\\\\\"><span class=\\\\\"vlist-t\\\\\"><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:0.7143919999999999em;\\\\\"><span style=\\\\\"top:-3.113em;margin-right:0.05em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:2.7em;\\\\\"></span><span class=\\\\\"sizing reset-size6 size3 mtight\\\\\"><span class=\\\\\"mord mathdefault mtight\\\\\">n</span></span></span></span></span></span></span></span></span></span></span></span></span></p>\"`;\n\nexports[`sanitizer do not oversanitize math - test vec 1`] = `\n\"<p><span class=\\\\\"math math-inline math-display\\\\\"><span class=\\\\\"katex-display\\\\\"><span class=\\\\\"katex\\\\\"><span class=\\\\\"katex-mathml\\\\\"><math xmlns=\\\\\"http://www.w3.org/1998/Math/MathML\\\\\"><semantics><mrow><mover accent=\\\\\"true\\\\\"><mi>a</mi><mo>⃗</mo></mover></mrow><annotation encoding=\\\\\"application/x-tex\\\\\">\\\\\\\\vec{a}</annotation></semantics></math></span><span class=\\\\\"katex-html\\\\\" aria-hidden=\\\\\"true\\\\\"><span class=\\\\\"base\\\\\"><span class=\\\\\"strut\\\\\" style=\\\\\"height:0.714em;vertical-align:0em;\\\\\"></span><span class=\\\\\"mord accent\\\\\"><span class=\\\\\"vlist-t\\\\\"><span class=\\\\\"vlist-r\\\\\"><span class=\\\\\"vlist\\\\\" style=\\\\\"height:0.714em;\\\\\"><span style=\\\\\"top:-3em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:3em;\\\\\"></span><span class=\\\\\"mord\\\\\"><span class=\\\\\"mord mathdefault\\\\\">a</span></span></span><span style=\\\\\"top:-3em;\\\\\"><span class=\\\\\"pstrut\\\\\" style=\\\\\"height:3em;\\\\\"></span><span class=\\\\\"accent-body\\\\\" style=\\\\\"left:-0.2355em;\\\\\"><span class=\\\\\"overlay\\\\\" style=\\\\\"height:0.714em;width:0.471em;\\\\\"><svg width=\\\\\"0.471em\\\\\" height=\\\\\"0.714em\\\\\" style=\\\\\"width:0.471em\\\\\" viewBox=\\\\\"0 0 471 714\\\\\" preserveAspectRatio=\\\\\"xMinYMin\\\\\"><path d=\\\\\"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z\\\\\"></path></svg></span></span></span></span></span></span></span></span></span></span></span></span></p>\"\n`;\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/__snapshots__/regressions.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`Regression tests HTML endpoint #188 It does not crash on unsupported languages fenced code blocks 1`] = `\n\"<h1 id=\\\\\"foo\\\\\">foo<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#foo\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\n<div class=\\\\\"hljs-code-div hljs-code-foobar\\\\\"><pre><code class=\\\\\"hljs language-foobar\\\\\">console.error(\\\\\"foo\\\\\", true)\n</code></pre></div>\n<div class=\\\\\"hljs-code-div hljs-code-js\\\\\"><pre><code class=\\\\\"hljs language-js\\\\\"><span class=\\\\\"hljs-built_in\\\\\">console</span>.error(<span class=\\\\\"hljs-string\\\\\">\\\\\"foo\\\\\"</span>, <span class=\\\\\"hljs-literal\\\\\">true</span>)\n</code></pre></div>\"\n`;\n\nexports[`Regression tests Latex endpoint It wraps image basenames containing dots 1`] = `\n\"\\\\\\\\image{{x.yz}.png}\n\n\n\n\\\\\\\\externalLink{\\\\\\\\image{/a/{w.x.y.z}.png}}{http://example.com}\n\n\n\n\\\\\\\\image{/{w.x.y.z}.png}\n\n\n\n\\\\\\\\image{/foo.bar/{x.yz}.png}\n\n\"\n`;\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/__snapshots__/server.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`HTML endpoint accepts POSTed markdown 1`] = `\"<h1 id=\\\\\"foo\\\\\">foo<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#foo\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\"`;\n\nexports[`HTML endpoint can use custom iframe elements 1`] = `\n\"<h1 id=\\\\\"you-wont-get-my-data-google\\\\\">You won’t get my data, Google!<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#you-wont-get-my-data-google\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\n<hidden-frame src=\\\\\"https://www.youtube.com/embed/q3zqJs7JUCQ?feature=oembed\\\\\" width=\\\\\"560\\\\\" height=\\\\\"315\\\\\" allowfullscreen frameborder=\\\\\"0\\\\\"></hidden-frame>\"\n`;\n\nexports[`HTML endpoint correctly renders manifest 1`] = `\nObject {\n  \"children\": Array [\n    Object {\n      \"text\": \"<p>On a balcony in summer air</p>\",\n    },\n    Object {\n      \"text\": \"<p>Escape this town for a little while</p>\",\n    },\n    Object {\n      \"text\": \"<p>Marry me, Juliet, you’ll never have to be alone</p>\",\n    },\n  ],\n  \"conclusion\": \"<p>Just say \\\\\"Yes\\\\\"</p>\",\n  \"title\": \"<h1 id=\\\\\"a-story\\\\\">A story<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#a-story\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\",\n}\n`;\n\nexports[`HTML endpoint enforce level shifting by default 1`] = `\n\"<h2 id=\\\\\"i-have-seen-a-dolphin\\\\\">I have seen a dolphin<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#i-have-seen-a-dolphin\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h2>\n<p>On a camera. What is happening with animals these days?\\\\\"</p>\"\n`;\n\nexports[`HTML endpoint produces statistics when configured 1`] = `\n\"<p>7 chars</p>\n<h1 id=\\\\\"13-chars-here\\\\\">13 chars here<a aria-hidden=\\\\\"true\\\\\" tabindex=\\\\\"-1\\\\\" href=\\\\\"#13-chars-here\\\\\"><span class=\\\\\"icon icon-link\\\\\"></span></a></h1>\n<p><a href=\\\\\"https.//github.com/zestedesavoir/zmarkdown\\\\\">13 chars here</a></p>\n<figure><img src=\\\\\"https.//github.com/zestedesavoir/zmarkdown\\\\\" alt=\\\\\"13 chars here\\\\\" loading=\\\\\"lazy\\\\\"><figcaption>13 chars here</figcaption></figure>\n<figure><img src=\\\\\"https.//github.com/zestedesavoir/zmarkdown\\\\\" alt=\\\\\"no chars here\\\\\" loading=\\\\\"lazy\\\\\"><figcaption>13 chars here</figcaption></figure>\"\n`;\n\nexports[`LaTeX endpoint accepts POSTed markdown 1`] = `\n\"\\\\\\\\levelOneTitle{foo}\n\"\n`;\n\nexports[`LaTeX endpoint correctly renders manifest 1`] = `\nObject {\n  \"children\": Array [\n    Object {\n      \"text\": \"I’m standing there\n\n\",\n    },\n    Object {\n      \"text\": \"And I was crying on the staircase\n\n\",\n    },\n    Object {\n      \"text\": \"I got tired of waiting\n\n\",\n    },\n  ],\n  \"conclusion\": \"\\\\\\\\begin{LevelOneConclusion}\nJust say \\\\\"Yes\\\\\"\n\\\\\\\\end{LevelOneConclusion}\n\n\",\n  \"title\": \"\\\\\\\\levelOneTitle{Another story}\n\",\n}\n`;\n\nexports[`Texfile endpoint accepts POSTed markdown 1`] = `\n\"\\\\\\\\documentclass[contentType]{zmdocument}\n\n\\\\\\\\usepackage{blindtext}\n\\\\\\\\title{The Title}\n\\\\\\\\author{FØØ, Bär}\n\\\\\\\\licence[/tmp/l/by-nc-sa.svg]{CC-BY-NC-SA}{https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode}\n\n\\\\\\\\smileysPath{/tmp/s}\n\\\\\\\\makeglossaries\n\n\\\\\\\\begin{document}\n\\\\\\\\maketitle\n\\\\\\\\tableofcontents\n\n\\\\\\\\levelOneTitle{foo}\n\n\\\\\\\\end{document}\"\n`;\n\nexports[`Texfile endpoint allows date 1`] = `\n\"\\\\\\\\documentclass[contentType]{zmdocument}\n\n\\\\\\\\usepackage{blindtext}\n\\\\\\\\title{The Title}\n\\\\\\\\author{FØØ, Bär}\n\\\\\\\\licence[/tmp/l/by-nc-sa.svg]{CC-BY-NC-SA}{https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode}\n\\\\\\\\date{2 mai 1998}\n\\\\\\\\smileysPath{/tmp/s}\n\\\\\\\\makeglossaries\n\n\\\\\\\\begin{document}\n\\\\\\\\maketitle\n\\\\\\\\tableofcontents\n\n\\\\\\\\levelOneTitle{foo}\n\n\\\\\\\\end{document}\"\n`;\n\nexports[`Texfile endpoint allows extra arguments 1`] = `\n\"\\\\\\\\documentclass[contentType]{zmdocument}\n\n\\\\\\\\usepackage{blindtext}\n\\\\\\\\title{The Title}\n\\\\\\\\author{FØØ, Bär}\n\\\\\\\\licence[/tmp/l/by-nc-sa.svg]{CC-BY-NC-SA}{https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode}\n\\\\\\\\logo{/tmp/logo/h2g2.png}\n\\\\\\\\editorLogo{/tmp/logo/pmm.jpg}\n\\\\\\\\tutoLink{https://en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy_(novel)}\n\\\\\\\\editor{https://www.panmacmillan.com/}\n\\\\\\\\smileysPath{/tmp/s}\n\\\\\\\\makeglossaries\n\n\\\\\\\\begin{document}\n\\\\\\\\maketitle\n\\\\\\\\tableofcontents\n\n\\\\\\\\levelOneTitle{foo}\n\n\\\\\\\\end{document}\"\n`;\n\nexports[`Texfile endpoint correctly renders introduction & conclusion 1`] = `\n\"\\\\\\\\documentclass[contentType]{zmdocument}\n\n\\\\\\\\usepackage{blindtext}\n\\\\\\\\title{The Title}\n\\\\\\\\author{FØØ, Bär}\n\\\\\\\\licence[/tmp/l/by-nc-sa.svg]{CC-BY-NC-SA}{https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode}\n\n\\\\\\\\smileysPath{/tmp/s}\n\\\\\\\\makeglossaries\n\n\\\\\\\\begin{document}\n\\\\\\\\maketitle\n\\\\\\\\tableofcontents\n\n\\\\\\\\levelOneTitle{My content™}\n\n\\\\\\\\begin{LevelOneIntroduction}\nHere I introduce My content™\n\\\\\\\\end{LevelOneIntroduction}\n\n\n\\\\\\\\begin{LevelThreeIntroduction}\nHere I introduce My section™\n\\\\\\\\end{LevelThreeIntroduction}\n\n\n\\\\\\\\begin{LevelThreeConclusion}\nHere I conclude My section™\n\\\\\\\\end{LevelThreeConclusion}\n\n\n\\\\\\\\begin{LevelOneConclusion}\nHere I conclude My content™\n\\\\\\\\end{LevelOneConclusion}\n\n\n\\\\\\\\end{document}\"\n`;\n\nexports[`Texfile endpoint escapes title and author 1`] = `\n\"\\\\\\\\documentclass[contentType]{zmdocument}\n\n\\\\\\\\usepackage{blindtext}\n\\\\\\\\title{recap \\\\\\\\#1}\n\\\\\\\\author{titi\\\\\\\\_alone}\n\\\\\\\\licence[/tmp/l/by-nc-sa.svg]{CC-BY-NC-SA}{https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode}\n\n\\\\\\\\smileysPath{/tmp/s}\n\\\\\\\\makeglossaries\n\n\\\\\\\\begin{document}\n\\\\\\\\maketitle\n\\\\\\\\tableofcontents\n\n\\\\\\\\levelOneTitle{foo}\n\n\\\\\\\\end{document}\"\n`;\n\nexports[`Texfile endpoint shifts titles and only titles 1`] = `\n\"\\\\\\\\documentclass[contentType]{zmdocument}\n\n\\\\\\\\usepackage{blindtext}\n\\\\\\\\title{The Title}\n\\\\\\\\author{FØØ, Bär}\n\\\\\\\\licence[/tmp/l/by-nc-sa.svg]{CC-BY-NC-SA}{https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode}\n\n\\\\\\\\smileysPath{/tmp/s}\n\\\\\\\\makeglossaries\n\n\\\\\\\\begin{document}\n\\\\\\\\maketitle\n\\\\\\\\tableofcontents\n\n\\\\\\\\levelThreeTitle{myTitle}\n\n\\\\\\\\begin{LevelOneIntroduction}\nmyIntro\n\\\\\\\\end{LevelOneIntroduction}\n\n\n\\\\\\\\end{document}\"\n`;\n\nexports[`Texfile endpoint transform quizzes for document 1`] = `\n\"\\\\\\\\documentclass[contentType]{zmdocument}\n\n\\\\\\\\usepackage{blindtext}\n\\\\\\\\title{The Title}\n\\\\\\\\author{FØØ, Bär}\n\\\\\\\\licence[/tmp/l/by-nc-sa.svg]{CC-BY-NC-SA}{https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode}\n\n\\\\\\\\smileysPath{/tmp/s}\n\\\\\\\\makeglossaries\n\n\\\\\\\\begin{document}\n\\\\\\\\maketitle\n\\\\\\\\tableofcontents\n\n\\\\\\\\begin{Neutral}[{{What is true?}}]\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax true\n\\\\\\\\item\\\\\\\\relax false\n\\\\\\\\end{itemize}\n\\\\\\\\end{Neutral}\n\n\n\\\\\\\\begin{Spoiler}[{{Correction}}]\n\\\\\\\\begin{itemize}\n\\\\\\\\item\\\\\\\\relax true\n\\\\\\\\item\\\\\\\\relax false\n\\\\\\\\end{itemize}\n\\\\\\\\end{Spoiler}\n\n\\\\\\\\end{document}\"\n`;\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/api.test.js",
    "content": "const clone = require('clone')\nconst dedent = require('dedent')\nconst zmarkdown = require('../common')\n\nconst trimContent = vfile => vfile.contents.trim()\n\ndescribe('mdast', () => {\n  it('uses default config', () => {\n    const parser = zmarkdown(null)\n\n    expect(parser('# some md\\n\\n@hello')).toMatchSnapshot()\n  })\n\n  it('can take custom config', () => {\n    const mdastConfig = clone(require('../config/mdast'))\n    mdastConfig.ping.pingUsername = _ => false\n\n    const parser = zmarkdown(null, mdastConfig)\n\n    expect(parser('# some md\\n\\n@hello')).toMatchSnapshot()\n  })\n})\n\ndescribe('html', () => {\n  it('uses default config', () => {\n    const parser = zmarkdown('html')\n\n    expect(parser(dedent`\n      # some md\n\n      \\`\\`\\`latex\n      Some LaTeX\n      \\`\\`\\`\n    `).then(trimContent)).resolves.toMatchSnapshot()\n  })\n\n  it('can take custom config', () => {\n    const mdastConfig = clone(require('../config/mdast'))\n    const htmlConfig = clone(require('../config/html'))\n\n    htmlConfig.postProcessors.wrapCode = false\n\n    const parser = zmarkdown('html', mdastConfig, htmlConfig)\n\n    expect(parser(dedent`\n      # some md\n\n      \\`\\`\\`latex\n      Some LaTeX\n      \\`\\`\\`\n    `).then(trimContent)).resolves.toMatchSnapshot()\n  })\n})\n\ndescribe('latex', () => {\n  it('uses default config', () => {\n    const parser = zmarkdown('latex')\n\n    expect(parser('# some md').then(trimContent)).resolves.toMatchSnapshot()\n  })\n\n  it('can take custom config', () => {\n    const mdastConfig = clone(require('../config/mdast'))\n    const latexConfig = clone(require('../config/latex'))\n\n    latexConfig.headings[0] = (val) => `\\\\thisIsNotATitle{${val}}\\n`\n\n    const parser = zmarkdown('latex', mdastConfig, latexConfig)\n\n    expect(parser('# some md').then(trimContent)).resolves.toMatchSnapshot()\n  })\n})\n\ndescribe('misc', () => {\n  it('can use callback', done => {\n    const parser = zmarkdown('latex')\n\n    parser('# some md', (err, vfile) => {\n      expect(err).toBeNull()\n      expect(trimContent(vfile)).toMatchSnapshot()\n\n      done()\n    })\n  })\n})\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/html-suite.test.js",
    "content": "const dedent = require('dedent')\n\nconst {\n  defaultMdastConfig,\n  defaultHtmlConfig,\n  renderAs,\n} = require('../utils/renderer-tests')\n\nconst renderString = renderAs('html')\n\ndescribe('math', () => {\n  it('must escape a dollar with backslash', () => {\n    const markdown = '$\\\\alpha\\\\$'\n\n    expect(renderString(markdown)).resolves.not.toMatch('inlineMath')\n  })\n\n  it('must not parse a raw starting dollar', () => {\n    const markdown = '`$`\\\\alpha$'\n\n    expect(renderString(markdown)).resolves.not.toMatch('inlineMath')\n  })\n\n  it('must not parse a raw ending dollar', () => {\n    const markdown = '$\\\\alpha`$` foo'\n\n    expect(renderString(markdown)).resolves.not.toMatch('inlineMath')\n  })\n\n  it(\"must not parse what's inside inline maths as markdown\", () => {\n    const markdown = '$`\\\\alpha`$'\n\n    expect(renderString(markdown)).resolves.not.toMatch('<pre')\n  })\n\n  it('properly loads extensions - mhchem', async () => {\n    const markdown = '$\\\\ce{H2O}$'\n    const result = await renderString(markdown, true)\n\n    expect(result.messages).toEqual([])\n    expect(result.contents).toContain('<span class=\"mord mathrm\">H</span>')\n  })\n})\n\ndescribe('pedantic', () => {\n  it('must not parse * and _ surrounded by spaces', () => {\n    const markdown = 'a * b * c'\n\n    expect(renderString(markdown)).resolves.not.toMatch('strong')\n  })\n})\n\nconst maxNesting = defaultMdastConfig.postProcessors.limitDepth\ndescribe('depth checks', () => {\n  it(`is fast enough with ${maxNesting} nested quotes`, () => {\n    const base = ['foo', '\\n']\n    const input = Array.from({length: maxNesting}).reduce((acc, _, i) => {\n      return acc + base.map((x, j) => ('>'.repeat(i) + ((i && !j && ' ') || '') + x)).join('\\n')\n    }, '')\n\n    const a = Date.now()\n    const render = renderString(input).then((ok, fail) => {\n      const b = Date.now()\n      if ((b - a) < 2000) return Promise.resolve('ok')\n      return Promise.reject(`Rendering ${maxNesting} nest blockquotes took too long: ${b - a}ms.`)\n    })\n\n    return expect(render).resolves.toBe('ok')\n  })\n\n  it(`fails with > ${maxNesting} nested quotes`, () => {\n    const base = ['foo', '\\n']\n    const input = Array.from({length: maxNesting + 1}).reduce((acc, _, i) => {\n      return acc + base.map((x, j) => ('>'.repeat(i) + ((i && !j && ' ') || '') + x)).join('\\n')\n    }, '')\n\n    return expect(\n      renderString(input).catch((err) => Promise.reject(err.message)),\n    ).rejects.toContain(`Markdown AST too complex: tree depth > ${maxNesting}`)\n  })\n})\n\ndescribe('tables', () => {\n  it(`with pipes in code in cells`, () => {\n    const input = dedent`\n      Titre 1 | Titre 2\n      --------|--------\n      \\`ici ok\\`| \\`gauche | droite\\`\n    `\n\n    return expect(renderString(input)).resolves.toContain('<td>`gauche</td>')\n  })\n\n  it(`with escaped pipes in code in cells`, () => {\n    const input = dedent`\n      Titre 1 | Titre 2\n      --------|--------\n      \\`ici ok\\`| \\`gauche \\| droite\\`\n    `\n\n    return expect(renderString(input)).resolves.toContain('<td><code>gauche \\\\| droite</code></td>')\n  })\n})\n\ndescribe('images become figures:', () => {\n  it('works with only an image', () => {\n    const input = dedent`\n      ![wrapped into _figure_](http://blabla.fr)`\n    return expect(renderString(input)).resolves.toMatchSnapshot()\n  })\n\n  it('does not apply to images not alone in a block', async () => {\n    const input = dedent`\n      ![wrapped into figure](http://blabla.fr)\n      one image`\n\n    expect(await renderString(input)).not.toContain('<figure')\n\n    const input2 = dedent`\n      one image\n      ![wrapped into figure](http://blabla.fr)`\n\n    expect(await renderString(input2)).not.toContain('<figure')\n  })\n\n  it('does not apply to images without [alt]', async () => {\n    const input = dedent`![](http://example.com)`\n\n    expect(await renderString(input)).not.toContain('<figure')\n  })\n\n  it('does not transform inline images', async () => {\n    const input = dedent`\n      one image ![not wrapped into figure because inline](http://blabla.fr)\n    `\n    expect(await renderString(input)).not.toContain('<figure')\n  })\n\n  it('does not apply when a caption is present', async () => {\n    const input = dedent`\n      ![foo](http://example.com)\n\n      ![](http://example.com)\n      Figure: Caption\n\n      ![foo](http://example.com)\n      Figure: Caption\n\n      ![](http://example.com)\n      Figure:\n    `\n    const result = await renderString(input)\n\n    expect(result).not.toContain('<p><figure')\n    expect(result).toMatchSnapshot()\n  })\n})\n\ndescribe('ping', () => {\n  beforeEach(() => {\n    defaultMdastConfig.ping.pingUsername = () => true\n  })\n\n  it(`does not ping parts of email addresses`, () => {\n    const input = 'My email address is test@test.com.'\n\n    return expect(renderString(input)).resolves.not.toContain('ping')\n  })\n\n  afterEach(() => {\n    defaultMdastConfig.ping.pingUsername = () => false\n  })\n})\n\ndescribe('oembed', () => {\n  it.skip(`correctly render oEmbed iframe`, () => {\n    const input = '!(https://soundcloud.com/paresh-sankhe/sets/h2g2)'\n\n    return expect(renderString(input)).resolves.toContain('<iframe')\n  })\n})\n\ndescribe('smileys', () => {\n  it(`translates >_<`, () => {\n    const input = 'This is funny >_<'\n\n    return expect(renderString(input)).resolves.toMatchSnapshot()\n  })\n\n  it(`translates X/`, () => {\n    const input = 'This is funny X/'\n\n    return expect(renderString(input)).resolves.toMatchSnapshot()\n  })\n\n  it(`translates cthulhu`, () => {\n    const input = '^(;,;)^'\n\n    return expect(renderString(input)).resolves.toMatchSnapshot()\n  })\n})\n\ndescribe('pedantic mode disabled', () => {\n  it(`unordered lists markers`, () => {\n    const input = dedent`\n      * a\n      - b\n      * c\n    `\n\n    return expect(renderString(input)).resolves.toMatchSnapshot()\n  })\n\n  it(`leading spaces in list item`, async () => {\n    const three = dedent`\n      *    a\n    `\n    expect(await renderString(three)).not.toContain('<pre>')\n\n    const four = dedent`\n      *     a\n    `\n    expect(await renderString(four)).toContain('<pre>')\n\n    const five = dedent`\n      *      a\n    `\n    expect(await renderString(five)).toContain('<pre>')\n  })\n\n  it(`em`, () => {\n    const input = dedent`\n      no_em_here\n\n      http://localhost/foo_bar_baz\n    `\n\n    return expect(renderString(input)).resolves.not.toContain('<em>')\n  })\n})\n\n\ndescribe('code highlight special cases', () => {\n  beforeEach(() => {\n    defaultHtmlConfig.disableTokenizers.internal = []\n    defaultHtmlConfig.bridge.handlers = {\n      code: require('../utils/code-handler'),\n    }\n    defaultHtmlConfig.postProcessors.codeHighlight = true\n  })\n\n  it('does not count one-liners', () => {\n    const input = dedent`\n      \\`\\`\\`js\n      const a = 1\n      \\`\\`\\`\n    `\n\n    expect(renderString(input)).resolves.toMatchSnapshot()\n  })\n\n  it('does not highlight console', () => {\n    const input = dedent `\n      \\`\\`\\`console\n      echo \"Hello world\"\n      \\`\\`\\`\n    `\n    expect(renderString(input)).resolves.toMatchSnapshot()\n  })\n\n  it('highlights latex', async () => {\n    const input = [\n      '```latex',\n      '\\\\usepackage{inputenc}[utf8]',\n      '\\\\begin{document}',\n      '\\\\texttt{code}',\n      '\\\\end{document}',\n      '```',\n    ]\n\n    const result1 = await renderString(input.join('\\n'))\n    expect(result1).toMatchSnapshot()\n  })\n\n  it('highlights latex as tex', async () => {\n    const input = [\n      '```latex',\n      '\\\\usepackage{inputenc}[utf8]',\n      '\\\\begin{document}',\n      '\\\\texttt{code}',\n      '\\\\end{document}',\n      '```',\n    ]\n\n    const result1 = (await renderString(input.join('\\n')))\n      .replace('language-latex', '')\n      .replace('hljs-code-latex', '')\n\n    input[0] = '```tex'\n    const result2 = (await renderString(input.join('\\n')))\n      .replace('language-tex', '')\n      .replace('hljs-code-tex', '')\n\n    expect(result2).toBe(result1)\n  })\n\n  it('supports hl_lines - spaced syntax', async () => {\n    const input = dedent `\n      \\`\\`\\`python hl_lines=\"4 5\"\n      def main():\n        print('It\\'s amazing!')\n      \n      def unused():\n        print('Please use me!')\n      \\`\\`\\`\n    `\n\n    const result = await renderString(input)\n    expect((result.match(/class=\"hll\"/g) || []).length).toBe(2)\n    expect(result).toMatchSnapshot()\n  })\n\n  it('supports hl_lines - comma syntax', async () => {\n    const input = dedent `\n      \\`\\`\\`python hl_lines=4,5\n      def main():\n        print('It\\'s amazing!')\n      \n      def unused():\n        print('Please use me!')\n      \\`\\`\\`\n    `\n\n    const result = await renderString(input)\n    expect((result.match(/class=\"hll\"/g) || []).length).toBe(2)\n    expect(result).toMatchSnapshot()\n  })\n\n  it('supports hl_lines - interval syntax', async () => {\n    const input = dedent `\n    \\`\\`\\`python hl_lines=1-3\n    def main():\n      print('It\\'s amazing!')\n    \n    def unused():\n      print('Please use me!')\n    \\`\\`\\`\n    `\n\n    const result = await renderString(input)\n    expect((result.match(/class=\"hll\"/g) || []).length).toBe(3)\n    expect(result).toMatchSnapshot()\n  })\n\n  it('supports hl_lines - interval syntax reversed', async () => {\n    const input = dedent `\n    \\`\\`\\`python hl_lines=3-1\n    def main():\n      print('It\\'s amazing!')\n    \n    def unused():\n      print('Please use me!')\n    \\`\\`\\`\n    `\n\n    const result = await renderString(input)\n    expect((result.match(/class=\"hll\"/g) || []).length).toBe(3)\n    expect(result).toMatchSnapshot()\n  })\n\n  it('supports linenostart', async () => {\n    const input = dedent `\n      \\`\\`\\`python linenostart=3\n      def main():\n        print('It\\'s amazing!')\n      \n      def unused():\n        print('Please use me!')\n      \\`\\`\\`\n    `\n\n    const result = await renderString(input)\n    expect(result).not.toContain('data-count=\"1\"')\n    expect(result).toMatchSnapshot()\n  })\n\n  it('supports both hl_lines and linenostart', () => {\n    const input = dedent `\n      \\`\\`\\`python hl_lines=4 linenostart=3\n      def main():\n        print('It\\'s amazing!')\n      \n      def unused():\n        print('Please use me!')\n      \\`\\`\\`\n    `\n\n    expect(renderString(input)).resolves.toMatchSnapshot()\n  })\n\n  it('discards unused attributes', async () => {\n    const input = dedent `\n      \\`\\`\\`python none hl_lines\n      def main():\n        print('It\\'s amazing!')\n      \n      def unused():\n        print('Please use me!')\n      \\`\\`\\`\n    `\n\n    const result = await renderString(input)\n    expect(result).not.toContain('class=\"hll\"')\n    expect(result).toMatchSnapshot()\n  })\n\n  afterEach(() => {\n    defaultHtmlConfig.disableTokenizers.internal = ['highlight']\n    defaultHtmlConfig.bridge.handlers = {}\n    defaultHtmlConfig.postProcessors.codeHighlight = false\n  })\n})\n\ndescribe('Sanitize HTML to prevent XSS', () => {\n  it('XSS test', () => {\n    const input = dedent `\n    [test XSS](javascript:alert(11))\n    `\n    // remove href\n    return expect(renderString(input)).resolves.toContain('<a>')\n  })\n  it('auto-link XSS', () => {\n    const input = dedent `\n    <javascript:console.log(\"XSS\")>\n    `\n    // Not auto-link anymore\n    return expect(renderString(input)).resolves.not.toContain('</a>')\n  })\n  it('advanced XSS', () => {\n    const input = dedent `\n    This is [not obvious](   lives\\0cript:promp('It works !')) !\n    `\n    return expect(renderString(input)).resolves.toMatchSnapshot()\n  })\n  it('Iframe XSS', () => {\n    const input = dedent `\n    !(javascript:alert(\"XSS\"))\n    `\n    return expect(renderString(input)).resolves.not.toContain('iframe')\n  })\n})\n\ndescribe('footnotes', () => {\n  it('orders footnotes as their definitions', async () => {\n    const input = dedent `\n      a[^first_footnote_reference]\n      b[^\\`b\\` second footnote reference but first footnote definition]\n      c[^last_footnote_reference]\n\n      [^last_footnote_reference]: \\`c\\` last footnote reference but second footnote definition\n      [^first_footnote_reference]: \\`a\\` first footnote reference but last footnote definition\n    `\n    const html = await renderString(input)\n    let [, olContent] = html.split('<ol>')\n    ;[olContent] = olContent.split('</ol>')\n    const footnotes = olContent\n      .split('\\n')\n      .filter(Boolean)\n      .map((line) => parseInt(line.match(/\"fn-(\\d+)/)[1]))\n    expect(footnotes).toStrictEqual(Array.from(footnotes).sort())\n  })\n})\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/latex-suite.test.js",
    "content": "/* eslint-disable max-len */\nconst dedent = require('dedent')\n\nconst {\n  defaultMdastConfig,\n  renderAs,\n} = require('../utils/renderer-tests')\n\nconst renderString = renderAs('latex')\n\ntest('html nodes', () => {\n  const p = renderString(dedent`\n    # foo\n    **something <a> else**\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('link with special characters', () => {\n  const p = renderString(dedent`\n    [foo](http://example.com?a=b%c^{}#foo)\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('heading', () => {\n  const p = renderString(dedent`\n    # first level title\n    ## second level title\n    ### third level title\n    #### fourth level title\n    ##### fifth level title\n    ###### sixth level title\n\n    # a \\ b\n    # a } b\n    # a } \\ b\n    # a \\} b\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('paragraph', () => {\n  const p = renderString(dedent`\n    # first 1\n\n    Disrupt asymmetrical unicorn, pok pok kale chips umami selfies gastropub food truck flannel. Blue bottle craft beer hexagon artisan. Chia gochujang crucifix, readymade hammock blog succulents sriracha raw denim scenester cray typewriter fashion axe art party. Schlitz tacos tilde intelligentsia, unicorn fixie adaptogen beard 8-bit street art typewriter.\n\n    ## second 1\n\n    Literally selfies tbh lo-fi. Actually health goth ennui, brooklyn retro polaroid sriracha. Kogi live-edge mixtape marfa street art synth. Godard synth truffaut selfies, vape fanny pack subway tile. Stumptown af pabst, try-hard fam ethical actually four dollar toast. Microdosing kogi brooklyn, locavore jianbing etsy sartorial YOLO. Williamsburg salvia photo booth readymade listicle man braid.\n\n    Marfa pickled helvetica put a bird on it hot chicken williamsburg. Edison bulb asymmetrical keffiyeh schlitz iceland put a bird on it hoodie affogato. Tofu tote bag distillery viral knausgaard, health goth asymmetrical.\n\n    Asymmetrical pug scenester sustainable enamel pin distillery quinoa keffiyeh. Flannel humblebrag PBR&B polaroid banh mi wolf. Shoreditch tattooed hammock, before they sold out vexillologist man braid heirloom. Activated charcoal craft beer cloud bread meh biodiesel pabst.\n\n    ### third 1\n\n    Art party keytar godard iceland neutra cronut. Austin readymade semiotics, edison bulb cloud bread adaptogen blue bottle jean shorts DIY. Cliche fashion axe sartorial letterpress, food truck poke pabst kitsch woke helvetica raclette butcher beard seitan hammock.\n\n    Hexagon lo-fi seitan you probably haven't heard of them, bicycle rights small batch meditation try-hard green juice banh mi keffiyeh. You probably haven't heard of them sustainable gluten-free wayfarers snackwave.\n\n    ### third 2\n    #### fourth 1\n\n    Mumblecore kombucha offal, health goth next level before they sold out gluten-free chicharrones keffiyeh. Mumblecore kickstarter hoodie fixie keffiyeh. Microdosing lo-fi taiyaki irony pok pok. Banjo brooklyn umami succulents flexitarian. Swag sartorial scenester synth viral.\n\n    ##### fifth 1\n\n    Banjo bespoke subway tile, street art drinking vinegar offal franzen. Pour-over green juice vaporware kale chips. Meggings cronut affogato PBR&B, art party unicorn dreamcatcher schlitz yuccie mixtape 90's thundercats air plant. Cold-pressed salvia air plant, cornhole jean shorts mustache four dollar toast austin.\n\n    ### third 3\n\n    Meditation heirloom chicharrones, sartorial man braid hot chicken sustainable. Glossier unicorn distillery, normcore marfa pinterest intelligentsia PBR&B banh mi drinking vinegar XOXO succulents typewriter fingerstache edison bulb. Meditation ethical cronut glossier cliche kickstarter.\n\n    #### fourth 2\n\n    Venmo bushwick food truck chartreuse fam. Everyday carry gastropub glossier, cold-pressed salvia migas keytar. Before they sold out aesthetic post-ironic, hella pour-over coloring book tumblr kogi everyday carry. Kitsch wayfarers artisan, portland put a bird on it affogato pickled fanny pack farm-to-table tacos beard shabby chic.\n\n    #### fourth 3\n\n    Chambray intelligentsia vape listicle. Pok pok snackwave cronut retro hot chicken, trust fund master cleanse keytar forage dreamcatcher. Taiyaki actually deep v, godard small batch irony lumbersexual unicorn cardigan af. Irony lumbersexual salvia, pitchfork fam snackwave man bun. Kitsch jianbing intelligentsia freegan, waistcoat raw denim cloud bread vice cray etsy listicle skateboard jean shorts.\n\n    ##### fifth 2\n\n    Asymmetrical normcore portland, vaporware viral tote bag DIY slow-carb kogi fanny pack. Keffiyeh ennui church-key, irony VHS man bun edison bulb listicle cloud bread try-hard cred lumbersexual lo-fi glossier.\n\n    # first 2\n    ## second 2\n    ##### fifth 3\n\n    Messenger bag locavore swag raclette brunch whatever, portland food truck. PBR&B cred mlkshk, poke letterpress waistcoat celiac. La croix letterpress forage keffiyeh.\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('inline-code', () => {\n  const p = renderString(dedent`\n    a paragraph \\`with inline code\\`.\n\n    \\`a\n    multiline\n    inlinecode\\`\n\n    \\`a code with \\ \\`\n\n    \\`a \\text in \\LaTeX \\\\\\`\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('emoticon', () => {\n  const p = renderString(`foo :p bar :)`)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('table', () => {\n  const p = renderString(dedent`\n    1 | 2\n    --|--\n    1|2\n    1|2\n    1|2\n\n\n    1 | 2 | 3\n    --|---|--\n    1 | 2\n    1 | 2 | 3\n    1 | 2 | 3\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('blockquote', () => {\n  const p = renderString(dedent`\n    > a quote\n\n    > a\n    > multiline\n    > quote\n\n    ---\n\n    > a quote\n\n    ---\n\n    > a\n    > multiline\n    > quote\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('figure+caption', () => {\n  const p = renderString(dedent`\n    > a\n    > multiline\n    > quote\n    Source: With Source\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('code', () => {\n  const p = renderString(dedent`\n    \\`\\`\\`python\n    print('bla')\n    \\`\\`\\`\n\n    \\`\\`\\`python hl_lines=1,2\n    print('bla')\n    print('bla')\n    print('bla')\n    \\`\\`\\`\n\n    \\`\\`\\`python linenostart=10\n    print('bla')\n    print('bla')\n    print('bla')\n    \\`\\`\\`\n\n    \\`\\`\\`python hl_lines=1,2 linenostart=10\n    print('bla')\n    print('bla')\n    print('bla')\n    \\`\\`\\`\n\n    \\`\\`\\`css hl_lines=\"2\"\n    .tmp {\n      font-weight: bold;\n    }\n    \\`\\`\\`\n\n    \\`\\`\\`css hl_lines='1,3'\n    .tmp {\n      font-weight: bold;\n    }\n    \\`\\`\\`\n\n    \\`\\`\\`\n    a code without lang\n    \\`\\`\\`\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('code+reversed-hl', () => {\n  const p = renderString(dedent`\n    \\`\\`\\`python hl_lines=3-2\n    print('bla')\n    print('bla')\n    print('bla')\n    \\`\\`\\`\n\n    \\`\\`\\`python hl_lines=2-1,4-3\n    print('bla')\n    print('bla')\n    print('bla')\n    print('bla')\n    \\`\\`\\`\n  `)\n\n  return expect(p).resolves.toMatchSnapshot() &&\n    expect(p).not.toContain('3-2') &&\n    expect(p).not.toContain('2-1') &&\n    expect(p).not.toContain('4-3')\n})\n\ntest('code+caption', () => {\n  const p = renderString(dedent`\n    \\`\\`\\`python\n    print('bla')\n    \\`\\`\\`\n    Code: With Source\n\n    \\`\\`\\`python hl_lines=1,2\n    print('bla')\n    print('bla')\n    print('bla')\n    \\`\\`\\`\n    Code: With Source\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('list', () => {\n  const p = renderString(dedent`\n    - an\n    - **unordered**\n    - list\n\n\n    1. an\n    1. \\`ordered\\`\n    1. list\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('link', () => {\n  const p = renderString(dedent`\n    [an external link](https://wikipedia.com)\n\n\n    [an internal link](/forums)\n\n\n    [an \\`external\\` link](https://wikipedia.com)\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('mix-1', () => {\n  const p = renderString(dedent`\n    (for convenience, · are replaced with simple single spaces in the tests)\n    # first 1\n\n    foo··\n    bar\n\n    Disrupt ~~asymmetrical~~ unicorn, pok pok kale chips umami selfies gastropub food truck flannel. Blue **bottle craft** beer hexagon artisan. Chia gochujang crucifix, ^ready^ ^made^ hammock _blog succulents_ sriracha raw denim scenester cray typewriter fashion axe ~art~ *party*. Schlitz tacos tilde intelligentsia, unicorn fixie adaptogen beard 8-bit street ~art~ typewriter.\n\n    ## *second* 1\n\n    **Literally selfies tbh lo-fi. Actually health goth ennui, brooklyn retro polaroid sriracha. Kogi live-edge mixtape marfa street ~art~ synth. Godard synth truffaut selfies, vape fanny ~~pack~~ subway tile. Stumptown af pabst, try-hard fam ethical actually four dollar toast. Microdosing kogi brooklyn, locavore jianbing etsy sartorial _YOLO_. Williamsburg salvia photo booth ^readymade^ listicle man braid.**\n\n    ---\n\n    > Marfa pickled helvetica put a bird on it hot chicken williamsburg.\n    > Edison bulb asymmetrical \\`keffiyeh\\` schlitz iceland put a bird on it hoodie affogato.\n    >\n    > Tofu tote bag distillery viral knausgaard, health goth asymmetrical.\n    Source: Guru\n\n    Asymmetrical pug scenester sustainable enamel pin distillery quinoa keffiyeh. Flannel humblebrag PBR&B polaroid banh mi wolf. Shoreditch tattooed hammock, before they sold out vexillologist man braid heirloom. Activated charcoal craft beer cloud bread meh biodiesel pabst.\n\n    ### ~~third~~ 1\n\n    Art party keytar godard iceland neutra cronut. Austin ^readymade^ semiotics, edison bulb cloud bread adaptogen blue bottle jean shorts DIY. Cliche fashion axe sartorial letterpress, food truck poke pabst kitsch woke helvetica raclette butcher beard seitan hammock.\n\n    \\`foo\n    bar\\`\n\n    > \\`fo\\o\n    > bar\\`\n\n    Hexagon lo-fi seitan you probably haven't heard of them, bicycle rights small batch meditation try-hard green juice banh mi keffiyeh. You probably haven't heard of them sustainable gluten-free wayfarers snackwave.\n\n    ### third 2\n    #### ~~fo~~u**r**t*h* _1_\n\n    Mumblecore kombucha offal, health goth next level before they sold out gluten-free chicharrones keffiyeh. Mumblecore kickstarter hoodie fixie keffiyeh. Microdosing lo-fi taiyaki irony pok pok. Banjo brooklyn umami succulents flexitarian. Swag sartorial scenester synth viral.\n\n    ##### fifth 1\n\n    Banjo bespoke subway tile, street ~a*r*~^t^ drinking vinegar offal franzen. Pour-over green juice vaporware kale chips. Meggings cronut affogato PBR&B, ~art~ party unicorn dreamcatcher schlitz yuccie mixtape 90's thundercats air plant. Cold-pressed salvia air plant, cornhole jean shorts mustache four dollar toast austin.\n\n    ### third 3\n\n    Meditation heirloom chicharrones, sartorial man braid hot chicken sustainable. Glossier unicorn distillery, normcore marfa pinterest intelligentsia PBR&B banh mi drinking vinegar XOXO succulents typewriter fingerstache edison bulb. Meditation ethical cronut glossier cliche kickstarter.\n\n    #### fourth 2\n\n    Venmo bushwick food truck chartreuse fam. Everyday carry gastropub glossier, cold-pressed salvia migas keytar. Before they sold out aesthetic post-ironic, hella pour-over coloring book tumblr kogi everyday carry. Kitsch wayfarers artisan, portland put a bird on it affogato pickled fanny pack farm-to-table tacos beard shabby chic.\n\n    #### fourth 3\n\n    Chambray intelligentsia vape listicle. Pok pok snackwave cronut retro hot chicken, trust fund master cleanse keytar forage dreamcatcher. Taiyaki actually deep v, godard small batch irony lumbersexual unicorn cardigan af. Irony lumbersexual salvia, pitchfork fam snackwave man bun. Kitsch jianbing intelligentsia freegan, waistcoat raw denim cloud bread vice cray etsy listicle skateboard jean shorts.\n\n    ##### fifth 2\n\n    Asymmetrical normcore portland, vaporware viral tote bag DIY slow-carb kogi fanny pack. Keffiyeh ennui church-key, irony VHS man bun edison bulb listicle cloud bread try-hard cred lumbersexual lo-fi glossier.\n\n    # first 2\n    ## second 2\n    ##### fifth 3\n\n    Messenger bag locavore swag raclette brunch whatever, portland food truck. PBR&B cred mlkshk, poke letterpress waistcoat celiac. La croix letterpress forage keffiyeh.\n  `.replace(/·/g, ' '))\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('mix-2', () => {\n  const p = renderString(dedent`\n    (for convenience, · are replaced with simple single spaces in the tests)\n    # first 1\n\n    > Code inside quote\n    > \\`\\`\\`python\n    > print('bla')\n    > \\`\\`\\`\n    > Code: code source\n    Source: Quotation Source\n\n    \\`\\`\\`python\n    print('bla')\n    \\`\\`\\`\n    Code: First ||CTRL||+||S||\n    Code: Second\n\n    \\`\\`\\`python\n    print('code without caption')\n    \\`\\`\\`\n  `.replace(/·/g, ' '))\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('mix-3', () => {\n  const p = renderString(dedent`\n    # right-aligned list\n\n    ->\n    - item\n    - item\n    ->\n\n    # centered list\n\n    ->\n    - item\n    - item\n    - item\n    <-\n\n\n    # left list\n\n    <-\n    - item\n    - item\n    - item\n    <-\n  `.replace(/·/g, ' '))\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('mix-4', () => {\n  const p = renderString(dedent`\n    +-------+----------+------+\n    | Sub   | Headings | ABBR |\n    +=======+==========+======+\n    | cell  | column spanning |\n    | spans +----------+------+\n    | rows  | normal   | cell |\n    +-------+----------+------+\n    | multi | cells can be    |\n    | line  | *formatted*     |\n    |       | **paragraphs**  |\n    | cells |                 |\n    | too   |                 |\n    +-------+-----------------+\n    Table: The new table ABBR [^foot] with ||CTRL|| + ||S||\n\n    *[ABBR]: abbreviation\n\n    [^foot]: a foot\n\n    +-----------+---------------------------------------------------------------+\n    | title     |  image                                                        |\n    +===========+===============================================================+\n    | space     | ![space](https://i.ytimg.com/vi/lt0WQ8JzLz4/maxresdefault.jpg)|\n    +-----------+---------------------------------------------------------------+\n\n    +-----------+--------------------+\n    | title     | code               |\n    +===========+====================+\n    | inline    | \\`inline\\` br        |\n    |           | \\`inline\\`           |\n    +-----------+--------------------+\n    | block     | \\`\\`\\`python          |\n    |           | print('bla')       |\n    |           | \\`\\`\\`                |\n    +-----------+--------------------+\n  `.replace(/·/g, ' '))\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('mix-5', () => {\n  const p = renderString(dedent`\n    ![](http://www.numerama.com/content/uploads/2016/07/espace.jpg)\n    Figure: espace[^node]\n\n    [^node]: Two things are infinite: the universe and human stupidity.\n  `.replace(/·/g, ' '))\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('mix-6', () => {\n  const p = renderString(dedent`\n    !(https://www.youtube.com/watch?v=8TQIvdFl4aU)\n    Video: a caption\n\n    !(https://www.youtube.com/watch?v=8TQIvdFl4aU)\n\n    no caption\n  `.replace(/·/g, ' '))\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('footnotes', () => {\n  const p = renderString(dedent`\n    # mytitle A[^footnoteRef]\n\n    [^footnoteRef]: reference in title\n\n    # mytitle B^[footnoterawhead inner]\n\n    # myti*tle C^[foo inner]*\n\n    a paragraph^[footnoteRawPar inner]\n  `)\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('math', () => {\n  const p = renderString(dedent`\n    A sentence ($S$) with *italic* and inline math ($C_L$) and $$b$$ another.\n\n    $$\n    L = \\frac{1}{2} \\rho v^2 S C_L\n    $$\n\n    This should be escaped: $\\pink{\\text{I love \\LaTeX} \\immediate\\write18{ls / > outputrce} \\input{outputrce}}$.\n\n    hehe\n  `)\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('ping', () => {\n  defaultMdastConfig.ping.pingUsername = () => true\n\n  const p = renderString(dedent`\n    Hello @you and @you_too, and @**also you**\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('custom-blocks', () => {\n  defaultMdastConfig.ping.pingUsername = () => false\n\n  const p = renderString(dedent`\n    [[i]]\n    | info\n\n    [[a]]\n    | warning\n\n    [[s]]\n    | secret\n\n    [[s]]\n    | imbricated spoilers\n    | [[s]]\n    | | and another\n    | | [[s]]\n    | | | and that's it\n\n    [[s]]\n    | imbricated spoilers\n    | [[s]]\n    | | second level\n    | [[s]]\n    | | second level too\n\n    [[s]]\n    | imbricated spoilers\n    | [[s]]\n    | | second level\n    |\n    | with text in between\n    |\n    | [[s]]\n    | | second level too\n\n    [[s]]\n    | imbricated spoilers\n    |\n    | \\`\\`\\`markdown\n    | and here is some code\n    | \\`\\`\\`\n    |\n    | [[s]]\n    | | second level\n\n    [[s]]\n    | do not over-flattenize\n    | [[s]]\n    | | expected to be flattened\n    |\n    | first level\n    |\n    | [[q]]\n    | | this remains a question\n\n    [[s]]\n    | flattenize children of children\n    | [[q]]\n    | | this remains a question\n    | | [[s]]\n    | | | but the content in it is flattened to the question\n\n    [[q]]\n    | question \\`coded\\`\n\n    [[e]]\n    | **error**\n    | foo bar··\n    | baz\n  `.replace(/·/g, ' '))\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('regression: code block without language', () => {\n  const p = renderString(dedent`\n    \\`\\`\\`\n    a\n    \\`\\`\\`\n  `)\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('properly loads extensions - mhchem', () => {\n  const markdown = '$\\\\ce{H2O}$'\n  const result = renderString(markdown)\n\n  return expect(result).resolves.toContain(markdown)\n})\n\ntest('codes in notes', () => {\n  const p = renderString(dedent`\n    hello [^note][^note-caption]\n\n    [^note]:\n        test\n        \\`\\`\\`javascript\n        console.log('hello')\n        \\`\\`\\`\n\n    [^note-caption]:\n        test\n        \\`\\`\\`javascript\n        console.log('hello')\n        \\`\\`\\`\n        Code: with a legend\n  `.replace(/·/g, ' '))\n\n  return expect(p).resolves.toMatchSnapshot()\n})\n\ntest('quizz with answers', () => {\n  const p = renderString(dedent`\n  [[quizz | question]]\n  | - [ ] bad answer\n  | - [x] good answer\n  | - [ ] other bad answer\n  |\n  | the good answer is \"good answer\" as it better matches the philosophy\n  | of what good is for answers\n  `.replace(/·/g, ' '))\n  return expect(p).resolves.toMatchSnapshot()\n})\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/legacy-suite.test.js",
    "content": "/* eslint-disable no-tabs */\n/* eslint-disable max-len */\nconst {\n  defaultMdastConfig,\n  defaultHtmlConfig,\n  defaultLatexConfig,\n  configOverride,\n  renderAs,\n} = require('../utils/renderer-tests')\n\nconst renderHtml = renderAs('html')\nconst renderLatex = renderAs('latex')\n\ndescribe('heading-shift', () => {\n  it(`shifts in range`, async () => {\n    const input = '### should be h4'\n    const newMdastConfig = configOverride(defaultMdastConfig, {headingShifter: 1})\n\n    const html = await renderHtml(newMdastConfig, defaultHtmlConfig)(input)\n    const latex = await renderLatex(newMdastConfig, defaultLatexConfig)(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`shifts past range`, async () => {\n    const input = '### should be h6'\n    const newMdastConfig = configOverride(defaultMdastConfig, {headingShifter: 10})\n\n    const html = await renderHtml(newMdastConfig, defaultHtmlConfig)(input)\n    const latex = await renderLatex(newMdastConfig, defaultLatexConfig)(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`shifts before range`, async () => {\n    const input = '### should be h1'\n    const newMdastConfig = configOverride(defaultMdastConfig, {headingShifter: -10})\n\n    const html = await renderHtml(newMdastConfig, defaultHtmlConfig)(input)\n    const latex = await renderLatex(newMdastConfig, defaultLatexConfig)(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n})\n\ndescribe('basic', () => {\n  it(`renders amps-and-angle-encoding.txt`, async () => {\n    const input = `AT&T has an ampersand in their name.\n\nAT&amp;T is another way to write it.\n\nThis & that.\n\n4 < 5.\n\n6 > 5.\n\nHere's a [link] [1] with an ampersand in the URL.\n\nHere's a link with an amersand in the link text: [AT&T] [2].\n\nHere's an inline [link](/script?foo=1&bar=2).\n\nHere's an inline [link](</script?foo=1&bar=2>).\n\n\n[1]: http://example.com/?foo=1&bar=2\n[2]: http://att.com/  \"AT&T\"`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders angle-links-and-img.txt`, async () => {\n    const input = `[link](<simple link> \"my title\")\n![image](<http://example.com/image.jpg>)\n[link](<http://example.com/(()((())923)(>)\n![image](<link(()))(>)\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders auto-links.txt`, async () => {\n    const input = `Link: <http://example.com/>.\n\nHttps link: <https://example.com>\n\nFtp link: <ftp://example.com>\n\nWith an ampersand: <http://example.com/?foo=1&bar=2>\n\n* In a list?\n* <http://example.com/>\n* It should.\n\n> Blockquoted: <http://example.com/>\n\nAuto-links should not occur here: \\`<http://example.com/>\\`\n\n\tor here: <http://example.com/>\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders backlash-escapes.txt`, async () => {\n    const input = `These should all get escaped:\n\nBackslash: \\\\\\\\\n\nBacktick: \\\\\\`\n\nAsterisk: \\\\*\n\nUnderscore: \\\\_\n\nLeft brace: \\\\{\n\nRight brace: \\\\}\n\nLeft bracket: \\\\[\n\nRight bracket: \\\\]\n\nLeft paren: \\\\(\n\nRight paren: \\\\)\n\nGreater-than: \\\\>\n\nHash: \\\\#\n\nPeriod: \\\\.\n\nBang: \\\\!\n\nPlus: \\\\+\n\nMinus: \\\\-\n\n\n\nThese should not, because they occur within a code block:\n\n\tBackslash: \\\\\\\\\n\n\tBacktick: \\\\\\`\n\n\tAsterisk: \\\\*\n\n\tUnderscore: \\\\_\n\n\tLeft brace: \\\\{\n\n\tRight brace: \\\\}\n\n\tLeft bracket: \\\\[\n\n\tRight bracket: \\\\]\n\n\tLeft paren: \\\\(\n\n\tRight paren: \\\\)\n\n\tGreater-than: \\\\>\n\n\tHash: \\\\#\n\n\tPeriod: \\\\.\n\n\tBang: \\\\!\n\n\tPlus: \\\\+\n\n\tMinus: \\\\-\n\n\nNor should these, which occur in code spans:\n\nBackslash: \\`\\\\\\\\\\`\n\nBacktick: \\`\\` \\\\\\` \\`\\`\n\nAsterisk: \\`\\\\*\\`\n\nUnderscore: \\`\\\\_\\`\n\nLeft brace: \\`\\\\{\\`\n\nRight brace: \\`\\\\}\\`\n\nLeft bracket: \\`\\\\[\\`\n\nRight bracket: \\`\\\\]\\`\n\nLeft paren: \\`\\\\(\\`\n\nRight paren: \\`\\\\)\\`\n\nGreater-than: \\`\\\\>\\`\n\nHash: \\`\\\\#\\`\n\nPeriod: \\`\\\\.\\`\n\nBang: \\`\\\\!\\`\n\nPlus: \\`\\\\+\\`\n\nMinus: \\`\\\\-\\`\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders blockquotes-with-code-blocks.txt`, async () => {\n    const input = `> Example:\n> \n>     sub status {\n>         print \"working\";\n>     }\n> \n> Or:\n> \n>     sub status {\n>         return \"working\";\n>     }\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders codeblock-in-list.txt`, async () => {\n    const input = `* A list item with a code block\n\n        Some *code*\n\n* Another list item\n\n        More code\n\n        And more code\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders hard-wrapped.txt`, async () => {\n    const input = `In Markdown 1.0.0 and earlier. Version\n8. This line turns into a list item.\nBecause a hard-wrapped line in the\nmiddle of a paragraph looked like a\nlist item.\n\nHere's one with a bullet.\n* criminey.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders horizontal-rules.txt`, async () => {\n    const input = `Dashes:\n\n---\n\n ---\n \n  ---\n\n   ---\n\n\t---\n\n- - -\n\n - - -\n \n  - - -\n\n   - - -\n\n\t- - -\n\n\nAsterisks:\n\n***\n\n ***\n \n  ***\n\n   ***\n\n\t***\n\n* * *\n\n * * *\n \n  * * *\n\n   * * *\n\n\t* * *\n\n\nUnderscores:\n\n___\n\n ___\n \n  ___\n\n   ___\n\n    ___\n\n_ _ _\n\n _ _ _\n \n  _ _ _\n\n   _ _ _\n\n    _ _ _\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders inline-html-advanced.txt`, async () => {\n    const input = `Simple block on one line:\n\n<div>foo</div>\n\nAnd nested without indentation:\n\n<div>\n<div>\n<div>\nfoo\n</div>\n</div>\n<div>bar</div>\n</div>\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders inline-html-comments.txt`, async () => {\n    const input = `Paragraph one.\n\n<!-- This is a simple comment -->\n\n<!--\n\tThis is another comment.\n-->\n\nParagraph two.\n\n<!-- one comment block -- -- with two comments -->\n\nThe end.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders inline-html-simple.txt`, async () => {\n    const input = `Here's a simple block:\n\n<div>\n\tfoo\n</div>\n\nThis should be a code block, though:\n\n\t<div>\n\t\tfoo\n\t</div>\n\nAs should this:\n\n\t<div>foo</div>\n\nNow, nested:\n\n<div>\n\t<div>\n\t\t<div>\n\t\t\tfoo\n\t\t</div>\n\t</div>\n</div>\n\nThis should just be an HTML comment:\n\n<!-- Comment -->\n\nMultiline:\n\n<!--\nBlah\nBlah\n-->\n\nCode block:\n\n\t<!-- Comment -->\n\nJust plain comment, with trailing spaces on the line:\n\n<!-- foo -->   \n\nCode:\n\n\t<hr />\n\t\nHr's:\n\n<hr>\n\n<hr/>\n\n<hr />\n\n<hr>   \n\n<hr/>  \n\n<hr /> \n\n<hr class=\"foo\" id=\"bar\" />\n\n<hr class=\"foo\" id=\"bar\"/>\n\n<hr class=\"foo\" id=\"bar\" >\n\n<some [weird](http://example.com) stuff>\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders links-inline.txt`, async () => {\n    const input = `Just a [URL](/url/).\n\n[URL and title](/url/ \"title\").\n\n[URL and title](/url/  \"title preceded by two spaces\").\n\n[URL and title](/url/\t\"title preceded by a tab\").\n\n[Empty]().\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders links-reference.txt`, async () => {\n    const input = `Foo [bar] [1].\n\nFoo [bar][1].\n\nFoo [bar]\n[1].\n\n[1]: /url/  \"Title\"\n\n\nWith [embedded [brackets]] [b].\n\n\nIndented [once][].\n\nIndented [twice][].\n\nIndented [thrice][].\n\nIndented [four][] times.\n\n [once]: /url\n\n  [twice]: /url\n\n   [thrice]: /url\n\n    [four]: /url\n\n\n[b]: /url/\n\nWith [angle brackets][].\n\nAnd [without][].\n\n[angle brackets]: <http://example.com/> \"Angle Brackets\"\n[without]: http://example.com/ \"Without angle brackets.\"\n\nWith [line\nbreaks][]\n\nand [line \nbreaks][] with one space.\n\nand [line  \nbreaks[] with two spaces.\n\n[line breaks]: http://example.com \"Yes this works\"\n\n[short ref]\n\n[short \nref]\n\n[short ref]: http://example.com \"No more hanging empty bracket!\"\n\n[a ref]\n\n[a ref]: http://example.com\n    \"Title on next line.\"\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders nested-blockquotes.txt`, async () => {\n    const input = `> foo\n>\n> > bar\n>\n> foo\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders ordered-and-unordered-list.txt`, async () => {\n    const input = `Unordered\n\nAsterisks tight:\n\n*\tasterisk 1\n*\tasterisk 2\n*\tasterisk 3\n\n\nAsterisks loose:\n\n*\tasterisk 1\n\n*\tasterisk 2\n\n*\tasterisk 3\n\n* * *\n\nPluses tight:\n\n+\tPlus 1\n+\tPlus 2\n+\tPlus 3\n\n\nPluses loose:\n\n+\tPlus 1\n\n+\tPlus 2\n\n+\tPlus 3\n\n* * *\n\n\nMinuses tight:\n\n-\tMinus 1\n-\tMinus 2\n-\tMinus 3\n\n\nMinuses loose:\n\n-\tMinus 1\n\n-\tMinus 2\n\n-\tMinus 3\n\n\n---\n\nOrdered\n\nTight:\n\n1.\tFirst\n2.\tSecond\n3.\tThird\n\nand:\n\n1. One\n2. Two\n3. Three\n\n\nLoose using tabs:\n\n1.\tFirst\n\n2.\tSecond\n\n3.\tThird\n\nand using spaces:\n\n1. One\n\n2. Two\n\n3. Three\n\nMultiple paragraphs:\n\n1.\tItem 1, graf one.\n\n\tItem 2. graf two. The quick brown fox jumped over the lazy dog's\n\tback.\n\n2.\tItem 2.\n\n3.\tItem 3.\n\n\n\n---\n\nNested\n\n*\tTab\n\t*\tTab\n\t\t*\tTab\n\nHere's another:\n\n1. First\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n3. Third\n\nSame thing but with paragraphs:\n\n1. First\n\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n\n3. Third\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders strong-and-em-together.txt`, async () => {\n    const input = `***This is strong and em.***\n\nSo is ***this*** word.\n\n___This is strong and em.___\n\nSo is ___this___ word.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders tabs.txt`, async () => {\n    const input = `+\tthis is a list item\n\tindented with tabs\n\n+   this is a list item\n    indented with spaces\n\nCode:\n\n\tthis code block is indented by one tab\n\nAnd:\n\n\t\tthis code block is indented by two tabs\n\nAnd:\n\n\t+\tthis is an example list item\n\t\tindented with tabs\n\t\n\t+   this is an example list item\n\t    indented with spaces\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders tidyness.txt`, async () => {\n    const input = `> A list within a blockquote:\n> \n> *\tasterisk 1\n> *\tasterisk 2\n> *\tasterisk 3\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n})\n\ndescribe('extensions', () => {\n  it(`renders abbr.txt`, async () => {\n    const input = `An ABBR: \"REF\".\nref and REFERENCE should be ignored.\n\n*[REF]: Reference\n*[ABBR]: This gets overriden by the next one.\n*[ABBR]: Abbreviation\n\nThe HTML specification\nis maintained by the W3C.\n\n*[HTML]: Hyper Text Markup Language\n*[W3C]:  World Wide Web Consortium\n\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders footnote.txt`, async () => {\n    const input = `This is the body with a footnote[^1] or two[^2] or more[^3] [^4] [^5].\n\nAlso a reference that does not exist[^6].\n\n[^1]: Footnote that ends with a list:\n\n    * item 1\n    * item 2\n\n[^2]: > This footnote is a blockquote.\n\n[^3]: A simple oneliner.\n\n[^4]: A footnote with multiple paragraphs.\n\n    Paragraph two.\n\n[^5]: First line of first paragraph.\nSecond line of first paragraph is not intended.\nNor is third...\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders footnote_many_footnotes.txt`, async () => {\n    const input = `Something[^1]\n\nSomething[^2]\n\nSomething[^3]\n\nSomething[^4]\n\nSomething[^5]\n\nSomething[^6]\n\nSomething[^7]\n\nSomething[^8]\n\nSomething[^9]\n\nSomething[^10]\n\nSomething[^11]\n\nSomething[^12]\n\nSomething[^13]\n\nSomething[^14]\n\nSomething[^15]\n\nSomething[^16]\n\nSomething[^17]\n\nSomething[^18]\n\nSomething[^19]\n\nSomething[^20]\n\nSomething[^21]\n\nSomething[^22]\n\nSomething[^23]\n\nSomething[^24]\n\nSomething[^25]\n\nSomething[^26]\n\nSomething[^27]\n\nSomething[^28]\n\nSomething[^29]\n\nSomething[^30]\n\nSomething[^31]\n\nSomething[^32]\n\nSomething[^33]\n\nSomething[^34]\n\nSomething[^35]\n\nSomething[^36]\n\nSomething[^37]\n\nSomething[^38]\n\nSomething[^39]\n\nSomething[^40]\n\nSomething[^41]\n\nSomething[^42]\n\nSomething[^43]\n\nSomething[^44]\n\nSomething[^45]\n\nSomething[^46]\n\nSomething[^47]\n\nSomething[^48]\n\nSomething[^49]\n\nSomething[^50]\n\nSomething[^51]\n\nSomething[^52]\n\nSomething[^53]\n\nSomething[^54]\n\nSomething[^55]\n\nSomething[^56]\n\nSomething[^57]\n\nSomething[^58]\n\nSomething[^59]\n\nSomething[^60]\n\nSomething[^61]\n\nSomething[^62]\n\nSomething[^63]\n\nSomething[^64]\n\nSomething[^65]\n\nSomething[^66]\n\nSomething[^67]\n\nSomething[^68]\n\nSomething[^69]\n\nSomething[^70]\n\nSomething[^71]\n\nSomething[^72]\n\nSomething[^73]\n\nSomething[^74]\n\nSomething[^75]\n\nSomething[^76]\n\nSomething[^77]\n\nSomething[^78]\n\nSomething[^79]\n\nSomething[^80]\n\nSomething[^81]\n\nSomething[^82]\n\nSomething[^83]\n\nSomething[^84]\n\nSomething[^85]\n\nSomething[^86]\n\nSomething[^87]\n\nSomething[^88]\n\nSomething[^89]\n\nSomething[^90]\n\nSomething[^91]\n\nSomething[^92]\n\nSomething[^93]\n\nSomething[^94]\n\nSomething[^95]\n\nSomething[^96]\n\nSomething[^97]\n\nSomething[^98]\n\nSomething[^99]\n\nSomething[^100]\n\nSomething[^101]\n\nSomething[^102]\n\nSomething[^103]\n\nSomething[^104]\n\nSomething[^105]\n\nSomething[^106]\n\nSomething[^107]\n\nSomething[^108]\n\nSomething[^109]\n\nSomething[^110]\n\nSomething[^111]\n\nSomething[^112]\n\nSomething[^113]\n\nSomething[^114]\n\nSomething[^115]\n\nSomething[^116]\n\nSomething[^117]\n\nSomething[^118]\n\nSomething[^119]\n\nSomething[^120]\n\nSomething[^121]\n\nSomething[^122]\n\nSomething[^123]\n\nSomething[^124]\n\nSomething[^125]\n\nSomething[^126]\n\nSomething[^127]\n\nSomething[^128]\n\nSomething[^129]\n\nSomething[^130]\n\nSomething[^131]\n\nSomething[^132]\n\nSomething[^133]\n\nSomething[^134]\n\nSomething[^135]\n\nSomething[^136]\n\nSomething[^137]\n\nSomething[^138]\n\nSomething[^139]\n\nSomething[^140]\n\nSomething[^141]\n\nSomething[^142]\n\nSomething[^143]\n\nSomething[^144]\n\nSomething[^145]\n\nSomething[^146]\n\nSomething[^147]\n\nSomething[^148]\n\nSomething[^149]\n\nSomething[^150]\n\n[^1]: Another thing\n\n[^2]: Another thing\n\n[^3]: Another thing\n\n[^4]: Another thing\n\n[^5]: Another thing\n\n[^6]: Another thing\n\n[^7]: Another thing\n\n[^8]: Another thing\n\n[^9]: Another thing\n\n[^10]: Another thing\n\n[^11]: Another thing\n\n[^12]: Another thing\n\n[^13]: Another thing\n\n[^14]: Another thing\n\n[^15]: Another thing\n\n[^16]: Another thing\n\n[^17]: Another thing\n\n[^18]: Another thing\n\n[^19]: Another thing\n\n[^20]: Another thing\n\n[^21]: Another thing\n\n[^22]: Another thing\n\n[^23]: Another thing\n\n[^24]: Another thing\n\n[^25]: Another thing\n\n[^26]: Another thing\n\n[^27]: Another thing\n\n[^28]: Another thing\n\n[^29]: Another thing\n\n[^30]: Another thing\n\n[^31]: Another thing\n\n[^32]: Another thing\n\n[^33]: Another thing\n\n[^34]: Another thing\n\n[^35]: Another thing\n\n[^36]: Another thing\n\n[^37]: Another thing\n\n[^38]: Another thing\n\n[^39]: Another thing\n\n[^40]: Another thing\n\n[^41]: Another thing\n\n[^42]: Another thing\n\n[^43]: Another thing\n\n[^44]: Another thing\n\n[^45]: Another thing\n\n[^46]: Another thing\n\n[^47]: Another thing\n\n[^48]: Another thing\n\n[^49]: Another thing\n\n[^50]: Another thing\n\n[^51]: Another thing\n\n[^52]: Another thing\n\n[^53]: Another thing\n\n[^54]: Another thing\n\n[^55]: Another thing\n\n[^56]: Another thing\n\n[^57]: Another thing\n\n[^58]: Another thing\n\n[^59]: Another thing\n\n[^60]: Another thing\n\n[^61]: Another thing\n\n[^62]: Another thing\n\n[^63]: Another thing\n\n[^64]: Another thing\n\n[^65]: Another thing\n\n[^66]: Another thing\n\n[^67]: Another thing\n\n[^68]: Another thing\n\n[^69]: Another thing\n\n[^70]: Another thing\n\n[^71]: Another thing\n\n[^72]: Another thing\n\n[^73]: Another thing\n\n[^74]: Another thing\n\n[^75]: Another thing\n\n[^76]: Another thing\n\n[^77]: Another thing\n\n[^78]: Another thing\n\n[^79]: Another thing\n\n[^80]: Another thing\n\n[^81]: Another thing\n\n[^82]: Another thing\n\n[^83]: Another thing\n\n[^84]: Another thing\n\n[^85]: Another thing\n\n[^86]: Another thing\n\n[^87]: Another thing\n\n[^88]: Another thing\n\n[^89]: Another thing\n\n[^90]: Another thing\n\n[^91]: Another thing\n\n[^92]: Another thing\n\n[^93]: Another thing\n\n[^94]: Another thing\n\n[^95]: Another thing\n\n[^96]: Another thing\n\n[^97]: Another thing\n\n[^98]: Another thing\n\n[^99]: Another thing\n\n[^100]: Another thing\n\n[^101]: Another thing\n\n[^102]: Another thing\n\n[^103]: Another thing\n\n[^104]: Another thing\n\n[^105]: Another thing\n\n[^106]: Another thing\n\n[^107]: Another thing\n\n[^108]: Another thing\n\n[^109]: Another thing\n\n[^110]: Another thing\n\n[^111]: Another thing\n\n[^112]: Another thing\n\n[^113]: Another thing\n\n[^114]: Another thing\n\n[^115]: Another thing\n\n[^116]: Another thing\n\n[^117]: Another thing\n\n[^118]: Another thing\n\n[^119]: Another thing\n\n[^120]: Another thing\n\n[^121]: Another thing\n\n[^122]: Another thing\n\n[^123]: Another thing\n\n[^124]: Another thing\n\n[^125]: Another thing\n\n[^126]: Another thing\n\n[^127]: Another thing\n\n[^128]: Another thing\n\n[^129]: Another thing\n\n[^130]: Another thing\n\n[^131]: Another thing\n\n[^132]: Another thing\n\n[^133]: Another thing\n\n[^134]: Another thing\n\n[^135]: Another thing\n\n[^136]: Another thing\n\n[^137]: Another thing\n\n[^138]: Another thing\n\n[^139]: Another thing\n\n[^140]: Another thing\n\n[^141]: Another thing\n\n[^142]: Another thing\n\n[^143]: Another thing\n\n[^144]: Another thing\n\n[^145]: Another thing\n\n[^146]: Another thing\n\n[^147]: Another thing\n\n[^148]: Another thing\n\n[^149]: Another thing\n\n[^150]: Another thing\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders tables-2.txt`, async () => {\n    const input = `foo|bar|baz\n---|---|---\n   | Q |\n W |   | W\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders tables.txt`, async () => {\n    const input = `First Header  | Second Header\n------------- | -------------\nContent Cell  | Content Cell\nContent Cell  | Content Cell\n\n| First Header  | Second Header |\n| ------------- | ------------- |\n| Content Cell  | Content Cell  |\n| Content Cell  | Content Cell  |\n\n| Item      | Value |\n| :-------- | -----:|\n| Computer  | $1600 |\n| Phone     |   $12 |\n| Pipe      |    $1 |\n\n| Function name | Description                    |\n| ------------- | ------------------------------ |\n| \\`help()\\`      | Display the help window.       |\n| \\`destroy()\\`   | **Destroy your computer!**     |\n\n|foo|bar|baz|\n|:--|:-:|--:|\n|   | Q |   |\n|W  |   |  W|\n\nThree spaces in front of a table:\n\n   First Header | Second Header\n   ------------ | -------------\n   Content Cell | Content Cell\n   Content Cell | Content Cell\n\n   | First Header | Second Header |\n   | ------------ | ------------- |\n   | Content Cell | Content Cell  |\n   | Content Cell | Content Cell  |\n\nFour spaces is a code block:\n\n    First Header | Second Header\n    ------------ | -------------\n    Content Cell | Content Cell\n    Content Cell | Content Cell\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders fenced_code.txt`, async () => {\n    const input = `index 0000000..6e956a9\n\n\\`\\`\\`\n--- /dev/null\n+++ b/test/data/stripped_text/mike-30-lili\n@@ -0,0 +1,27 @@\n+Summary:\n+ drift_mod.py |    1 +\n+ 1 files changed, 1 insertions(+), 0 deletions(-)\n+\n+commit da4bfb04debdd994683740878d09988b2641513d\n+Author: Mike Dirolf <mike@dirolf.com>\n+Date:   Tue Jan 17 13:42:28 2012 -0500\n+\n+\\`\\`\\`\n+minor: just wanted to push something.\n+\\`\\`\\`\n+\n+diff --git a/drift_mod.py b/drift_mod.py\n+index 34dfba6..8a88a69 100644\n+\n+\\`\\`\\`\n+--- a/drift_mod.py\n++++ b/drift_mod.py\n+@@ -281,6 +281,7 @@ CONTEXT_DIFF_LINE_PATTERN = re.compile(r'^('\n+                                        '|\\\\+ .*'\n+                                        '|- .*'\n+                                        ')$')\n++\n+ def wrap_context_diffs(message_text):\n+     return _wrap_diff(CONTEXT_DIFF_HEADER_PATTERN,\n+                       CONTEXT_DIFF_LINE_PATTERN,\n+\\`\\`\\`\n\\`\\`\\`\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders github_flavored.txt`, async () => {\n    const input = `index 0000000..6e956a9\n\n\\`\\`\\`diff\n--- /dev/null\n+++ b/test/data/stripped_text/mike-30-lili\n@@ -0,0 +1,27 @@\n+Summary:\n+ drift_mod.py |    1 +\n+ 1 files changed, 1 insertions(+), 0 deletions(-)\n+\n+commit da4bfb04debdd994683740878d09988b2641513d\n+Author: Mike Dirolf <mike@dirolf.com>\n+Date:   Tue Jan 17 13:42:28 2012 -0500\n+\n+\\`\\`\\`\n+minor: just wanted to push something.\n+\\`\\`\\`\n+\n+diff --git a/drift_mod.py b/drift_mod.py\n+index 34dfba6..8a88a69 100644\n+\n+\\`\\`\\`\n+--- a/drift_mod.py\n++++ b/drift_mod.py\n+@@ -281,6 +281,7 @@ CONTEXT_DIFF_LINE_PATTERN = re.compile(r'^('\n+                                        '|\\\\+ .*'\n+                                        '|- .*'\n+                                        ')$')\n++\n+ def wrap_context_diffs(message_text):\n+     return _wrap_diff(CONTEXT_DIFF_HEADER_PATTERN,\n+                       CONTEXT_DIFF_LINE_PATTERN,\n+\\`\\`\\`\n\\`\\`\\`\n\nTest support for foo+bar lexer names.\n\n\\`\\`\\`html+jinja\n<title>{% block title %}{% endblock %}</title>\n<ul>\n{% for user in users %}\n  <li><a href=\"{{ user.url }}\">{{ user.username }}</a></li>\n{% endfor %}\n</ul>\n\\`\\`\\`\n\nTest support for foo+bar lexer names in citation.\n\n> \\`\\`\\`html+jinja\n> <title>{% block title %}{% endblock %}</title>\n> <ul>\n>\n> {% for user in users %}\n>   <li><a href=\"{{ user.url }}\">{{ user.username }}</a></li>\n> {% endfor %}\n>\n> </ul>\n> \\`\\`\\`\n\nTest support for foo+bar lexer names with hightlight.\n\n\\`\\`\\`html+jinja hl_lines=\"2-4\"\n<title>{% block title %}{% endblock %}</title>\n<ul>\n\n{% for user in users %}\n  <li><a href=\"{{ user.url }}\">{{ user.username }}</a></li>\n{% endfor %}\n\n</ul>\n\\`\\`\\`\n\nTest support for foo+bar lexer names with linenostart.\n\n\\`\\`\\`html+jinja linenostart=10\n<title>{% block title %}{% endblock %}</title>\n<ul>\n\n{% for user in users %}\n  <li><a href=\"{{ user.url }}\">{{ user.username }}</a></li>\n{% endfor %}\n\n</ul>\n\\`\\`\\`\n\nTest support for foo+bar lexer names with both.\n\n\\`\\`\\`html+jinja hl_lines=\"2-4\" linenostart=10\n<title>{% block title %}{% endblock %}</title>\n<ul>\n{% for user in users %}\n  <li><a href=\"{{ user.url }}\">{{ user.username }}</a></li>\n{% endfor %}\n</ul>\n\\`\\`\\`\n\nCode without matching end\n\n~~~~html\n\n~~~\n\nCode into paragraph\n\\`\\`\\`html+jinja hl_lines= \"2-4\" linenostart=10\n<title>{% block title %}{% endblock %}</title>\n<ul>\n{% for user in users %}\n  <li><a href=\"{{ user.url }}\">{{ user.username }}</a></li>\n{% endfor %}\n</ul>\n\\`\\`\\`\nwith end\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n})\n\ndescribe('misc', () => {\n  it(`renders CRLF_line_ends.txt`, async () => {\n    const input = `foo\n\n<div>\nbar\n</div>\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders adjacent-headers.txt`, async () => {\n    const input = `# this is a huge header #\n## this is a smaller header ##\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders amp-in-url.txt`, async () => {\n    const input = `[link](http://www.freewisdom.org/this&that)\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders ampersand.txt`, async () => {\n    const input = `&\n\nAT&T\n\n\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders arabic.txt`, async () => {\n    const input = `\nبايثون\n=====\n\n**بايثون** لغة برمجة حديثة بسيطة، واضحة، سريعة ، تستخدم أسلوب البرمجة الكائنية (OOP) وقابلة للتطوير بالإضافة إلى أنها مجانية و مفتوحة المصدر. صُنفت بالأساس كلغة تفسيرية ، بايثون مصممة أصلاً للأداء بعض المهام الخاصة أو المحدودة. إلا أنه يمكن استخدامها بايثون لإنجاز المشاريع الضخمه كأي لغة برمجية أخرى،  غالباً ما يُنصح المبتدئين في ميدان البرمجة بتعلم هذه اللغة لأنها من بين أسهل اللغات البرمجية تعلماً.\n\nنشأت بايثون في مركز CWI (مركز العلوم والحاسب الآلي) بأمستردام على يد جويدو فان رُزوم. تم تطويرها بلغة C. أطلق فان رُزوم اسم \"بايثون\" على لغته تعبيرًا عن إعجابه بفِرقَة مسرحية هزلية شهيرة من بريطانيا، كانت تطلق على نفسها اسم مونتي بايثون Monty Python.\n\nتتميز بايثون بمجتمعها النشط ، كما أن لها الكثير من المكتبات البرمجية ذات الأغراض الخاصة والتي برمجها أشخاص من مجتمع هذه اللغة ، مثلاً مكتبة PyGame التي توفر مجموعه من الوظائف من اجل برمجة الالعاب. ويمكن لبايثون التعامل مع العديد من أنواع قواعد البيانات مثل MySQL وغيره.\n\n## أمثلة\nمثال Hello World!\n\n    print \"Hello World!\"\n\n\nمثال لاستخراج المضروب Factorial :\n\n    num = 1\n    x = raw_input('Insert the number please ')\n    x = int(x)\n\n    if x > 69:\n     print 'Math Error !'\n    else:\n     while x > 1:\n      num *= x\n      x = x-1\n\n     print num\n\n\n\n## وصلات خارجية\n* [الموقع الرسمي للغة بايثون](http://www.python.org)\n\n بذرة حاس\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders autolinks_with_asterisks.txt`, () => {\n    const input = `<http://some.site/weird*url*thing>\n\n`\n\n    return expect(renderHtml(input)).resolves.toMatchSnapshot()\n  })\n\n  it(`renders backtick-escape.txt`, async () => {\n    const input = `\\\\\\`This also should not be in code.\\\\\\`\n\\\\\\\\\\`This should be in code.\\\\\\\\\\`\n\\\\\\`And finally this should not be in code.\\`\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders blank-block-quote.txt`, async () => {\n    const input = `\naaaaaaaaaaa\n\n> \n\nbbbbbbbbbbb\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders blank_lines_in_codeblocks.txt`, async () => {\n    const input = `Preserve blank lines in code blocks with tabs:\n\n    a code block\n    \n    two tabbed lines\n    \n    \n    three tabbed lines\n    \n    \n    \n    four tabbed lines\n    \n    \n    \n    \n    five tabbed lines\n    \n    \n    \n    \n    \n    six tabbed lines\n    \n    \n    \n    \n    \n    \n    End of tabbed block\n    \n    \n    \n    \n    \n    \nAnd without tabs:\n\n    a code block\n\n    two blank lines\n\n\n    three blank lines\n\n\n\n    four blank lines\n\n\n\n\n    five blank lines\n\n\n\n\n\n    six blank lines\n\n\n\n\n\n\n    End of block\n\n\n\n\n\n\nEnd of document`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders block_html5.txt`, async () => {\n    const input = `<section>\n    <header>\n        <hgroup>\n            <h1>Hello :-)</h1>\n        </hgroup>\n    </header>\n    <figure>\n        <img src=\"image.png\" alt=\"\" />\n        <figcaption>Caption</figcaption>\n    </figure>\n    <footer>\n        <p>Some footer</p>\n    </footer>\n</section><figure></figure>\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders block_html_attr.txt`, async () => {\n    const input = `<blockquote>\nRaw HTML processing should not confuse this with the blockquote below\n</blockquote>\n<div id=\"current-content\">\n    <div id=\"primarycontent\" class=\"hfeed\">\n        <div id=\"post-\">\n            <div class=\"page-head\">\n                <h2>Header2</h2>\n            </div>\n            <div class=\"entry-content\">\n                <h3>Header3</h3>\n                    <p>Paragraph</p>\n                <h3>Header3</h3>\n                    <p>Paragraph</p>\n                    <blockquote>\n                        <p>Paragraph</p>\n                    </blockquote>\n                    <p>Paragraph</p>\n                    <p><a href=\"/somelink\">linktext</a></p>\n            </div>\n        </div><!-- #post-ID -->\n        <!-- add contact form here -->\n    </div><!-- #primarycontent -->\n</div><!-- #current-content -->\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders block_html_simple.txt`, async () => {\n    const input = `<p>foo</p>\n<ul>\n<li>\n<p>bar</p>\n</li>\n<li>\n<p>baz</p>\n</li>\n</ul>\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders blockquote-below-paragraph.txt`, async () => {\n    const input = `Paragraph\n> Block quote\n> Yep\n\nParagraph\n>no space\n>Nope\n\nParagraph one\n> blockquote\nMore blockquote.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders blockquote-hr.txt`, () => {\n    const input = `This is a paragraph.\n\n---\n\n> Block quote with horizontal lines.\n>\n> ---\n>\n> > Double block quote.\n> >\n> > ---\n> >\n> > End of the double block quote.\n\n> A new paragraph.\n> With multiple lines.\nEven a lazy line.\n>\n> ---\n>\n> The last line.\n`\n\n    return expect(renderHtml(input)).resolves.toMatchSnapshot()\n  })\n\n  it(`renders blockquote.txt`, async () => {\n    const input = `> blockquote with no whitespace before \\`>\\`.\n\nfoo\n\n > blockquote with one space before the \\`>\\`.\n\nbar\n\n  > blockquote with 2 spaces.\n\nbaz\n\n   > this has three spaces so its a paragraph.\n\nblah\n\n    > this one had four so it's a code block.\n\n>   > this nested blockquote has 0 on level one and 3 (one after the first \\`>\\` + 2 more) on level 2.\n\n>    > and this has 4 on level 2 - another code block.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders bold_links.txt`, async () => {\n    const input = `**bold [link](http://example.com)**\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders br.txt`, async () => {\n    const input = `Output:\n\n    <p>Some of these words <em>are emphasized</em>.\n    Some of these words <em>are emphasized also</em>.</p>\n\n    <p>Use two asterisks for <strong>strong emphasis</strong>.\n    Or, if you prefer, <strong>use two underscores instead</strong>.</p>\n\n\n\nUnordered (bulleted) lists use asterisks, pluses, and hyphens (\\`*\\`,\n\\`+\\`, and \\`-\\`) as list markers. These three markers are\ninterchangable; this:\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders bracket_re.txt`, async () => {\n    const input = `\n[x\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\nxxx xxx xxx xxx xxx xxx xxx xxx\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders brackets-in-img-title.txt`, () => {\n    const input = `![alt](local-img.jpg)\n![alt](local-img.jpg \"\")\n![alt](local-img.jpg \"normal title\")\n\n![alt](local-img.jpg \"(just title in brackets)\")\n![alt](local-img.jpg \"title with brackets (I think)\")\n\n![alt](local-img.jpg \"(\")\n![alt](local-img.jpg \"(open only\")\n![alt](local-img.jpg \")\")\n![alt](local-img.jpg \"close only)\")\n\n`\n\n    return expect(renderHtml(input)).resolves.toMatchSnapshot()\n  })\n\n  it(`renders code-first-line.txt`, async () => {\n    const input = `    print \"This is a code block.\"\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders comments.txt`, async () => {\n    const input = `X<0\n\nX>0\n\n<!-- A comment -->\n\n<div>as if</div>\n\n<!-- comment -->\n__no blank line__\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders div.txt`, async () => {\n    const input = `<div id=\"sidebar\">\n\n   _foo_\n\n</div>\n\nAnd now in uppercase:\n\n<DIV>\nfoo\n</DIV>\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders em-around-links.txt`, async () => {\n    const input = `  - *[Python in Markdown](https://pythonhosted.org/Markdown/) by some\n    great folks* - This *does* work as expected.\n  - _[Python in Markdown](https://pythonhosted.org/Markdown/) by some\n    great folks_ - This *does* work as expected.\n  - [_Python in Markdown_](https://pythonhosted.org/Markdown/) by some\n    great folks - This *does* work as expected.\n  - [_Python in Markdown_](https://pythonhosted.org/Markdown/) _by some\n    great folks_ - This *does* work as expected.\n\n_[Python in Markdown](https://pythonhosted.org/Markdown/) by some\ngreat folks_ - This *does* work as expected.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders em_strong.txt`, async () => {\n    const input = `One asterisk: *\n\nOne underscore: _\n\nTwo asterisks: **\n\nWith spaces: * *\n\nTwo underscores __\n\nwith spaces: _ _\n\nthree asterisks: ***\n\nwith spaces: * * *\n\nthree underscores: ___\n\nwith spaces: _ _ _\n\nOne char: _a_\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders email.txt`, async () => {\n    const input = `\nasdfasdfadsfasd <yuri@freewisdom.org> or you can say \ninstead <mailto:yuri@freewisdom.org>\n\n<bob&sue@example.com>\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders escaped_chars_in_js.txt`, async () => {\n    const input = `<span id=\"e116142240\">[javascript protected email address]</span>\n<script type=\"text/javascript\">\n    var a=\"gqMjyw7lZCaKk6p0J3uAUYS1.dbIW2hXzDHmiVNotOPRe_Ev@c4Gs58+LBr-F9QTfxn\";\n    var b=a.split(\"\").sort().join(\"\");\n    var c=\"F_-F6F_-FMe_\";\n    var d=\"\";\n    for(var e=0;e<c.length;e++)\n    d+=b.charAt(a.indexOf(c.charAt(e)));\n        document\n            .getElementById(\"e116142240\")\n            .innerHTML=\"<a href=\\\\\"mailto:\"+d+\"\\\\\">\"+d+\"</a>\";\n</script>\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders h1.txt`, async () => {\n    const input = `Header\n------  \n\nHeader 2 \n========\n\n### H3   \n\nH1  \n=\n\nH2\n--  \n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders image-2.txt`, async () => {\n    const input = `[*link!*](http://src.com/)\n\n*[link](http://www.freewisdom.org)*\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders image.txt`, async () => {\n    const input = `\n![Poster](http://humane_man.jpg \"The most humane man.\")\n\n![Poster][]\n\n[Poster]:http://humane_man.jpg \"The most humane man.\"\n\n![Blank]()`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders image_in_links.txt`, async () => {\n    const input = `\n\n[![altname](path/to/img_thumb.png)](path/to/image.png)\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders ins-at-start-of-paragraph.txt`, async () => {\n    const input = `<ins>Hello, fellow developer</ins> this ins should be wrapped in a p.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders inside_html.txt`, async () => {\n    const input = `<a href=\"stuff\"> __ok__? </a>\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders lazy-block-quote.txt`, async () => {\n    const input = `> Line one of lazy block quote.\nLine two of lazy block quote.\n\n> Line one of paragraph two.\nLine two of paragraph two.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders link-with-parenthesis.txt`, async () => {\n    const input = `[ZIP archives](http://en.wikipedia.org/wiki/ZIP_(file_format) \"ZIP (file format) - Wikipedia, the free encyclopedia\")\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders lists.txt`, async () => {\n    const input = `\n* A multi-paragraph list, \nunindented.\n\n\n\nSimple tight list\n\n* Uno\n* Due\n* Tri\n\nA singleton tight list:\n\n* Uno\n\nA lose list:\n\n* One\n\n* Two\n\n* Three\n\nA lose list with paragraphs\n\n* One one one one\n\n    one one one one\n\n* Two two two two\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders lists2.txt`, async () => {\n    const input = `* blah blah blah\nsdf asdf asdf asdf asdf\nasda asdf asdfasd\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders lists3.txt`, async () => {\n    const input = `* blah blah blah\n    sdf asdf asdf asdf asdf\n    asda asdf asdfasd\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders lists4.txt`, async () => {\n    const input = `\n* item1\n* item2\n    1. Number 1\n    2. Number 2\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders lists5.txt`, async () => {\n    const input = `> This is a test of a block quote\n> With just two lines\n\nA paragraph\n\n> This is a more difficult case\n> With a list item inside the quote\n>\n> * Alpha\n> * Beta\n> Etc.\n\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders lists6.txt`, async () => {\n    const input = `Test five or more spaces as start of list:\n\n*     five spaces\n\nnot first item:\n\n* one space\n*     five spaces\n\nloose list:\n\n* one space\n\n*     five spaces\n`\n\n    return expect(renderHtml(input)).resolves.toMatchSnapshot()\n  })\n\n  it(`renders lists8.txt`, async () => {\n    const input = `1. > Four-score and seven years ago...\n\n2. > We have nothing to fear...\n\n3. > This is it...\n\n---\n\n* > Four-score and sever years ago\n  > our fathers brought forth\n\n* > We have nothing to fear\n  > but fear itself\n\n* > This is it\n  > as far as I'm concerned\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders mismatched-tags.txt`, async () => {\n    const input = `<p>Some text</p><div>some more text</div>\n\nand a bit more\n\n<p>And this output</p> *Compatible with PHP Markdown Extra 1.2.2 and Markdown.pl1.0.2b8:*\n\n<!-- comment --><p><div>text</div><br /></p><br />\n\nShould be in p\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders missing-link-def.txt`, async () => {\n    const input = `This is a [missing link][empty] and a [valid][link] and [missing][again].\n\n[link]: http://example.com\n\n`\n\n    return expect(renderHtml(input)).resolves.toMatchSnapshot()\n  })\n\n  it(`renders multi-line-tags.txt`, async () => {\n    const input = `\n<div>\n\nasdf asdfasd\n\n</div>\n\n<div>\n\nfoo bar\n\n</div>\nNo blank line.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders multi-paragraph-block-quote.txt`, async () => {\n    const input = `> This is line one of paragraph one\n> This is line two of paragraph one\n\n> This is line one of paragraph two\n\n\n\n> This is another blockquote.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders nested-lists.txt`, () => {\n    const input = `* item 1\n\n    paragraph 2\n\n* item 2\n\n    * item 2-1\n    * item 2-2\n\n        * item 2-2-1\n\n    * item 2-3\n\n        * item 2-3-1\n\n* item 3\n\nplain text\n\n* item 1\n    * item 1-1\n    * item 1-2\n        * item 1-2-1\n* item 2\n* item 3\n* item 4\n    * item 4-1\n    * item 4-2\n    * item 4-3\n\n        Code under item 4-3\n\n    Paragraph under item 4\n`\n\n    return expect(renderHtml(input)).resolves.toMatchSnapshot()\n  })\n\n  it(`renders nested-patterns.txt`, async () => {\n    const input = `___[link](http://example.com)___\n***[link](http://example.com)***\n**[*link*](http://example.com)**\n__[_link_](http://example.com)__\n__[*link*](http://example.com)__\n**[_link_](http://example.com)**\n[***link***](http://example.com)\n\n***I am ___italic_ and__ bold* I am \\`just\\` bold**\n\nExample __*bold italic*__ on the same line __*bold italic*__.\n\nExample **_bold italic_** on the same line **_bold italic_**.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders normalize.txt`, async () => {\n    const input = `\n[Link](http://www.stuff.com/q?x=1&y=2<>)\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders numeric-entity.txt`, async () => {\n    const input = `\n<user@gmail.com>\n\nThis is an entity: &#234; \n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders para-with-hr.txt`, async () => {\n    const input = `Here is a paragraph, followed by a horizontal rule.\n***\nFollowed by another paragraph.\n\nHere is another paragraph, followed by:\n*** not an HR.\nFollowed by more of the same paragraph.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders php.txt`, async () => {\n    const input = `<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n            \"http://www.w3.org/TR/html4/strict.dtd\">\n\n<b>This should have a p tag</b>\n\n<!--This is a comment -->\n\n<div>This shouldn't</div>\n\n<?php echo \"block_level\";?>\n\n <?php echo \"not_block_level\";?>\n\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders smart_em.txt`, async () => {\n    const input = `_emphasis_\n\nthis_is_not_emphasis\n\n[_punctuation with emphasis_]\n\n[_punctuation_with_emphasis_]\n\n[punctuation_without_emphasis]\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders span.txt`, async () => {\n    const input = `\n<span id=\"someId\"> Foo *bar* Baz </span>\n\n<div><b>*foo*</b></div>\n\n<div id=\"someId\"> Foo *bar* Baz </div>\n\n<baza id=\"someId\"> Foo *bar* Baz </baza>\n\n\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders strong-with-underscores.txt`, async () => {\n    const input = `__this_is_strong__\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders strongintags.txt`, async () => {\n    const input = `this is a [**test**](http://example.com/)\n\nthis is a second **[test](http://example.com)**\n\nreference **[test][]**\nreference [**test**][]\n\n\n`\n\n    return expect(renderHtml(input)).resolves.toMatchSnapshot()\n  })\n\n  it(`renders underscores.txt`, async () => {\n    const input = `THIS_SHOULD_STAY_AS_IS\n\nHere is some _emphasis_, ok?\n\nOk, at least _this_ should work.\n\nTHIS__SHOULD__STAY\n\nHere is some __strong__ stuff.\n\nTHIS___SHOULD___STAY?\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n})\n\ndescribe('options', () => {\n  it(`renders no-attributes.txt`, async () => {\n    const input = `Regression *test* for issue 87\n\nIt's run with enable_attributes=False so this {@id=explanation} should not become an attribute\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n})\n\ndescribe('php', () => {\n  it(`renders Code Spans.txt`, async () => {\n    const input = `From \\`<!--\\` to \\`-->\\`\non two lines.\n\nFrom \\`<!--\\`\nto \\`-->\\`\non three lines.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Code block on second line.txt`, async () => {\n    const input = `\n    Codeblock on second line\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Horizontal Rules.txt`, async () => {\n    const input = `Horizontal rules:\n\n- - -\n \n* * *\n \n***\n \n---\n \n___\n\nNot horizontal rules (testing for a bug in 1.0.1j):\n\n+++\n\n,,,\n\n===\n\n???\n\nAAA\n\njjj\n\nj j j\n\nn n n\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Inline HTML comments.txt`, async () => {\n    const input = `Paragraph one.\n\n<!-- double--dash (invalid SGML comment) -->\n\nParagraph two.\n\n<!-- enclosed tag </div> -->\n\nThe end.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders MD5 Hashes.txt`, async () => {\n    const input = `The MD5 value for \\`+\\` is \"26b17225b626fb9238849fd60eabdf60\".\n\n<p>test</p>\n\nThe MD5 value for \\`<p>test</p>\\` is:\n\n6205333b793f34273d75379350b36826\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n})\n\ndescribe('pl', () => {\n  it(`renders Amps and angle encoding.txt`, async () => {\n    const input = `AT&T has an ampersand in their name.\n\nAT&amp;T is another way to write it.\n\nThis & that.\n\n4 < 5.\n\n6 > 5.\n\nHere's a [link] [1] with an ampersand in the URL.\n\nHere's a link with an amersand in the link text: [AT&T] [2].\n\nHere's an inline [link](/script?foo=1&bar=2).\n\nHere's an inline [link](</script?foo=1&bar=2>).\n\n\n[1]: http://example.com/?foo=1&bar=2\n[2]: http://att.com/  \"AT&T\"`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Auto links.txt`, async () => {\n    const input = `Link: <http://example.com/>.\n\nWith an ampersand: <http://example.com/?foo=1&bar=2>\n\n* In a list?\n* <http://example.com/>\n* It should.\n\n> Blockquoted: <http://example.com/>\n\nAuto-links should not occur here: \\`<http://example.com/>\\`\n\n\tor here: <http://example.com/>`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Blockquotes with code blocks.txt`, async () => {\n    const input = `> Example:\n> \n>     sub status {\n>         print \"working\";\n>     }\n> \n> Or:\n> \n>     sub status {\n>         return \"working\";\n>     }\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Horizontal rules.txt`, async () => {\n    const input = `Dashes:\n\n---\n\n ---\n \n  ---\n\n   ---\n\n\t---\n\n- - -\n\n - - -\n \n  - - -\n\n   - - -\n\n\t- - -\n\n\nAsterisks:\n\n***\n\n ***\n \n  ***\n\n   ***\n\n\t***\n\n* * *\n\n * * *\n \n  * * *\n\n   * * *\n\n\t* * *\n\n\nUnderscores:\n\n___\n\n ___\n \n  ___\n\n   ___\n\n    ___\n\n_ _ _\n\n _ _ _\n \n  _ _ _\n\n   _ _ _\n\n    _ _ _\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Inline HTML comments.txt`, async () => {\n    const input = `Paragraph one.\n\n<!-- This is a simple comment -->\n\n<!--\n\tThis is another comment.\n-->\n\nParagraph two.\n\n<!-- one comment block -- -- with two comments -->\n\nThe end.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Links, shortcut references.txt`, async () => {\n    const input = `This is the [simple case].\n\n[simple case]: /simple\n\n\n\nThis one has a [line\nbreak].\n\nThis one has a [line \nbreak] with a line-ending space.\n\n[line break]: /foo\n\n\n[this] [that] and the [other]\n\n[this]: /this\n[that]: /that\n[other]: /other\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Nested blockquotes.txt`, async () => {\n    const input = `> foo\n>\n> > bar\n>\n> foo\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Ordered and unordered lists.txt`, async () => {\n    const input = `Asterisks tight:\n\n*\tasterisk 1\n*\tasterisk 2\n*\tasterisk 3\n\n\nAsterisks loose:\n\n*\tasterisk 1\n\n*\tasterisk 2\n\n*\tasterisk 3\n\n* * *\n\nPluses tight:\n\n+\tPlus 1\n+\tPlus 2\n+\tPlus 3\n\n\nPluses loose:\n\n+\tPlus 1\n\n+\tPlus 2\n\n+\tPlus 3\n\n* * *\n\n\nMinuses tight:\n\n-\tMinus 1\n-\tMinus 2\n-\tMinus 3\n\n\nMinuses loose:\n\n-\tMinus 1\n\n-\tMinus 2\n\n-\tMinus 3\n\n\nTight:\n\n1.\tFirst\n2.\tSecond\n3.\tThird\n\nand:\n\n1. One\n2. Two\n3. Three\n\n\nLoose using tabs:\n\n1.\tFirst\n\n2.\tSecond\n\n3.\tThird\n\nand using spaces:\n\n1. One\n\n2. Two\n\n3. Three\n\nMultiple paragraphs:\n\n1.\tItem 1, graf one.\n\n\tItem 2. graf two. The quick brown fox jumped over the lazy dog's\n\tback.\n\n2.\tItem 2.\n\n3.\tItem 3.\n\n\n\n*\tTab\n\t*\tTab\n\t\t*\tTab\n\nHere's another:\n\n1. First\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n3. Third\n\nSame thing but with paragraphs:\n\n1. First\n\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n\n3. Third\n\n\nThis was an error in Markdown 1.0.1:\n\n*\tthis\n\n\t*\tsub\n\n\tthat\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Strong and em together.txt`, async () => {\n    const input = `***This is strong and em.***\n\nSo is ***this*** word.\n\n___This is strong and em.___\n\nSo is ___this___ word.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Tabs.txt`, async () => {\n    const input = `+\tthis is a list item\n\tindented with tabs\n\n+   this is a list item\n    indented with spaces\n\nCode:\n\n\tthis code block is indented by one tab\n\nAnd:\n\n\t\tthis code block is indented by two tabs\n\nAnd:\n\n\t+\tthis is an example list item\n\t\tindented with tabs\n\t\n\t+   this is an example list item\n\t    indented with spaces\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders Tidyness.txt`, async () => {\n    const input = `> A list within a blockquote:\n> \n> *\tasterisk 1\n> *\tasterisk 2\n> *\tasterisk 3\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n})\n\ndescribe('zds', () => {\n  it(`renders align.txt`, async () => {\n    const input = `A simple paragraph\n\n->A centered paragraph<-\n\na simple paragraph\n\n->A right aligned paragraph->\n\nan other simple paragraph\n\nA simple paragraph\n\n->A centered paragraph<-\n\na simple paragraph\n\n->A right aligned paragraph->\n\nan other simple paragraph\n\n->A centered paragraph.\n\nContaining two paragraph<-\n\nan other simple paragraph\n\n->A right aligned paragraph.\n\nContaining two paragraph<-\n\nan other simple paragraph\n\n->A centered paragraph.<-\n->An other centered paragraph.<-\n\na simple paragraph\n\n->A started block without end.\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders comments.txt`, async () => {\n    const input = `Blabla<--COMMENTS hahaha COMMENTS-->Balbla\n\n\\`\\`\\`\nBlabla<--COMMENTS hahaha COMMENTS-->Balbla\n\\`\\`\\`\n\n<--COMMENTS Unfinished block\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders customblock.txt`, async () => {\n    const input = `[[s]]\n| Secret Block\n\n[[s]]\n|Secret Block\n\n[[secret]]\n| another\n\n> [[s]]\n> | > Blockquote in secret block in blockquote\n\n[[i]]\n| Information Block\n\n[[information]]\n| an other\n\n[[q]]\n| Question Block\n\n[[question]]\n| an other\n\n[[a]]\n| Attention Block\n\n[[attention]]\n| an other\n\n[[e]]\n| Erreur Block\n\n[[erreur]]\n| an other\n\n\n[[se]]\n| not a block\n\n[[secretsecret]]\n| not a block\n\n[[SECRET]]\n| not a block\n\n[[s]]\n| Multiline block\n|\n| > with blockquote !\n\n| Not a block\n\ncontent before\n[[s]]\n|A Block\nwith content after\n\n[[erreur  | a **title**]]\n| content\n\n[[neutre  | a **title**]]\n| content\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders delext.txt`, async () => {\n    const input = `Blabla ~~truc~~ kxcvj ~~sdv sd~~ sdff\n\nsdf ~~~~ df\n\nsfdgs ~ ~ dfg ~~ dgsg ~ qs\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders emoticons.txt`, async () => {\n    const input = `Lolilol :) Hey :D\n\n:)\n\n> Citation\n\n:D Ce n'est pas une légende\n\n![toto](https://zestedesavoir.com/media/galleries/3014/bee33fae-2216-463a-8b85-d1d9efe2c374.png)\n\n:D ce n'est pas une légende non plus`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders grid_tables.txt`, async () => {\n    const input = `# Grid table\n\n## Basic example\n\n+-------+----------+------+\n| Table Headings   | Here |\n+-------+----------+------+\n| Sub   | Headings | Too  |\n+=======+==========+======+\n| cell  | column spanning |\n+ spans +----------+------+\n| rows  | normal   | cell |\n+-------+----------+------+\n| multi | cells can be    |\n| line  | *formatted*     |\n|       | **paragraphs**  |\n| cells |                 |\n| too   |                 |\n+-------+-----------------+\n\n+---+---+---+\n| A | B | C |\n+===+===+===+\n| D | E     |\n|   +---+---+\n|   | F | G |\n+---+---+---+\n\n+---+-------+\n| A | B     |\n|   +---+---+\n|   | C | D |\n|   +---+---+\n|   | E     |\n+---+-------+\n\n+-----------+\n| A         |\n+---+---+---+\n| B | C | D |\n|   +---+   |\n|   | E |   |\n+---+---+---+\n\n+---+---+---+\n| C | D | E |\n|   |   +---+\n|   |   | F |\n|   +---+---+\n|   | G | H |\n|   |   +---+\n|   |   | I |\n+---+---+---+\n\n+---+---+---+\n| A | B | C |\n+---+   |   |\n| D |   |   |\n+---+---+   |\n| E | F |   |\n+---+   |   |\n| G |   |   |\n+---+---+---+\n\n+---+---+---+---+\n| A | B | C | D |\n+---+---+---+---+\n| E     | F     |\n+-------+-------+\n| G             |\n+---------------+\n\n+---------------+\n| A             |\n+-------+-------+\n| B     | C     |\n+---+---+---+---+\n| D | E | F | G |\n+---+---+---+---+\n\n\n+---+---+---+---+---+---+\n| A | B | C | D | E | F |\n|   |   +---+---+   |   |\n|   |   | G     |   |   |\n|   +---+-------+---+   |\n|   | H             |   |\n+---+---------------+---+\n| I                     |\n+-----------------------+\n\n+---+-------------------+\n| A | B                 |\n+===+===================+\n| C |                   |\n|   | +---+---+---+---+ |\n|   | | D | E | F | G | |\n|   | +---+---+---+---+ |\n|   | | H             | |\n|   | +---------------+ |\n|   |                   |\n+---+-------------------+\n\n+---+---------------------------------------------------------------+---+\n| H |                                                               |He |\n+---+---+---------------------------------------+---+---+---+---+---+---+\n|Li |Be |                                       | B | C | N | O | F |Ne |\n+---+---+                                       +---+---+---+---+---+---+\n|Na |Mg |                                       |Al |Si | P | S |Cl |Ar |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n| K |Ca |Sc |Ti | V |Cr |Mn |Fe |Co |Ni |Cu |Zn |Ga |Ge |As |Se |Br |Kr |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Rb |Sr | Y |Zr |Nb |Mo |Tc |Ru |Rh |Pd |Ag |Cd |In |Sn |Sb |Te | I |Xe |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Cs |Ba |LAN|Hf |Ta | W |Re |Os |Ir |Pt |Au |Hg |Tl |Pb |Bi |Po |At |Rn |\n+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Fr |Ra |ACT|                                                           |\n+---+---+---+-----------------------------------------------------------+\n|                                                                       |\n+-----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Lanthanide |La |Ce |Pr |Nd |Pm |Sm |Eu |Gd |Tb |Dy |Ho |Er |Tm |Yb |Lu |\n+-----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n|Actinide   |Ac |Th |Pa | U |Np |Pu |Am |Cm |Bk |Cf |Es |Fm |Md |No |Lw |\n+-----------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+\n\n+---------+\n| A       |\n+---------+\nText at the end\n\n+---------+\n| A       |\n+---------+\nText at the\n\n## specific tests\n\nIn this examples, the second row should always be a full-cell\n\n+---------------+\n| A             |\n+---------------+\n| B | C         |\n+---+---+---+---+\n| D | E | F | G |\n+---+---+---+---+\n\n+---+-----------+\n| A |           |\n+---+-----------+\n| B | C         |\n+-------+---+---+\n| D   E | F | G |\n+-------+---+---+\n\n+---+---+---+---+\n| A | B | C | D |\n+---+---+---+---+\n| B | C         |\n|               |\n+---+---+---+---+\n| D | E | F | G |\n+---+---+---+---+\n\n+---+---+---+---+\n| A | B | C | D |\n+---+---+---+---+\n| B  | C        |\n+---+---+---+---+\n| D | E | F | G |\n+---+---+---+---+\n\n## Failing example\n\n+--- A ---+\n\n+---------+\n+---------+\n\n+---------+\n| A       |\n|         |\n\n+---------+\n| A       |\n+=========+\n| B       |\n+=========+\n\n+--- A ---+\n|         |\n+---------+\n|         |\n+---------+\n\nBug #107\n\n+-----+-------+-------+-------+-------+-------+\n|     | case1         | case2         | case3 |\n+-----+-------+-------+-------+-------+-------+\n|     | case4 | case5 | case6 | case7 |       |\n+=====+=======+=======+=======+=======+=======+\n|  X  |    X  |   X   |   X   |   X   |   X   |\n+-----+-------+-------+-------+-------+-------+\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders math.txt without custom config`, async () => {\n    const input = `inline $simple$ math\n\n*inline* $$doubledisplay$$ math\n\n$$\ndisplay\n$$\n\n$$again$$\n`\n    const newMdastConfig = configOverride(defaultMdastConfig, {math: {}})\n    const newHtmlConfig = configOverride(defaultHtmlConfig, {katex: {}})\n\n    return renderHtml(newMdastConfig, newHtmlConfig)(input).then((html) => {\n      expect((html.match(/katex-mathml/g) || []).length).toBe(4)\n      expect((html.match(/span class=\"katex-display\"/g) || []).length).toBe(1)\n      expect((html.match(/inlineMath math-display/g) || []).length).toBe(0)\n      expect((html.match(/div class=\"math/g) || []).length).toBe(1)\n    })\n  })\n\n  it(`renders math.txt`, async () => {\n    const input = `inline $simple$ math\n\n*inline* $$doubledisplay$$ math\n\n$$\ndisplay\n$$\n\n$$again$$\n`\n\n    return renderHtml(input).then((html) => {\n      expect((html.match(/katex-mathml/g) || []).length).toBe(4)\n      expect((html.match(/span class=\"katex-display\"/g) || []).length).toBe(3)\n      expect((html.match(/math-inline math-display/g) || []).length).toBe(2)\n      expect((html.match(/div class=\"math/g) || []).length).toBe(1)\n    })\n  })\n\n  it(`renders kbd.txt`, async () => {\n    const input = `Blabla ||ok|| kxcvj ||ok foo|| sdff\n\nsdf |||| df\n\nsfdgs | | dfg || dgsg | qs\n\nWith two pipes: \\\\||key|| you'll get ||key||.\n\nIt parses inline elements inside:\n\n* ||hell[~~o~~](#he)?||\n\nbut not block elements inside:\n\n* ||hello: [[secret]]?||\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders subsuperscript.txt`, async () => {\n    const input = `Foo ^sup^ kxcvj ^sup *string*^ bar\n\nnot ^ here\n\nneither \\\\^ here ^ because it's escaped\n\nFoo ~sup~ kxcvj ~sup *string*~ bar\n\nnot ~ here\n\nneither \\\\~ here ~ because it's escaped\n\nfoo ^^a^^ bar\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders urlize.txt`, async () => {\n    const input = `http://www.google.fr\n\nhttps://www.google.fr\n\nwww.google.fr\n\ngoogle.fr\n\n<http://www.google.fr>\n\nVoici mon super lien qui termine une phrase http://www.google.fr.\n\nhttps://fr.wikipedia.org/wiki/Compactifié_d'Alexandrov\n\nhttps://fr.wikipedia.org/wiki/Compactifi%C3%A9_d%27Alexandrov\n\njavascript:alert%28'Hello%20world!'%29\n\nvbscript:msgbox%28%22Hello%20world!%22%29\n\nlivescript:alert%28'Hello%20world!'%29\n\nmocha:[code])\n\njAvAsCrIpT:alert%28'Hello%20world!'%29\n\nja&#32;vas&#32;cr&#32;ipt:alert%28'Hello%20world!'%29\n\nja&#00032;vas&#32;cr&#32;ipt:alert%28'Hello%20world!'%29\n\nja&#x00020;vas&#32;cr&#32;ipt:alert%28'Hello%20world!'%29\n\nja%09&#x20;%0Avas&#32;cr&#x0a;ipt:alert%28'Hello%20world!'%29\n\nja%20vas%20cr%20ipt:alert%28'Hello%20world!'%29\n\nlive%20script:alert%28'Hello%20world!'%29\n\njavascript:alert%29'XSS'%29\n\n[sur isocpp.org](https://isocpp.org/std/status)\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n\n  it(`renders video.txt`, async () => {\n    const input = `!(https://www.youtube.com/watch?v=FdltlrKFr1w)\n\n!(https://www.dailymotion.com/video/x2y6lhm)\n\n!(http://vimeo.com/133693532)\n\n!(https://screen.yahoo.com/weatherman-gives-forecast-using-taylor-191821481.html)\n\n!(https://youtu.be/FdltlrKFr1w)\n\n!(http://youtube.com/watch?v=FdltlrKFr1w)\n\n!(http://jsfiddle.net/Sandhose/BcKhe/1/)\n\n!(http://jsfiddle.net/zgjhjv9j/)\n\n!(http://jsfiddle.net/zgjhjv9j/1/)\n\n!(https://www.youtube.com/watch?v=1Bh4DZ2xGmw&ab_channel=DestinationPr%C3%A9pa)\n\n!(http://www.ina.fr/video/MAN9062216517/qui-a-vole-le-bolero-de-ravel-e01-la-naissance-du-bolero-et-la-mort-de-ravel-video.html)\n\nThis one should not be allowed:\n\n!(http://jsfiddle.net/Sandhose/BcKhe/)\n\n!(https://www.youtube.com/watch?v=FdltlrKFr1w)\nwith text after\n`\n\n    const html = await renderHtml(input)\n    const latex = await renderLatex(input)\n\n    expect(html).toMatchSnapshot()\n    expect(latex).toMatchSnapshot()\n  })\n})\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/mdast-suite.test.js",
    "content": "const dedent = require('dedent')\nconst renderString = require('../common')()\n\ntest('renders correctly', () => {\n  const p = renderString(dedent`\n    # foo\n    **something else**\n  `)\n\n  return expect(p).toMatchSnapshot()\n})\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/misc.test.js",
    "content": "const {\n  defaultMdastConfig,\n  renderAs,\n} = require('../utils/renderer-tests')\n\nconst vfile = require('../server/utils/manifest')\n\nconst renderString = renderAs('html')\n\ndescribe('sanitizer', () => {\n  it('do not oversanitize ping', async () => {\n    defaultMdastConfig.ping.pingUsername = () => true\n\n    const rendered = await renderString('@Clem')\n    expect(rendered).toContain('class=\"ping ping-link\"')\n    expect(rendered).toContain('class=\"ping-username\"')\n\n    defaultMdastConfig.ping.pingUsername = () => false\n  })\n\n  it('do not oversanitize math - test sub/sup', () => {\n    expect(renderString('$$1_n + 1^n$$')).resolves.toMatchSnapshot()\n  })\n\n  it('do not oversanitize math - test frac', () => {\n    expect(renderString('$$\\\\frac{1+1}{x+y}$$')).resolves.toMatchSnapshot()\n  })\n\n  it('do not oversanitize math - test sqrt', () => {\n    expect(renderString('$$\\\\sqrt[3]{x^3 + y^3 + z^3}$$')).resolves.toMatchSnapshot()\n  })\n\n  it('do not oversanitize math - test notin', () => {\n    expect(renderString('$$\\\\notin$$')).resolves.toMatchSnapshot()\n  })\n\n  it('do not oversanitize math - test overrightarrow', () => {\n    expect(renderString('$$\\\\overrightarrow{AB}$$')).resolves.toMatchSnapshot()\n  })\n\n  it('do not oversanitize math - test vec', () => {\n    expect(renderString('$$\\\\vec{a}$$')).resolves.toMatchSnapshot()\n  })\n\n  it('do not oversanitize math - test color', () => {\n    expect(renderString('$$\\\\color{red}{x}$$')).resolves.toMatchSnapshot()\n  })\n})\n\ndescribe('manifest utils', () => {\n  it('assembles content-only vfile', () => {\n    const res = vfile.assemble({contents: 'aa'}, {contents: 'bb'})\n\n    expect(res.contents).toEqual('aa\\nbb')\n    // Check messages are dropped\n    expect(res.messages).toEqual([])\n  })\n\n  it('assembles vfile with messages', () => {\n    const messages = [\n      'I dream\\'d a dream to-night.',\n      'And so did I.',\n      'Well, what was yours?',\n      'That dreamers often lie.',\n    ]\n\n    const res = vfile.assemble(\n      {messages: [messages[0], messages[1]]},\n      {messages: [messages[2], messages[3]]},\n    )\n\n    expect(res.messages).toEqual(messages)\n  })\n\n  it('assembles properties - big test', () => {\n    const res = vfile.assemble(\n      {data: {\n        disableToc: true,\n        stats:      {signs: 16, words: 4},\n        ping:       ['Romeo', 'Juliet'],\n      }},\n      {data: {\n        languages: ['html', 'js'],\n        stats:     {signs: 15, words: 3},\n        ping:      ['Romeo', 'Mercutio'],\n      }},\n    )\n\n    expect(res.data).toEqual({\n      disableToc: true,\n      languages:  ['html', 'js'],\n      stats:      {signs: 31, words: 7},\n      ping:       ['Romeo', 'Juliet', 'Mercutio'],\n    })\n  })\n\n  it('assembles properties - unique property', () => {\n    const res = vfile.assemble(\n      {data: {\n        disableToc: true,\n      }},\n      {data: {\n        disableToc: false,\n      }},\n    )\n\n    expect(res.data).toEqual({\n      disableToc: false,\n    })\n  })\n\n  it('gather extracts', () => {\n    const extracts = ['introduction', '# foo\\n\\nHello @you', 'Foobar', 'Barfoo']\n\n    const manifest = {\n      introduction: extracts[0],\n      children:     [{text: extracts[2]}, {text: extracts[3]}],\n      text:         extracts[1],\n    }\n\n    return expect(vfile.gatherExtracts(manifest).map(v => v.text)).toEqual(extracts)\n  })\n\n  it('dispatch extracts - simple', () => {\n    const extracts = ['introduction', '# foo\\n\\nHello @you', 'Foobar', 'Barfoo']\n\n    const manifest = {\n      introduction: 1,\n      children:     [{text: 1}, {text: 1}],\n      text:         1,\n    }\n\n    const expectedManifest = {\n      introduction: extracts[0],\n      children:     [{text: extracts[2]}, {text: extracts[3]}],\n      text:         extracts[1],\n    }\n\n    const resultingVfile = vfile.dispatch(extracts.map(v => ({contents: v})), manifest)\n\n    expect(resultingVfile.contents).toEqual(expectedManifest)\n  })\n\n  it('dispatch extracts - with data', () => {\n    const extracts = ['introduction', '# foo\\n\\nHello @you', 'Foobar', 'Barfoo']\n\n    const manifest = {\n      introduction: 1,\n      children:     [{text: 1}, {text: 1}],\n      text:         1,\n    }\n\n    const resultingVfile = vfile.dispatch(extracts.map((v, i) => ({\n      contents: v,\n      messages: [`Message ${i}`],\n      data:     {\n        stats: {words: 2},\n      },\n    })), manifest)\n\n    expect(resultingVfile.data.stats.words).toEqual(8)\n    expect(resultingVfile.messages).toEqual([0, 0, 0, 0].map((_, i) => `Message ${i}`))\n  })\n})\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/regressions.test.js",
    "content": "const a = require('axios')\nconst dedent = require('dedent')\n\nconst u = (path) => `http://localhost:27272${path}`\nconst html = u('/html')\nconst latex = u('/latex')\n\ndescribe('Regression tests', () => {\n  describe('HTML endpoint', () => {\n    test('#188 It does not crash on unsupported languages fenced code blocks', async () => {\n      const response = await a.post(html, {\n        md: [\n          '# foo',\n          '',\n          '```foobar',\n          'console.error(\"foo\", true)',\n          '```',\n          '',\n          '```js',\n          'console.error(\"foo\", true)',\n          '```',\n        ].join('\\n'),\n        opts: {},\n      })\n\n      const [rendered] = response.data\n      expect(rendered).toMatchSnapshot()\n    })\n\n    test('#431 It uses random footnote postfix correctly', async () => {\n      const md = dedent`\n        hello[^foo] world[^bar]\n\n        [^foo]: foo\n        [^bar]: bar\n      `\n\n      const firstResponse = await a.post(html, {\n        md,\n        opts: {},\n      })\n\n      const secondResponse = await a.post(html, {\n        md,\n        opts: {},\n      })\n\n      const [firstRendered] = firstResponse.data\n      const [secondRendered] = secondResponse.data\n\n      const firstFooReference = firstRendered.match(/fnref-1-([a-zA-Z0-9-_]+)/)\n      const firstFooDefinition = firstRendered.match(/fn-1-([a-zA-Z0-9-_]+)/)\n      const firstBarReference = firstRendered.match(/fnref-2-([a-zA-Z0-9-_]+)/)\n      const secondBarDefinition = secondRendered.match(/fn-2-([a-zA-Z0-9-_]+)/)\n\n      // A unique token shall be generated for a given footnote\n      expect(firstFooReference[1]).toEqual(firstFooDefinition[1])\n      // But also for a given render\n      expect(firstFooReference[1]).toEqual(firstBarReference[1])\n\n      // Finally, we expect tokens to differ between two successive renderings\n      expect(secondBarDefinition[1]).not.toEqual(firstBarReference[1])\n    })\n  })\n\n  describe('Latex endpoint', () => {\n    test('It wraps image basenames containing dots', async () => {\n      const response = await a.post(latex, {\n        md: dedent`\n          ![](x.yz.png)\n\n          [![foo](/a/w.x.y.z.png)](http://example.com)\n\n          ![](/w.x.y.z.png)\n\n          ![](/foo.bar/x.yz.png)\n        `,\n        opts: {},\n      })\n\n      const [rendered] = response.data\n      expect(rendered).toMatchSnapshot()\n    })\n  })\n})\n"
  },
  {
    "path": "packages/zmarkdown/__tests__/server.test.js",
    "content": "/* eslint-disable max-len */\nconst clone = require('clone')\nconst dedent = require('dedent')\nconst a = require('axios')\nconst fs = require('fs')\nconst xtend = require('xtend')\n\nconst u = (path) => `http://localhost:27272${path}`\n\nconst epub = u('/epub')\nconst html = u('/html')\nconst latex = u('/latex')\nconst texfile = u('/latex-document')\n\nconst texfileOpts = {\n  content_type:      'contentType',\n  title:             'The Title',\n  authors:           ['FØØ', 'Bär'],\n  license:           'CC-BY-NC-SA',\n  license_logo:      'by-nc-sa.svg',\n  license_url:       'https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode',\n  license_directory: '/tmp/l',\n  smileys_directory: '/tmp/s',\n}\n\nconst rm = (dir, file) => new Promise((resolve, reject) =>\n  fs.unlink(`${dir}/${file}`, (err) => {\n    if (err) reject(err)\n    fs.rmdir(dir, (err) => {\n      if (err) reject(err)\n      resolve('ok')\n    })\n  }))\n\ndescribe('HTML endpoint', () => {\n  it('accepts POSTed markdown', async () => {\n    const response = await a.post(html, {md: '# foo', opts: {}})\n\n    expect(response.status).toBe(200)\n    const [string, metadata] = response.data\n    expect(string).toMatchSnapshot()\n    expect(metadata.disableToc).toBe(false)\n  })\n\n  it('does not disable TOC', async () => {\n    const response = await a.post(html, {md: '# foo', opts: {}})\n\n    const [, {disableToc}] = response.data\n    expect(disableToc).toBe(false)\n  })\n\n  it('disables TOC', async () => {\n    const response = await a.post(html, {md: '*foo*', opts: {}})\n\n    const [, {disableToc}] = response.data\n    expect(disableToc).toBe(true)\n  })\n\n  it('gets ping as metadata', async () => {\n    const response = await a.post(html, {md: 'waddup @Clem', opts: {}})\n\n    const [rendered, metadata] = response.data\n    expect(rendered).toContain('class=\"ping ping-link\"')\n    expect(rendered).toContain('href=\"/@Clem\"')\n    expect(metadata.ping).toEqual(['Clem'])\n  })\n\n  it('disables ping', async () => {\n    const response = await a.post(html, {md: 'waddup @Clem', opts: {disable_ping: true}})\n\n    const [rendered, metadata] = response.data\n    expect(rendered).not.toContain('class=\"ping\"')\n    expect(metadata.ping).toBe(undefined)\n    expect(metadata.languages).toEqual([])\n  })\n\n  it('only parses inline things', async () => {\n    const response = await a.post(html, {\n      md:   '# foo\\n```js\\nwindow\\n```',\n      opts: {inline: true},\n    })\n\n    const [rendered, {languages}] = response.data\n    expect(rendered).not.toContain('<h')\n    expect(languages).toEqual([])\n  })\n\n  it('can disable tokenizers', async () => {\n    const response = await a.post(html, {\n      md:   '# foo\\nhello bar!',\n      opts: {disable_tokenizers: {block: ['atxHeading']}},\n    })\n\n    const [rendered] = response.data\n    expect(rendered).not.toContain('<h')\n  })\n\n  it('can disable tokenizers in inline mode', async () => {\n    const response = await a.post(html, {\n      md:   '# foo\\n*hello bar!*',\n      opts: {\n        inline:             true,\n        disable_tokenizers: {inline: ['emphasis']},\n      },\n    })\n\n    const [rendered, {languages}] = response.data\n    expect(rendered).not.toContain('<h')\n    expect(rendered).not.toContain('<em')\n    expect(languages).toEqual([])\n  })\n\n  it('extracts languages', async () => {\n    const response = await a.post(html, {\n      md: dedent`\n        \\`\\`\\`js\n        \\`\\`\\`\n        \\`\\`\\`python\n        \\`\\`\\`\n        \\`\\`\\`java\n        \\`\\`\\`\n      `,\n      opts: {},\n    })\n\n    const [, {languages}] = response.data\n    expect(languages).toEqual(['js', 'python', 'java'])\n  })\n\n  it('does not crash with an invalid align that looks like a comment', async () => {\n    const response = await a.post(html, {\n      md:   '<-- x -->',\n      opts: {},\n    })\n\n    const rendered = response.data[0]\n    expect(rendered).toBe('<p>&#x3C;— x —></p>')\n  })\n\n  it('produces statistics when configured', async () => {\n    const text = dedent(`\n    7 chars\n    # 13 chars here\n\n    [13 chars here](https.//github.com/zestedesavoir/zmarkdown)\n\n    ![13 chars here](https.//github.com/zestedesavoir/zmarkdown)\n\n    ![no chars here](https.//github.com/zestedesavoir/zmarkdown)\n    Figure: 13 chars here\n    `)\n    const response = await a.post(html, {md: text, opts: {stats: true}})\n    expect(response.status).toBe(200)\n\n    const [string, metadata] = response.data\n    expect(string).toMatchSnapshot()\n    expect(metadata.stats.signs).toBe(59)\n    expect(metadata.stats.words).toBe(14)\n  })\n\n  it('correctly renders manifest', async () => {\n    const text = {\n      title:    'A story',\n      children: [\n        {'text': 'On a balcony in summer air'},\n        {'text': 'Escape this town for a little while'},\n        {'text': 'Marry me, Juliet, you\\'ll never have to be alone'},\n      ],\n      conclusion: 'Just say \"Yes\"',\n    }\n\n    const response = await a.post(html, {md: text})\n    expect(response.status).toBe(200)\n\n    const [string] = response.data\n    expect(string).toMatchSnapshot()\n  })\n\n  it('reports quizzes', async () => {\n    const text = dedent(`\n    [[quizz | What is true?]]\n    | - true\n    | - false\n    `)\n    const response = await a.post(html, {md: text})\n    expect(response.status).toBe(200)\n\n    const [, metadata] = response.data\n    expect(metadata.hasQuizz).toBe(true)\n  })\n\n  it('enforce level shifting by default', async () => {\n    const text = dedent(`\n    # I have seen a dolphin\n    \n    On a camera. What is happening with animals these days?\"\n    `)\n\n    const response = await a.post(html, {md: text, opts: {heading_shift: 1}})\n    expect(response.status).toBe(200)\n\n    const [content] = response.data\n    expect(content).toMatchSnapshot()\n    expect(content).toContain('h2')\n  })\n\n  it('can use custom iframe elements', async () => {\n    const text = dedent(`\n    # You won't get my data, Google!\n\n    !(https://www.youtube.com/watch?v=q3zqJs7JUCQ)\n    `)\n\n    const response = await a.post(html, {md: text, opts: {hide_iframes: true}})\n    expect(response.status).toBe(200)\n\n    const [content] = response.data\n    expect(content).not.toContain('iframe')\n    expect(content).toContain('hidden-frame')\n    expect(content).toMatchSnapshot()\n  })\n})\n\ndescribe('LaTeX endpoint', () => {\n  it('accepts POSTed markdown', async () => {\n    const response = await a.post(latex, {md: '# foo', opts: {}})\n    expect(response.status).toBe(200)\n\n    const [string, metadata] = response.data\n    expect(string).toMatchSnapshot()\n    expect(metadata.disableToc).toBe(false)\n  })\n\n  it('does not disable TOC', async () => {\n    const response = await a.post(latex, {md: '# foo', opts: {}})\n\n    const [, {disableToc}] = response.data\n    expect(disableToc).toBe(false)\n  })\n\n  it('disables TOC', async () => {\n    const response = await a.post(latex, {md: '*foo*', opts: {}})\n\n    const [, {disableToc}] = response.data\n    expect(disableToc).toBe(true)\n  })\n\n  it('does not have pings', async () => {\n    const response = await a.post(latex, {md: 'waddup @Clem', opts: {}})\n\n    const [rendered, metadata] = response.data\n    expect(rendered).toEqual('waddup @Clem\\n\\n')\n    expect(metadata.ping).toBe(undefined)\n  })\n\n  it('disables ping', async () => {\n    const response = await a.post(latex, {md: 'waddup @Clem', opts: {disable_ping: true}})\n\n    const [rendered, metadata] = response.data\n    expect(rendered).not.toContain('class=\"ping\"')\n    expect(metadata.ping).toBe(undefined)\n  })\n\n  it('only parses inline things', async () => {\n    const response = await a.post(latex, {\n      md:   '# foo\\n```js\\nwindow\\n```',\n      opts: {inline: true},\n    })\n\n    const [rendered] = response.data\n    expect(rendered).not.toContain('<h')\n  })\n\n  it('downloads images', async () => {\n    const destination = process.env.DEST || `${__dirname}/../public/`\n    const response = await a.post(latex, {\n      md:   `![](${u('/static/img.png')})`,\n      opts: {inline: true, images_download_dir: destination},\n    })\n\n    const [rendered, , messages] = response.data\n    expect(messages).toEqual([])\n\n    const regex = /\\/([a-zA-Z0-9_-]{7,14})\\/([a-zA-Z0-9_-]{7,14})\\.(.{1,4})}/\n    expect(rendered).toMatch(regex)\n    const [, dir, file, ext] = rendered.match(regex)\n    return expect(rm(`${destination}/${dir}`, `${file}.${ext}`)).resolves.toBe('ok')\n  })\n\n  it('properly defaults image', async () => {\n    const destination = process.env.DEST || `${__dirname}/../public/`\n    const response = await a.post(latex, {\n      md:   `![](${u('/static/noimage.png')})`,\n      opts: {inline: true, images_download_dir: destination},\n    })\n\n    const rendered = response.data[0]\n    expect(rendered).toContain('black.png')\n  })\n\n  it('properly defaults image with custom path', async () => {\n    const destination = process.env.DEST || `${__dirname}/../public/`\n    const response = await a.post(latex, {\n      md:   `![](${u('/static/noimage.png')})`,\n      opts: {\n        inline:                  true,\n        images_download_dir:     destination,\n        images_download_default: 'default.png',\n      },\n    })\n\n    const rendered = response.data[0]\n    expect(rendered).toContain('default.png')\n  })\n\n  it('correctly renders manifest', async () => {\n    const text = {\n      title:    'Another story',\n      children: [\n        {'text': 'I\\'m standing there'},\n        {'text': 'And I was crying on the staircase'},\n        {'text': 'I got tired of waiting'},\n      ],\n      conclusion: 'Just say \"Yes\"',\n    }\n\n    const response = await a.post(latex, {md: text})\n    expect(response.status).toBe(200)\n\n    const [string] = response.data\n    expect(string).toMatchSnapshot()\n  })\n})\n\ndescribe('Texfile endpoint', () => {\n  it('accepts POSTed markdown', async () => {\n    const response = await a.post(texfile, {md: '# foo', opts: texfileOpts})\n    expect(response.status).toBe(200)\n\n    const [string, metadata] = response.data\n    expect(string).toMatchSnapshot()\n    expect(string).toContain(\n      '\\\\licence[/tmp/l/by-nc-sa.svg]{CC-BY-NC-SA}' +\n      '{https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode}')\n    expect(metadata).toEqual({})\n  })\n\n  it('escapes title and author', async () => {\n    const titleOpts = {authors: ['titi_alone'], title: 'recap #1'}\n    const response = await a.post(texfile,\n      {md: '# foo', opts: xtend(texfileOpts, titleOpts)})\n    expect(response.status).toBe(200)\n\n    const result = response.data\n    expect(result[0]).toMatchSnapshot()\n  })\n\n  it('allows date', async () => {\n    const specificOptions = {date: '2 mai 1998'}\n    const response = await a.post(texfile,\n      {md: '# foo', opts: xtend(texfileOpts, specificOptions)})\n    expect(response.status).toBe(200)\n\n    const result = response.data\n    expect(result[0]).toMatchSnapshot()\n  })\n\n  it('does not return metadata', async () => {\n    const response = await a.post(texfile, {md: '# foo', opts: texfileOpts})\n\n    const [, metadata] = response.data\n    expect(metadata).toEqual({})\n  })\n\n  it('does not have pings', async () => {\n    const response = await a.post(texfile, {md: 'waddup @Clem', opts: texfileOpts})\n\n    const [rendered, metadata] = response.data\n    expect(rendered).toContain('waddup @Clem\\n\\n')\n    expect(metadata.ping).toBe(undefined)\n  })\n\n  it('only parses inline things', async () => {\n    const response = await a.post(texfile, {\n      md:   '# foo\\n```js\\nwindow\\n```',\n      opts: texfileOpts,\n    })\n\n    const [rendered] = response.data\n    expect(rendered).not.toContain('<h')\n  })\n\n  it('downloads images', async () => {\n    const destination = process.env.DEST || `${__dirname}/../public/`\n    const opts = clone(texfileOpts)\n    opts.images_download_dir = destination\n    const response = await a.post(texfile, {\n      md:   `![](${u('/static/img.png')})`,\n      opts: opts,\n    })\n\n    const [rendered, , messages] = response.data\n    expect(messages).toEqual([])\n\n    const regex = /\\/([a-zA-Z0-9_-]{7,14})\\/([a-zA-Z0-9_-]{7,14})\\.(.{1,4})}/\n    expect(rendered).toMatch(regex)\n    const [, dir, file, ext] = rendered.match(regex)\n    return expect(rm(`${destination}/${dir}`, `${file}.${ext}`)).resolves.toBe('ok')\n  })\n\n  it('allows extra arguments', async () => {\n    const additionalOpts = {\n      logo_directory: '/tmp/logo',\n      content_logo:   'h2g2.png',\n      content_link:   'https://en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy_(novel)',\n      editor_logo:    'pmm.jpg',\n      editor_link:    'https://www.panmacmillan.com/',\n    }\n    const opts = Object.assign({}, texfileOpts, additionalOpts)\n    const response = await a.post(texfile, {md: '# foo', opts})\n    expect(response.status).toBe(200)\n\n    const [string] = response.data\n    expect(string).toMatchSnapshot()\n    expect(string).toContain(dedent`\\logo{/tmp/logo/h2g2.png}\n    \\editorLogo{/tmp/logo/pmm.jpg}\n    \\tutoLink{https://en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy_(novel)}\n    \\editor{https://www.panmacmillan.com/}`)\n  })\n\n  it('transform quizzes for document', async () => {\n    const opts = clone(texfileOpts)\n    const text = dedent(`\n    [[quizz | What is true?]]\n    | - true\n    | - false\n    `)\n    const response = await a.post(texfile, {md: text, opts})\n    expect(response.status).toBe(200)\n\n    const [content] = response.data\n    expect(content).toMatchSnapshot()\n  })\n\n  it('correctly renders introduction & conclusion', async () => {\n    const opts = clone(texfileOpts)\n    const manifest = {\n      introduction: 'Here I introduce My content™',\n      title:        'My content™',\n      children:     [{\n        children: [{\n          introduction: 'Here I introduce My section™',\n          conclusion:   'Here I conclude My section™',\n        }],\n      }],\n      conclusion: 'Here I conclude My content™',\n    }\n\n    const response = await a.post(texfile, {md: manifest, opts})\n    expect(response.status).toBe(200)\n\n    const [content] = response.data\n    expect(content).toMatchSnapshot()\n    expect(content).toContain('LevelOneIntroduction')\n    expect(content).toContain('LevelOneConclusion')\n    expect(content).toContain('LevelThreeIntroduction')\n    expect(content).toContain('LevelThreeConclusion')\n  })\n\n  it('shifts titles and only titles', async () => {\n    const opts = clone(texfileOpts)\n    const manifest = {\n      introduction: 'myIntro',\n      title:        'myTitle',\n    }\n\n    opts.heading_shift = 2\n\n    const response = await a.post(texfile, {md: manifest, opts})\n    expect(response.status).toBe(200)\n\n    const [content] = response.data\n    expect(content).toMatchSnapshot()\n    expect(content).toContain('LevelOneIntroduction')\n    expect(content).toContain('levelThreeTitle')\n  })\n})\n\n\ndescribe('EPUB endpoint', () => {\n  it('downloads images', async () => {\n    const destination = process.env.DEST || `${__dirname}/../public/`\n    const opts = clone(texfileOpts)\n    opts.images_download_dir = destination\n    const response = await a.post(epub, {\n      md:   `![](${u('/static/img.png')})`,\n      opts: opts,\n    })\n\n    const [rendered, , messages] = response.data\n    expect(messages).toEqual([])\n\n    const regex = /\\/([a-zA-Z0-9_-]{7,14})\\/([a-zA-Z0-9_-]{7,14})\\.(.{1,4})\"/\n    expect(rendered).toMatch(regex)\n    const [, dir, file, ext] = rendered.match(regex)\n    return expect(rm(`${destination}/${dir}`, `${file}.${ext}`)).resolves.toBe('ok')\n  })\n\n  it('copies local images', async () => {\n    const destination = process.env.DEST || `${__dirname}/../public/`\n    const opts = clone(texfileOpts)\n    opts.images_download_dir = destination\n    opts.local_url_to_local_path = [\n      '/foobar',\n      `${__dirname.replace('__tests__', 'server/static')}`,\n    ]\n    const response = await a.post(epub, {\n      md:   `![](file://tmp/passwd)`,\n      opts: opts,\n    })\n\n    const [rendered, , messages] = response.data\n    expect(messages[0].message).toMatch(\"Protocol 'file:' not allowed.\")\n\n    expect(rendered).toBe('<p><img></p>')\n  })\n})\n"
  },
  {
    "path": "packages/zmarkdown/client/zhlite.js",
    "content": "// This is the same as the `html` renderer, but highlight & katex were removed.\n// We need to duplicate the file because otherwise Webpack would\n// load the modules anyway...\nimport {parser as mdastParser} from './zmdast'\n\nconst rendererForge   = require('../renderers/renderer-forge')\n\nconst remark2rehype   = require('remark-rehype')\nconst rehypeStringify = require('rehype-stringify')\n\nconst defaultMdastConfig = require('../config/mdast')\nconst defaultHtmlConfig  = require('../config/html')\n\nconst defaultStringifierList = {\n  slug:             require('rehype-slug'),\n  autolinkHeadings: require('rehype-autolink-headings'),\n  footnotesTitles:  require('rehype-footnotes-title'),\n  htmlBlocks:       require('rehype-html-blocks'),\n  postfixFootnotes: require('rehype-postfix-footnote-anchors'),\n  sanitize:         require('rehype-sanitize'),\n}\n\nconst postProcessorList = {\n  wrapCode:         require('../postprocessors/html-wrap-code'),\n  iframeWrappers:   require('../postprocessors/html-iframe-wrappers'),\n  footnotesReorder: require('../postprocessors/html-footnotes-reorder'),\n}\n\nexport function parser (tokenizer, config) {\n  tokenizer\n    .use(remark2rehype, config.bridge)\n\n  rendererForge(\n    tokenizer,\n    defaultStringifierList,\n    postProcessorList,\n  )(config)\n\n  return tokenizer\n    .use(rehypeStringify, config.stringify)\n}\n\nexport function render (\n  markdown,\n  cb,\n  mdConfig = defaultMdastConfig,\n  htmlConfig = defaultHtmlConfig,\n) {\n  const processor = mdastParser(mdConfig)\n  parser(processor, htmlConfig)\n\n  processor.process(markdown, (err, vfile) => {\n    if (err) return cb(err)\n\n    cb(null, vfile)\n  })\n}\n"
  },
  {
    "path": "packages/zmarkdown/client/zhtml.js",
    "content": "const defaultMdastConfig = require('../config/mdast')\nconst defaultHtmlConfig = require('../config/html')\n\nimport {parser as mdastParser} from './zmdast'\n\nexport const parser = require('../renderers/html')\n\nexport function render (\n  markdown,\n  cb,\n  mdConfig = defaultMdastConfig,\n  htmlConfig = defaultHtmlConfig,\n) {\n  const processor = mdastParser(mdConfig)\n  parser(processor, htmlConfig)\n\n  processor.process(markdown, (err, vfile) => {\n    if (err) return cb(err)\n\n    cb(null, vfile)\n  })\n}\n"
  },
  {
    "path": "packages/zmarkdown/client/zlatex.js",
    "content": "const defaultMdastConfig = require('../config/mdast')\nconst defaultLatexConfig = require('../config/latex')\n\nimport {parser as mdastParser} from './zmdast'\n\nexport const parser = require('../renderers/latex')\n\nexport function render (\n  markdown,\n  cb,\n  mdConfig = defaultMdastConfig,\n  latexConfig = defaultLatexConfig,\n) {\n  const processor = mdastParser(mdConfig)\n  parser(processor, latexConfig)\n\n  processor.process(markdown, (err, vfile) => {\n    if (err) return cb(err)\n\n    cb(null, vfile)\n  })\n}\n"
  },
  {
    "path": "packages/zmarkdown/client/zmdast.js",
    "content": "// This is the same as the `mdast` renderer, but downloadImages was removed.\n// We need to duplicate the file because otherwise Webpack would\n// load the module anyway...\nexport const inspect          = require('unist-util-inspect')\n\nconst rendererForge           = require('../renderers/renderer-forge')\n\nconst unified                 = require('unified')\nconst remarkParse             = require('remark-parse')\nconst remarkDisableTokenizers = require('remark-disable-tokenizers/src')\n\nconst defaultMdastConfig      = require('../config/mdast')\n\nconst defaultTokenizerList = {\n  abbr:                 require('remark-abbr/src'),\n  alignBlocks:          require('remark-align/src'),\n  captions:             require('remark-captions/src'),\n  codeMeta:             require('../plugins/remark-code-meta'),\n  comments:             require('remark-comments/src'),\n  customBlocks:         require('remark-custom-blocks/src'),\n  emoticons:            require('remark-emoticons/src'),\n  escapeEscaped:        require('remark-escape-escaped/src'),\n  footnotes:            require('remark-footnotes'),\n  gridTables:           require('remark-grid-tables/src'),\n  headingShifter:       require('remark-heading-shift/src'),\n  iframes:              require('remark-iframes/src'),\n  imageToFigure:        require('../plugins/remark-image-to-figure'),\n  kbd:                  require('remark-kbd/src'),\n  math:                 require('remark-math'),\n  numberedFootnotes:    require('remark-numbered-footnotes/src'),\n  ping:                 require('remark-ping/src'),\n  subSuper:             require('remark-sub-super/src'),\n  textr:                require('../plugins/remark-textr'),\n  trailingSpaceHeading: require('remark-heading-trailing-spaces'),\n}\n\nconst postProcessorList = {\n  detectQuizzes: require('../postprocessors/md-detect-quizzes'),\n  getStats:      require('../postprocessors/md-get-stats'),\n  limitDepth:    require('../postprocessors/md-limit-depth'),\n  listLanguages: require('../postprocessors/md-list-languages'),\n  wrapIntroCcl:  require('../postprocessors/md-wrap-intro-ccl'),\n}\n\nexport function parser (config) {\n  const baseTokenizer = unified()\n    .use(remarkParse, config.parse)\n\n  rendererForge(\n    baseTokenizer,\n    defaultTokenizerList,\n    postProcessorList,\n  )(config)\n\n  return baseTokenizer\n    .use(remarkDisableTokenizers, config.disableTokenizers)\n}\n\nexport function render (markdown, cb, config = defaultMdastConfig) {\n  const processor = parser(config)\n\n  return processor.parse(markdown)\n}\n"
  },
  {
    "path": "packages/zmarkdown/common.js",
    "content": "const mdastRenderer = require('./renderers/mdast')\nconst htmlRenderer = require('./renderers/html')\nconst latexRenderer = require('./renderers/latex')\n\nconst mdastConfig = require('./config/mdast')\nconst htmlConfig = require('./config/html')\nconst latexConfig = require('./config/latex')\n\nmodule.exports = (\n  processor = null,\n  tokenizerConfig = mdastConfig,\n  processorConfig\n) => {\n  const parser = mdastRenderer(tokenizerConfig)\n\n  if (processor === 'html') {\n    if (typeof processorConfig === 'undefined') {\n      processorConfig = htmlConfig\n    }\n\n    htmlRenderer(parser, processorConfig)\n  } else if (processor === 'latex') {\n    if (typeof processorConfig === 'undefined') {\n      processorConfig = latexConfig\n    }\n\n    latexRenderer(parser, processorConfig)\n  // No processor given: output syntax tree\n  } else if (processor === null) {\n    return parser.parse\n  // Custom processor: use it\n  } else {\n    parser.use(processor, processorConfig)\n  }\n\n  // Regenerate footnotes postfix on extracts\n  const doRegenerate = (processor === 'html' && processorConfig._regenerateFootnotePostfix)\n  const regenerator = processorConfig._regenerateFootnotePostfix\n\n  return (input, cb) => {\n    if (typeof cb !== 'function') {\n      return new Promise((resolve, reject) =>\n        parser.process(input, (err, vfile) => {\n          if (doRegenerate) regenerator()\n          if (err) return reject(err)\n\n          resolve(vfile)\n        }))\n    }\n\n    parser.process(input, (err, vfile) => {\n      if (doRegenerate) regenerator()\n      if (err) return cb(err)\n\n      cb(null, vfile)\n    })\n  }\n}\n"
  },
  {
    "path": "packages/zmarkdown/config/html/iframe-wrappers.js",
    "content": "const createWrapper = require('../../utils/create-wrappers')\n\nconst jsFiddleAndInaFilter = node => {\n  if (node.properties.src) {\n    return node.properties.src.includes('jsfiddle.') || node.properties.src.includes('ina.')\n  }\n  return false\n}\n\nmodule.exports = {\n  iframe: [\n    createWrapper(\n      'iframe',\n      ['div', 'div'],\n      [['video-wrapper'], ['video-container']],\n      node => !jsFiddleAndInaFilter(node)\n    ),\n    createWrapper('iframe', 'div', ['iframe-wrapper'], jsFiddleAndInaFilter)\n  ],\n  table: [\n    createWrapper('table', 'div', ['table-wrapper'])\n  ]\n}\n"
  },
  {
    "path": "packages/zmarkdown/config/html/index.js",
    "content": "const shortid = require('shortid')\n\nlet currentFootnotePostfix = shortid.generate()\n\nmodule.exports = {\n  autolinkHeadings: {\n    behaviour: 'append'\n  },\n\n  bridge: {\n    allowDangerousHtml: true,\n    handlers: {\n      code: require('../../utils/code-handler')\n    }\n  },\n\n  footnotesTitles: 'Retourner au texte de la note $id',\n\n  highlight: {\n    ignoreMissing: true,\n    plainText: ['console'],\n    aliases: { tex: ['latex'] }\n  },\n\n  sanitize: require('../sanitize'),\n\n  postfixFootnotes: (agg) => `${agg}-${currentFootnotePostfix}`,\n\n  _regenerateFootnotePostfix: () => {\n    currentFootnotePostfix = shortid.generate()\n  },\n\n  postProcessors: {\n    iframeWrappers: require('./iframe-wrappers'),\n    footnotesReorder: true,\n    lazyLoadImages: true,\n    wrapCode: true\n  }\n}\n"
  },
  {
    "path": "packages/zmarkdown/config/latex/index.js",
    "content": "/* eslint-disable max-len */\nconst remarkConfig = require('../mdast')\nconst globalEscape = require('rebber/dist/escaper')\n\nconst appendix = require('rebber-plugins/dist/preprocessors/codeVisitor')\nconst mathEscape = require('rebber-plugins/dist/preprocessors/mathEscape')\nconst footnoteProtect = require('rebber-plugins/dist/preprocessors/footnoteProtect')\n\nconst rebberConfig = {\n  preprocessors: {\n    tableCell: appendix,\n    footnoteDefinition: [appendix],\n    spoilerFlatten: require('rebber-plugins/dist/preprocessors/spoilerFlatten')([\n      'sCustomBlock',\n      'secretCustomBlock'\n    ]),\n\n    inlineMath: [mathEscape],\n    inlineMathDouble: [mathEscape],\n    math: [mathEscape],\n\n    heading: footnoteProtect,\n    figcaption: footnoteProtect,\n    quizzCustomBlock: require('rebber-plugins/dist/preprocessors/prepareQuizz')\n  },\n  overrides: {\n    abbr: require('rebber-plugins/dist/type/abbr'),\n    comments: require('rebber-plugins/dist/type/comments'),\n    conclusion: require('rebber-plugins/dist/type/conclusion'),\n    emoticon: require('rebber-plugins/dist/type/emoticon'),\n    figure: require('rebber-plugins/dist/type/figure'),\n    gridTable: require('rebber-plugins/dist/type/gridTable'),\n    inlineMath: require('rebber-plugins/dist/type/math'),\n    introduction: require('rebber-plugins/dist/type/introduction'),\n    kbd: require('rebber-plugins/dist/type/kbd'),\n    math: require('rebber-plugins/dist/type/math'),\n    ping: require('rebber-plugins/dist/type/ping'),\n    sub: require('rebber-plugins/dist/type/sub'),\n    sup: require('rebber-plugins/dist/type/sup'),\n    tableHeader: require('rebber-plugins/dist/type/tableHeader'),\n\n    footnote: require('rebber-plugins/dist/type/footnote'),\n    footnoteDefinition: require('rebber-plugins/dist/type/footnoteDefinition'),\n    footnoteReference: require('rebber-plugins/dist/type/footnoteReference'),\n\n    centerAligned: require('rebber-plugins/dist/type/align'),\n    leftAligned: require('rebber-plugins/dist/type/align'),\n    rightAligned: require('rebber-plugins/dist/type/align'),\n\n    errorCustomBlock: require('rebber-plugins/dist/type/customBlocks'),\n    informationCustomBlock: require('rebber-plugins/dist/type/customBlocks'),\n    neutralCustomBlock: require('rebber-plugins/dist/type/customBlocks'),\n    questionCustomBlock: require('rebber-plugins/dist/type/customBlocks'),\n    secretCustomBlock: require('rebber-plugins/dist/type/customBlocks'),\n    warningCustomBlock: require('rebber-plugins/dist/type/customBlocks'),\n\n    inlineCode: (ctx, node) => {\n      const escaped = globalEscape(node.value)\n      return `\\\\CodeInline{${escaped}}`\n    },\n    iframe: (ctx, node) => {\n      const alternative = node.data.hProperties.src.includes('jsfiddle') ? 'Code' : 'Video'\n      const caption = node.caption || ''\n      return `\\\\iframe{${node.data.hProperties.src}}[${alternative}][${caption}]`\n    }\n  },\n  emoticons: {\n    emoticons: Object.entries(remarkConfig.emoticons.emoticons).reduce((acc, [key, val]) => {\n      acc[key] = val.substring(val.lastIndexOf('/') + 1)\n      return acc\n    }, {})\n  },\n  codeAppendiceTitle: 'Annexes',\n  appendiceReferenceGenerator: (appendixIndex) => `Annexe de code ${appendixIndex}`,\n  code: require('../../utils/latex-code'),\n  customBlocks: {\n    map: {\n      error: 'Error',\n      information: 'Information',\n      question: 'Question',\n      secret: 'Spoiler',\n      warning: 'Warning',\n      neutre: 'Neutral'\n    }\n  },\n  link: {\n    prefix: 'http://zestedesavoir.com'\n  },\n  image: {\n    inlineImage: (node) => `\\\\inlineImage{${node.url}}`,\n    image: (node) => `\\\\image{${node.url}}`\n  },\n  firstLineRowFont: '\\\\rowfont[l]{\\\\bfseries}',\n  tableEnvName: 'zdstblr',\n  figure: {\n    image: (_1, _2, caption, extra) => `\\\\image{${extra.url}}${caption ? `[${caption}]` : ''}\\n`\n  },\n  headings: [\n    (val) => `\\\\levelOneTitle{${val}}\\n`,\n    (val) => `\\\\levelTwoTitle{${val}}\\n`,\n    (val) => `\\\\levelThreeTitle{${val}}\\n`,\n    (val) => `\\\\levelFourTitle{${val}}\\n`,\n    (val) => `\\\\levelFiveTitle{${val}}\\n`,\n    (val) => `\\\\levelSixTitle{${val}}\\n`,\n    (val) => `\\\\levelSevenTitle{${val}}\\n`\n  ]\n}\n\nObject.assign(rebberConfig.overrides, {\n  eCustomBlock: (ctx, node) => {\n    node.type = 'errorCustomBlock'\n    return rebberConfig.overrides.errorCustomBlock(ctx, node)\n  },\n  erreurCustomBlock: (ctx, node) => {\n    node.type = 'errorCustomBlock'\n    return rebberConfig.overrides.errorCustomBlock(ctx, node)\n  },\n  iCustomBlock: (ctx, node) => {\n    node.type = 'informationCustomBlock'\n    return rebberConfig.overrides.informationCustomBlock(ctx, node)\n  },\n  qCustomBlock: (ctx, node) => {\n    node.type = 'questionCustomBlock'\n    return rebberConfig.overrides.questionCustomBlock(ctx, node)\n  },\n  sCustomBlock: (ctx, node) => {\n    node.type = 'secretCustomBlock'\n    return rebberConfig.overrides.secretCustomBlock(ctx, node)\n  },\n  aCustomBlock: (ctx, node) => {\n    node.type = 'warningCustomBlock'\n    return rebberConfig.overrides.warningCustomBlock(ctx, node)\n  },\n  attentionCustomBlock: (ctx, node) => {\n    node.type = 'warningCustomBlock'\n    return rebberConfig.overrides.warningCustomBlock(ctx, node)\n  },\n  nCustomBlock: (ctx, node) => {\n    node.type = 'neutralCustomBlock'\n    return rebberConfig.overrides.neutralCustomBlock(ctx, node)\n  },\n  neutreCustomBlock: (ctx, node) => {\n    node.type = 'neutralCustomBlock'\n    return rebberConfig.overrides.neutralCustomBlock(ctx, node)\n  }\n})\n\nmodule.exports = rebberConfig\n"
  },
  {
    "path": "packages/zmarkdown/config/mdast/custom-blocks.js",
    "content": "module.exports = {\n  secret: {\n    classes: 'custom-block-spoiler',\n    title: 'optional',\n    details: true\n  },\n  s: {\n    classes: 'custom-block-spoiler',\n    title: 'optional',\n    details: true\n  },\n  information: {\n    classes: 'custom-block-information',\n    title: 'optional'\n  },\n  i: {\n    classes: 'custom-block-information',\n    title: 'optional'\n  },\n  question: {\n    classes: 'custom-block-question',\n    title: 'optional'\n  },\n  q: {\n    classes: 'custom-block-question',\n    title: 'optional'\n  },\n  attention: {\n    classes: 'custom-block-warning',\n    title: 'optional'\n  },\n  a: {\n    classes: 'custom-block-warning',\n    title: 'optional'\n  },\n  erreur: {\n    classes: 'custom-block-error',\n    title: 'optional'\n  },\n  e: {\n    classes: 'custom-block-error',\n    title: 'optional'\n  },\n  neutre: {\n    classes: 'custom-block-neutral',\n    title: 'required'\n  },\n  n: {\n    classes: 'custom-block-neutral',\n    title: 'required'\n  },\n  quizz: {\n    classes: 'custom-block-quizz',\n    title: 'required'\n  }\n}\n"
  },
  {
    "path": "packages/zmarkdown/config/mdast/emoticons.js",
    "content": "module.exports = {\n  emoticons: {\n    ':ange:': '/static/smileys/svg/ange.svg',\n    ':colere:': '/static/smileys/svg/angry.svg',\n    o_O: '/static/smileys/svg/blink.svg',\n    ';)': '/static/smileys/svg/clin.svg',\n    ':B': '/static/smileys/svg/b.svg',\n    ':diable:': '/static/smileys/svg/diable.svg',\n    ':D': '/static/smileys/svg/heureux.svg',\n    '^^': '/static/smileys/svg/hihi.svg',\n    ':o': '/static/smileys/svg/huh.svg',\n    ':p': '/static/smileys/svg/langue.svg',\n    ':magicien:': '/static/smileys/svg/magicien.svg',\n    ':colere2:': '/static/smileys/svg/mechant.svg',\n    ':ninja:': '/static/smileys/svg/ninja.svg',\n    '>_<': '/static/smileys/svg/pinch.svg',\n    'X/': '/static/smileys/svg/pinch.svg',\n    ':pirate:': '/static/smileys/svg/pirate.svg',\n    \":'(\": '/static/smileys/svg/pleure.svg',\n    ':lol:': '/static/smileys/svg/rire.svg',\n    ':honte:': '/static/smileys/svg/rouge.svg',\n    ':-°': '/static/smileys/svg/siffle.svg',\n    ':)': '/static/smileys/svg/smile.svg',\n    ':soleil:': '/static/smileys/svg/soleil.svg',\n    ':(': '/static/smileys/svg/triste.svg',\n    ':euh:': '/static/smileys/svg/unsure.svg',\n    ':waw:': '/static/smileys/svg/waw.svg',\n    ':zorro:': '/static/smileys/svg/zorro.svg',\n    '^(;,;)^': '/static/smileys/svg/cthulhu.svg',\n    ':bounce:': '/static/smileys/svg/bounce.svg',\n    ':popcorn:': '/static/smileys/svg/popcorn.svg',\n    ':démon:': '/static/smileys/svg/1f47f.svg',\n    ':demon:': '/static/smileys/svg/1f47f.svg',\n    ':content:': '/static/smileys/svg/1f600.svg',\n    ':joyeux:': '/static/smileys/svg/1f601.svg',\n    ':mortderire:': '/static/smileys/svg/1f602.svg',\n    ':daccord:': '/static/smileys/svg/1f603.svg',\n    ':eneffet:': '/static/smileys/svg/1f604.svg',\n    ':eneffetgené:': '/static/smileys/svg/1f605.svg',\n    ':eneffetgene:': '/static/smileys/svg/1f605.svg',\n    'x)': '/static/smileys/svg/1f606.svg',\n    ':innocent:': '/static/smileys/svg/1f607.svg',\n    ':démonjoyeux:': '/static/smileys/svg/1f608.svg',\n    ':demonjoyeux:': '/static/smileys/svg/1f608.svg',\n    ':clindoeil:': '/static/smileys/svg/1f609.svg',\n    ':rejouis:': '/static/smileys/svg/1f60a.svg',\n    ':yum:': '/static/smileys/svg/1f60b.svg',\n    ':soulagé:': '/static/smileys/svg/1f60c.svg',\n    ':soulage:': '/static/smileys/svg/1f60c.svg',\n    '<3': '/static/smileys/svg/1f60d.svg',\n    ':confiant:': '/static/smileys/svg/1f60e.svg',\n    ':malicieux:': '/static/smileys/svg/1f60f.svg',\n    ':indifférent:': '/static/smileys/svg/1f610.svg',\n    ':indifferent:': '/static/smileys/svg/1f610.svg',\n    ':détaché:': '/static/smileys/svg/1f611.svg',\n    ':detache:': '/static/smileys/svg/1f611.svg',\n    ':lassé:': '/static/smileys/svg/1f612.svg',\n    ':lasse:': '/static/smileys/svg/1f612.svg',\n    ':sueurfroide:': '/static/smileys/svg/1f613.svg',\n    ':insatisfait:': '/static/smileys/svg/1f614.svg',\n    ':-/': '/static/smileys/svg/1f615.svg',\n    ':contrarié:': '/static/smileys/svg/1f616.svg',\n    ':contrarie:': '/static/smileys/svg/1f616.svg',\n    ':bisou:': '/static/smileys/svg/1f617.svg',\n    ':bisoucoeur:': '/static/smileys/svg/1f618.svg',\n    ':bisousourire:': '/static/smileys/svg/1f619.svg',\n    ':bisourougir:': '/static/smileys/svg/1f61a.svg',\n    ':-P': '/static/smileys/svg/1f61b.svg',\n    ';-P': '/static/smileys/svg/1f61c.svg',\n    'x-P': '/static/smileys/svg/1f61d.svg',\n    ':déçuinquiet:': '/static/smileys/svg/1f61e.svg',\n    ':decuinquiet:': '/static/smileys/svg/1f61e.svg',\n    ':inquiet:': '/static/smileys/svg/1f61f.svg',\n    ':fâché:': '/static/smileys/svg/1f620.svg',\n    ':fache:': '/static/smileys/svg/1f620.svg',\n    ':fâchérouge:': '/static/smileys/svg/1f621.svg',\n    ':facherouge:': '/static/smileys/svg/1f621.svg',\n    ':tristelarme:': '/static/smileys/svg/1f622.svg',\n    'x(': '/static/smileys/svg/1f623.svg',\n    ':fulminant:': '/static/smileys/svg/1f624.svg',\n    ':deçularme:': '/static/smileys/svg/1f625.svg',\n    ':decularme:': '/static/smileys/svg/1f625.svg',\n    ':déçu:': '/static/smileys/svg/1f626.svg',\n    ':decu:': '/static/smileys/svg/1f626.svg',\n    ':déçutriste:': '/static/smileys/svg/1f627.svg',\n    ':decutriste:': '/static/smileys/svg/1f627.svg',\n    ':déçuangoissé:': '/static/smileys/svg/1f628.svg',\n    ':decuangoisse:': '/static/smileys/svg/1f628.svg',\n    ':éreinté:': '/static/smileys/svg/1f629.svg',\n    ':ereinte:': '/static/smileys/svg/1f629.svg',\n    ':somnole:': '/static/smileys/svg/1f62a.svg',\n    ':fatigué:': '/static/smileys/svg/1f62b.svg',\n    ':fatigue:': '/static/smileys/svg/1f62b.svg',\n    ':grimace:': '/static/smileys/svg/1f62c.svg',\n    ':pleure:': '/static/smileys/svg/1f62d.svg',\n    ':ébahi:': '/static/smileys/svg/1f62e.svg',\n    ':ebahi:': '/static/smileys/svg/1f62e.svg',\n    ':étonné:': '/static/smileys/svg/1f62f.svg',\n    ':etonne:': '/static/smileys/svg/1f62f.svg',\n    ':angoissé:': '/static/smileys/svg/1f630.svg',\n    ':angoisse:': '/static/smileys/svg/1f630.svg',\n    ':hurlantdepeur:': '/static/smileys/svg/1f631.svg',\n    ':abasourdi:': '/static/smileys/svg/1f632.svg',\n    ':surprisrougi:': '/static/smileys/svg/1f633.svg',\n    ':dort:': '/static/smileys/svg/1f634.svg',\n    ':vertige:': '/static/smileys/svg/1f635.svg',\n    ':muet:': '/static/smileys/svg/1f636.svg',\n    ':masquetissu:': '/static/smileys/svg/1f637.svg',\n    ':nonsatisfait:': '/static/smileys/svg/1f641.svg',\n    ':satisfait:': '/static/smileys/svg/1f642.svg',\n    ':inversé:': '/static/smileys/svg/1f643.svg',\n    ':inverse:': '/static/smileys/svg/1f643.svg',\n    ':regardauciel:': '/static/smileys/svg/1f644.svg',\n    ':bouchezipper:': '/static/smileys/svg/1f910.svg',\n    ':appâtdugain:': '/static/smileys/svg/1f911.svg',\n    ':appatdugain:': '/static/smileys/svg/1f911.svg',\n    ':thermomètre:': '/static/smileys/svg/1f912.svg',\n    ':intello4yeux:': '/static/smileys/svg/1f913.svg',\n    ':pensif:': '/static/smileys/svg/1f914.svg',\n    ':blessé:': '/static/smileys/svg/1f915.svg',\n    ':blesse:': '/static/smileys/svg/1f915.svg',\n    ':bienveillant:': '/static/smileys/svg/1f917.svg',\n    ':nausée:': '/static/smileys/svg/1f922.svg',\n    ':nausee:': '/static/smileys/svg/1f922.svg',\n    ':pliéderire:': '/static/smileys/svg/1f923.svg',\n    ':pliederire:': '/static/smileys/svg/1f923.svg',\n    ':baver:': '/static/smileys/svg/1f924.svg',\n    ':pinocchio:': '/static/smileys/svg/1f925.svg',\n    ':eternuer:': '/static/smileys/svg/1f927.svg',\n    ':quésaco:': '/static/smileys/svg/1f928.svg',\n    ':quesaco:': '/static/smileys/svg/1f928.svg',\n    ':regardfan:': '/static/smileys/svg/1f929.svg',\n    ':hébété:': '/static/smileys/svg/1f92a.svg',\n    ':hebete:': '/static/smileys/svg/1f92a.svg',\n    ':chut:': '/static/smileys/svg/1f92b.svg',\n    ':fureur:': '/static/smileys/svg/1f92c.svg',\n    ':bailler:': '/static/smileys/svg/1f92d.svg',\n    ':vomir:': '/static/smileys/svg/1f92e.svg',\n    ':tropcogiter:': '/static/smileys/svg/1f92f.svg',\n    ':amoureux:': '/static/smileys/svg/1f970.svg',\n    ':fêter:': '/static/smileys/svg/1f973.svg',\n    ':feter:': '/static/smileys/svg/1f973.svg',\n    ':maldecoeur:': '/static/smileys/svg/1f974.svg',\n    ':avoirchaud:': '/static/smileys/svg/1f975.svg',\n    ':avoirfroid:': '/static/smileys/svg/1f976.svg',\n    ':désolé:': '/static/smileys/svg/1f97a.svg',\n    ':desole:': '/static/smileys/svg/1f97a.svg',\n    ':triste:': '/static/smileys/svg/2639.svg',\n    ':rougir:': '/static/smileys/svg/263a.svg',\n    '🧐': '/static/smileys/svg/1f9d0.svg',\n    '👿': '/static/smileys/svg/1f47f.svg',\n    '😀': '/static/smileys/svg/1f600.svg',\n    '😁': '/static/smileys/svg/1f601.svg',\n    '😂': '/static/smileys/svg/1f602.svg',\n    '😃': '/static/smileys/svg/1f603.svg',\n    '😄': '/static/smileys/svg/1f604.svg',\n    '😅': '/static/smileys/svg/1f605.svg',\n    '😆': '/static/smileys/svg/1f606.svg',\n    '😇': '/static/smileys/svg/1f607.svg',\n    '😈': '/static/smileys/svg/1f608.svg',\n    '😉': '/static/smileys/svg/1f609.svg',\n    '😊': '/static/smileys/svg/1f60a.svg',\n    '😋': '/static/smileys/svg/1f60b.svg',\n    '😌': '/static/smileys/svg/1f60c.svg',\n    '😍': '/static/smileys/svg/1f60d.svg',\n    '😎': '/static/smileys/svg/1f60e.svg',\n    '😏': '/static/smileys/svg/1f60f.svg',\n    '😐': '/static/smileys/svg/1f610.svg',\n    '😑': '/static/smileys/svg/1f611.svg',\n    '😒': '/static/smileys/svg/1f612.svg',\n    '😓': '/static/smileys/svg/1f613.svg',\n    '😔': '/static/smileys/svg/1f614.svg',\n    '😕': '/static/smileys/svg/1f615.svg',\n    '😖': '/static/smileys/svg/1f616.svg',\n    '😗': '/static/smileys/svg/1f617.svg',\n    '😘': '/static/smileys/svg/1f618.svg',\n    '😙': '/static/smileys/svg/1f619.svg',\n    '😚': '/static/smileys/svg/1f61a.svg',\n    '😛': '/static/smileys/svg/1f61b.svg',\n    '😜': '/static/smileys/svg/1f61c.svg',\n    '😝': '/static/smileys/svg/1f61d.svg',\n    '😞': '/static/smileys/svg/1f61e.svg',\n    '😟': '/static/smileys/svg/1f61f.svg',\n    '😠': '/static/smileys/svg/1f620.svg',\n    '😡': '/static/smileys/svg/1f621.svg',\n    '😢': '/static/smileys/svg/1f622.svg',\n    '😣': '/static/smileys/svg/1f623.svg',\n    '😤': '/static/smileys/svg/1f624.svg',\n    '😥': '/static/smileys/svg/1f625.svg',\n    '😦': '/static/smileys/svg/1f626.svg',\n    '😧': '/static/smileys/svg/1f627.svg',\n    '😨': '/static/smileys/svg/1f628.svg',\n    '😩': '/static/smileys/svg/1f629.svg',\n    '😪': '/static/smileys/svg/1f62a.svg',\n    '😫': '/static/smileys/svg/1f62b.svg',\n    '😬': '/static/smileys/svg/1f62c.svg',\n    '😭': '/static/smileys/svg/1f62d.svg',\n    '😮': '/static/smileys/svg/1f62e.svg',\n    '😯': '/static/smileys/svg/1f62f.svg',\n    '😰': '/static/smileys/svg/1f630.svg',\n    '😱': '/static/smileys/svg/1f631.svg',\n    '😲': '/static/smileys/svg/1f632.svg',\n    '😳': '/static/smileys/svg/1f633.svg',\n    '😴': '/static/smileys/svg/1f634.svg',\n    '😵': '/static/smileys/svg/1f635.svg',\n    '😶': '/static/smileys/svg/1f636.svg',\n    '😷': '/static/smileys/svg/1f637.svg',\n    '🙁': '/static/smileys/svg/1f641.svg',\n    '🙂': '/static/smileys/svg/1f642.svg',\n    '🙃': '/static/smileys/svg/1f643.svg',\n    '🙄': '/static/smileys/svg/1f644.svg',\n    '🤐': '/static/smileys/svg/1f910.svg',\n    '🤑': '/static/smileys/svg/1f911.svg',\n    '🤒': '/static/smileys/svg/1f912.svg',\n    '🤓': '/static/smileys/svg/1f913.svg',\n    '🤔': '/static/smileys/svg/1f914.svg',\n    '🤕': '/static/smileys/svg/1f915.svg',\n    '🤗': '/static/smileys/svg/1f917.svg',\n    '🤢': '/static/smileys/svg/1f922.svg',\n    '🤣': '/static/smileys/svg/1f923.svg',\n    '🤤': '/static/smileys/svg/1f924.svg',\n    '🤥': '/static/smileys/svg/1f925.svg',\n    '🤧': '/static/smileys/svg/1f927.svg',\n    '🤨': '/static/smileys/svg/1f928.svg',\n    '🤩': '/static/smileys/svg/1f929.svg',\n    '🤪': '/static/smileys/svg/1f92a.svg',\n    '🤫': '/static/smileys/svg/1f92b.svg',\n    '🤬': '/static/smileys/svg/1f92c.svg',\n    '🤭': '/static/smileys/svg/1f92d.svg',\n    '🤮': '/static/smileys/svg/1f92e.svg',\n    '🤯': '/static/smileys/svg/1f92f.svg',\n    '🥰': '/static/smileys/svg/1f970.svg',\n    '🥳': '/static/smileys/svg/1f973.svg',\n    '🥴': '/static/smileys/svg/1f974.svg',\n    '🥵': '/static/smileys/svg/1f975.svg',\n    '🥶': '/static/smileys/svg/1f976.svg',\n    '🥺': '/static/smileys/svg/1f97a.svg',\n    '☹': '/static/smileys/svg/2639.svg',\n    '☺': '/static/smileys/svg/263a.svg'\n  },\n  classes: 'smiley'\n}\n"
  },
  {
    "path": "packages/zmarkdown/config/mdast/iframes.js",
    "content": "module.exports = {\n  'www.dailymotion.com': {\n    width: 480,\n    height: 270,\n    disabled: false,\n    oembed: 'https://www.dailymotion.com/services/oembed'\n  },\n  'www.vimeo.com': {\n    width: 500,\n    height: 281,\n    disabled: false,\n    oembed: 'https://vimeo.com/api/oembed.json'\n  },\n  'vimeo.com': {\n    width: 500,\n    height: 281,\n    disabled: false,\n    oembed: 'https://vimeo.com/api/oembed.json'\n  },\n  'www.youtube.com': {\n    width: 560,\n    height: 315,\n    disabled: false,\n    oembed: 'https://www.youtube.com/oembed'\n  },\n  'youtube.com': {\n    width: 560,\n    height: 315,\n    disabled: false,\n    oembed: 'https://www.youtube.com/oembed'\n  },\n  'youtu.be': {\n    width: 560,\n    height: 315,\n    disabled: false,\n    oembed: 'https://www.youtube.com/oembed'\n  },\n  'soundcloud.com': {\n    width: 500,\n    height: 305,\n    disabled: false,\n    oembed: 'https://soundcloud.com/oembed'\n  },\n  'www.ina.fr': {\n    width: 620,\n    height: 349,\n    disabled: false,\n    replace: [\n      ['www.', 'player.'],\n      ['/video/', '/player/embed/']\n    ],\n    append: '/1/1b0bd203fbcd702f9bc9b10ac3d0fc21/560/315/1/148db8',\n    removeFileName: true\n  },\n  'www.jsfiddle.net': {\n    width: 560,\n    height: 560,\n    disabled: false,\n    replace: [\n      ['http://', 'https://']\n    ],\n    append: 'embedded/result,js,html,css/',\n    match: /https?:\\/\\/(www\\.)?jsfiddle\\.net\\/([\\w\\d]+\\/[\\w\\d]+\\/\\d+\\/?|[\\w\\d]+\\/\\d+\\/?|[\\w\\d]+\\/?)$/,\n    thumbnail: {\n      format: 'http://www.unixstickers.com/image/data/stickers' +\n      '/jsfiddle/JSfiddle-blue-w-type.sh.png'\n    }\n  },\n  'jsfiddle.net': {\n    width: 560,\n    height: 560,\n    disabled: false,\n    replace: [\n      ['http://', 'https://']\n    ],\n    append: 'embedded/result,js,html,css/',\n    match: /https?:\\/\\/(www\\.)?jsfiddle\\.net\\/([\\w\\d]+\\/[\\w\\d]+\\/\\d+\\/?|[\\w\\d]+\\/\\d+\\/?|[\\w\\d]+\\/?)$/,\n    thumbnail: {\n      format: 'http://www.unixstickers.com/image/data/stickers' +\n      '/jsfiddle/JSfiddle-blue-w-type.sh.png'\n    }\n  }\n}\n"
  },
  {
    "path": "packages/zmarkdown/config/mdast/images-download.js",
    "content": "module.exports = {\n  disabled: true,\n  defaultImagePath: 'black.png',\n  defaultOn: {\n    statusCode: true,\n    invalidPath: true,\n    mimeType: false,\n    fileTooBig: false\n  },\n  downloadDestination: './img/',\n  maxlength: 1000000,\n  dirSizeLimit: 10000000\n}\n"
  },
  {
    "path": "packages/zmarkdown/config/mdast/index.js",
    "content": "module.exports = {\n  parse: {\n    gfm: true,\n    commonmark: false,\n    footnotes: true,\n    pedantic: false,\n    /* sets list of known blocks to nothing, otherwise <h3>hey</h3> would become\n    &#x3C;h3>hey&#x3C;/h3> instead of <p>&#x3C;h3>hey&#x3C;/h3></p> */\n    blocks: []\n  },\n\n  alignBlocks: {\n    center: 'align-center',\n    right: 'align-right'\n  },\n\n  captions: {\n    external: {\n      table: 'Table:',\n      gridTable: 'Table:',\n      code: 'Code:',\n      math: 'Equation:',\n      iframe: 'Video:'\n    },\n    internal: {\n      math: 'Equation:',\n      inlineMath: 'Equation:',\n      image: 'Figure:'\n    }\n  },\n\n  customBlocks: require('./custom-blocks'),\n\n  disableTokenizers: {},\n\n  emoticons: require('./emoticons'),\n\n  escapeEscaped: ['&'],\n\n  footnotes: {\n    inlineNotes: true\n  },\n\n  headingShifter: 0,\n\n  iframes: require('./iframes'),\n\n  imagesDownload: require('./images-download'),\n\n  math: {\n    inlineMathDouble: true\n  },\n\n  ping: {\n    pingUsername: (_username) => true,\n    userURL: (username) => `/@${username}`\n  },\n\n  postProcessors: {\n    detectQuizzes: true,\n    getStats: true,\n    limitDepth: 100,\n    listLanguages: true,\n    wrapIntroCcl: false\n  },\n\n  textr: require('./textr')\n}\n"
  },
  {
    "path": "packages/zmarkdown/config/mdast/textr.js",
    "content": "const textrModules = {\n  apostrophes: require('typographic-apostrophes'),\n  apostrophesForPlurals: require('typographic-apostrophes-for-possessive-plurals'),\n  copyright: require('typographic-copyright'),\n  ellipses: require('typographic-ellipses'),\n  emDashes: require('typographic-em-dashes'),\n  enDashes: require('typographic-en-dashes'),\n  registeredTrademark: require('typographic-registered-trademark'),\n  singleSpaces: require('typographic-single-spaces'),\n  trademark: require('typographic-trademark'),\n  colon: require('typographic-colon/src'),\n  emDash: require('typographic-em-dash/src'),\n  exclamationMark: require('typographic-exclamation-mark/src'),\n  guillemets: require('typographic-guillemets/src'),\n  percent: require('typographic-percent/src'),\n  permille: require('typographic-permille/src'),\n  questionMark: require('typographic-question-mark/src'),\n  semicolon: require('typographic-semicolon/src')\n}\n\nmodule.exports = {\n  plugins: Object.values(textrModules),\n  options: { locale: 'fr' }\n}\n"
  },
  {
    "path": "packages/zmarkdown/config/sanitize/index.js",
    "content": "const gh = require('hast-util-sanitize/lib/github')\nconst katex = require('./katex')\nconst merge = require('deepmerge')\n\nmodule.exports = merge.all([gh, katex, {\n  tagNames: ['span', 'abbr', 'figure', 'figcaption', 'iframe', 'hidden-frame'],\n  attributes: {\n    a: ['ariaHidden', 'class', 'className'],\n    abbr: ['title'],\n    code: ['class', 'className'],\n    details: ['class', 'className'],\n    div: ['id', 'class', 'className'],\n    h1: ['ariaHidden'],\n    h2: ['ariaHidden'],\n    h3: ['ariaHidden'],\n    iframe: ['allowfullscreen', 'frameborder', 'height', 'src', 'width'],\n    'hidden-frame': ['allowfullscreen', 'frameborder', 'height', 'src', 'width'],\n    img: ['class', 'className'],\n    span: ['id', 'data-count', 'class', 'className'],\n    summary: ['class', 'className'],\n    td: ['colspan', 'colSpan', 'rowSpan', 'rowspan'],\n    th: ['colspan', 'colSpan', 'rowSpan', 'rowspan']\n  },\n  protocols: {\n    href: ['ftp', 'dav', 'sftp', 'magnet', 'tftp', 'view-source'],\n    src: ['ftp', 'dav', 'sftp', 'tftp']\n  },\n  clobberPrefix: '',\n  clobber: []\n}])\n"
  },
  {
    "path": "packages/zmarkdown/config/sanitize/katex.json",
    "content": "{\n  \"tagNames\": [\n    \"span\",\n    \"abbr\",\n    \"figure\",\n    \"figcaption\",\n    \"iframe\",\n    \"math\",\n    \"maction\",\n    \"maligngroup\",\n    \"malignmark\",\n    \"menclose\",\n    \"merror\",\n    \"mfenced\",\n    \"mfrac\",\n    \"mglyph\",\n    \"mi\",\n    \"mlabeledtr\",\n    \"mlongdiv\",\n    \"mmultiscripts\",\n    \"mn\",\n    \"mo\",\n    \"mover\",\n    \"mpadded\",\n    \"mphantom\",\n    \"mroot\",\n    \"mrow\",\n    \"ms\",\n    \"mscarries\",\n    \"mscarry\",\n    \"msgroup\",\n    \"mstack\",\n    \"msline\",\n    \"mspace\",\n    \"msqrt\",\n    \"msrow\",\n    \"mstyle\",\n    \"msub\",\n    \"msubsup\",\n    \"msup\",\n    \"mtable\",\n    \"mtd\",\n    \"mtext\",\n    \"mtr\",\n    \"munder\",\n    \"munderover\",\n    \"semantics\",\n    \"annotation\",\n    \"annotation-xml\",\n    \"svg\",\n    \"path\"\n  ],\n  \"attributes\": {\n    \"annotation\": [\n      \"encoding\"\n    ],\n    \"mo\": [\n      \"accent\",\n      \"dir\",\n      \"fence\",\n      \"form\",\n      \"indentalign\",\n      \"indentalignfirst\",\n      \"indentalignlast\",\n      \"indentshift\",\n      \"indentshiftfirst\",\n      \"indentshiftlast\",\n      \"indenttarget\",\n      \"largeop\",\n      \"linebreak\",\n      \"linebreakmultchar\",\n      \"linebreakstyle\",\n      \"lineleading\",\n      \"lspace\",\n      \"mathsize\",\n      \"mathvariant\",\n      \"maxsize\",\n      \"minsize\",\n      \"movablelimits\",\n      \"rspace\",\n      \"separator\",\n      \"stretchy\",\n      \"symmetric\"\n    ],\n    \"mover\": [\n      \"accent\",\n      \"align\"\n    ],\n    \"munderover\": [\n      \"accent\",\n      \"accentunder\",\n      \"align\"\n    ],\n    \"munder\": [\n      \"accentunder\",\n      \"align\"\n    ],\n    \"maction\": [\n      \"actiontype\",\n      \"selection\"\n    ],\n    \"mtable\": [\n      \"align\",\n      \"alignmentscope\",\n      \"columnalign\",\n      \"columnlines\",\n      \"columnspacing\",\n      \"columnwidth\",\n      \"displaystyle\",\n      \"equalcolumns\",\n      \"equalrows\",\n      \"frame\",\n      \"framespacing\",\n      \"groupalign\",\n      \"minlabelspacing\",\n      \"rowalign\",\n      \"rowlines\",\n      \"rowspacing\",\n      \"side\",\n      \"width\"\n    ],\n    \"mstack\": [\n      \"align\",\n      \"charalign\",\n      \"stackalign\"\n    ],\n    \"math\": [\n      \"altimg\",\n      \"dir\",\n      \"display\",\n      \"overflow\",\n      \"xmlns\"\n    ],\n    \"mfrac\": [\n      \"bevelled\",\n      \"denomalign\",\n      \"linethickness\",\n      \"numalign\"\n    ],\n    \"mfenced\": [\n      \"close\",\n      \"open\",\n      \"separators\"\n    ],\n    \"mtd\": [\n      \"columnalign\",\n      \"columnspan\",\n      \"groupalign\",\n      \"rowalign\",\n      \"rowspan\"\n    ],\n    \"mtr\": [\n      \"columnalign\",\n      \"groupalign\",\n      \"rowalign\"\n    ],\n    \"mlabeledtr\": [\n      \"columnalign\"\n    ],\n    \"mscarry\": [\n      \"crossout\"\n    ],\n    \"mstyle\": [\n      \"decimalpoint\",\n      \"displaystyle\",\n      \"infixlinebreakstyle\",\n      \"scriptlevel\",\n      \"scriptminsize\",\n      \"scriptsizemultiplier\",\n      \"mathcolor\"\n    ],\n    \"mpadded\": [\n      \"depth\",\n      \"height\",\n      \"lspace\",\n      \"voffset\",\n      \"width\"\n    ],\n    \"mi\": [\n      \"dir\",\n      \"mathsize\",\n      \"mathvariant\"\n    ],\n    \"mrow\": [\n      \"dir\"\n    ],\n    \"ms\": [\n      \"dir\",\n      \"lquote\",\n      \"mathsize\",\n      \"mathvariant\",\n      \"rquote\"\n    ],\n    \"mtext\": [\n      \"dir\",\n      \"mathsize\",\n      \"mathvariant\"\n    ],\n    \"malignmark\": [\n      \"edge\"\n    ],\n    \"maligngroup\": [\n      \"groupalign\"\n    ],\n    \"mglyph\": [\n      \"height\",\n      \"src\",\n      \"width\"\n    ],\n    \"mspace\": [\n      \"height\",\n      \"indentalign\",\n      \"indentalignfirst\",\n      \"indentalignlast\",\n      \"indentshift\",\n      \"indentshiftfirst\",\n      \"indentshiftlast\",\n      \"indenttarget\",\n      \"linebreak\",\n      \"linebreakmultchar\",\n      \"linebreakstyle\",\n      \"lineleading\",\n      \"width\"\n    ],\n    \"msline\": [\n      \"length\",\n      \"position\"\n    ],\n    \"mscarries\": [\n      \"location\",\n      \"position\"\n    ],\n    \"mlongdiv\": [\n      \"longdivstyle\"\n    ],\n    \"mn\": [\n      \"mathsize\",\n      \"mathvariant\"\n    ],\n    \"menclose\": [\n      \"notation\"\n    ],\n    \"msgroup\": [\n      \"position\",\n      \"shift\"\n    ],\n    \"msrow\": [\n      \"position\"\n    ],\n    \"mmultiscripts\": [\n      \"subscriptshift\",\n      \"supscriptshift\"\n    ],\n    \"msub\": [\n      \"subscriptshift\"\n    ],\n    \"msubsup\": [\n      \"subscriptshift\",\n      \"supscriptshift\"\n    ],\n    \"msup\": [\n      \"supscriptshift\"\n    ],\n    \"span\": [\n      \"className\",\n      \"class\",\n      \"style\",\n      \"ariaHidden\"\n    ],\n    \"svg\": [\n      \"width\",\n      \"height\",\n      \"style\",\n      \"viewBox\",\n      \"preserveAspectRatio\"\n    ],\n    \"path\": [\n      \"d\"\n    ]\n  }\n}\n"
  },
  {
    "path": "packages/zmarkdown/munin/zmd.sh",
    "content": "#!/bin/bash\n\n# ln -s /path/to/this/folder/zmd.sh /etc/munin/plugins/zmd_status\n# ln -s /path/to/this/folder/zmd.sh /etc/munin/plugins/zmd_memory\n# ln -s /path/to/this/folder/zmd.sh /etc/munin/plugins/zmd_cpu\n# ln -s /path/to/this/folder/zmd.sh /etc/munin/plugins/zmd_event_loop_lag\n# ln -s /path/to/this/folder/zmd.sh /etc/munin/plugins/zmd_avg_per_process\n# ln -s /path/to/this/folder/zmd.sh /etc/munin/plugins/zmd_avg_per_endpoint\n\ndestination=`basename $0 | sed 's/^zmd_//g'`\n\nif [ \"$1\" = \"config\" ]; then\n  wget -qO- http://localhost:27272/munin/config/$destination\nelse\n  wget -qO- http://localhost:27272/munin/$destination\nfi\n"
  },
  {
    "path": "packages/zmarkdown/package.json",
    "content": "{\n  \"name\": \"zmarkdown\",\n  \"version\": \"12.1.0\",\n  \"description\": \"HTTP server API providing fast and extensible markdown parser\",\n  \"keywords\": [\n    \"markdown\",\n    \"md\",\n    \"http\",\n    \"api\"\n  ],\n  \"author\": \"Victor Felder <victor@draft.li> (https://draft.li)\",\n  \"contributors\": [\n    \"Sébastien (AmarOk) Blin <contact@enconn.fr>\",\n    \"François (artragis) Dambrine <perso@francoisdambrine.me>\",\n    \"Victor Felder <victor@draft.li> (https://draft.li)\",\n    \"Titouan (Stalone) S. <talone@boxph.one>\"\n  ],\n  \"homepage\": \"https://zestedesavoir.github.io/zmarkdown/\",\n  \"license\": \"MIT\",\n  \"main\": \"server/index.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/zestedesavoir/zmarkdown/tree/master/packages/zmarkdown\"\n  },\n  \"scripts\": {\n    \"lint\": \"eslint .\",\n    \"pretest\": \"npm run server && eslint .\",\n    \"test\": \"cross-env DEST=/tmp jest\",\n    \"posttest\": \"npm run stop\",\n    \"watch\": \"jest --watch\",\n    \"server\": \"pm2 start -f server/index.js -i 3 --max-memory-restart 150M\",\n    \"stop\": \"pm2 kill\",\n    \"watch:client\": \"cross-env NODE_ENV=development webpack --watch\",\n    \"release\": \"webpack\"\n  },\n  \"engines\": {\n    \"node\": \">=18\",\n    \"npm\": \">=9\"\n  },\n  \"dependencies\": {\n    \"@pm2/io\": \"^4.3.5\",\n    \"@sentry/node\": \"^7.111.0\",\n    \"body-parser\": \"^1.19.0\",\n    \"clone\": \"^2.1.2\",\n    \"cors\": \"^2.8.5\",\n    \"deepmerge\": \"^4.2.2\",\n    \"express\": \"^4.17.1\",\n    \"hast-util-sanitize\": \"^3.0.0\",\n    \"katex\": \"0.11.1\",\n    \"md-attr-parser\": \"^1.3.0\",\n    \"pm2\": \"^4.4.1\",\n    \"process\": \"^0.11.10\",\n    \"rebber\": \"file:../rebber\",\n    \"rebber-plugins\": \"file:../rebber-plugins\",\n    \"rehype-autolink-headings\": \"^4.0.0\",\n    \"rehype-footnotes-title\": \"file:../rehype-footnotes-title\",\n    \"rehype-highlight\": \"^4.0.0\",\n    \"rehype-html-blocks\": \"file:../rehype-html-blocks\",\n    \"rehype-katex\": \"3.0.0\",\n    \"rehype-parse\": \"^7.0.1\",\n    \"rehype-postfix-footnote-anchors\": \"file:../rehype-postfix-footnote-anchors\",\n    \"rehype-sanitize\": \"^4.0.0\",\n    \"rehype-slug\": \"^3.0.0\",\n    \"rehype-stringify\": \"^8.0.0\",\n    \"remark-abbr\": \"file:../remark-abbr\",\n    \"remark-align\": \"file:../remark-align\",\n    \"remark-captions\": \"file:../remark-captions\",\n    \"remark-comments\": \"file:../remark-comments\",\n    \"remark-custom-blocks\": \"file:../remark-custom-blocks\",\n    \"remark-disable-tokenizers\": \"file:../remark-disable-tokenizers\",\n    \"remark-emoticons\": \"file:../remark-emoticons\",\n    \"remark-escape-escaped\": \"file:../remark-escape-escaped\",\n    \"remark-fix-guillemets\": \"file:../remark-fix-guillemets\",\n    \"remark-footnotes\": \"^2.0.0\",\n    \"remark-grid-tables\": \"file:../remark-grid-tables\",\n    \"remark-heading-shift\": \"file:../remark-heading-shift\",\n    \"remark-heading-trailing-spaces\": \"file:../remark-heading-trailing-spaces\",\n    \"remark-iframes\": \"file:../remark-iframes\",\n    \"remark-images-download\": \"file:../remark-images-download\",\n    \"remark-kbd\": \"file:../remark-kbd\",\n    \"remark-math\": \"^3.0.1\",\n    \"remark-numbered-footnotes\": \"file:../remark-numbered-footnotes\",\n    \"remark-parse\": \"^8.0.3\",\n    \"remark-ping\": \"file:../remark-ping\",\n    \"remark-rehype\": \"^7.0.0\",\n    \"remark-sub-super\": \"file:../remark-sub-super\",\n    \"shortid\": \"^2.2.15\",\n    \"textr\": \"^0.3.0\",\n    \"typographic-apostrophes\": \"^1.1.1\",\n    \"typographic-apostrophes-for-possessive-plurals\": \"^1.0.5\",\n    \"typographic-colon\": \"file:../typographic-colon\",\n    \"typographic-copyright\": \"^1.0.1\",\n    \"typographic-ellipses\": \"^1.0.11\",\n    \"typographic-em-dash\": \"file:../typographic-em-dash\",\n    \"typographic-em-dashes\": \"^1.0.2\",\n    \"typographic-en-dashes\": \"^1.0.1\",\n    \"typographic-exclamation-mark\": \"file:../typographic-exclamation-mark\",\n    \"typographic-guillemets\": \"file:../typographic-guillemets\",\n    \"typographic-percent\": \"file:../typographic-percent\",\n    \"typographic-permille\": \"file:../typographic-permille\",\n    \"typographic-question-mark\": \"file:../typographic-question-mark\",\n    \"typographic-registered-trademark\": \"^1.0.1\",\n    \"typographic-semicolon\": \"file:../typographic-semicolon\",\n    \"typographic-single-spaces\": \"^1.0.2\",\n    \"typographic-trademark\": \"^1.0.1\",\n    \"unified\": \"^9.2.0\",\n    \"unist-util-inspect\": \"^6.0.0\",\n    \"unist-util-visit\": \"^2.0.3\"\n  },\n  \"devDependencies\": {\n    \"assert\": \"^2.1.0\",\n    \"axios\": \"^0.21.1\",\n    \"cross-env\": \"^7.0.3\",\n    \"dedent\": \"^0.7.0\",\n    \"path-browserify\": \"^1.0.1\",\n    \"url\": \"^0.11.3\",\n    \"webpack\": \"^5.88.2\",\n    \"webpack-cli\": \"^5.1.4\",\n    \"xtend\": \"^4.0.2\"\n  }\n}\n"
  },
  {
    "path": "packages/zmarkdown/plugins/remark-code-meta.js",
    "content": "// A word of caution: this plugin is non-standard\n// as regard to the MDAST specification.\n// Indeed, it transforms `meta` from `string?`\n// to `object` for code blocks.\n\n// The goal of this plugin is to be able to parse\n// meta information only once for HTML and LaTeX.\n\nconst visit = require('unist-util-visit')\nconst attrsParser = require('md-attr-parser')\n\nmodule.exports = parseCodeMeta\n\nfunction parseCodeMeta () {\n  // Normalize ranges for hl_lines\n  const rangeNormalize = range => {\n    let normalizedRange = ''\n\n    let previousNumber = -1\n    let currentNumber = ''\n\n    // Insert a number or range in the list\n    function insert () {\n      if (previousNumber >= 0) {\n        const currentInt = parseInt(currentNumber)\n        const previousInt = parseInt(previousNumber)\n\n        const minLineNumber = Math.min(currentInt, previousInt)\n        const maxLineNumber = Math.max(currentInt, previousInt)\n\n        normalizedRange += `${minLineNumber}-${maxLineNumber} `\n      } else {\n        normalizedRange += `${parseInt(currentNumber)} `\n      }\n    }\n\n    for (let charIndex = 0; charIndex < range.length; charIndex++) {\n      const currentChar = range[charIndex]\n      const currentCharCode = range.charCodeAt(charIndex)\n\n      // Match 0-9\n      if (currentCharCode >= 48 && currentCharCode <= 57) {\n        currentNumber += currentChar\n      } else if (currentChar === '-') {\n        previousNumber = parseInt(currentNumber)\n        currentNumber = ''\n      } else if (currentChar === ' ' || currentChar === ',') {\n        insert()\n\n        previousNumber = -1\n        currentNumber = ''\n      }\n    }\n\n    // Parse the last property if any\n    if (currentNumber) insert()\n\n    return normalizedRange.trim()\n  }\n\n  return (tree) => {\n    visit(tree, 'code', mutateCodeNode)\n  }\n\n  function mutateCodeNode (node) {\n    const attrs = attrsParser(node.meta || '').prop\n\n    const linenostart = parseInt(attrs.linenostart) || 1\n    const hlLines = rangeNormalize(attrs.hl_lines || '')\n\n    node.meta = { linenostart, hlLines }\n  }\n}\n"
  },
  {
    "path": "packages/zmarkdown/plugins/remark-image-to-figure.js",
    "content": "const clone = require('clone')\nconst visit = require('unist-util-visit')\n\nmodule.exports = plugin\n\nfunction plugin () {\n  return function transformer (tree) {\n    visit(tree, 'image', imageToFigure)\n  }\n}\n\n// when a block only contains an image with an `alt`, turn this image into\n// a `figure` for which the caption is the content of the `alt` attribute\nfunction imageToFigure (img, index, parent) {\n  if (parent.children.length === 1 && parent.type === 'paragraph') {\n    if (!img.alt) return\n\n    const figureCaptionNode = {\n      type: 'figcaption',\n      children: [\n        {\n          type: 'text',\n          value: img.alt\n        }\n      ],\n      data: {\n        hName: 'figcaption'\n      }\n    }\n    parent.type = 'figure'\n    parent.children = [clone(img), figureCaptionNode]\n    parent.data = {\n      hName: 'figure'\n    }\n  }\n}\n"
  },
  {
    "path": "packages/zmarkdown/plugins/remark-textr.js",
    "content": "const visit = require('unist-util-visit')\nconst textr = require('textr')\n\nmodule.exports = plugin\n\nfunction plugin ({ plugins = [], options = {} } = {}) {\n  let fn\n\n  return function transformer (tree) {\n    fn = plugins.reduce(\n      (processor, p) => processor.use(typeof p === 'string' ? require(p) : p),\n      textr(options)\n    )\n\n    visit(tree, 'text', visitor)\n  }\n\n  function visitor (node) {\n    node.value = fn(node.value)\n  }\n}\n"
  },
  {
    "path": "packages/zmarkdown/postprocessors/html-footnotes-reorder.js",
    "content": "const visit = require('unist-util-visit')\n\nmodule.exports = () => (tree) => {\n  // Find .footnotes > ol\n  visit(tree, (node, _, parent) => {\n    if (node.type === 'element' &&\n      node.tagName === 'ol' &&\n      parent.properties &&\n      parent.properties.className &&\n      parent.properties.className.includes('footnotes')\n    ) {\n      // Get all the footnotes\n      const footnotes = node.children.filter(c => c.type === 'element' && c.tagName === 'li')\n\n      // Reorder footnotes\n      footnotes.sort((a, b) => {\n        const aId = parseInt(a.properties.id.split('-')[1])\n        const bId = parseInt(b.properties.id.split('-')[1])\n\n        // We assume the two ids are never equals\n        return aId > bId ? -1 : 1\n      })\n\n      // Interchange footnotes in HAST\n      node.children.forEach((child, id) => {\n        if (child.type === 'element' && child.tagName === 'li') {\n          node.children[id] = footnotes.pop()\n        }\n      })\n    }\n  })\n}\n"
  },
  {
    "path": "packages/zmarkdown/postprocessors/html-iframe-wrappers.js",
    "content": "const visit = require('unist-util-visit')\n\nmodule.exports = (wrappers) => (tree) => {\n  Object.keys(wrappers).forEach(nodeName =>\n    wrappers[nodeName].forEach(wrapper => {\n      visit(tree, wrapper)\n    }))\n}\n"
  },
  {
    "path": "packages/zmarkdown/postprocessors/html-lazy-load-images.js",
    "content": "const visit = require('unist-util-visit')\n\nmodule.exports = () => tree => {\n  visit(tree, node => {\n    if (node.type !== 'element' ||\n        node.tagName !== 'img' ||\n        !node.properties.src) return\n\n    // Ignore smileys, which may be eagerly loaded\n    if (node.properties.class &&\n        node.properties.class.includes('smiley')) return\n\n    node.properties.loading = 'lazy'\n  })\n}\n"
  },
  {
    "path": "packages/zmarkdown/postprocessors/html-wrap-code.js",
    "content": "/**\n * This plugin adds a class precising the language\n * to code blocks (.hljs-code-div).\n */\n\nconst visit = require('unist-util-visit')\n\nmodule.exports = () => (tree) => {\n  visit(tree, (node) => {\n    // filter super code blocks\n    if (node.type === 'element' &&\n        node.tagName === 'div' &&\n        node.properties &&\n        node.properties.className &&\n        node.properties.className.includes('hljs-code-div')\n    ) {\n      // get pre > code\n      const preElem = node.children.filter(c =>\n        c.type === 'element' && c.tagName === 'pre')\n\n      if (preElem.length === 1) {\n        const classes = preElem[0].children[0].properties.className\n        if (!classes) return\n\n        const langClass = classes.filter(c => c.startsWith('language'))\n        if (langClass.length === 0 || langClass[0].length < 9) return\n\n        const language = langClass[0].substring(9)\n\n        // rewrite class name\n        if (langClass.length === 1 && language !== 'div') {\n          node.properties.className.push(`hljs-code-${language}`)\n        }\n      }\n    }\n  })\n}\n"
  },
  {
    "path": "packages/zmarkdown/postprocessors/md-detect-quizzes.js",
    "content": "const visit = require('unist-util-visit')\n\nmodule.exports = () => (tree, vfile) => {\n  visit(tree, 'quizzCustomBlock', () => {\n    vfile.data.hasQuizz = true\n  })\n}\n"
  },
  {
    "path": "packages/zmarkdown/postprocessors/md-get-stats.js",
    "content": "const visit = require('unist-util-visit')\n\nmodule.exports = () => (tree, vfile) => {\n  let signs = 0\n  let words = 0\n\n  visit(tree, 'text', (node) => {\n    let wordMatchFlag = false\n\n    for (let i = 0; i < node.value.length; i++) {\n      const currentCharCode = node.value.charCodeAt(i)\n\n      if (\n        // a-z\n        (currentCharCode >= 65 && currentCharCode <= 90) ||\n        // A-Z\n        (currentCharCode >= 97 && currentCharCode <= 122) ||\n        // 0-9\n        (currentCharCode >= 48 && currentCharCode <= 57)\n      ) {\n        signs++\n        wordMatchFlag = true\n      } else if (currentCharCode === 32) {\n        if (wordMatchFlag) words++\n        signs++\n        wordMatchFlag = false\n      }\n    }\n\n    if (wordMatchFlag) words++\n  })\n\n  vfile.data.stats = {\n    signs,\n    words\n  }\n}\n"
  },
  {
    "path": "packages/zmarkdown/postprocessors/md-limit-depth.js",
    "content": "const visit = require('unist-util-visit')\n\n// get max depth of an element's children\nfunction getDepth (node) {\n  let maxDepth = 0\n\n  if (node.children) {\n    node.children.forEach(child => {\n      const depth = getDepth(child)\n\n      if (depth > maxDepth) {\n        maxDepth = depth\n      }\n    })\n  }\n\n  return maxDepth + 1\n}\n\nmodule.exports = (maxDepth) => (tree, vfile) => {\n  // limit AST depth to config.maxNesting\n  visit(tree, 'root', (node) => {\n    vfile.data.depth = getDepth(node) - 2\n  })\n\n  if (vfile.data.depth > maxDepth) {\n    vfile.fail(`Markdown AST too complex: tree depth > ${maxDepth}`)\n  }\n}\n"
  },
  {
    "path": "packages/zmarkdown/postprocessors/md-list-languages.js",
    "content": "const visit = require('unist-util-visit')\n\nmodule.exports = () => (tree, vfile) => {\n  // if we don't have any headings, we add a flag to disable\n  // the Table of Contents directly in the latex template\n  vfile.data.disableToc = true\n  visit(tree, 'heading', () => {\n    vfile.data.disableToc = false\n  })\n\n  // get a unique list of languages used in input\n  const languages = new Set()\n  visit(tree, 'code', (node) => {\n    if (node.lang) languages.add(node.lang)\n  })\n  vfile.data.languages = [...languages]\n}\n"
  },
  {
    "path": "packages/zmarkdown/postprocessors/md-wrap-intro-ccl.js",
    "content": "module.exports = (config) => tree => {\n  tree.type = config.type\n  tree.data = { level: config.level - 1 }\n}\n"
  },
  {
    "path": "packages/zmarkdown/public/README.md",
    "content": "# Info\n\n\n\nTo update the css you should build the css with `gulp css` on [`zds-site`](https://github.com/zestedesavoir/zds-site)."
  },
  {
    "path": "packages/zmarkdown/public/css/main.css",
    "content": "@charset \"UTF-8\";\n/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}.hljs{display:block;overflow-x:auto;padding:.5em;color:#000;background:#fff}.hljs-subst,.hljs-title{font-weight:400;color:#000}.hljs-comment,.hljs-quote{color:gray;font-style:italic}.hljs-meta{color:olive}.hljs-tag{background:#efefef}.hljs-keyword,.hljs-literal,.hljs-name,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-selector-tag,.hljs-type{font-weight:700;color:navy}.hljs-attribute,.hljs-link,.hljs-number,.hljs-regexp{font-weight:700;color:#00f}.hljs-link,.hljs-number,.hljs-regexp{font-weight:400}.hljs-string{color:green;font-weight:700}.hljs-bullet,.hljs-formula,.hljs-symbol{color:#000;background:#d0eded;font-style:italic}.hljs-doctag{text-decoration:underline}.hljs-template-variable,.hljs-variable{color:#660e7a}.hljs-addition{background:#baeeba}.hljs-deletion{background:#ffc8bd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}html{font-size:62.5%;overflow-x:hidden;word-wrap:break-word}body,html{height:100%;width:100%}body{background:#f7f7f7;font-size:14px;font-size:1.4rem;line-height:1.7em}::selection{color:#fff;background:#084561}::-moz-selection{color:#fff;background:#084561}.flexpage-header::selection,.flexpage-header ::selection,.header-menu::selection,.header-menu ::selection,.header-right::selection,.header-right ::selection,.page-footer::selection,.page-footer ::selection,.taglist::selection,.taglist ::selection,.write-tutorial::selection,.write-tutorial ::selection{color:#084561;background:#fff}.flexpage-header::-moz-selection,.flexpage-header ::-moz-selection,.header-menu::-moz-selection,.header-menu ::-moz-selection,.header-right::-moz-selection,.header-right ::-moz-selection,.page-footer::-moz-selection,.page-footer ::-moz-selection,.taglist::-moz-selection,.taglist ::-moz-selection,.write-tutorial::-moz-selection,.write-tutorial ::-moz-selection{color:#084561;background:#fff}.flexpage-header input::selection,.header-menu input::selection,.header-right input::selection,.page-footer input::selection,.taglist input::selection,.write-tutorial input::selection{color:#fff;background:#084561}.flexpage-header input::-moz-selection,.header-menu input::-moz-selection,.header-right input::-moz-selection,.page-footer input::-moz-selection,.taglist input::-moz-selection,.write-tutorial input::-moz-selection{color:#fff;background:#084561}.page-container{height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.page-container .main-container{background:#f7f7f7;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:0;flex-shrink:0;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-preferred-size:auto;flex-basis:auto}.page-container #accessibility,.page-container .cookies-eu-banner,.page-container .header-container,.page-container .page-footer{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:auto;flex-basis:auto}.content-container{margin-bottom:50px}img{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}.old-browser-warning{margin:0;background:#ddd;color:#000;padding:.2em 0;text-align:center;position:fixed;z-index:11;width:100%}body.old-browser-warning-shown .page-container{position:relative;top:3rem}.a11y{display:block;width:0;height:0;text-indent:-9999px}nav ol,nav ul{list-style:none}@media only screen and (min-width:960px){body,html{height:100%}.wrapper{width:95%;margin:0 2.5%}}@media only screen and (max-width:959px){body{background:#222}body:not(.swipping) .mobile-menu,body:not(.swipping) .page-container{-webkit-transition-property:-webkit-transform;transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-timing-function:ease;transition-timing-function:ease}body.swipping *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}}.table-wrapper{max-width:100%;overflow:auto}table{margin:15px auto;border-top:1px solid #ddd;border-collapse:collapse}table thead{background:#ddd;color:#084561}table td,table th{text-align:left;padding:5px 15px 5px 7px;border-right:1px solid #ddd}table td:first-child,table th:first-child{border-left:1px solid #ddd}table td p,table th p{margin:0}table tbody tr{background:#fdfdfd;border-bottom:1px solid #ddd}table tbody tr:nth-child(odd){background:#f7f7f7}table.fullwidth{width:100%}.diff_delta{overflow-x:auto;width:100%;margin:15px 0}.diff_delta table.diff{font-family:Source Code Pro,monospace,serif;font-size:.9em;border:2px solid gray;margin:0}.diff_delta table.diff tr{line-height:1em;border-bottom:none}.diff_delta table.diff .diff_header{background-color:#e0e0e0;padding:5px}.diff_delta table.diff td.diff_header{text-align:right}.diff_delta table.diff .diff_next{display:none}.diff_add{background-color:#afa}.diff_chg{background-color:#fff8ab}.diff_sub{background-color:#faa}.content-container form,.modals-container form{width:100%}.content-container form.content-wrapper,.modals-container form.content-wrapper{width:calc(100% - 20px);margin:0 10px}.content-container form p,.modals-container form p{position:relative}.content-container .search-form,.modals-container .search-form{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.content-container .search-form input,.modals-container .search-form input{margin-right:10px;height:auto}.content-container fieldset,.modals-container fieldset{border-top:1px solid #ddd;border-bottom:3px solid #ddd;background:#efefef;padding:0 4%}.content-container fieldset legend,.modals-container fieldset legend{padding:0 10px;border-top:1px solid #ddd;border-bottom:3px solid #ddd;background:#efefef}.content-container label,.modals-container label{display:block;color:#555;height:30px;line-height:30px}.content-container label .asteriskField,.modals-container label .asteriskField{color:#c0392b;margin-left:4px}.content-container .small-content-wrapper .asteriskField,.modals-container .small-content-wrapper .asteriskField{display:none}.content-container .form-error,.modals-container .form-error{display:block;font-size:13px;color:#c0392b}.content-container input,.content-container textarea,.modals-container input,.modals-container textarea{border:1px solid #d2d5d6}.content-container input:focus,.content-container textarea:focus,.modals-container input:focus,.modals-container textarea:focus{outline-color:#999}.content-container input.field-error,.content-container input:invalid,.content-container textarea.field-error,.content-container textarea:invalid,.modals-container input.field-error,.modals-container input:invalid,.modals-container textarea.field-error,.modals-container textarea:invalid{border-color:#c0392b}.content-container input.field-error:focus,.content-container input:invalid:focus,.content-container textarea.field-error:focus,.content-container textarea:invalid:focus,.modals-container input.field-error:focus,.modals-container input:invalid:focus,.modals-container textarea.field-error:focus,.modals-container textarea:invalid:focus{outline-color:#c0392b}.content-container input .disabled,.content-container input[disabled],.content-container textarea .disabled,.content-container textarea[disabled],.modals-container input .disabled,.modals-container input[disabled],.modals-container textarea .disabled,.modals-container textarea[disabled]{background:#ddd!important;color:#555}.content-container .btn,.content-container button,.content-container input,.content-container textarea,.modals-container .btn,.modals-container button,.modals-container input,.modals-container textarea{-webkit-appearance:none;-webkit-transition:color .15s ease,background .15s ease;transition:color .15s ease,background .15s ease}.content-container input:not([type=submit]):not([type=reset]):not([type=radio]):not([type=checkbox]),.modals-container input:not([type=submit]):not([type=reset]):not([type=radio]):not([type=checkbox]){width:calc(98% - 2px);padding:0 1%}.content-container textarea,.modals-container textarea{width:calc(98% - 2px);padding:10px 1%;font-family:Source Code Pro,monospace,serif;line-height:normal}.content-container .btn,.content-container button,.content-container input,.modals-container .btn,.modals-container button,.modals-container input{display:block;height:30px}.content-container .btn.ico-after,.content-container button.ico-after,.content-container input.ico-after,.modals-container .btn.ico-after,.modals-container button.ico-after,.modals-container input.ico-after{padding-left:30px}.content-container .btn.ico-after:after,.content-container button.ico-after:after,.content-container input.ico-after:after,.modals-container .btn.ico-after:after,.modals-container button.ico-after:after,.modals-container input.ico-after:after{margin:12px 0 0 7px}.content-container .btn,.content-container [type=submit],.content-container button:not(.link),.modals-container .btn,.modals-container [type=submit],.modals-container button:not(.link){position:relative;height:40px;line-height:40px;cursor:pointer;color:#ddd;padding:0 15px;border:none;text-decoration:none;margin-left:1px;outline:none}.content-container .btn.submitted,.content-container [type=submit].submitted,.content-container button:not(.link).submitted,.modals-container .btn.submitted,.modals-container [type=submit].submitted,.modals-container button:not(.link).submitted{color:#555}.content-container .btn.submitted .line-loading,.content-container [type=submit].submitted .line-loading,.content-container button:not(.link).submitted .line-loading,.modals-container .btn.submitted .line-loading,.modals-container [type=submit].submitted .line-loading,.modals-container button:not(.link).submitted .line-loading{display:block;position:absolute;left:0;bottom:0;width:0;height:1px;background:#555;-webkit-animation:a linear 1s infinite;animation:a linear 1s infinite}.content-container .btn:not(.btn-holder),.content-container [type=submit]:not(.btn-holder),.content-container button:not(.link):not(.btn-holder),.modals-container .btn:not(.btn-holder),.modals-container [type=submit]:not(.btn-holder),.modals-container button:not(.link):not(.btn-holder){float:right}.content-container .btn-submit:not(.link),.content-container [type=submit]:not(.link),.modals-container .btn-submit:not(.link),.modals-container [type=submit]:not(.link){color:#fff;background:#48a200}.content-container .btn-submit:not(.link):not(.disabled):focus,.content-container .btn-submit:not(.link):not(.disabled):hover,.content-container .btn-submit:not(.link):not([disabled]):focus,.content-container .btn-submit:not(.link):not([disabled]):hover,.content-container [type=submit]:not(.link):not(.disabled):focus,.content-container [type=submit]:not(.link):not(.disabled):hover,.content-container [type=submit]:not(.link):not([disabled]):focus,.content-container [type=submit]:not(.link):not([disabled]):hover,.modals-container .btn-submit:not(.link):not(.disabled):focus,.modals-container .btn-submit:not(.link):not(.disabled):hover,.modals-container .btn-submit:not(.link):not([disabled]):focus,.modals-container .btn-submit:not(.link):not([disabled]):hover,.modals-container [type=submit]:not(.link):not(.disabled):focus,.modals-container [type=submit]:not(.link):not(.disabled):hover,.modals-container [type=submit]:not(.link):not([disabled]):focus,.modals-container [type=submit]:not(.link):not([disabled]):hover{background:#58c600}.content-container .btn-submit:not(.link).disabled.submitted,.content-container [type=submit]:not(.link).disabled.submitted,.modals-container .btn-submit:not(.link).disabled.submitted,.modals-container [type=submit]:not(.link).disabled.submitted{color:#48a200}.content-container .btn-submit:not(.link).disabled.submitted .line-loading,.content-container [type=submit]:not(.link).disabled.submitted .line-loading,.modals-container .btn-submit:not(.link).disabled.submitted .line-loading,.modals-container [type=submit]:not(.link).disabled.submitted .line-loading{background:#48a200}.content-container .btn-cancel:not(.link),.modals-container .btn-cancel:not(.link){background:#c0392b}.content-container .btn-cancel:not(.link):not(.disabled):focus,.content-container .btn-cancel:not(.link):not(.disabled):hover,.content-container .btn-cancel:not(.link):not([disabled]):focus,.content-container .btn-cancel:not(.link):not([disabled]):hover,.modals-container .btn-cancel:not(.link):not(.disabled):focus,.modals-container .btn-cancel:not(.link):not(.disabled):hover,.modals-container .btn-cancel:not(.link):not([disabled]):focus,.modals-container .btn-cancel:not(.link):not([disabled]):hover{background:#d34a3b}.content-container .btn-cancel:not(.link).disabled.submitted,.modals-container .btn-cancel:not(.link).disabled.submitted{color:#c0392b}.content-container .btn-cancel:not(.link).disabled.submitted .line-loading,.modals-container .btn-cancel:not(.link).disabled.submitted .line-loading{background:#c0392b}.content-container .btn-grey:not(.link),.modals-container .btn-grey:not(.link){background:#eee;color:#555}.content-container .btn-grey:not(.link):not(.disabled):focus,.content-container .btn-grey:not(.link):not(.disabled):hover,.content-container .btn-grey:not(.link):not([disabled]):focus,.content-container .btn-grey:not(.link):not([disabled]):hover,.modals-container .btn-grey:not(.link):not(.disabled):focus,.modals-container .btn-grey:not(.link):not(.disabled):hover,.modals-container .btn-grey:not(.link):not([disabled]):focus,.modals-container .btn-grey:not(.link):not([disabled]):hover{background:#ccc;color:#333}.content-container .btn-grey:not(.link).disabled.submitted,.modals-container .btn-grey:not(.link).disabled.submitted{color:#555}.content-container .btn-grey:not(.link).disabled.submitted .line-loading,.modals-container .btn-grey:not(.link).disabled.submitted .line-loading{background:#999}.content-container .disabled,.content-container [disabled],.modals-container .disabled,.modals-container [disabled]{cursor:default!important;background:#eee!important}.content-container .disabled:not(.submitted),.content-container [disabled]:not(.submitted),.modals-container .disabled:not(.submitted),.modals-container [disabled]:not(.submitted){color:#bbb!important}.content-container .btn-facebook:not(.link),.modals-container .btn-facebook:not(.link){background:#3b5998}.content-container .btn-facebook:not(.link):focus,.content-container .btn-facebook:not(.link):hover,.modals-container .btn-facebook:not(.link):focus,.modals-container .btn-facebook:not(.link):hover{background:#2d4373}.content-container .btn-twitter:not(.link),.modals-container .btn-twitter:not(.link){background:#4099ff}.content-container .btn-twitter:not(.link):focus,.content-container .btn-twitter:not(.link):hover,.modals-container .btn-twitter:not(.link):focus,.modals-container .btn-twitter:not(.link):hover{background:#0d7eff}.content-container .btn-google-plus:not(.link),.modals-container .btn-google-plus:not(.link){background:#d34836}.content-container .btn-google-plus:not(.link):focus,.content-container .btn-google-plus:not(.link):hover,.modals-container .btn-google-plus:not(.link):focus,.modals-container .btn-google-plus:not(.link):hover{background:#b03626}.content-container .btn-facebook,.content-container .btn-google-plus,.content-container .btn-twitter,.modals-container .btn-facebook,.modals-container .btn-google-plus,.modals-container .btn-twitter{width:50%;margin:0 auto;text-align:center}.content-container .btn-holder,.content-container .buttonHolder{margin-top:25px;min-height:40px}.main-container input[type=checkbox],.main-container input[type=radio],.modals-container input[type=checkbox],.modals-container input[type=radio]{float:left;margin-right:5px;height:15px;width:15px;border:1px solid #bbb;background:#fcfcfc;-webkit-transition:none;transition:none;position:relative}.main-container input[type=checkbox]:after,.main-container input[type=radio]:after,.modals-container input[type=checkbox]:after,.modals-container input[type=radio]:after{display:block;content:\"\";position:absolute;top:0;left:0;bottom:0;right:0;opacity:0;background-image:url(../images/sprite.png)}.main-container input[type=checkbox]:checked:after,.main-container input[type=radio]:checked:after,.modals-container input[type=checkbox]:checked:after,.modals-container input[type=radio]:checked:after{opacity:1}.main-container input[type=radio],.modals-container input[type=radio]{border-radius:50%}.main-container input[type=radio]:after,.modals-container input[type=radio]:after{background-position:-47px -272px}.main-container input[type=checkbox]:after,.modals-container input[type=checkbox]:after{background-position:-60px -272px}.main-container .checkbox,.main-container .radio,.modals-container .checkbox,.modals-container .radio{padding:10px 0}.main-container .checkbox input,.main-container .radio input,.modals-container .checkbox input,.modals-container .radio input{margin-top:8px}.main-container .controls .radio,.modals-container .controls .radio{padding-top:3px;padding-bottom:0}.main-container #div_id_helps .checkbox,.main-container .checkbox-new-content,.modals-container #div_id_helps .checkbox,.modals-container .checkbox-new-content{padding:0}@media only screen and (min-width:960px){.content-container form.content-wrapper,.modals-container form.content-wrapper{margin:0;width:100%}}@-webkit-keyframes a{0%{width:0;left:0;right:inherit}49%{left:0;right:inherit}50%{width:100%;left:inherit;right:0}to{left:inherit;right:0}}@keyframes a{0%{width:0;left:0;right:inherit}49%{left:0;right:inherit}50%{width:100%;left:inherit;right:0}to{left:inherit;right:0}}body,button,html,input,select,textarea{font-family:Source Sans Pro,Segoe UI,Trebuchet MS,Helvetica,Helvetica Neue,Arial,sans-serif;color:#222}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}.link,a{color:#1088bf;-webkit-transition:color .15s ease,-webkit-text-decoration .15s ease;transition:color .15s ease,-webkit-text-decoration .15s ease;transition:color .15s ease,text-decoration .15s ease;transition:color .15s ease,text-decoration .15s ease,-webkit-text-decoration .15s ease}.link:hover,a:hover{color:#d68807;text-decoration:none}.page-container .header-container .staff-only a{color:#f8ad32}button.link{display:inline-block;background:none;border:none;text-decoration:underline}.ico{background-repeat:no-repeat;background-image:url(../images/sprite.png)}.custom-block-body,.ico-after{position:relative}.custom-block-body:after,.ico-after:after{content:\" \";display:block;position:absolute;top:0;left:0;width:16px;height:16px;background-repeat:no-repeat;background-image:url(../images/sprite.png)}.custom-block-body.alert:after,.custom-block-body.ico-alert:after,.ico-after.alert:after,.ico-after.ico-alert:after{background-position:-292px 0}.custom-block-body.alert.blue:after,.custom-block-body.ico-alert.blue:after,.ico-after.alert.blue:after,.ico-after.ico-alert.blue:after{background-position:-80px -232px}.custom-block-body.alert.light:after,.custom-block-body.ico-alert.light:after,.ico-after.alert.light:after,.ico-after.ico-alert.light:after{background-position:-260px -80px}.custom-block-body.arrow-left:after,.ico-after.arrow-left:after{background-position:-212px 0}.custom-block-body.arrow-left.blue:after,.ico-after.arrow-left.blue:after{background-position:-308px -80px}.custom-block-body.arrow-left.light:after,.ico-after.arrow-left.light:after{background-position:-196px 0}.custom-block-body.arrow-right:after,.custom-block-body.offline:after,.ico-after.arrow-right:after,.ico-after.offline:after{background-position:-64px -232px}.custom-block-body.arrow-right.blue:after,.custom-block-body.offline.blue:after,.ico-after.arrow-right.blue:after,.ico-after.offline.blue:after{background-position:-244px -80px}.custom-block-body.arrow-right.light:after,.custom-block-body.offline.light:after,.ico-after.arrow-right.light:after,.ico-after.offline.light:after{background-position:-260px -40px}.custom-block-body.beta:after,.ico-after.beta:after{background-position:-276px -80px}.custom-block-body.beta.blue:after,.ico-after.beta.blue:after{background-position:-160px -232px}.custom-block-body.beta.light:after,.ico-after.beta.light:after{background-position:-276px -40px}.custom-block-body.cite:after,.ico-after.cite:after{background-position:-164px 0}.custom-block-body.cite.blue:after,.ico-after.cite.blue:after{background-position:-126px -112px}.custom-block-body.cite.light:after,.ico-after.cite.light:after{background-position:-142px -112px}.custom-block-body.cross:after,.ico-after.cross:after{background-position:-180px -80px}.custom-block-body.cross.blue:after,.ico-after.cross.blue:after{background-position:-164px -40px}.custom-block-body.cross.red:after,.ico-after.cross.red:after{background-position:-180px 0}.custom-block-body.cross.light:after,.ico-after.cross.light:after{background-position:-164px -80px}.custom-block-body.cross.white:after,.ico-after.cross.white:after{background-position:-180px -40px}.custom-block-body.download:after,.ico-after.download:after{background-position:-80px -152px}.custom-block-body.download.blue:after,.ico-after.download.blue:after{background-position:-48px -152px}.custom-block-body.download.light:after,.ico-after.download.light:after{background-position:-64px -152px}.custom-block-body.downvote:after,.ico-after.downvote:after{background-position:-292px -80px}.custom-block-body.downvote.voted:after,.ico-after.downvote.voted:after{background-position:-292px -40px}.custom-block-body.edit:after,.ico-after.edit:after{background-position:-128px -152px}.custom-block-body.edit.blue:after,.ico-after.edit.blue:after{background-position:-96px -152px}.custom-block-body.edit.light:after,.ico-after.edit.light:after{background-position:-112px -152px}.custom-block-body.email:after,.ico-after.email:after{background-position:-176px -152px}.custom-block-body.email.blue:after,.ico-after.email.blue:after{background-position:-144px -152px}.custom-block-body.email.light:after,.ico-after.email.light:after{background-position:-160px -152px}.custom-block-body.diaspora:after,.ico-after.diaspora:after{background-position:-32px -152px}.custom-block-body.diaspora.blue:after,.ico-after.diaspora.blue:after{background-position:0 -152px}.custom-block-body.diaspora.light:after,.ico-after.diaspora.light:after{background-position:-16px -152px}.custom-block-body.facebook:after,.ico-after.facebook:after{background-position:-196px -120px}.custom-block-body.facebook.blue:after,.ico-after.facebook.blue:after{background-position:-196px -40px}.custom-block-body.facebook.light:after,.ico-after.facebook.light:after{background-position:-196px -80px}.custom-block-body.foursquare:after,.ico-after.foursquare:after{background-position:-212px -120px}.custom-block-body.foursquare.blue:after,.ico-after.foursquare.blue:after{background-position:-212px -40px}.custom-block-body.foursquare.light:after,.ico-after.foursquare.light:after{background-position:-212px -80px}.custom-block-body.gear:after,.ico-after.gear:after{background-position:-228px -80px}.custom-block-body.gear.blue:after,.ico-after.gear.blue:after{background-position:-228px 0}.custom-block-body.gear.light:after,.ico-after.gear.light:after{background-position:-228px -40px}.custom-block-body.github:after,.ico-after.github:after{background-position:-16px -192px}.custom-block-body.github.blue:after,.ico-after.github.blue:after{background-position:-228px -120px}.custom-block-body.github.light:after,.ico-after.github.light:after{background-position:0 -192px}.custom-block-body.google-plus:after,.ico-after.google-plus:after{background-position:-64px -192px}.custom-block-body.google-plus.blue:after,.ico-after.google-plus.blue:after{background-position:-32px -192px}.custom-block-body.google-plus.light:after,.ico-after.google-plus.light:after{background-position:-48px -192px}.custom-block-body.help:after,.ico-after.help:after{background-position:-112px -192px}.custom-block-body.help.blue:after,.ico-after.help.blue:after{background-position:-80px -192px}.custom-block-body.help.light:after,.ico-after.help.light:after{background-position:-96px -192px}.custom-block-body.hide:after,.ico-after.hide:after{background-position:-160px -192px}.custom-block-body.hide.blue:after,.ico-after.hide.blue:after{background-position:-128px -192px}.custom-block-body.hide.light:after,.ico-after.hide.light:after{background-position:-144px -192px}.custom-block-body.history:after,.ico-after.history:after{background-position:-208px -192px}.custom-block-body.history.blue:after,.ico-after.history.blue:after{background-position:-176px -192px}.custom-block-body.history.light:after,.ico-after.history.light:after{background-position:-192px -192px}.custom-block-body.import:after,.ico-after.import:after{background-position:-244px -40px}.custom-block-body.import.blue:after,.ico-after.import.blue:after{background-position:-224px -192px}.custom-block-body.import.light:after,.ico-after.import.light:after{background-position:-244px 0}.custom-block-body.lock:after,.ico-after.lock:after{background-position:-260px 0}.custom-block-body.lock.blue:after,.ico-after.lock.blue:after{background-position:-244px -120px}.custom-block-body.lock.light:after,.ico-after.lock.light:after{background-position:-244px -160px}.custom-block-body.more:after,.ico-after.more:after{background-position:0 -232px}.custom-block-body.more.blue:after,.ico-after.more.blue:after{background-position:-260px -120px}.custom-block-body.more.light:after,.ico-after.more.light:after{background-position:-260px -160px}.custom-block-body.move:after,.ico-after.move:after{background-position:-48px -232px}.custom-block-body.move.blue:after,.ico-after.move.blue:after{background-position:-16px -232px}.custom-block-body.move.light:after,.ico-after.move.light:after{background-position:-32px -232px}.custom-block-body.pin:after,.ico-after.pin:after{background-position:-128px -232px}.custom-block-body.pin.blue:after,.ico-after.pin.blue:after{background-position:-96px -232px}.custom-block-body.pin.light:after,.ico-after.pin.light:after{background-position:-112px -232px}.custom-block-body.rss:after,.ico-after.rss:after{background-position:-240px -232px}.custom-block-body.rss.blue:after,.ico-after.rss.blue:after{background-position:-192px -232px}.custom-block-body.rss.orange:after,.ico-after.rss.orange:after{background-position:-224px -232px}.custom-block-body.rss.light:after,.ico-after.rss.light:after{background-position:-208px -232px}.custom-block-body.star:after,.ico-after.star:after{background-position:-276px -200px}.custom-block-body.star.yellow:after,.ico-after.star.yellow:after{background-position:-276px -160px}.custom-block-body.star.blue:after,.ico-after.star.blue:after{background-position:-276px 0}.custom-block-body.star.light:after,.ico-after.star.light:after{background-position:-276px -120px}.custom-block-body.tick:after,.ico-after.tick:after{background-position:-308px -40px}.custom-block-body.tick.green:after,.ico-after.tick.green:after{background-position:-292px -200px}.custom-block-body.tick.light:after,.ico-after.tick.light:after{background-position:-308px 0}.custom-block-body.twitter:after,.ico-after.twitter:after{background-position:-308px -200px}.custom-block-body.twitter.blue:after,.ico-after.twitter.blue:after{background-position:-308px -120px}.custom-block-body.twitter.light:after,.ico-after.twitter.light:after{background-position:-308px -160px}.custom-block-body.unread:after,.ico-after.unread:after{background-position:-292px -240px}.custom-block-body.upvote:after,.ico-after.upvote:after{background-position:-292px -160px}.custom-block-body.upvote.voted:after,.ico-after.upvote.voted:after{background-position:-292px -120px}.custom-block-body.online:after,.custom-block-body.view:after,.ico-after.online:after,.ico-after.view:after{background-position:-110px -112px}.custom-block-body.online.blue:after,.custom-block-body.view.blue:after,.ico-after.online.blue:after,.ico-after.view.blue:after{background-position:-176px -232px}.custom-block-body.online.light:after,.custom-block-body.view.light:after,.ico-after.online.light:after,.ico-after.view.light:after{background-position:-144px -232px}h3:hover span.icon-link:after,h4:hover span.icon-link:after,h5:hover span.icon-link:after,h6:hover span.icon-link:after{content:\" \";display:inline-block;background-image:url(../images/sprite.png);background-position:-308px -240px;width:16px;height:16px}.ir{background-color:transparent;border:0;overflow:hidden;*text-indent:-9999px}.ir:before{content:\"\";display:block;width:0;height:150%}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.clearfix:after,.clearfix:before{content:\" \";display:table}.clearfix:after{clear:both}.clearfix{*zoom:1}hr.clearfix{clear:both;height:0;border:none}.unstyled-list{list-style:none;padding-left:0}.screen,.wide{display:none}@media only screen and (min-width:1140px){.wide{display:inline}table .wide{display:table-cell}}@media only screen and (min-width:960px){.screen{display:inline}}.header-container *{-webkit-box-sizing:border-box;box-sizing:border-box}.header-container .sub-header,.header-container header{display:-webkit-box;display:-ms-flexbox;display:flex}@media only screen and (min-width:960px){.header-container .sub-header,.header-container header{padding:0 2rem}.header-container .sub-header .header-right .dropdown,.header-container header .header-right .dropdown{right:2rem}}.header-container header{background:#084561;border-bottom:3px solid #f8ad32}.header-container header a,.header-container header button{text-decoration:none;color:#fff;-webkit-transition-property:background;transition-property:background;-webkit-transition-duration:.15s;transition-duration:.15s}.header-container header a:focus,.header-container header button:focus{outline:none}.header-container .header-menu{height:60px;-ms-flex-preferred-size:auto;flex-basis:auto;display:-webkit-box;display:-ms-flexbox;display:flex}.header-container .header-menu-list{margin:0;padding:0;-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.header-container .header-menu-list>li{display:block;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:1;flex-shrink:1;-ms-flex-preferred-size:auto;flex-basis:auto}.header-container .header-menu-list>li>a{padding:0 2.5rem;display:block;position:relative;text-align:center;line-height:60px;font-size:1.6rem;text-transform:uppercase;text-shadow:rgba(0,0,0,.75) 0 0 3px}.header-container .header-menu-list>li>a.active,.header-container .header-menu-list>li>a:focus,.header-container .header-menu-list>li>a:hover{background:#396a81}.header-container .header-menu-list>li>a.active .arrow:after,.header-container .header-menu-list>li>a:focus .arrow:after,.header-container .header-menu-list>li>a:hover .arrow:after{border-top:6px solid #fff}.header-container .header-menu-list>li>a.has-dropdown{padding-right:1.5rem}.header-container .header-menu-list>li>a.has-dropdown .arrow{display:inline-block}.header-container .header-menu-list>li>a.current:before{content:\" \";display:block;position:absolute;bottom:0;left:0;right:0;height:2px;border-radius:2px 2px 0 0;background-color:#f8ad32}.header-container .header-menu-list>li>a.current.active:before{height:0}.header-container .header-logo{text-align:center;margin:0;padding:0}.header-container .header-logo-link{display:block;margin:0;text-indent:-9999px;width:250px;height:60px;background:url(../images/logo.png) no-repeat 50%;background-size:240px auto}@media only screen and (min-width:960px){.header-container .header-logo-link:focus,.header-container .header-logo-link:hover{background-color:#396a81}}.header-container .sub-header{background:#eee}.header-container .header-mobile-page-title{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;color:#fff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0 .5em;line-height:50px;font-size:1.7rem}@media only screen and (min-width:960px){.header-container .header-mobile-page-title{display:none}}.header-container .arrow{display:none;width:20px;height:9px;position:relative}.header-container .arrow:after{content:\"\";display:block;position:absolute;right:0;height:0;width:0;border:6px solid transparent;border-top:6px solid hsla(0,0%,100%,.7);border-left:6px inset transparent}.logbox .notifs-links,.logbox>a{background:hsla(0,0%,100%,.05)}.logbox .notifs-links{display:-webkit-box;display:-ms-flexbox;display:flex}.logbox .notifs-links .ico-link{-webkit-box-flex:0;-ms-flex:0;flex:0;display:block;position:relative;width:60px;height:60px;line-height:60px}.logbox .notifs-links .ico-link .notif-count{display:block;position:absolute;z-index:1;top:50%;right:50%;margin:-20px -22px 0 0;padding:0 5px;height:16px;line-height:14px;background:#c0392b;border-radius:16px}.logbox .notifs-links .ico-link .notif-text{display:block;position:absolute;text-indent:-9999px;height:22px;width:22px;top:50%;left:50%;margin:-11px 0 0 -11px}.logbox .notifs-links .ico-link .notif-text.ico-messages{background-position:-22px -112px}.logbox .notifs-links .ico-link .notif-text.ico-notifs{background-position:-142px 0}.logbox .notifs-links .ico-link .notif-text.ico-alerts{background-position:-120px 0}.logbox .notifs-links .ico-link .notif-text.ico-params{background-position:-142px -40px}.logbox .notifs-links .ico-link.active,.logbox .notifs-links .ico-link:focus,.logbox .notifs-links .ico-link:hover{background:#396a81}.logbox .dropdown{overflow:hidden}.logbox .dropdown .dropdown-title{display:block;width:100%;height:35px;line-height:37px;text-align:center;border-bottom:1px solid #274a5a;background-color:#396a81}.logbox .dropdown,.logbox .dropdown .dropdown-list{margin:0;padding:0;list-style:none;background-color:#19526c}.logbox .dropdown .dropdown-list li,.logbox .dropdown li{display:block;width:100%;height:60px}.logbox .dropdown .dropdown-list li a,.logbox .dropdown li a{display:block;overflow:hidden;position:relative;height:100%}.logbox .dropdown .dropdown-list li a,.logbox .dropdown .dropdown-list li a:focus,.logbox .dropdown .dropdown-list li a:hover,.logbox .dropdown li a,.logbox .dropdown li a:focus,.logbox .dropdown li a:hover{opacity:1;-webkit-transition-property:opacity,background-color;transition-property:opacity,background-color}.logbox .dropdown .dropdown-list li a:focus,.logbox .dropdown .dropdown-list li a:hover,.logbox .dropdown li a:focus,.logbox .dropdown li a:hover{background-color:#396a81}.logbox .dropdown .dropdown-list li a:focus .username,.logbox .dropdown .dropdown-list li a:hover .username,.logbox .dropdown li a:focus .username,.logbox .dropdown li a:hover .username{text-shadow:rgba(0,0,0,.5) 0 0 5px}.logbox .dropdown .dropdown-list li a:focus .date,.logbox .dropdown .dropdown-list li a:hover .date,.logbox .dropdown li a:focus .date,.logbox .dropdown li a:hover .date{color:#95d7f5}.logbox .dropdown .dropdown-list li .avatar,.logbox .dropdown li .avatar{float:left;height:30px;width:30px}.logbox .dropdown .dropdown-list li .username,.logbox .dropdown li .username{display:block;float:left;margin:4px 0 0 7px;color:#95d7f5;width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.logbox .dropdown .dropdown-list li .date,.logbox .dropdown li .date{color:#5196b6;float:right;padding:4px 10px 0 0;-webkit-transition-property:color;transition-property:color}.logbox .dropdown .dropdown-list li .topic,.logbox .dropdown li .topic{display:block;position:absolute;bottom:0;left:0;overflow:hidden;height:31px;padding:4px 7px 2px;text-overflow:ellipsis;white-space:nowrap;width:95%;width:calc(100% - 14px)}.logbox .dropdown .dropdown-list li:nth-child(odd),.logbox .dropdown .dropdown-list li:nth-child(odd) form button,.logbox .dropdown li:nth-child(odd),.logbox .dropdown li:nth-child(odd) form button{background-color:#084561}.logbox .dropdown .dropdown-pm{text-align:left;padding-left:15px}.logbox .dropdown .dropdown-pm .ico-after{float:right;padding-right:30px;top:9px}.logbox .dropdown .dropdown-pm .pm-new.white:after{background-position:-142px -80px;width:17px;height:16px}.logbox .my-account{display:block;height:60px;width:60px;float:right}.logbox .my-account .username{display:none}.logbox .my-account .avatar{background:#396a81}.logbox .dropdown.my-account-dropdown a,.logbox .dropdown.my-account-dropdown button{padding-left:10px}.logbox .dropdown.my-account-dropdown button{width:100%;height:30px;line-height:28px;background:transparent;text-align:left;border:0}.logbox .dropdown.my-account-dropdown button:focus,.logbox .dropdown.my-account-dropdown button:hover{background:#396a81}.logbox.unlogged a{display:block;width:120px;text-align:center;float:left;line-height:60px;height:60px}.logbox.unlogged a:focus,.logbox.unlogged a:hover{background-color:#396a81}@media only screen and (max-width:959px){.header-container .header-logo{width:40px;height:50px;margin-left:50px}.header-container .header-logo-link{background-image:url(../images/logo-mobile.png)!important;background-size:100%;width:100%;height:100%}.header-container header .header-menu{display:none}.header-container .logbox .notifs-links{background:none;width:100%}.header-container .logbox .notifs-links .ico-link{height:50px;width:50px}.header-container .logbox .dropdown{top:50px}.header-container .logbox .dropdown.my-account-dropdown .dropdown-list{bottom:0}.header-container .logbox .dropdown.my-account-dropdown .dropdown-list li{height:45px;line-height:45px}.header-container .logbox.unlogged{font-size:13px;font-size:1.3rem}.header-container .logbox.unlogged a{line-height:30px;height:30px;margin:10px 0;width:74px;margin-right:1px}}@media only screen and (min-width:960px){.header-container{z-index:1;position:relative;-webkit-box-shadow:0 0 4px rgba(0,0,0,.3);box-shadow:0 0 4px rgba(0,0,0,.3)}.header-container header{background-image:-webkit-gradient(linear,left top,right top,color-stop(20%,transparent),color-stop(40%,hsla(0,0%,100%,.07)),color-stop(60%,hsla(0,0%,100%,.07)),color-stop(80%,transparent));background-image:linear-gradient(90deg,transparent 20%,hsla(0,0%,100%,.07) 40%,hsla(0,0%,100%,.07) 60%,transparent 80%)}.header-container .header-menu{-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.header-logo{text-align:left;width:250px}.dropdown{top:60px}.logbox .dropdown.my-account-dropdown ul li{height:30px;line-height:30px}.logbox .dropdown.my-account-dropdown ul li button{cursor:pointer}.lt-ie9 .dropdown{top:90px}.header-logo,.header-right{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0}.header-right{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}}.dropdown{display:none;position:absolute;text-align:left;top:50px;left:0;right:0;background-color:#396a81;margin:0;padding:10px 2.5%;font-size:14px;font-size:1.4rem;border-bottom:3px solid #f8ad32;z-index:8}.dropdown .dropdown-title{color:#fff}.dropdown.header-menu-dropdown .dropdown-list>li:first-child:last-child,.dropdown.header-menu-dropdown .dropdown-list>li:first-child:last-child ~ li{width:100%}.dropdown.header-menu-dropdown .dropdown-list>li:first-child:nth-last-child(2),.dropdown.header-menu-dropdown .dropdown-list>li:first-child:nth-last-child(2)~li{width:50%}.dropdown.header-menu-dropdown .dropdown-list>li:first-child:nth-last-child(3),.dropdown.header-menu-dropdown .dropdown-list>li:first-child:nth-last-child(3)~li{width:33.33333%}.dropdown.header-menu-dropdown .dropdown-list>li:first-child:nth-last-child(4),.dropdown.header-menu-dropdown .dropdown-list>li:first-child:nth-last-child(4)~li{width:25%}.dropdown .dropdown-list{width:100%;padding:0;margin-top:15px}.dropdown .dropdown-list>li{width:20%;float:left}.dropdown .dropdown-list>li.dropdown-empty-message{color:hsla(0,0%,100%,.5);text-align:center;line-height:60px;background:none!important}.dropdown .dropdown-list>li ul{margin:0 0 10px;padding:0}.dropdown .dropdown-list>li ul li{position:relative}.dropdown .dropdown-list>li ul li a{display:block;width:95%;min-height:25px;line-height:25px;color:#95d7f5;overflow:hidden;-webkit-transition:padding-left .15s ease,background-color .15s ease;transition:padding-left .15s ease,background-color .15s ease}.dropdown .dropdown-list>li ul li a:focus,.dropdown .dropdown-list>li ul li a:hover{padding-left:3%;background-color:rgba(0,0,0,.3)}.dropdown .dropdown-link-all{display:block;clear:both;text-align:center;height:30px;line-height:30px;border-top:1px solid #274a5a;background-color:#396a81;-webkit-transition-property:color,background-color;transition-property:color,background-color}.dropdown .dropdown-link-all:first-child{border-top:0!important;border-bottom:1px solid #274a5a}.dropdown .dropdown-link-all:focus,.dropdown .dropdown-link-all:hover{color:#95d7f5;background-color:#274a5a;border-top:1px solid #396a81}.active+.dropdown{display:block}@media only screen and (min-width:760px){.dropdown{-webkit-box-shadow:0 5px 7px rgba(0,0,0,.3);box-shadow:0 5px 7px rgba(0,0,0,.3)}.header-right .dropdown{width:350px;left:auto;padding:0}.header-right .dropdown .dropdown-list{max-height:390px;overflow-x:hidden;overflow-y:auto}.header-right .dropdown .dropdown-list::-webkit-scrollbar{width:10px;height:10px}.header-right .dropdown .dropdown-list::-webkit-scrollbar-track{background-color:#06354a}.header-right .dropdown .dropdown-list::-webkit-scrollbar-thumb{background-color:#396a81;border:1px solid #06354a;-webkit-transition:background-color .15s ease;transition:background-color .15s ease}.header-right .dropdown .dropdown-list::-webkit-scrollbar-thumb:hover{background-color:#5196b6}.header-right .dropdown .dropdown-list::-webkit-scrollbar-thumb:active{background-color:#71b4d3}.header-right .dropdown.my-account-dropdown{width:350px}}@media only screen and (max-width:759px){html.dropdown-active{overflow:hidden}html.dropdown-active .page-container{width:100%}html.dropdown-active .main-container{display:none}.header-menu-dropdown{display:none!important}.dropdown{width:100%;top:180px;bottom:0;border-bottom:none}.dropdown .dropdown-list{overflow:auto;position:absolute;top:36px;bottom:50px}.dropdown .dropdown-link-all{position:absolute;left:0;right:0;bottom:0;height:50px;line-height:50px}}@media only screen and (min-width:960px){.dropdown{top:60px}}.search-form{margin-bottom:30px}.search{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.search form button,.search form input{float:left;border:none;background:hsla(0,0%,100%,.25);height:40px;-webkit-transition-property:background;transition-property:background;-webkit-transition-duration:.15s;transition-duration:.15s}.search form button:focus,.search form button:hover,.search form input:focus,.search form input:hover{background-color:#fff}.search form button:focus,.search form input:focus{outline-color:#f8ad32}.search form input{height:30px;padding:5px 3%;width:70%}.search form button{width:12%;text-indent:-9999px}.search form button.disabled{opacity:.5;background:transparent;cursor:default}.search form button:after{display:block;content:\" \";position:absolute;top:12px;left:50%;margin-left:-8px;height:17px;width:17px;background-position:-256px -232px}.search .search-more{display:block;float:left;height:40px;font-family:Arial,sans-serif;line-height:40px;width:12%;text-align:center;font-weight:700;text-decoration:none;font-size:24px;background:#fff;color:#084561;-webkit-transition:background .15s ease;transition:background .15s ease}.search .search-more:focus,.search .search-more:hover{background:#f8ad32;color:#fff;outline:none}.search .search-more:before{content:\"+\"}@media only screen and (min-width:960px){.search:before{content:\" \";display:block;position:absolute;left:-20px;height:30px;width:20px;background:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.03)),to(transparent));background:linear-gradient(270deg,rgba(0,0,0,.03),transparent)}.search form input{padding:6px 10px;height:30px;width:180px}.search form button{height:30px;line-height:30px;width:30px}.search form button:after{top:7px}.search .search-more{width:30px;height:30px;line-height:30px}}#accessibility{list-style:none;margin:0;padding:0 2.5%;background:#062e41;overflow:hidden;height:0}#accessibility.focused{height:auto}#accessibility li{display:inline;margin:0;padding:0}#accessibility li a{display:inline-block;padding:0 7px;color:#eee}#accessibility li a:focus,#accessibility li a:hover{color:#084561;background-color:#fff;text-decoration:none}#cookies-eu-banner{padding:0 3%;background:#062e41;display:none}#cookies-eu-banner #cookies-eu-reject,#cookies-eu-banner div{display:inline-block;margin:0;padding:7px 0;color:#eee;line-height:23px}#cookies-eu-banner #cookies-eu-reject{background:none;border:none;text-decoration:underline}#cookies-eu-banner #cookies-eu-reject:focus,#cookies-eu-banner #cookies-eu-reject:hover{text-decoration:none}#cookies-eu-banner #cookies-eu-accept,#cookies-eu-banner #cookies-eu-more{display:inline-block;margin-top:3px;padding:4px 15px;text-decoration:none;-webkit-transition:background .15s,color .15s;transition:background .15s,color .15s}#cookies-eu-banner #cookies-eu-more{margin-left:15px;color:#eee;background:#084561}#cookies-eu-banner #cookies-eu-more:focus,#cookies-eu-banner #cookies-eu-more:hover{color:#084561;background:#eee}#cookies-eu-banner #cookies-eu-accept{border:none;color:#084561;background:#eee}#cookies-eu-banner #cookies-eu-accept:focus,#cookies-eu-banner #cookies-eu-accept:hover{color:#eee;background:#084561}@media only screen and (max-width:759px){#cookies-eu-banner{position:absolute;top:50px;right:0;bottom:0;left:0;z-index:4}#cookies-eu-banner div{margin-top:40px;padding:0 5px}#cookies-eu-banner #cookies-eu-accept,#cookies-eu-banner #cookies-eu-more{display:block;width:100%;height:40px;padding:0!important;margin:15px 0 0!important;text-align:center}#cookies-eu-banner #cookies-eu-more{margin-top:40px!important;line-height:40px}}.main .sidebar{padding:0 0 10px;background:#f0f0f0;border-bottom:1px solid #fff;color:#424242;width:105%;margin:0 0 0 -2.7%}.main .sidebar .new-btn{display:block;height:40px;padding-left:11.5%;text-decoration:none;text-indent:25px;line-height:40px;font-size:16px;font-size:1.6rem;position:relative;color:#1088bf;-webkit-transition:background-color .15s ease;transition:background-color .15s ease}.main .sidebar .new-btn:first-child{margin-top:31px}.main .sidebar .new-btn:focus,.main .sidebar .new-btn:hover{background-color:#fff}.main .sidebar .new-btn:after{top:12px;left:11.5%}.main .sidebar h3,.main .sidebar h4{font-weight:400;margin:0;padding:0}.main .sidebar h3{font-size:18px;font-size:1.8rem;line-height:38px;line-height:3.8rem;color:#084561;border-bottom:1px solid #f8ad32;margin-top:30px}.main .sidebar h4{padding-top:20px;font-size:17px;font-size:1.7rem}.main .sidebar h4 a{text-decoration:none;color:#424242}.main .sidebar.accordeon h4{cursor:pointer}.main .sidebar h4[data-num]{position:relative;padding-left:calc(5% + 25px)}.main .sidebar h4[data-num]:before{content:attr(data-num);position:absolute;left:5%;text-align:right;width:50px;margin-left:-35px}.main .sidebar h3+ol,.main .sidebar h3+ul{margin:7px 0}.main .sidebar ol,.main .sidebar ul{margin:0;padding:0;list-style:none;width:100%}.main .sidebar ol li,.main .sidebar ul li{position:relative;padding:0 0 0 2.5%;-webkit-transition:background .15s ease;transition:background .15s ease}.main .sidebar ol li:not(.inactive):hover,.main .sidebar ol li a:focus,.main .sidebar ol li button:focus,.main .sidebar ul li:not(.inactive):hover,.main .sidebar ul li a:focus,.main .sidebar ul li button:focus{background:#fff;outline:none}.main .sidebar ol li:not(.inactive):hover .ico-after.action-hover,.main .sidebar ol li a:focus .ico-after.action-hover,.main .sidebar ol li button:focus .ico-after.action-hover,.main .sidebar ul li:not(.inactive):hover .ico-after.action-hover,.main .sidebar ul li a:focus .ico-after.action-hover,.main .sidebar ul li button:focus .ico-after.action-hover{display:block}.main .sidebar ol li.inactive>em,.main .sidebar ol li.inactive>span,.main .sidebar ol li a,.main .sidebar ol li button,.main .sidebar ul li.inactive>em,.main .sidebar ul li.inactive>span,.main .sidebar ul li a,.main .sidebar ul li button{display:block;cursor:pointer;padding-left:25px;padding-right:10px;text-decoration:none;color:#0079b2;overflow:hidden;height:30px;line-height:30px;font-size:14px;font-size:1.4rem;text-overflow:ellipsis;white-space:nowrap;border:0;text-align:left;background:transparent}.main .sidebar ol li.inactive>em[data-num],.main .sidebar ol li.inactive>span[data-num],.main .sidebar ol li a[data-num],.main .sidebar ol li button[data-num],.main .sidebar ul li.inactive>em[data-num],.main .sidebar ul li.inactive>span[data-num],.main .sidebar ul li a[data-num],.main .sidebar ul li button[data-num]{position:relative}.main .sidebar ol li.inactive>em[data-num]:after,.main .sidebar ol li.inactive>span[data-num]:after,.main .sidebar ol li a[data-num]:after,.main .sidebar ol li button[data-num]:after,.main .sidebar ul li.inactive>em[data-num]:after,.main .sidebar ul li.inactive>span[data-num]:after,.main .sidebar ul li a[data-num]:after,.main .sidebar ul li button[data-num]:after{content:attr(data-num) \".\";position:absolute;left:0;width:18px;text-align:right;color:#424242}.main .sidebar ol li.inactive>em.selected,.main .sidebar ol li.inactive>span.selected,.main .sidebar ol li a.selected,.main .sidebar ol li button.selected,.main .sidebar ul li.inactive>em.selected,.main .sidebar ul li.inactive>span.selected,.main .sidebar ul li a.selected,.main .sidebar ul li button.selected{font-weight:700}.main .sidebar ol li.inactive>em img,.main .sidebar ol li.inactive>span img,.main .sidebar ol li a img,.main .sidebar ol li button img,.main .sidebar ul li.inactive>em img,.main .sidebar ul li.inactive>span img,.main .sidebar ul li a img,.main .sidebar ul li button img{border-right:7px solid transparent}.main .sidebar ol li.inactive>em img,.main .sidebar ol li.inactive>em span:not(.wide),.main .sidebar ol li.inactive>span img,.main .sidebar ol li.inactive>span span:not(.wide),.main .sidebar ol li a img,.main .sidebar ol li a span:not(.wide),.main .sidebar ol li button img,.main .sidebar ol li button span:not(.wide),.main .sidebar ul li.inactive>em img,.main .sidebar ul li.inactive>em span:not(.wide),.main .sidebar ul li.inactive>span img,.main .sidebar ul li.inactive>span span:not(.wide),.main .sidebar ul li a img,.main .sidebar ul li a span:not(.wide),.main .sidebar ul li button img,.main .sidebar ul li button span:not(.wide){vertical-align:middle}.main .sidebar ol li.inactive>em .icon,.main .sidebar ol li.inactive>span .icon,.main .sidebar ol li a .icon,.main .sidebar ol li button .icon,.main .sidebar ul li.inactive>em .icon,.main .sidebar ul li.inactive>span .icon,.main .sidebar ul li a .icon,.main .sidebar ul li button .icon{border-right:7px solid transparent;display:inline-block;width:16px;height:16px;margin:7px 5px;line-height:30px}.main .sidebar ol li.inactive>em.ico-after:after,.main .sidebar ol li.inactive>span.ico-after:after,.main .sidebar ol li a.ico-after:after,.main .sidebar ol li button.ico-after:after,.main .sidebar ul li.inactive>em.ico-after:after,.main .sidebar ul li.inactive>span.ico-after:after,.main .sidebar ul li a.ico-after:after,.main .sidebar ul li button.ico-after:after{top:7px;left:0;opacity:.7}.main .sidebar ol li.inactive>em.ico-after.disabled:after,.main .sidebar ol li.inactive>span.ico-after.disabled:after,.main .sidebar ol li a.ico-after.disabled:after,.main .sidebar ol li button.ico-after.disabled:after,.main .sidebar ul li.inactive>em.ico-after.disabled:after,.main .sidebar ul li.inactive>span.ico-after.disabled:after,.main .sidebar ul li a.ico-after.disabled:after,.main .sidebar ul li button.ico-after.disabled:after{opacity:.4!important}.main .sidebar ol li.inactive>em.ico-after:focus:after,.main .sidebar ol li.inactive>em.ico-after:hover:after,.main .sidebar ol li.inactive>span.ico-after:focus:after,.main .sidebar ol li.inactive>span.ico-after:hover:after,.main .sidebar ol li a.ico-after:focus:after,.main .sidebar ol li a.ico-after:hover:after,.main .sidebar ol li button.ico-after:focus:after,.main .sidebar ol li button.ico-after:hover:after,.main .sidebar ul li.inactive>em.ico-after:focus:after,.main .sidebar ul li.inactive>em.ico-after:hover:after,.main .sidebar ul li.inactive>span.ico-after:focus:after,.main .sidebar ul li.inactive>span.ico-after:hover:after,.main .sidebar ul li a.ico-after:focus:after,.main .sidebar ul li a.ico-after:hover:after,.main .sidebar ul li button.ico-after:focus:after,.main .sidebar ul li button.ico-after:hover:after{opacity:1}.main .sidebar ol li.inactive>em.ico-after.action-hover,.main .sidebar ol li.inactive>span.ico-after.action-hover,.main .sidebar ol li a.ico-after.action-hover,.main .sidebar ol li button.ico-after.action-hover,.main .sidebar ul li.inactive>em.ico-after.action-hover,.main .sidebar ul li.inactive>span.ico-after.action-hover,.main .sidebar ul li a.ico-after.action-hover,.main .sidebar ul li button.ico-after.action-hover{position:absolute;display:none;overflow:visible;top:0;left:10%;padding:0;z-index:1;width:30px;height:30px;text-indent:-9999px;background:#fff;right:-30px}.main .sidebar ol li.inactive>em.ico-after.action-hover[data-title]:hover:before,.main .sidebar ol li.inactive>span.ico-after.action-hover[data-title]:hover:before,.main .sidebar ol li a.ico-after.action-hover[data-title]:hover:before,.main .sidebar ol li button.ico-after.action-hover[data-title]:hover:before,.main .sidebar ul li.inactive>em.ico-after.action-hover[data-title]:hover:before,.main .sidebar ul li.inactive>span.ico-after.action-hover[data-title]:hover:before,.main .sidebar ul li a.ico-after.action-hover[data-title]:hover:before,.main .sidebar ul li button.ico-after.action-hover[data-title]:hover:before{content:attr(data-title);display:block;position:absolute;background:#fff;color:#555;top:-27px;left:0;height:27px;line-height:27px;line-height:2.7rem;text-indent:0;padding:0 15px;border:1px solid #eee;-webkit-box-shadow:rgba(0,0,0,.15) 0 0 7px;box-shadow:0 0 7px rgba(0,0,0,.15)}.main .sidebar ol li.inactive>em.ico-after.action-hover:after,.main .sidebar ol li.inactive>span.ico-after.action-hover:after,.main .sidebar ol li a.ico-after.action-hover:after,.main .sidebar ol li button.ico-after.action-hover:after,.main .sidebar ul li.inactive>em.ico-after.action-hover:after,.main .sidebar ul li.inactive>span.ico-after.action-hover:after,.main .sidebar ul li a.ico-after.action-hover:after,.main .sidebar ul li button.ico-after.action-hover:after{left:7px}.main .sidebar ol li.inactive>em,.main .sidebar ol li.inactive>span,.main .sidebar ul li.inactive>em,.main .sidebar ul li.inactive>span{color:#555}.main .sidebar ol li .count,.main .sidebar ul li .count{display:block;position:absolute;top:6px;right:20px;padding:1px 10px;height:16px;line-height:16px;font-style:normal;background:#aaa;color:#fff}.main .sidebar ol li .last-answer,.main .sidebar ul li .last-answer{display:block;visibility:hidden;position:absolute;top:-13px;left:102%;width:250px;height:40px;background:#fff;padding:7px 10px;border:1px solid #f0f0f0;-webkit-box-shadow:rgba(0,0,0,.1) 2px 2px 2px;box-shadow:2px 2px 2px rgba(0,0,0,.1);opacity:0;-webkit-transition:visibility 0s linear .15s,opacity .15s,left .15s;transition:visibility 0s linear .15s,opacity .15s,left .15s}.main .sidebar ol li .last-answer .avatar,.main .sidebar ul li .last-answer .avatar{height:40px;width:40px;float:left;border:1px solid #f0f0f0}.main .sidebar ol li .last-answer .topic-last-answer,.main .sidebar ul li .last-answer .topic-last-answer{display:block;margin-left:50px;line-height:18px;padding:3px 0;color:#555}.main .sidebar ol li .last-answer .topic-no-last-answer,.main .sidebar ul li .last-answer .topic-no-last-answer{display:block;line-height:40px;width:100%;text-align:center;color:#999}.main .sidebar ol li a:focus+.last-answer,.main .sidebar ol li a:hover+.last-answer,.main .sidebar ul li a:focus+.last-answer,.main .sidebar ul li a:hover+.last-answer{visibility:visible;left:100%;opacity:1;-webkit-transition:visibility 0s linear 0,opacity .15s,left .15s;transition:visibility 0s linear 0,opacity .15s,left .15s}.main .sidebar ol li a.unread,.main .sidebar ul li a.unread{font-weight:700}.main .sidebar ol li button,.main .sidebar ul li button{width:100%;line-height:28px}.main .sidebar ol li button.follow span,.main .sidebar ul li button.follow span{vertical-align:inherit}.main .sidebar ol li li,.main .sidebar ul li li{padding:0}.main .sidebar ol li li a,.main .sidebar ul li li a{position:relative;color:#084561;-webkit-transition-property:color,background,margin;transition-property:color,background,margin;-webkit-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.15s;transition-duration:.15s}.main .sidebar ol li li a:focus,.main .sidebar ol li li a:hover,.main .sidebar ul li li a:focus,.main .sidebar ul li li a:hover{color:#0079b2;background:#fff;margin-left:-11px}.main .sidebar ol li li a:focus:before,.main .sidebar ol li li a:hover:before,.main .sidebar ul li li a:focus:before,.main .sidebar ul li li a:hover:before{content:\"> \"}.main .sidebar.summary h4{border-bottom:1px solid #d8dada;padding-bottom:5px;padding-right:15px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.main .sidebar.summary h4+ol>li:first-child,.main .sidebar.summary h4+ul>li:first-child{margin-top:5px}.main .sidebar.summary ol li.current{margin-top:0!important;padding-top:5px;margin-bottom:5px;background-color:#fff}.main .sidebar.summary ol li.current+a{font-weight:700}.main .sidebar.summary ol li.current ol{margin-top:5px;padding-top:5px;padding-bottom:5px;margin-left:-42px;width:calc(105% + 25px);background:linear-gradient(180deg,rgba(0,0,0,.07),#f7f7f7 3px)}.main .sidebar.summary ol li.current ol a{padding-left:50px}.main{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.main .content-container{padding-top:30px}.main .content-container h1,.main .content-container h2{font-size:22px;font-size:2.2rem;line-height:38px;line-height:3.8rem;color:#084561;font-weight:400;border-bottom:1px solid #f8ad32;margin:1px 0 15px}.main .content-container h1.illu,.main .content-container h2.illu{padding-left:60px}.main .content-container h1.illu img,.main .content-container h2.illu img{background:#fff}.main .content-container h1.ico-after,.main .content-container h2.ico-after{padding-left:50px}.main .content-container h1.ico-after:after,.main .content-container h2.ico-after:after{width:40px;height:40px}.main .content-container h1.ico-articles:after,.main .content-container h2.ico-articles:after{background-position:-40px 0}.main .content-container h1.ico-tutorials:after,.main .content-container h2.ico-tutorials:after{background-position:0 0}.main .content-container h1.ico-news:after,.main .content-container h2.ico-news:after{background-position:-40px -40px}.main .content-container h1.ico-forum:after,.main .content-container h2.ico-forum:after{background-position:0 -40px}.main .content-container h1.ico-tags:after,.main .content-container h2.ico-tags:after{background-position:-80px -40px}.main .content-container h1.illu img,.main .content-container h2.illu img{position:absolute;margin:-6px 0 0 -60px;border:1px solid #cdd0d1;width:50px;height:50px}.main .content-container h1.inline,.main .content-container h2.inline{display:inline-block}.main .content-container h1 .btn,.main .content-container h2 .btn{font-size:15px;line-height:38px;height:38px}.main .content-container .license{float:right;margin:0;margin-top:10px}.main .content-container .subtitle{font-size:18px;font-size:1.8rem;line-height:23px;color:#999;margin-top:-15px;margin-bottom:15px;padding:10px 0;font-weight:400;border-bottom:1px solid #eee}.main .content-container .pubdate{display:block;color:#999;margin-bottom:15px}.main .content-container .member-item .avatar{margin-top:-2px;height:20px;width:20px;border:1px solid #ccc}.main .content-container .member-item .avatar+span{padding-left:3px}.main .content-container .member-item:hover .avatar{border-color:#999}.main .content-container .member-item+.member-item{margin-left:7px}.main .content-container .authors .member-item{margin-right:0;margin-left:7px}.main .content-container .authors .member-item .avatar{height:30px;width:30px;margin:-3px 5px 0 -6px}.main .content-container .new-btn-container,.main .content-container .open-zen-mode{display:none}.home .main .content-container{margin-top:0}.pagination-bottom-clear{clear:both}@media only screen and (min-width:1360px){.main .content-container .content-wrapper{max-width:960px;margin:0 auto!important}}@media only screen and (min-width:960px){body.no-sidebar .main .content-container{width:100%}body.no-sidebar .main .sidebar{display:none}.main{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;margin-left:0;padding-left:2.5%;min-width:0}.main .content-container{width:80%;margin-right:0}.main .content-container .taglist+.pubdate{margin-top:-40px}.main .content-container .open-zen-mode{display:block}.main .content-container.zen-mode{width:100%;min-height:calc(100% - 200px);position:absolute;top:0;left:0;right:0;z-index:6;background:#fcfcfc;padding:100px 0;margin-bottom:0}.main .content-container.zen-mode .alert-box,.main .content-container.zen-mode .comments-title,.main .content-container.zen-mode .pagination:not(.pagination-chapter),.main .content-container.zen-mode .sidebar,.main .content-container.zen-mode .topic-message{display:none}.main .content-container.zen-mode .content-wrapper{margin:0 4%}.main .content-container.zen-mode .summary-button{display:unset}.main .content-container h1,.main .content-container h2{margin-left:1px}.main .content-container .content-col-2{width:49.5%;margin:0 0 0 1%}.main .content-container .content-col-3{width:32%;margin:0 0 0 2%}.main .content-container .content-col-2,.main .content-container .content-col-3{float:left}.main .content-container .content-col-2:first-child,.main .content-container .content-col-3:first-child{margin:0}.main .content-container .article-content>.summary-part>li{float:left;width:50%}.main .content-container .article-content>.summary-part>li:nth-child(odd){clear:both}.main .sidebar{width:22.5%;border-bottom:none}.main .sidebar h3,.main .sidebar h4,.main .sidebar ol li,.main .sidebar ul li{padding-left:11.5%}.main .sidebar h3:first-child{margin-top:31px}.main .sidebar h4[data-num]{padding-left:calc(11% + 25px)}.main .sidebar h4[data-num]:before{left:11%}.main .sidebar.sommaire ul li.current ol,.main .sidebar.sommaire ul li.current ul{margin-left:calc(-11% - 10px);width:calc(111% + 10px);background:linear-gradient(180deg,rgba(0,0,0,.07),transparent 3px)}.main .sidebar.sommaire ul li.current ol a,.main .sidebar.sommaire ul li.current ul a{padding-left:calc(11% + 30px)}}@media only screen and (min-width:960px){.content-cols .main .content-container{width:79%;margin-left:1.5%}.full-content-wrapper .tutorial-list article{width:46%;float:left}.full-content-wrapper .tutorial-list article.extend{width:100%}}@media only screen and (max-width:959px){.main .content-container .new-btn-container{display:block;margin:30px 0;border-top:1px solid #ddd;overflow:hidden}.main .content-container .new-btn-container .new-btn{display:block;width:100%;padding:7px 10px 7px 35px;text-decoration:none;height:30px;line-height:30px;background:#eee;color:#333;border-bottom:1px solid #ddd}.main .content-container .new-btn-container .new-btn.ico-after:after{top:13px;left:10px}.main .content-container h1.ico-news:after,.main .content-container h2.ico-news:after{background-position:-80px 0}.main{width:100%}.main .content-container .content-col:not(:first-child),.main .sidebar{margin-top:50px}.main .sidebar{width:102.5%}.main .sidebar h3,.main .sidebar h4,.main .sidebar ul li{padding-left:5.5%}.main .sidebar h3 a,.main .sidebar h4 a,.main .sidebar ul li a{white-space:normal}.content-col-2:not(:first-child),.content-col-3:not(:first-child){margin-top:50px}}.small-content-wrapper{width:90%;max-width:500px;margin:20px auto}.main .content-container .content-wrapper.article-content,.main .content-container .content-wrapper.authors{padding-left:2%;padding-right:2%}.main .content-container .article-content>a,.main .content-container .article-content ol:not(.summary-part),.main .content-container .article-content p,.main .content-container .article-content p a,.main .content-container .article-content ul:not(.pagination){font-family:Merriweather,Liberation Serif,Times New Roman,Times,Georgia,FreeSerif,serif}.main .content-container .comment-author,.main .content-container .content-wrapper.comment-author{background:#eee;padding:7px 15px;margin-bottom:20px}.main .content-container .comment-author blockquote,.main .content-container .content-wrapper.comment-author blockquote{margin:10px 0;border-left:5px solid #ccc;padding:5px 0 5px 15px}.main .content-container .article-content .summary-part{font-size:20px;color:#ea9408}.main .content-container .article-content .summary-part h3,.main .content-container .article-content .summary-part h4{font-weight:400;width:90%}.main .content-container .article-content .summary-part h3 a,.main .content-container .article-content .summary-part h4 a{text-decoration:none}.main .content-container .article-content .summary-part h3 a:focus,.main .content-container .article-content .summary-part h3 a:hover,.main .content-container .article-content .summary-part h4 a:focus,.main .content-container .article-content .summary-part h4 a:hover{text-decoration:underline}.main .content-container .article-content .summary-part h3{font-size:20px;margin:0 0 5px}.main .content-container .article-content .summary-part .summary-part{list-style:none;padding-left:0;margin-bottom:15px}.main .content-container .article-content .summary-part .summary-part h4{font-size:14px;margin:2px 0}.main .content-container .article-content,.main .content-container .message-content{margin-top:20px;margin-bottom:20px;color:#424242}.main .content-container .article-content h2,.main .content-container .article-content h3,.main .content-container .message-content h2,.main .content-container .message-content h3{clear:both}.main .content-container .article-content h2,.main .content-container .article-content h2 a,.main .content-container .article-content h3,.main .content-container .article-content h3 a,.main .content-container .message-content h2,.main .content-container .message-content h2 a,.main .content-container .message-content h3,.main .content-container .message-content h3 a{color:#ea9408;margin-top:40px;text-decoration:none}.main .content-container .article-content h2 a:focus,.main .content-container .article-content h2 a:hover,.main .content-container .article-content h3 a:focus,.main .content-container .article-content h3 a:hover,.main .content-container .message-content h2 a:focus,.main .content-container .message-content h2 a:hover,.main .content-container .message-content h3 a:focus,.main .content-container .message-content h3 a:hover{text-decoration:underline}.main .content-container .article-content h2,.main .content-container .message-content h2{font-size:22px;font-size:2.2rem;line-height:50px;margin-bottom:20px;background:#fff;border-top:1px solid #e0e4e5;padding-left:1%;font-weight:400}.main .content-container .article-content h3,.main .content-container .message-content h3{font-size:20px;font-size:2rem;margin-bottom:14px}.main .content-container .article-content h4,.main .content-container .message-content h4{font-size:18px;font-size:1.8rem;margin-bottom:12px}.main .content-container .article-content h5,.main .content-container .message-content h5{font-size:16px;font-size:1.6rem;margin-bottom:10px}.main .content-container .article-content h6,.main .content-container .message-content h6{font-size:15px;font-size:1.5rem;margin-bottom:10px}.main .content-container .article-content .actions-title,.main .content-container .message-content .actions-title{float:right;margin:-60px 10px 0 0}.main .content-container .article-content .actions-title .btn,.main .content-container .message-content .actions-title .btn{height:30px;line-height:30px;margin-left:3px;opacity:.7;z-index:1}.main .content-container .article-content .actions-title .btn.ico-after:after,.main .content-container .message-content .actions-title .btn.ico-after:after{margin-top:7px}.main .content-container .article-content .actions-title .btn:focus,.main .content-container .article-content .actions-title .btn:hover,.main .content-container .message-content .actions-title .btn:focus,.main .content-container .message-content .actions-title .btn:hover{opacity:1}.main .content-container .article-content .custom-block,.main .content-container .message-content .custom-block{margin:25px 0}.main .content-container .article-content .custom-block-body,.main .content-container .message-content .custom-block-body{padding:7px 15px 7px 45px}.main .content-container .article-content .custom-block-body:after,.main .content-container .message-content .custom-block-body:after{position:absolute;top:50%;left:23px;margin:-11px 0 0 -11px;height:22px;width:22px}.main .content-container .article-content .custom-block-heading,.main .content-container .message-content .custom-block-heading{padding:3px 15px;font-weight:700}.main .content-container .article-content .custom-block-information,.main .content-container .message-content .custom-block-information{background:#daeaee}.main .content-container .article-content .custom-block-information .custom-block-heading,.main .content-container .message-content .custom-block-information .custom-block-heading{color:#fff;background:#53b2e4}.main .content-container .article-content .custom-block-information .custom-block-body:after,.main .content-container .message-content .custom-block-information .custom-block-body:after{background-position:-88px -112px}.main .content-container .article-content .custom-block-question,.main .content-container .message-content .custom-block-question{background:#e2daee}.main .content-container .article-content .custom-block-question .custom-block-heading,.main .content-container .message-content .custom-block-question .custom-block-heading{color:#fff;background:#9560e6}.main .content-container .article-content .custom-block-question .custom-block-body:after,.main .content-container .message-content .custom-block-question .custom-block-body:after{background-position:0 -112px}.main .content-container .article-content .custom-block-error,.main .content-container .message-content .custom-block-error{background:#eedada}.main .content-container .article-content .custom-block-error .custom-block-heading,.main .content-container .message-content .custom-block-error .custom-block-heading{color:#fff;background:#e45353}.main .content-container .article-content .custom-block-error .custom-block-body:after,.main .content-container .message-content .custom-block-error .custom-block-body:after{background-position:-44px -112px}.main .content-container .article-content .custom-block-warning,.main .content-container .message-content .custom-block-warning{background:#eee7da}.main .content-container .article-content .custom-block-warning .custom-block-heading,.main .content-container .message-content .custom-block-warning .custom-block-heading{color:#fff;background:#ebb552}.main .content-container .article-content .custom-block-warning .custom-block-body:after,.main .content-container .message-content .custom-block-warning .custom-block-body:after{background-position:-66px -112px}.main .content-container .article-content .custom-block-neutral,.main .content-container .article-content .custom-block-spoiler,.main .content-container .message-content .custom-block-neutral,.main .content-container .message-content .custom-block-spoiler{background:#eee}.main .content-container .article-content .custom-block-neutral .custom-block-heading,.main .content-container .article-content .custom-block-spoiler .custom-block-heading,.main .content-container .message-content .custom-block-neutral .custom-block-heading,.main .content-container .message-content .custom-block-spoiler .custom-block-heading{color:#fff;background:#888}.main .content-container .article-content .custom-block-neutral .custom-block-body,.main .content-container .article-content .custom-block-spoiler .custom-block-body,.main .content-container .message-content .custom-block-neutral .custom-block-body,.main .content-container .message-content .custom-block-spoiler .custom-block-body{padding-left:15px}.main .content-container .article-content .custom-block-neutral .custom-block-body:after,.main .content-container .article-content .custom-block-spoiler,.main .content-container .article-content .custom-block-spoiler .custom-block-body:after,.main .content-container .article-content .js .spoiler,.main .content-container .message-content .custom-block-neutral .custom-block-body:after,.main .content-container .message-content .custom-block-spoiler,.main .content-container .message-content .custom-block-spoiler .custom-block-body:after,.main .content-container .message-content .js .spoiler{display:none}.main .content-container .article-content .spoiler-title,.main .content-container .message-content .spoiler-title{display:block;background:#eee;margin:15px 0;padding:3px 15px 3px 40px;text-decoration:none;border-bottom:1px solid #ddd;color:#555}.main .content-container .article-content .spoiler-title.ico-after:after,.main .content-container .message-content .spoiler-title.ico-after:after{margin:8px 0 0 10px}.main .content-container .article-content .spoiler-title:nth-last-child(2),.main .content-container .message-content .spoiler-title:nth-last-child(2){margin-bottom:15px}.main .content-container .article-content .spoiler-title:hover,.main .content-container .message-content .spoiler-title:hover{text-decoration:underline}.main .content-container .article-content :not(.alert-box).error,.main .content-container .article-content :not(.alert-box).information,.main .content-container .article-content :not(.alert-box).question,.main .content-container .article-content :not(.alert-box).spoiler,.main .content-container .article-content :not(.alert-box).warning,.main .content-container .message-content :not(.alert-box).error,.main .content-container .message-content :not(.alert-box).information,.main .content-container .message-content :not(.alert-box).question,.main .content-container .message-content :not(.alert-box).spoiler,.main .content-container .message-content :not(.alert-box).warning{margin:25px 0;padding:7px 15px 7px 45px}.main .content-container .article-content :not(.alert-box).error.ico-after:after,.main .content-container .article-content :not(.alert-box).information.ico-after:after,.main .content-container .article-content :not(.alert-box).question.ico-after:after,.main .content-container .article-content :not(.alert-box).spoiler.ico-after:after,.main .content-container .article-content :not(.alert-box).warning.ico-after:after,.main .content-container .message-content :not(.alert-box).error.ico-after:after,.main .content-container .message-content :not(.alert-box).information.ico-after:after,.main .content-container .message-content :not(.alert-box).question.ico-after:after,.main .content-container .message-content :not(.alert-box).spoiler.ico-after:after,.main .content-container .message-content :not(.alert-box).warning.ico-after:after{position:absolute;top:50%;left:23px;margin:-11px 0 0 -11px;height:22px;width:22px}.main .content-container .article-content :not(.alert-box).information,.main .content-container .message-content :not(.alert-box).information{background:#daeaee}.main .content-container .article-content :not(.alert-box).information.ico-after:after,.main .content-container .message-content :not(.alert-box).information.ico-after:after{background-position:-88px -112px}.main .content-container .article-content :not(.alert-box).question,.main .content-container .message-content :not(.alert-box).question{background:#e2daee}.main .content-container .article-content :not(.alert-box).question.ico-after:after,.main .content-container .message-content :not(.alert-box).question.ico-after:after{background-position:0 -112px}.main .content-container .article-content :not(.alert-box).error,.main .content-container .message-content :not(.alert-box).error{background:#eedada}.main .content-container .article-content :not(.alert-box).error.ico-after:after,.main .content-container .message-content :not(.alert-box).error.ico-after:after{background-position:-44px -112px}.main .content-container .article-content :not(.alert-box).warning,.main .content-container .message-content :not(.alert-box).warning{background:#eee7da}.main .content-container .article-content :not(.alert-box).warning.ico-after:after,.main .content-container .message-content :not(.alert-box).warning.ico-after:after{background-position:-66px -112px}.main .content-container .article-content .spoiler,.main .content-container .message-content .spoiler{margin-top:0;padding-left:15px;background:#eee}.main .content-container .article-content img,.main .content-container .message-content img{max-width:100%}.main .content-container .article-content figure,.main .content-container .message-content figure{margin:30px 0;text-align:center}.main .content-container .article-content figure>blockquote,.main .content-container .article-content figure>code,.main .content-container .article-content figure>embed,.main .content-container .article-content figure>img,.main .content-container .article-content figure>pre,.main .content-container .article-content figure>table,.main .content-container .article-content figure>video,.main .content-container .message-content figure>blockquote,.main .content-container .message-content figure>code,.main .content-container .message-content figure>embed,.main .content-container .message-content figure>img,.main .content-container .message-content figure>pre,.main .content-container .message-content figure>table,.main .content-container .message-content figure>video{max-width:100%;margin:0 auto;text-align:left}.main .content-container .article-content figure>code,.main .content-container .article-content figure>figcaption,.main .content-container .article-content figure>img,.main .content-container .article-content figure>pre,.main .content-container .article-content figure>video,.main .content-container .message-content figure>code,.main .content-container .message-content figure>figcaption,.main .content-container .message-content figure>img,.main .content-container .message-content figure>pre,.main .content-container .message-content figure>video{display:block}.main .content-container .article-content figure>blockquote~figcaption,.main .content-container .message-content figure>blockquote~figcaption{padding:0 0 1px 2%;font-style:italic;text-align:left;color:#999;border-left:5px solid #ccc}.main .content-container .article-content figure>blockquote~figcaption p,.main .content-container .message-content figure>blockquote~figcaption p{margin:0 0 5px}.main .content-container .article-content figure>blockquote~figcaption p:before,.main .content-container .message-content figure>blockquote~figcaption p:before{content:\"— \"}.main .content-container .article-content blockquote,.main .content-container .message-content blockquote{margin:0;color:#777;padding:1px 2%;border-left:5px solid #ccc}.main .content-container .article-content blockquote>p:first-child,.main .content-container .message-content blockquote>p:first-child{margin-top:5px}.main .content-container .article-content blockquote>p:last-child,.main .content-container .message-content blockquote>p:last-child{margin-bottom:5px}.main .content-container .article-content blockquote figure,.main .content-container .message-content blockquote figure{margin:15px 0}.main .content-container .article-content blockquote:last-child,.main .content-container .message-content blockquote:last-child{margin-bottom:15px}.main .content-container .article-content code,.main .content-container .article-content kbd,.main .content-container .article-content pre,.main .content-container .article-content samp,.main .content-container .message-content code,.main .content-container .message-content kbd,.main .content-container .message-content pre,.main .content-container .message-content samp{font-family:Source Code Pro,monospace,serif}.main .content-container .article-content .hljs-code-div,.main .content-container .message-content .hljs-code-div{background-color:#fff;margin:0 auto;padding:.5em;border-radius:.25em;display:-webkit-box;display:-ms-flexbox;display:flex;line-height:18px;font-family:Source Code Pro,monospace,serif;font-style:normal;font-size:14px}.main .content-container .article-content .hljs-code-div .hljs-line-numbers,.main .content-container .message-content .hljs-code-div .hljs-line-numbers{counter-reset:a;border-right:1px solid #ddd;margin:0;padding:.5em;color:#888;text-align:right}.main .content-container .article-content .hljs-code-div .hljs-line-numbers span:before,.main .content-container .message-content .hljs-code-div .hljs-line-numbers span:before{counter-increment:a;content:counter(a);display:block}.main .content-container .article-content .hljs-code-div pre,.main .content-container .message-content .hljs-code-div pre{margin:0;width:100%;overflow-x:auto}.main .content-container .article-content kbd,.main .content-container .message-content kbd{background-color:#f8f6ea;padding:2px 6px;border-radius:3px;border:1px solid #e0dab6;border-bottom-width:3px;text-shadow:0 1px 0 #fff;color:#5e551f}.main .content-container .article-content li code,.main .content-container .article-content p code,.main .content-container .article-content td code,.main .content-container .message-content li code,.main .content-container .message-content p code,.main .content-container .message-content td code{color:#a00;background:#eee;border:1px solid #ccc;padding:0 5px}.main .content-container .article-content .ping,.main .content-container .message-content .ping{color:inherit;text-decoration:none}.main .content-container .article-content .ping:focus,.main .content-container .article-content .ping:hover,.main .content-container .message-content .ping:focus,.main .content-container .message-content .ping:hover{text-decoration:underline}.main .content-container .article-content .ping .ping-username,.main .content-container .message-content .ping .ping-username{font-weight:700}.main .content-container .article-content .mathjax-wrapper,.main .content-container .message-content .mathjax-wrapper{max-width:100%;overflow:auto}.main .content-container .article-content .mathjax-wrapper mathjax,.main .content-container .message-content .mathjax-wrapper mathjax{font-size:16px;font-size:1.6rem}.main .content-container .article-content .footnote,.main .content-container .article-content .footnotes,.main .content-container .message-content .footnote,.main .content-container .message-content .footnotes{opacity:.7}.main .content-container .article-content .footnote ol,.main .content-container .article-content .footnotes ol,.main .content-container .message-content .footnote ol,.main .content-container .message-content .footnotes ol{padding-left:25px}.main .content-container .article-content .footnote ol p,.main .content-container .article-content .footnotes ol p,.main .content-container .message-content .footnote ol p,.main .content-container .message-content .footnotes ol p{display:inline}.main .content-container .article-content .video-container,.main .content-container .message-content .video-container{margin:0 auto;max-width:560px;max-height:315px}.main .content-container .article-content .video-container .video-wrapper,.main .content-container .message-content .video-container .video-wrapper{position:relative;padding-bottom:56.25%}.main .content-container .article-content .video-container .video-wrapper iframe,.main .content-container .message-content .video-container .video-wrapper iframe{width:100%}.main .content-container .article-content .katex-display>.katex,.main .content-container .message-content .katex-display>.katex{display:contents}.main .content-container .article-content .inlineMathDouble .katex,.main .content-container .message-content .inlineMathDouble .katex{max-width:100%;overflow-x:auto}.main .content-container .article-content .iframe-wrapper,.main .content-container .message-content .iframe-wrapper{overflow-x:auto}.main .content-container .article-content div.align-center,.main .content-container .message-content div.align-center{text-align:center}.main .content-container .article-content div.align-right,.main .content-container .message-content div.align-right{text-align:right}.main .content-container .article-content div.align-left,.main .content-container .article-content figure pre code.hljs,.main .content-container .message-content div.align-left,.main .content-container .message-content figure pre code.hljs{text-align:left}.main .content-container .article-content .language-console,.main .content-container .message-content .language-console{color:#ddd;background-color:#000;font-family:Source Code Pro,monospace,serif;display:block;overflow-x:auto;padding:.5em}.main .content-container .comments-title{margin:50px 0 20px;color:#084561;border-bottom:1px solid #f8ad32;font-weight:400;font-size:22px;font-size:2.2rem;line-height:30px}@media only screen and (min-width:1140px){.full-content-wrapper .tutorial-list article{width:29.3%}.main .content-container .topic-message .message .message-metadata .date .short-date{display:none}.main .content-container .topic-message .message .message-metadata .date .long-date{display:inline}}@media only screen and (min-width:960px){.content-wrapper,.full-content-wrapper{margin:0 0 0 4%}.content-wrapper.without-margin,.full-content-wrapper.without-margin{margin:0}.content-wrapper .content-wrapper,.full-content-wrapper .content-wrapper{max-width:none;margin:0}}@media only screen and (max-width:959px){.main .content-container .pubdate,.main .content-container .taglist{margin-left:10px;margin-right:10px}.main .content-container .article-content ol,.main .content-container .article-content p,.main .content-container .article-content ul:not(.pagination){font-size:15px;font-size:1.5rem;font-size:1.8ex}.main .content-container .content-wrapper .subtitle,.main .content-container .content-wrapper h1:not(.ico-after),.main .content-container .content-wrapper h2:not(.ico-after),.main .content-container .content-wrapper h3,.main .content-container .full-content-wrapper .subtitle,.main .content-container .full-content-wrapper h1:not(.ico-after),.main .content-container .full-content-wrapper h2:not(.ico-after),.main .content-container .full-content-wrapper h3{padding-left:10px;padding-right:10px}.main .content-container .content-wrapper .illu img,.main .content-container .full-content-wrapper .illu img{display:none}.main .content-container .content-wrapper .authors,.main .content-container .content-wrapper blockquote,.main .content-container .content-wrapper figure,.main .content-container .content-wrapper h4,.main .content-container .content-wrapper h5,.main .content-container .content-wrapper h6,.main .content-container .content-wrapper p,.main .content-container .full-content-wrapper .authors,.main .content-container .full-content-wrapper blockquote,.main .content-container .full-content-wrapper figure,.main .content-container .full-content-wrapper h4,.main .content-container .full-content-wrapper h5,.main .content-container .full-content-wrapper h6,.main .content-container .full-content-wrapper p{margin-left:10px;margin-right:10px}.main .content-container .content-wrapper figure blockquote,.main .content-container .content-wrapper figure p,.main .content-container .full-content-wrapper figure blockquote,.main .content-container .full-content-wrapper figure p{margin-left:0;margin-right:0}.main .content-container .content-wrapper .license,.main .content-container .full-content-wrapper .license{position:absolute;margin-top:0;top:62px;right:15px}}@media only screen and (max-width:759px){.main .content-container .article-content .btn{float:none;text-align:center}}.footer-container footer{color:#424242;padding:20px 0}.page-footer{background:#084561;height:40px;line-height:40px;border-top:3px solid #f8ad32;font-size:14px;font-size:1.4rem}.page-footer .wrapper{display:-webkit-box;display:-ms-flexbox;display:flex}.page-footer .copyright,.page-footer .links{-ms-flex-negative:1;flex-shrink:1;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;min-width:0}.page-footer .copyright{margin:0;padding:0 1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.page-footer .copyright,.page-footer .copyright a{color:hsla(0,0%,100%,.5)}.page-footer .copyright a:focus,.page-footer .copyright a:hover{color:#fff}.page-footer ul{list-style:none;margin:0;padding:0;white-space:nowrap}.page-footer ul.links{text-align:right}.page-footer ul.links li{display:inline-block;margin:0 1rem}.page-footer ul.links li a{text-decoration:none;color:#eee;border-bottom:1px solid transparent}.page-footer ul.links li a:focus,.page-footer ul.links li a:hover{border-bottom-color:#f8ad32}.page-footer ul.social{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:auto;flex-basis:auto;text-align:center}.page-footer ul.social li{margin:-2px 10px;display:inline-block}.page-footer ul.social li a{display:block;height:16px;width:16px}.page-footer ul.social li a:after{opacity:.6}.page-footer ul.social li a:hover{border-bottom-color:transparent}.page-footer ul.social li a:hover:after{opacity:1}@media only screen and (max-width:959px){.page-footer{text-align:center;height:auto}.page-footer .wrapper{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.page-footer .wrapper .social{-ms-flex:none}.page-footer .copyright,.page-footer .social{border-bottom:2px solid #0a5274;-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-negative:0;flex-shrink:0}.page-footer ul{white-space:normal}.page-footer ul.links{text-align:inherit}.page-footer ul li{margin:0 5px}}.alert-box{position:relative;padding:8px 30px 8px 15px;margin:0 0 15px 2%;color:#fff;text-shadow:rgba(0,0,0,.2) 0 0 2px;background:#777}.alert-box.alert-box-not-closable{padding-right:15px}.alert-box .alert-box-text{display:block;float:left}.alert-box .close-alert-box,.alert-box .view-alert-box{display:block;position:absolute;top:8px;right:15px;height:20px;width:20px;text-indent:-9999px;text-decoration:none;background-color:transparent;line-height:22px;color:#fff}.alert-box .close-alert-box.ico-after:after,.alert-box .view-alert-box.ico-after:after{margin-top:4px}.alert-box .close-alert-box-text{width:auto;text-indent:0;top:8px}.alert-box .alert-box-title{margin:5px 0;padding:0;font-size:18px;font-weight:400}.alert-box.info,.alert-box.success{background:#48a200}.alert-box.error{background:#c0392b}.alert-box.alert,.alert-box.warning{background:#e67e22}.alert-box.not-member{background:#fdfdfd;color:#333;text-shadow:none;border-bottom:3px solid #d2d5d6}.alert-box.ico-after{padding-left:40px}.alert-box.ico-after:after{margin:12px 0 0 13px}.alert-box h4,.alert-box p{margin-left:0!important;margin-right:0!important}.alert-box p{margin:0}.alert-box a{color:#eee}.alert-box .alert-box-btn{display:inline-block;background:#084561;text-decoration:none;padding:8px 15px;margin:5px 0;color:#fff!important}.alert-box .alert-box-btn:focus,.alert-box .alert-box-btn:hover{background:#0b5c82}.alert-box .alert-box-btn.alert-box-btn-right{position:absolute;top:0;right:0;margin:0}.alert-box.empty{display:none}.content-wrapper .alert-box{margin:0 0 20px}.content-wrapper .alert-box+.not-member{margin-top:-20px}.opinion-alerts .alert-box-text{float:none}@media only screen and (min-width:760px){.alert-box .alert-box-text{display:inline}.topic-message .alert-box{padding:8px 75px 8px 15px}}@media only screen and (max-width:759px){.alert-box .alert-box-btn,.alert-box .alert-box-btn.alert-box-btn-right{position:relative;float:none;display:block;margin:5px 0 0;text-align:center}}.authors{color:#9c9c9c;padding-bottom:10px;border-bottom:1px solid #e0e4e5;margin-bottom:20px!important}.authors .authors-label{display:inline-block}.authors ul{list-style:none;padding:0}.authors ul,.authors ul li{display:inline-block;margin:0}.authors ul li .avatar{height:28px;width:28px;border:1px solid #cdd0d1;margin-right:3px;margin-top:-4px}.authors ul li a{display:block;text-decoration:none;color:#1088bf;height:36px;line-height:36px;padding:0 8px;-webkit-transition:background .15s ease,color .15s ease;transition:background .15s ease,color .15s ease}.authors ul li a.ico-after{padding-left:30px}.authors ul li a.ico-after:after{margin:10px 0 0 8px}.authors ul li a:focus,.authors ul li a:hover{background:#ddd;color:#084561}.authors ul li .info{padding-left:5px;color:#777}.autocomplete-wrapper{position:relative}.autocomplete-wrapper .autocomplete-dropdown{position:absolute;z-index:9}.autocomplete-wrapper .autocomplete-dropdown .autocomplete-dropdown-header{padding:0;padding-left:5px;background-color:#eee;font-weight:400}.autocomplete-wrapper .autocomplete-dropdown .autocomplete-dropdown-header,.autocomplete-wrapper .autocomplete-dropdown ul{margin:0;border-right:1px solid #ccc;border-left:1px solid #ccc;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.autocomplete-wrapper .autocomplete-dropdown ul{padding:0;background-color:#fff}.autocomplete-wrapper .autocomplete-dropdown ul li{padding:4px 10px;border-bottom:1px solid #ccc;list-style:none}.autocomplete-wrapper .autocomplete-dropdown ul li.active,.autocomplete-wrapper .autocomplete-dropdown ul li:hover{background-color:#0c6790;color:#fff}.modal .autocomplete-dropdown{margin-top:-15px}.breadcrumb{display:none}@media only screen and (min-width:960px){.breadcrumb{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;width:calc(100% - 60px * 4);height:30px;padding-left:2rem}.breadcrumb:after{content:\" \";display:block;position:absolute;top:0;right:0;width:50px;height:100%;background-image:-webkit-gradient(linear,left top,right top,from(rgba(231,235,236,0)),to(rgba(231,235,236,.75)));background-image:linear-gradient(90deg,rgba(231,235,236,0),rgba(231,235,236,.75))}.breadcrumb ol{margin:0;padding:0;list-style:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.breadcrumb ol li{position:relative;display:inline-block;padding-right:30px;line-height:30px}.breadcrumb ol li a{text-decoration:none;color:#084561}.breadcrumb ol li a:focus,.breadcrumb ol li a:hover{text-decoration:underline;outline:none}.breadcrumb ol li:not(:last-child):after{display:block;position:absolute;top:0;right:7px;content:\" \";height:30px;width:15px;background-image:url(../images/sprite.png);background-repeat:no-repeat;background-position:0 -272px;opacity:.2}}.content-item{background:#fff;min-height:60px;display:-webkit-box;display:-ms-flexbox;display:flex;border:1px solid #dedede;border-bottom-width:2px;margin:0 10px 15px;overflow:hidden;-webkit-box-flex:1;-ms-flex:1 1 400px;flex:1 1 400px;width:100%}.content-item.expand-description .content-description{height:36px;white-space:normal;font-size:14px;font-size:1.4rem;line-height:18px}.content-item.expand-description .content-meta{line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.content-item.expand-description .content-meta:not(.inline)>*{display:inline}.content-item a{text-decoration:none}.content-item>a:not(.btn){display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.content-item .content-illu{-webkit-box-flex:0;-ms-flex:0 0 96px;flex:0 0 96px;height:96px;background-color:#dedede;background-size:contain}.content-item .content-illu img{width:100%;height:100%;background-color:#fff}.content-item .content-illu.article-illu{background-image:url(/static/images/article-illu.png)}.content-item .content-illu.tutorial-illu{background-image:url(/static/images/tutorial-illu.png)}.content-item .content-illu.opinion-illu{background-image:url(/static/images/opinion-illu.png)}.content-item .content-info{padding:10px 14px;height:76px;-webkit-box-flex:1;-ms-flex:1;flex:1;position:relative;min-width:100px}.content-item .content-reactions{position:absolute;z-index:0;bottom:6px;left:-14px;height:32px;width:32px;padding-left:1px;background-image:url(../images/sprite.png);background-position:-33px -80px;color:#f8ad32;text-align:center;line-height:32px;font-weight:700;font-size:14px;font-size:1.4rem}.content-item .content-reactions span{position:relative;z-index:2}.content-item .content-reactions:before{content:\"\";display:block;position:absolute;top:0;bottom:0;right:0;left:0;z-index:1;background-image:url(../images/sprite.png);background-position:0 -80px;opacity:0;-webkit-transition:opacity .15s;transition:opacity .15s}.content-item .content-reactions:focus,.content-item .content-reactions:hover{color:#fff}.content-item .content-reactions:focus:before,.content-item .content-reactions:hover:before{opacity:1}.content-item.has-reactions .content-meta{padding-left:14px}.content-item .content-title{margin:0;font-size:17px;font-size:1.7rem;font-weight:400;line-height:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#424242}.content-item a:focus,.content-item a:hover{outline:none}.content-item a:focus .content-title,.content-item a:hover .content-title{text-decoration:underline;outline:none}.content-item p{margin:0}.content-item .content-description{margin:0;font-size:15px;font-size:1.5rem;line-height:26px;height:26px;color:#999;margin-bottom:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.content-item .content-description .short{display:none}.content-item .content-meta{color:#f8ad32;font-size:13px;font-size:1.3rem;line-height:15px}.content-item .content-meta:not(.inline)>*{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.content-item .content-meta .short{display:none}.content-item .content-meta a{color:#ef9708}.content-item .content-meta a:focus,.content-item .content-meta a:hover{text-decoration:underline}.content-item .content-tags{margin:0;padding:10px 0 0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.content-item .content-tags li{padding:0;-webkit-box-flex:0;-ms-flex:0 0 22px;flex:0 0 22px;background-color:#eee;margin-bottom:5px;color:#777;display:block;text-align:right;-webkit-transition:color .15s,background-color .15s;transition:color .15s,background-color .15s}.content-item .content-tags li a{color:inherit;padding:0 12px;line-height:22px;height:22px;display:block}.content-item .content-tags li a:focus,.content-item .content-tags li a:hover{color:#eee;background-color:#777}.content-item.write-tutorial{background-color:#084561;border-color:#084561;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#fff;height:96px}.content-item.write-tutorial .write-tutorial-text{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center;margin:10px 14px}.content-item.write-tutorial .write-tutorial-text p{margin:0;font-size:16px}.content-item.write-tutorial .write-tutorial-text p.lead{font-size:18px;font-weight:700}.content-item.write-tutorial .btn-write-tutorial{background-color:#1c5b78;margin-right:28px;-webkit-transition:color .15s,background-color .15s;transition:color .15s,background-color .15s}.content-item.write-tutorial .btn-write-tutorial:focus,.content-item.write-tutorial .btn-write-tutorial:hover{background-color:#fff;color:#1c5b78}.content-item.topic-item .content-info{padding:14px 20px;height:68px}.content-item.topic-item .content-title{font-size:19px;font-size:1.9rem;line-height:24px;color:#084561}.content-item.topic-item .content-description{color:#505050;font-size:16px;font-size:1.6rem}.content-item.topic-item .member-item:focus,.content-item.topic-item .member-item:hover{text-decoration:underline}.content-item.topic-item .content-meta{font-size:14px;font-size:1.4rem;line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.content-item-list{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;min-width:100%;margin:0 -10px}.content-item-list .fill{-webkit-box-flex:1;-ms-flex:1 1 400px;flex:1 1 400px;margin:0 10px}@media only screen and (max-width:959px){.full-content-wrapper .content-item .content-info h3{padding:0!important}.full-content-wrapper .content-item .content-info p:not(.content-meta){margin:0!important}}@media only screen and (max-width:759px){.content-item .content-tags,.content-item.write-tutorial{display:none}.content-item .content-description .short,.content-item .content-meta .short{display:inline}.content-item .content-description .long,.content-item .content-meta .long{display:none}}.zform-toolbar{margin:0;padding:2px;list-style-position:initial;list-style-type:none;border-bottom:none}.zform-toolbar a,.zform-toolbar button{display:block;float:left;cursor:pointer;border-bottom:1px solid transparent;text-decoration:none;color:#999;height:27px;line-height:30px;padding:0 10px;margin-left:1px;text-indent:-9999px;width:0}.zform-toolbar a .zform-popup,.zform-toolbar button .zform-popup{text-indent:0;line-height:20px}.zform-toolbar a.ico-after,.zform-toolbar button.ico-after{padding-left:30px}.zform-toolbar a:after,.zform-toolbar button:after{top:7px;left:12px}.zform-toolbar a:focus,.zform-toolbar a:hover,.zform-toolbar button:focus,.zform-toolbar button:hover{border-bottom-color:#1088bf;outline:none;background-color:#eee}.zform-toolbar button{padding:0 15px;height:30px;border-top:none;border-right:none;border-left:none}.zform-toolbar button[type=submit]{background:#084561;border-bottom-color:#084561;color:#ddd}.zform-toolbar button[type=submit]:focus,.zform-toolbar button[type=submit]:hover{color:#fff;background:#396a81;border-bottom-color:#396a81}.zform-button{background-repeat:no-repeat;background-position:50%}.zform-button-bold:after{background-position:-260px -200px}.zform-button-italic:after{background-position:-212px -176px}.zform-button-strike:after{background-position:-66px -80px}.zform-button-abbr:after{background-position:-292px -256px}.zform-button-key:after{background-position:-196px -160px}.zform-button-sup:after{background-position:-98px -80px}.zform-button-sub:after{background-position:-82px -80px}.zform-button-center:after{background-position:-260px -216px}.zform-button-right:after{background-position:-142px -96px}.zform-button-ul:after{background-position:-31px -272px}.zform-button-ol:after{background-position:-180px -136px}.zform-button-quote:after{background-position:-164px -136px}.zform-button-link:after{background-position:-308px -240px}.zform-button-image:after{background-position:-228px -176px}.zform-button-attention:after{background-position:-276px -240px}.zform-button-error:after{background-position:-244px -216px}.zform-button-question:after{background-position:-164px -120px}.zform-button-infoblocks:after,.zform-button-information:after{background-position:-212px -160px}.zform-button-secret:after{background-position:-120px -80px}.zform-button-blockcode:after,.zform-button-monospace:after{background-position:-276px -256px}.zform-button-titles:after{background-position:-308px -256px}.zform-button-title1:after{background-position:-82px -96px}.zform-button-title2:after{background-position:-98px -96px}.zform-button-title3:after{background-position:-15px -272px}.zform-button-title4:after{background-position:-196px -176px}.zform-button-table:after{background-position:-66px -96px}.zform-button-math:after{background-position:-180px -120px}.zform-button-footnote:after{background-position:-228px -160px}.zform-button-chars:after{background-position:-244px -200px}.zform-button-smilies:after{background-position:-120px -96px}div.zform-popup{top:32px;z-index:10;background:transparent;background-color:#fff;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(to,center),color-stop(8%,#ebebe5),color-stop(75%,#f9f9f6));background-image:linear-gradient(center to top,#ebebe5 8%,#f9f9f6 75%);border:1px solid #ccc;border-radius:3px;padding:2px}.zform-button-smilies .zform-code-col>span{text-align:center}.zform-code-col{display:inline-block;vertical-align:top;margin:2px;min-width:100px}.zform-code-col>span{display:block;color:#2677c9;cursor:pointer}.zform-code-col>span[data-zform-selected=true]{color:blue;font-weight:700}.zform-code-col>span:focus,.zform-code-col>span:hover{color:#c87b02}.featured-resource-item{-webkit-box-flex:1;-ms-flex:1;flex:1;margin-right:1px;background-color:#ccc;position:relative;overflow:hidden;max-width:228px;min-width:170px;z-index:0;background-color:#084561}.featured-resource-item:before{content:\"\";display:block;padding-top:100%}.featured-resource-item .featured-resource-illu{position:absolute;z-index:1;top:0;left:0;height:100%;width:auto;-webkit-transition:.15s ease;transition:.15s ease;-webkit-transition-property:opacity,-webkit-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform;-webkit-transform:scale(0),translateZ(0);transform:scale(0),translateZ(0);-webkit-perspective:1000;perspective:1000;-webkit-backface-visibility:hidden;backface-visibility:hidden}.featured-resource-item .featured-resource-meta{position:absolute;z-index:3;color:#fff;bottom:0;right:0;left:0;padding:40px 14px 12px;text-shadow:1px 1px 0 rgba(0,0,0,.6);background-image:linear-gradient(180deg,transparent 0,rgba(0,0,0,.2) 30px,rgba(0,0,0,.4))}.featured-resource-item .featured-resource-meta h3{font-size:16px;line-height:20px;font-weight:400;margin:0;display:table-cell;vertical-align:middle;height:0;-webkit-transition:height .15s ease;transition:height .15s ease}.featured-resource-item .featured-resource-meta p{font-size:12px;margin:0;line-height:22px}.featured-resource-item a:focus .featured-resource-illu,.featured-resource-item a:hover .featured-resource-illu{opacity:.4;-webkit-filter:blur(5px);filter:blur(5px);-webkit-transform:scale(1.05),translateZ(0);transform:scale(1.05),translateZ(0)}.featured-resource-item a:focus .featured-resource-meta h3,.featured-resource-item a:hover .featured-resource-meta h3{height:190px;font-size:20px}.featured-resource-item>a{display:block}.featured-resource-edit-form{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.featured-resource-edit-form .featured-resource-item{margin-right:20px;-ms-flex-preferred-size:228px;flex-basis:228px}.featured-resource-edit-form form{width:auto;-webkit-box-flex:1;-ms-flex:1;flex:1}@media only screen and (max-width:759px){.featured-resource-edit-form{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:unset;-ms-flex-align:unset;align-items:unset}}.markdown-help{min-height:25px;overflow:hidden;background:#eee;padding:15px;margin-bottom:5px;border-bottom:1px solid #ccc}.mobile-menu,.mobile-menu-btn{display:none}@media only screen and (max-width:959px){.js .page-container{position:relative;z-index:4;-webkit-transform:translateZ(0);transform:translateZ(0)}.js .mobile-menu{display:block;position:absolute;position:fixed;overflow-x:hidden;overflow-y:auto;z-index:1;-webkit-transform:translate3d(-20%,0,0);transform:translate3d(-20%,0,0);width:90%;height:100%;padding-bottom:20px;background:#222;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.js .mobile-menu .search{height:50px;position:relative;top:0;left:0;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.js .mobile-menu .search form{-webkit-box-flex:1;-ms-flex:1;flex:1}.js .mobile-menu .search input{color:#eee;background-color:#333;height:30px;padding:10px 5%;font-size:16px;font-size:1.6rem;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.js .mobile-menu .search input:focus,.js .mobile-menu .search input:hover{padding-bottom:7px;border-bottom:3px solid #084561;background-color:#333}.js .mobile-menu .search button{display:none}.js .mobile-menu .search .search-more{background-color:#3f3f3f;width:50px;height:50px;line-height:50px;color:#ccc}.js .mobile-menu .mobile-menu-bloc,.js .mobile-menu .mobile-menu-link{width:90%;line-height:40px;text-indent:0}.js .mobile-menu .mobile-menu-bloc{margin:0 5% 15px}.js .mobile-menu .mobile-menu-bloc:nth-child(2){margin-top:15px}.js .mobile-menu .mobile-menu-bloc li,.js .mobile-menu .mobile-menu-bloc ul{margin:0;padding:0}.js .mobile-menu .mobile-menu-bloc .mobile-menu-link{margin:0;width:100%}.js .mobile-menu .mobile-menu-bloc .mobile-menu-link.disabled{opacity:.5}.js .mobile-menu .mobile-menu-bloc:not(.mobile-show-ico) .ico-after:after{display:none}.js .mobile-menu .mobile-menu-bloc[data-title]:before{display:block;content:attr(data-title);height:30px;font-size:14px;font-size:1.4rem;text-transform:uppercase;padding-bottom:3px;border-bottom:2px solid #3f3f3f;font-weight:700;color:#666}.js .mobile-menu .mobile-menu-bloc.mobile-show-ico .ico-after{padding-left:30px;width:calc(100% - 30px)}.js .mobile-menu .mobile-menu-bloc.mobile-show-ico .ico-after:after{top:12px;left:2px}.js .mobile-menu .mobile-menu-bloc.mobile-show-ico .icon{display:inline-block;width:16px;height:16px;margin:7px;line-height:30px;padding-left:5px}.js .mobile-menu .mobile-menu-bloc.mobile-show-ico .icon:after{top:0;left:0}.js .mobile-menu .mobile-menu-link{display:block;height:40px;line-height:40px;text-decoration:none;color:#ccc;font-size:16px;font-size:1.6rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;background:none;border:none;text-align:left;padding:0}.js .mobile-menu .mobile-menu-link.mobile-menu-sublink{width:90%;margin:0 0 0 10%}.js .mobile-menu .mobile-menu-link.mobile-menu-bloc[data-title]{height:80px}.js .mobile-menu .mobile-menu-link.mobile-menu-bloc:not([data-title]){margin-bottom:0}.js .mobile-menu .mobile-menu-link:not(:last-child):not(.mobile-menu-bloc){border-bottom:1px solid #2c2c2c}.js .mobile-menu .mobile-menu-link[data-prefix]:before{content:\"[\" attr(data-prefix) \"] \"}.js .mobile-menu .mobile-menu-link.unread{font-weight:700;color:#eee}.js .mobile-menu .mobile-menu-link img,.js .mobile-menu .mobile-menu-link span{vertical-align:middle}.js .mobile-menu .mobile-menu-link img{float:left;margin:5px 5px 5px 0;width:30px;height:30px}.js .mobile-menu .mobile-menu-link .label{padding:0 0 0 50px}.js .mobile-menu .mobile-menu-link img+.label{padding:0 0 0 10px}.js.show-mobile-menu{width:100%}.js.show-mobile-menu body{position:fixed}.js.show-mobile-menu .page-container{-webkit-transform:translate3d(90%,0,0);transform:translate3d(90%,0,0);overflow:hidden;-webkit-box-shadow:0 0 7px rgba(0,0,0,.25);box-shadow:0 0 7px rgba(0,0,0,.25)}.js.show-mobile-menu .mobile-menu{-webkit-transform:translateZ(0);transform:translateZ(0)}.js.enable-mobile-menu .mobile-menu-hide,.js.enable-mobile-menu .page-container .mobile-menu-bloc,.js.enable-mobile-menu .page-container .mobile-menu-link,.js.enable-mobile-menu .page-container .search{display:none}.js.enable-mobile-menu .page-container .mobile-menu-btn+.header-logo{margin-left:0}.js.enable-mobile-menu .page-container .mobile-menu-btn{display:block;float:left;height:50px;width:50px;cursor:pointer}.js.enable-mobile-menu .page-container .mobile-menu-btn:after{display:block;content:\" \";position:absolute;top:15px;left:13px;height:22px;width:22px;background-repeat:no-repeat;background-position:-120px -40px}html:not(.enable-mobile-menu) .header-container{border-bottom:1px solid #ccc}html:not(.enable-mobile-menu) .page-container .header-logo{margin-left:10px}html:not(.enable-mobile-menu) .page-container .header-logo-link:after{left:55px;right:205px}html:not(.enable-mobile-menu) .logbox .my-account,html:not(.enable-mobile-menu) .logbox .notifs-links .ico-link{position:absolute;top:0;right:0;height:50px;width:50px}html:not(.enable-mobile-menu) .logbox .my-account .avatar,html:not(.enable-mobile-menu) .logbox .notifs-links .ico-link .avatar{height:50px;width:50px}html:not(.enable-mobile-menu) .logbox .notifs-links :first-child .ico-link{right:150px}html:not(.enable-mobile-menu) .logbox .notifs-links :nth-child(2) .ico-link{right:100px}html:not(.enable-mobile-menu) .logbox .notifs-links .ico-link:nth-child(3),html:not(.enable-mobile-menu) .logbox .notifs-links :nth-child(3) .ico-link{right:50px}html:not(.enable-mobile-menu) .logbox.unlogged{position:absolute;top:0;right:0}}.modal{display:none}.modals-container{display:none;position:fixed;top:0;left:0;height:100vh;width:100vw;overflow-y:auto;z-index:8}.modals-container.open{display:block}.modals-container .modals-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;width:100vw;min-height:100vh;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-pack:distribute;justify-content:space-around;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.modals-container .modals-overlay{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1;background-color:rgba(0,0,0,.7)}.modals-container .modal{position:relative;z-index:2;background:#eee;-webkit-box-flex:0;-ms-flex:0;flex:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.modals-container .modal.open{display:-webkit-box;display:-ms-flexbox;display:flex}.modals-container .modal .modal-title{display:block;border-bottom:3px solid #f8ad32;line-height:53px;height:50px;text-indent:15px;background:#084561;color:#fff;font-size:16px;font-size:1.6rem;text-shadow:rgba(0,0,0,.75) 0 0 3px}.modals-container .modal .modal-title.ico-after{text-indent:40px}.modals-container .modal .modal-title.ico-after:after{margin:18px 0 0 15px}.modals-container .modal .modal-body{padding:20px 15px 5px;-webkit-box-flex:1;-ms-flex:1;flex:1}.modals-container .modal .modal-body p{width:370px}.modals-container .modal .modal-body table{margin-top:0}.modals-container .modal .modal-body input:not([type=checkbox]):not([type=radio]),.modals-container .modal .modal-body p,.modals-container .modal .modal-body select,.modals-container .modal .modal-body textarea{margin:0 0 15px}.modals-container .modal .modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;border-top:1px solid #ccc;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.modals-container .modal .modal-footer>*{-webkit-box-flex:1;-ms-flex:1;flex:1;height:50px;line-height:50px;margin:0;padding:0;text-align:center;background:none!important;color:#333}.modals-container .modal .modal-footer>:not(:first-child){border-right:1px solid #ccc}.modals-container .modal .modal-footer>:only-child{font-weight:700}.modals-container .modal .modal-footer .btn-submit,.modals-container .modal .modal-footer [type=submit]{color:#084561;font-weight:700}.modals-container .modal .modal-footer .btn-cancel{color:#555}.enable-mobile-menu .modals-container .modal{margin:25px;-webkit-box-shadow:0 0 5px #000;box-shadow:0 0 5px #000;max-width:100%}.enable-mobile-menu .modals-container .modal.modal-flex{width:400px}@media only screen and (min-width:960px){.enable-mobile-menu .modals-container .modal{-webkit-box-shadow:0 2px 7px rgba(0,0,0,.7);box-shadow:0 2px 7px rgba(0,0,0,.7)}.enable-mobile-menu .modals-container .modal .modal-title{line-height:50px}.enable-mobile-menu .modals-container .modal .btn-submit:not(.disabled):focus,.enable-mobile-menu .modals-container .modal .btn-submit:not(.disabled):hover,.enable-mobile-menu .modals-container .modal [type=submit]:not(.disabled):focus,.enable-mobile-menu .modals-container .modal [type=submit]:not(.disabled):hover{color:#eee;background:#48a200!important}.enable-mobile-menu .modals-container .modal .btn-cancel:focus,.enable-mobile-menu .modals-container .modal .btn-cancel:hover{color:#eee;background:#c0392b!important}}.modal .vote-details{display:-webkit-box;display:-ms-flexbox;display:flex;color:#444;max-height:400px;overflow-y:auto}.modal .vote-details .vote-col{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 8px 15px}.modal .vote-details .vote-col h3{margin:0 0 2px}.modal .vote-details ul.vote-list{padding:0;margin:0;list-style:none}.modal .vote-details ul.vote-list li{line-height:24px;border-top:1px solid #ccc}.modal .vote-details ul.vote-list li a{padding:4px;text-decoration:none;color:inherit;display:block}.modal .vote-details ul.vote-list li a:focus,.modal .vote-details ul.vote-list li a:hover{background-color:#fff}.modal .vote-details ul.vote-list li.muted{color:#777;padding:4px}.modal .vote-details ul.vote-list li img{height:24px;width:24px;margin-right:6px}.pagination{list-style:none;margin:0;padding:0;border-top:1px solid #d2d5d6;border-bottom:1px solid #d2d5d6;background:#fbfbfb;margin-bottom:20px!important;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.pagination li{margin-bottom:-1px}.pagination li a{display:block;text-align:center;text-decoration:none;color:#084561;min-width:45px;height:40px;line-height:40px;-webkit-transition:background .15s ease;transition:background .15s ease}.pagination li a.current{height:38px;color:gray;background:#f7f7f7;margin-top:-1px;border-left:1px solid #d2d5d6;border-bottom:3px solid #d2d5d6;border-right:2px solid #d2d5d6}.pagination li a.ico-after:after{margin-top:12px}.pagination li a[href]:focus,.pagination li a[href]:hover{background:#d2d5d6}.pagination li.next a,.pagination li.prev a,.pagination li.summary-button a{padding:0 15px}.pagination li.prev .ico-after{padding-left:30px}.pagination li.prev .ico-after:after{margin-left:8px}.pagination li.next{margin-left:auto}.pagination li.next .ico-after{padding-right:30px}.pagination li.next .ico-after:after{right:8px;left:auto}.pagination li.summary-button{position:absolute;left:47%;display:none}.pagination.pagination-top li a.current{margin-top:0;border-top:3px solid #d2d5d6;border-bottom:none;height:35px;line-height:35px;padding-bottom:3px}.pagination.pagination-chapter{margin-left:0}.pagination.pagination-chapter li{max-width:43%}.pagination.pagination-chapter a{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@media only screen and (min-width:960px){.pagination{border:1px solid #d2d5d6}}@media only screen and (max-width:759px){.pagination li.next a,.pagination li.prev a{min-width:0}.pagination li.next a span,.pagination li.prev a span{display:none}}@media only screen and (max-width:959px){.pagination li.summary-button{display:none}}.codehilite .hll{background-color:#ffc}.codehilite{background:#f8f8f8}.codehilite .c{color:#408080}.codehilite .k{color:green;font-weight:700}.codehilite .o{color:#666}.codehilite .cm{color:#408080}.codehilite .cp{color:#bc7a00}.codehilite .c1,.codehilite .cs{color:#408080}.codehilite .gd{color:#a00000}.codehilite .ge{font-style:italic}.codehilite .gr{color:red}.codehilite .gh{color:navy;font-weight:700}.codehilite .gi{color:#00a000}.codehilite .go{color:gray}.codehilite .gp{color:navy;font-weight:700}.codehilite .gs{font-weight:700}.codehilite .gu{color:purple;font-weight:700}.codehilite .gt{color:#0040d0}.codehilite .kc,.codehilite .kd,.codehilite .kn{color:green;font-weight:700}.codehilite .kp{color:green}.codehilite .kr{color:green;font-weight:700}.codehilite .kt{color:#b00040}.codehilite .m{color:#666}.codehilite .s{color:#ba2121}.codehilite .na{color:#7d9029}.codehilite .nb{color:green}.codehilite .nc{color:#00f;font-weight:700}.codehilite .no{color:#800}.codehilite .nd{color:#a2f}.codehilite .ni{color:#999;font-weight:700}.codehilite .ne{color:#d2413a;font-weight:700}.codehilite .nf{color:#00f}.codehilite .nl{color:#a0a000}.codehilite .nn{color:#00f;font-weight:700}.codehilite .nt{color:green;font-weight:700}.codehilite .nv{color:#19177c}.codehilite .ow{color:#a2f;font-weight:700}.codehilite .w{color:#bbb}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#666}.codehilite .sb,.codehilite .sc{color:#ba2121}.codehilite .sd{color:#ba2121;font-style:italic}.codehilite .s2{color:#ba2121}.codehilite .se{color:#b62;font-weight:700}.codehilite .sh{color:#ba2121}.codehilite .si{color:#b68;font-weight:700}.codehilite .sx{color:green}.codehilite .sr{color:#b68}.codehilite .s1{color:#ba2121}.codehilite .ss{color:#19177c}.codehilite .bp{color:green}.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#19177c}.codehilite .il{color:#666}.codehilitetable{width:100%!important;table-layout:fixed;border-color:rgba(0,0,0,.15)}.codehilitetable td{padding:0;vertical-align:top}.codehilitetable .linenos{background-color:#fbfbfc;border-right:1px solid #ececf0;width:46px}.codehilitetable .codehilite pre,.codehilitetable .linenos{padding-top:15px;padding-bottom:15px}.codehilitetable .linenodiv pre{text-align:right;padding-right:7px;color:#bebec5}.codehilitetable .codehilite{width:100%;height:auto;overflow:auto}.codehilitetable .codehilite pre{white-space:pre;overflow:auto}.codehilitetable .code pre{overflow:auto;word-wrap:normal;padding-left:7px;padding-right:7px}.search-box{background:#fff;position:relative;margin:30px auto 0;max-width:820px}.search-box form{display:-webkit-box;display:-ms-flexbox;display:flex}.search-box input,.search-box label{-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;line-height:50px;height:50px}.search-box label{text-align:right;padding:0 5px;font-size:2rem;font-weight:300;margin-left:50px}.search-box input{font-size:2rem;border:none;font-weight:300;-webkit-box-flex:1;-ms-flex:1;flex:1}.search-box button[type=submit]{background-color:#fff!important;width:50px;height:50px}.search-box button[type=submit]:focus,.search-box button[type=submit]:hover{background-color:#ccc!important}.search-box button[type=submit]:after{margin:16px!important;background-position:-256px -232px;width:16px;height:40px}.search-box:before{content:\"\";position:absolute;bottom:-6px;left:-28px;background:url(../images/home-clem.png);background-size:100%;width:68px;height:134px}body.vc-clem-christmas .search-box:before{background-image:url(../images/home-clem-christmas.png)}body.vc-clem-halloween .search-box:before{background-image:url(../images/home-clem-halloween.png);width:160px;left:-80px}.search-box .control-group{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;width:100%}.search-box .control-group .controls{width:100%}.search-box .control-group input{padding:0;width:100%!important}.search-results .content-item{margin-left:0}.search-filters{margin-right:auto;margin-left:auto;max-width:820px;padding-left:0;text-align:center;list-style:none}.search-filters li{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;padding-right:16px}.search-filters li input[type=checkbox]{margin-top:8px}.search-filters label{color:#fff}@media only screen and (max-width:759px){.search-box{margin:30px 0 0!important;padding-left:40px}.search-box label{display:none}.search-box:before{left:-46px}.search-filters{text-align:left;padding-left:10px}.search-filters li{display:list-item}}@media only screen and (max-width:959px){.search-box{margin:30px 40px 0}}.taglist{list-style:none;padding:0;margin:-14px 0 15px;height:30px;line-height:30px}.taglist li{float:right}.taglist li a{display:block;text-decoration:none;padding:0 10px;background:#396a81;color:#fff;margin-left:1px;-webkit-transition-property:color,background,border;transition-property:color,background,border;-webkit-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.15s;transition-duration:.15s}.taglist li a:focus,.taglist li a:hover{background:#fff;color:#396a81;border-bottom:1px solid #396a81}.content-tags-list{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.content-tags-list:after{content:\"\";display:block;-webkit-box-flex:20;-ms-flex:20;flex:20}.content-tag{margin:0 5px 20px;line-height:1.4em;white-space:nowrap;-webkit-box-flex:1;-ms-flex:auto;flex:auto}.content-tag a{color:#777;display:block;padding:8px 15px;text-decoration:none;background-color:#eee;-webkit-transition-property:color,background,border,outline;transition-property:color,background,border,outline;-webkit-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.15s;transition-duration:.15s;border:1px solid #ccc}.content-tag a:focus,.content-tag a:hover{color:#eee;background-color:#777;border-color:#777;outline:none}.content-tag a .tag-count{color:#aaa}.tooltips-container .tooltip-wrapper{position:absolute;z-index:7}.tooltips-container .tooltip-wrapper .tooltip{font-size:12px;line-height:16px;color:#fff;background-color:#333;padding:6px 8px}.tooltips-container .tooltip-wrapper.top:after{border-top:6px solid #333}.tooltips-container .tooltip-wrapper.bottom:before{border-bottom:6px solid #333}.tooltips-container .tooltip-wrapper.bottom:before,.tooltips-container .tooltip-wrapper.top:after{margin:auto;content:\"\";height:0;width:0;display:block;border-left:6px solid transparent;border-right:6px solid transparent}.topic-list{margin-top:50px!important;margin-bottom:50px!important}.topic-list h2{margin-bottom:0!important}.topic-list h2+.topic{border-top:none}.topic-list .topic{position:relative;min-height:81px;line-height:25px;border-top:1px solid #fff;border-bottom:1px solid #ccc;overflow:hidden;border-left:1px solid transparent;clear:both}.topic-list .topic:first-child{border-top:1px solid #ccc}.topic-list .topic:before{content:\" \";display:block;position:absolute;background:transparent;height:100%;width:2px}.topic-list .topic.unread:before{background:#1088bf}.topic-list .topic:nth-child(2n){background:none}.topic-list .topic.unread{background:#fff}.topic-list .topic.unread .topic-description .topic-title{font-weight:700}.topic-list .topic.active:before,.topic-list .topic:hover:before{width:5px;background:#1088bf}.topic-list .topic.selected{background-color:#eaf7fd}.topic-list a{text-decoration:none;color:#0e77a8}.topic-list a:focus,.topic-list a:hover{color:#0e77a8;text-decoration:underline;outline:none}.topic-list .topic-answers,.topic-list .topic-description,.topic-list .topic-infos,.topic-list .topic-last-answer{display:block;float:left;padding:4px 0;margin:0}.topic-list .topic-infos{width:8%}.topic-list .topic-infos input[type=checkbox]{margin:29px 25% 0}.topic-list .topic-infos .ico-after{display:block;text-indent:-9999px}.topic-list .topic-infos .ico-after:after{margin:4px 0 0 15px}.topic-list .topic-description{position:relative;width:60%}.topic-list .topic-description .topic-image{float:left;max-height:60px;max-width:60px;margin:5px 15px 0 0}.topic-list .topic-description .topic-tags{list-style:none;padding:0;margin:0;display:inline}.topic-list .topic-description .topic-tags .topic-tag{display:block;height:23px;line-height:23px;float:left;padding:0 5px;margin:0 3px 0 0;color:#396a81;background:#fcfcfc;border:1px solid #ccc}.topic-list .topic-description .topic-tags .topic-tag:focus,.topic-list .topic-description .topic-tags .topic-tag:hover{background:#fff;color:#084561;border-color:#084561;text-decoration:none}.topic-list .topic-description .topic-tags .topic-tag:focus{-webkit-box-shadow:#396a81 0 0 3px;box-shadow:0 0 3px #396a81}.topic-list .topic-description .topic-tags li:last-child .topic-tag{margin-right:5px}.topic-list .topic-description .topic-title-link{display:block;min-height:48px}.topic-list .topic-description .topic-title-link:focus,.topic-list .topic-description .topic-title-link:hover{text-decoration:none}.topic-list .topic-description .topic-title-link:focus .topic-title,.topic-list .topic-description .topic-title-link:hover .topic-title{text-decoration:underline}.topic-list .topic-description .topic-subtitle,.topic-list .topic-description .topic-title{margin:0!important;padding:0}.topic-list .topic-description .topic-title{display:inline-block;font-size:16px;font-size:1.6rem;font-weight:400}.topic-list .topic-description .topic-subtitle{display:block;min-height:24px;line-height:1.5em;color:#777}.topic-list .topic-description .topic-members{margin:0;color:#777}.topic-list .topic-answers{width:12%;text-align:center;padding-top:29px}.topic-list .topic-last-answer{width:20%}.topic-list .topic-last-answer .topic-no-last-answer{display:block;margin-top:27px;color:#084561;opacity:.5}.topic-list .highlighted{background-color:rgba(255,255,100,.4);padding:0 3px;border-radius:2px}.forum-list .group-title{max-width:100%;margin-top:30px!important;clear:both;border-bottom:1px solid #ccc;color:#f8ad32}.topic-list-small .topic{min-height:60px}.topic-list-small .topic-infos input[type=checkbox]{margin-top:18px}.topic-list-small .topic-description{padding:4px 1.5%}.topic-list-small .topic-description .topic-title{display:block;font-weight:400;margin-top:2px}.topic-list-small .topic-infos+.topic-description{padding-left:0}.topic-list-small .topic-answers{padding-top:17px}.topic-list-small .topic-answers span{display:block;float:left;width:50%}.topic-list-small .topic-last-answer{width:18%}.topic-list-small .topic-last-answer .topic-no-last-answer{margin-top:13px}.topic-list-small .topic-last-answer .forum-last-message{display:block}.topic-list-small .topic-last-answer .forum-last-message .forum-last-message-long{display:none}.topic-list-small .topic-last-answer .forum-last-message-title{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:960px){.topic-list .topic-last-answer-short-date,.topic-list .topic-members-short-date{display:none}.topic-list:not(.topic-list-small) .topic-last-answer .topic-no-last-answer{margin-top:24px}.forum-list .topic{min-height:0}.forum-list .topic-last-answer .forum-last-message .forum-last-message-long{display:none}}@media only screen and (max-width:959px){.topic-list .topic{background:none!important}.topic-list .topic p{margin:0!important}.topic-list .topic .topic-answers,.topic-list .topic .topic-members .topic-members-long-date{display:none}.topic-list .topic .topic-last-answer{width:30%;padding:0;text-align:right}.topic-list .topic .topic-last-answer .topic-last-answer-short-date{font-size:1.3rem}.topic-list .topic .topic-last-answer .topic-last-answer-long-date{display:none}.topic-list .topic .topic-last-answer .topic-no-last-answer{text-align:center}}@media only screen and (max-width:759px){.topic-list .topic-infos .ico-after:after{margin:4px 0 0 2px}.topic-list .topic-description .topic-subtitle:empty{display:none}.topic-list .topic-last-answer .topic-no-last-answer{font-size:1.3rem}.forum-list .topic-description .topic-subtitle{margin-left:10px}}.notification-list{margin-top:50px!important;margin-bottom:50px!important}.notification-list .notification{position:relative;line-height:25px;border-top:1px solid #fff;border-bottom:1px solid #ccc;overflow:hidden;border-left:1px solid transparent;clear:both}.notification-list .notification:first-child{border-top:1px solid #ccc}.notification-list .notification:before{content:\" \";display:block;position:absolute;background:transparent;height:100%;width:2px}.notification-list .notification.unread:before{background:#1088bf}.notification-list .notification:nth-child(2n){background:none}.notification-list .notification.unread{background:#fff}.notification-list .notification.unread .notification-description .notification-title{font-weight:700}.notification-list .notification.active:before,.notification-list .notification:hover:before{width:5px;background:#1088bf}.notification-list .notification.selected{background-color:#eaf7fd}.notification-list a{text-decoration:none;color:#0e77a8}.notification-list a:focus,.notification-list a:hover{color:#0e77a8;text-decoration:underline;outline:none}.notification-list .notification-description,.notification-list .notification-infos,.notification-list .notification-last-answer{display:block;float:left;padding:4px 0;margin:0}.notification-list .notification-infos{width:5%}.notification-list .notification-infos .ico-after{display:block;text-indent:-9999px}.notification-list .notification-infos .ico-after:after{margin:4px 0 0 15px}.notification-list .notification-description{position:relative;width:60%}.notification-list .notification-description .notification-title-link{display:block}.notification-list .notification-description .notification-title-link:focus,.notification-list .notification-description .notification-title-link:hover{text-decoration:none}.notification-list .notification-description .notification-title-link:focus .topic-title,.notification-list .notification-description .notification-title-link:hover .topic-title{text-decoration:underline}.notification-list .notification-description .notification-title{display:block;margin:0!important;padding:0;font-size:16px;font-size:1.6rem;font-weight:400}.notification-list .notification-last-answer{width:35%}@media only screen and (min-width:960px){.notification-list .notification-last-answer-short-date{display:none}}@media only screen and (max-width:959px){.notification-list .notification{background:none!important}.notification-list .notification .notification-last-answer{width:30%;text-align:right}.notification-list .notification .notification-last-answer .notification-last-answer-short-date{font-size:1.3rem}.notification-list .notification .notification-last-answer .notification-last-answer-long-date{display:none}}@media only screen and (max-width:759px){.notification-list .notification-infos .ico-after:after{margin:4px 0 0 2px}.notification-list .notification{background:none!important}.notification-list .notification .notification-last-answer{width:20%}}.topic-message{position:relative}.topic-message.repeated .message,.topic-message.repeated .message .is-author{background:#eee}.topic-message.repeated .message:after{border-right-color:#eee}.topic-message.helpful .message,.topic-message.helpful .message .is-author{background:#e9f9dc}.topic-message.helpful .message:after{border-right-color:#e9f9dc}.topic-message.helpful.repeated .message,.topic-message.helpful.repeated .message .is-author{background:#eaefe6}.topic-message.helpful.repeated .message:after{border-right-color:#eaefe6}.topic-message .user .avatar-link{display:block;height:58px;width:58px;z-index:0;position:absolute;top:0;border:1px solid #ddd}.topic-message .user .avatar-link[href]:focus,.topic-message .user .avatar-link[href]:hover{border-color:#fff;overflow:hidden;-webkit-box-shadow:rgba(0,0,0,.3) 0 1px 7px;box-shadow:0 1px 7px rgba(0,0,0,.3)}.topic-message .user .avatar-link img{height:58px;width:58px}.topic-message .user .user-metadata{width:60px;height:25px}.topic-message .user .user-metadata a{display:block;float:left;border:1px solid #d2d5d6;border-top:0;text-align:center;background-color:#edefef;text-decoration:none;color:#424242;height:25px;line-height:26px;width:58px;color:#777;-webkit-transition:border .15s ease,background .15s ease;transition:border .15s ease,background .15s ease}.topic-message .user .user-metadata a:focus,.topic-message .user .user-metadata a:hover{border-bottom-width:1px;border-bottom-color:#777;background:#fff}.topic-message .user .user-metadata a.positive{color:#48a200}.topic-message .user .user-metadata a.negative{color:#c0392b;font-weight:700}.topic-message .message{position:relative;background-color:#fdfdfd;border:1px solid #d2d5d6;border-right-width:2px;border-bottom-width:3px;min-height:75px}.topic-message .message .is-author{position:absolute;top:-16px;left:10px;background:#fdfdfd;padding:0 5px;font-size:12px;line-height:20px;color:#999;border-top:1px solid #d2d5d6}.topic-message .message .is-author:after,.topic-message .message .is-author:before{content:\" \";display:block;position:absolute;top:0;height:15px;width:1px;background:#d2d5d6}.topic-message .message .is-author:before{left:0}.topic-message .message .is-author:after{right:0}.topic-message .message .message-metadata{display:inline-block;font-size:14px;font-size:1.4rem;margin-left:5px}.topic-message .message .message-metadata a{display:block;float:left;color:#999;text-decoration:none;height:30px;line-height:30px;padding:0 5px;border-bottom:1px solid #d2d5d6;-webkit-transition-property:color,outline,border;transition-property:color,outline,border;-webkit-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.15s;transition-duration:.15s}.topic-message .message .message-metadata a:focus,.topic-message .message .message-metadata a:hover{border-bottom:1px solid #0e77a8;color:#0e77a8;outline:none}.topic-message .message .message-metadata .username{color:#484848;font-size:16px;font-size:1.6rem;margin-right:3px}.topic-message .message .message-metadata .date{line-height:32px}.topic-message .message .message-metadata .date .long-date{display:none}.topic-message .message .message-actions{margin:0;padding:0;list-style:none;position:absolute;top:0;right:0}.topic-message .message .message-actions li{float:left}.topic-message .message .message-content{clear:both;padding-top:1px}.topic-message .message .message-content>div>p:first-child{margin-top:7px}.topic-message .message .message-content>div>figure:first-child{margin-top:8px}.topic-message .message .message-content .message-hidden-content{display:none}.topic-message .message .message-content .with-hat{color:#fff;background-color:#6f6f6f;display:inline-block;padding:0;margin-top:5px;margin-bottom:5px}.topic-message .message .message-content .with-hat>a{color:#fff;text-decoration:none;display:inline-block;padding:0 6px}.topic-message .message .message-content .staff-hat{background-color:#2b5c73}.topic-message .message .message-content .message-edited,.topic-message .message .message-content .message-helpful,.topic-message .message .message-content .message-hidden,.topic-message .message .message-content .message-repeated{padding-top:3px 0 0}.topic-message .message .message-content .message-edited.ico-after,.topic-message .message .message-content .message-helpful.ico-after,.topic-message .message .message-content .message-hidden.ico-after,.topic-message .message .message-content .message-repeated.ico-after{text-indent:20px}.topic-message .message .message-content .message-edited.ico-after:after,.topic-message .message .message-content .message-helpful.ico-after:after,.topic-message .message .message-content .message-hidden.ico-after:after,.topic-message .message .message-content .message-repeated.ico-after:after{margin:4px 0}.topic-message .message .message-content .message-edited,.topic-message .message .message-content .message-hidden,.topic-message .message .message-content .message-repeated{font-style:italic;color:#999}.topic-message .message .message-content .message-edited>a,.topic-message .message .message-content .message-hidden>a,.topic-message .message .message-content .message-repeated>a{color:#999}.topic-message .message .message-content .message-edited:after,.topic-message .message .message-content .message-hidden:after,.topic-message .message .message-content .message-repeated:after{opacity:.5}.topic-message .message .message-content .message-hidden{margin-top:1px}.topic-message .message .message-content .message-helpful{color:#48a200;text-indent:20px}.topic-message .message .message-content textarea{margin:10px 0 10px -1px;background-color:transparent;min-height:150px}.topic-message .message .message-bottom{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;min-height:30px}.topic-message .message .message-bottom .signature{border-top:1px solid #d2d5d6;padding:3px 0 3px 10px;margin:0 10px 0 0;font-size:12px;font-size:1.2rem;color:#999;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.topic-message .message .message-bottom .signature p{margin:0;padding:0}.topic-message .message .message-bottom .signature a{color:#999;-webkit-transition:color .15s ease,-webkit-text-decoration .15s ease;transition:color .15s ease,-webkit-text-decoration .15s ease;transition:color .15s ease,text-decoration .15s ease;transition:color .15s ease,text-decoration .15s ease,-webkit-text-decoration .15s ease}.topic-message .message .message-bottom .signature a:focus,.topic-message .message .message-bottom .signature a:hover{text-decoration:none;color:#555}.topic-message .message .message-bottom .message-karma{margin-left:auto;margin-bottom:-2px}.topic-message .message .message-bottom .message-karma button.ico-after,.topic-message .message .message-bottom .message-karma span{border-bottom-width:3px;border-bottom-color:transparent;background:none!important;height:32px}.topic-message .message .message-bottom .message-karma span.downvote:not(.has-vote),.topic-message .message .message-bottom .message-karma span.upvote:not(.has-vote){border-bottom:none;opacity:.5}.topic-message .message .message-bottom .message-karma button{-webkit-transition-property:opacity,border;transition-property:opacity,border}.topic-message .message .message-bottom .message-karma button.voted:hover:after{opacity:.5}.topic-message .message .message-bottom .message-karma .downvote:after,.topic-message .message .message-bottom .message-karma .upvote:after{left:10px}.topic-message .message .message-bottom .message-karma .downvote.voted:after,.topic-message .message .message-bottom .message-karma .upvote.voted:after{opacity:1}.topic-message .message .message-bottom .message-karma .downvote:focus:not(.more-voted),.topic-message .message .message-bottom .message-karma .downvote:hover:not(.more-voted),.topic-message .message .message-bottom .message-karma .upvote:focus:not(.more-voted),.topic-message .message .message-bottom .message-karma .upvote:hover:not(.more-voted){border-bottom-color:transparent}.topic-message .message .message-bottom .message-karma .downvote:not(.has-vote),.topic-message .message .message-bottom .message-karma .upvote:not(.has-vote){text-indent:-9999px;width:0}.topic-message .message .message-bottom .message-karma .downvote.more-voted,.topic-message .message .message-bottom .message-karma .upvote.more-voted{font-weight:700}.topic-message .message .message-bottom .message-karma .upvote{color:#48a200}.topic-message .message .message-bottom .message-karma .upvote.more-voted{border-bottom-color:#48a200}.topic-message .message .message-bottom .message-karma .downvote{color:#c0392b}.topic-message .message .message-bottom .message-karma .downvote.more-voted{border-bottom-color:#c0392b}.topic-message .message .message-bottom .message-karma .tick{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topic-message .message .message-bottom .message-karma .tick:focus,.topic-message .message .message-bottom .message-karma .tick:hover{color:#555;border-bottom-color:#48a200}.topic-message .message .message-bottom .message-karma .tick.active{color:#48a200}.topic-message .message .message-bottom .message-karma .tick.active:after{opacity:1}.topic-message .message .message-buttons{margin:0 0 0 10px;padding:0;list-style:none;border-bottom:none}.topic-message .message .message-buttons a{text-indent:-9999px;width:0}.topic-message .message .message-buttons a:after{left:12px!important}.topic-message .message .message-submit{margin-left:auto;margin-right:10px}.topic-message .message .message-actions,.topic-message .message .message-buttons,.topic-message .message .message-karma,.topic-message .message .message-submit{display:-webkit-box;display:-ms-flexbox;display:flex}.topic-message .message .message-actions form,.topic-message .message .message-buttons form,.topic-message .message .message-karma form,.topic-message .message .message-submit form{width:auto}.topic-message .message .message-actions .downvote,.topic-message .message .message-actions .upvote,.topic-message .message .message-actions a,.topic-message .message .message-actions button,.topic-message .message .message-buttons .downvote,.topic-message .message .message-buttons .upvote,.topic-message .message .message-buttons a,.topic-message .message .message-buttons button,.topic-message .message .message-karma .downvote,.topic-message .message .message-karma .upvote,.topic-message .message .message-karma a,.topic-message .message .message-karma button,.topic-message .message .message-submit .downvote,.topic-message .message .message-submit .upvote,.topic-message .message .message-submit a,.topic-message .message .message-submit button{display:block;float:left;margin-left:3px}.topic-message .message .message-actions .downvote.ico-after,.topic-message .message .message-actions .upvote.ico-after,.topic-message .message .message-actions a.ico-after,.topic-message .message .message-actions button.ico-after,.topic-message .message .message-buttons .downvote.ico-after,.topic-message .message .message-buttons .upvote.ico-after,.topic-message .message .message-buttons a.ico-after,.topic-message .message .message-buttons button.ico-after,.topic-message .message .message-karma .downvote.ico-after,.topic-message .message .message-karma .upvote.ico-after,.topic-message .message .message-karma a.ico-after,.topic-message .message .message-karma button.ico-after,.topic-message .message .message-submit .downvote.ico-after,.topic-message .message .message-submit .upvote.ico-after,.topic-message .message .message-submit a.ico-after,.topic-message .message .message-submit button.ico-after{padding-left:30px!important}.topic-message .message .message-actions .downvote:after,.topic-message .message .message-actions .upvote:after,.topic-message .message .message-actions a:after,.topic-message .message .message-actions button:after,.topic-message .message .message-buttons .downvote:after,.topic-message .message .message-buttons .upvote:after,.topic-message .message .message-buttons a:after,.topic-message .message .message-buttons button:after,.topic-message .message .message-karma .downvote:after,.topic-message .message .message-karma .upvote:after,.topic-message .message .message-karma a:after,.topic-message .message .message-karma button:after,.topic-message .message .message-submit .downvote:after,.topic-message .message .message-submit .upvote:after,.topic-message .message .message-submit a:after,.topic-message .message .message-submit button:after{top:7px;left:7px;opacity:.5;margin:0}.topic-message .message .message-actions .downvote,.topic-message .message .message-actions .upvote,.topic-message .message .message-actions a,.topic-message .message .message-actions button.ico-after,.topic-message .message .message-buttons .downvote,.topic-message .message .message-buttons .upvote,.topic-message .message .message-buttons a,.topic-message .message .message-buttons button.ico-after,.topic-message .message .message-karma .downvote,.topic-message .message .message-karma .upvote,.topic-message .message .message-karma a,.topic-message .message .message-karma button.ico-after,.topic-message .message .message-submit .downvote,.topic-message .message .message-submit .upvote,.topic-message .message .message-submit a,.topic-message .message .message-submit button.ico-after{border-bottom:1px solid #d2d5d6;text-decoration:none;color:#999;height:29px;line-height:30px;padding:0 10px}.topic-message .message .message-actions a,.topic-message .message .message-actions button.ico-after,.topic-message .message .message-buttons a,.topic-message .message .message-buttons button.ico-after,.topic-message .message .message-karma a,.topic-message .message .message-karma button.ico-after,.topic-message .message .message-submit a,.topic-message .message .message-submit button.ico-after{cursor:pointer}.topic-message .message .message-actions a:focus,.topic-message .message .message-actions a:hover,.topic-message .message .message-actions button.ico-after:focus,.topic-message .message .message-actions button.ico-after:hover,.topic-message .message .message-buttons a:focus,.topic-message .message .message-buttons a:hover,.topic-message .message .message-buttons button.ico-after:focus,.topic-message .message .message-buttons button.ico-after:hover,.topic-message .message .message-karma a:focus,.topic-message .message .message-karma a:hover,.topic-message .message .message-karma button.ico-after:focus,.topic-message .message .message-karma button.ico-after:hover,.topic-message .message .message-submit a:focus,.topic-message .message .message-submit a:hover,.topic-message .message .message-submit button.ico-after:focus,.topic-message .message .message-submit button.ico-after:hover{border-bottom-color:#0e77a8;outline:none;background:none;-webkit-transition-property:background,border,outline,opacity;transition-property:background,border,outline,opacity;-webkit-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.15s;transition-duration:.15s}.topic-message .message .message-actions a:focus:after,.topic-message .message .message-actions a:hover:after,.topic-message .message .message-actions button.ico-after:focus:after,.topic-message .message .message-actions button.ico-after:hover:after,.topic-message .message .message-buttons a:focus:after,.topic-message .message .message-buttons a:hover:after,.topic-message .message .message-buttons button.ico-after:focus:after,.topic-message .message .message-buttons button.ico-after:hover:after,.topic-message .message .message-karma a:focus:after,.topic-message .message .message-karma a:hover:after,.topic-message .message .message-karma button.ico-after:focus:after,.topic-message .message .message-karma button.ico-after:hover:after,.topic-message .message .message-submit a:focus:after,.topic-message .message .message-submit a:hover:after,.topic-message .message .message-submit button.ico-after:focus:after,.topic-message .message .message-submit button.ico-after:hover:after{opacity:1}.topic-message .message .message-actions a:focus,.topic-message .message .message-actions a:hover,.topic-message .message .message-buttons a:focus,.topic-message .message .message-buttons a:hover,.topic-message .message .message-karma button:focus,.topic-message .message .message-karma button:hover{color:#555;text-decoration:none}.topic-message .message .alert-box .alert-box-text{float:none}form.topic-message{margin-top:50px}@media only screen and (max-width:959px){.topic-message{padding:20px 0}.topic-message .user{position:absolute;top:7px;z-index:4;width:100%}.topic-message .user .avatar-link{float:left;display:none}.topic-message .user .badge{float:left;height:20px;line-height:20px;font-size:12px;width:50px;margin-top:-2px;margin-left:10px}.topic-message .user .badge.push-badge{margin-left:105px}.topic-message .user .user-metadata{float:right;width:140px;margin-right:10px}.topic-message .user .user-metadata a{float:left;height:20px;line-height:20px;border-bottom:none;width:68px}.topic-message .message{border-right:0;border-left:0;padding-top:65px}.topic-message .message .message-metadata{position:absolute;top:0;left:0;right:10px;z-index:5;height:30px;line-height:30px}.topic-message .message .message-metadata .username{margin-left:5px}.topic-message .message .message-metadata .date{float:right}.topic-message .message .message-actions{margin:35px 10px 0 0}.topic-message .message .message-bottom{min-height:0}.topic-message .message .message-bottom .signature{display:none}.topic-message .message .message-bottom .message-karma{position:absolute;top:35px;left:7px}.topic-message .message .message-bottom .message-karma .tick{text-indent:-9999px;margin-right:1px}.topic-message .message .message-bottom .message-karma .tick:after{left:12px}.topic-message .message .message-bottom .message-karma .downvote,.topic-message .message .message-bottom .message-karma .upvote{padding:0 7px;text-align:center}}.message-content .message-hat-choice{display:inline-block;margin:10px}@media only screen and (min-width:960px){.topic-message{margin:25px 0}.topic-message:first-child{margin-top:35px}.topic-message .message:after,.topic-message .user:after{content:\" \";display:block;position:absolute;top:10px;height:0;width:0;border:20px solid transparent;border-left:0}.topic-message .user{position:absolute;padding-top:60px;top:0;left:0}.topic-message .user:after{left:60px;border-right-color:#d2d4d6}.topic-message .message{margin-left:80px}.topic-message .message:after{top:9px;left:-19px;border-right-color:#fdfdfd}.topic-message .message .is-author{left:5px}.topic-message .message .message-content{margin:0 10px}.topic-message .message .message-content>:first-child{margin-top:5px}.topic-message .message .message-content>figure:first-child{margin-top:10px}.topic-message .message .message-bottom .signature{cursor:pointer}.topic-message .message .message-bottom .signature p{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.topic-message .message .message-bottom .signature.full p{white-space:normal}}@media only screen and (max-width:759px){.topic-message .message .message-actions a{width:0;text-indent:-9999px}.topic-message .message .message-actions a:after{left:12px!important}.topic-message .message .message-submit{display:block!important;width:100%;margin:0}.topic-message .message .message-submit button{float:right;display:block;width:calc(50% - 2px);margin-left:1px!important}.topic-message .message .message-submit button.btn-grey{float:left}form .message{padding-top:0!important}}#topic-result-container{background-color:#fff;border:1px solid #d2d5d6}#topic-result-container ul{list-style:none;font-size:12px;padding:0;margin:0}#topic-result-container ul li{padding:1px 10px;border-bottom:1px solid #ccc}#topic-result-container ul li.active,#topic-result-container ul li:hover{background-color:#d7d7d7}#topic-result-container ul li.active.neither,#topic-result-container ul li:hover.neither{background-color:transparent}#topic-result-container ul li:last-child{border-bottom:none}.avatar{height:60px;width:60px;background-color:#fff}.badge{display:block;width:60px;height:25px;line-height:25px;text-align:center;text-transform:uppercase;color:#eee;text-shadow:rgba(0,0,0,.25) 0 0 3px;background:#777}.member-card .member-avatar{float:left;width:60px}.member-card .member-infos{float:left;list-style:none;margin:0;padding-left:15px}.member-social{list-style:none;margin:15px 0 0;padding:0}.content-linkbox-list{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 0 0 -20px}.content-linkbox-list .linkbox-item{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:33.33%;width:calc(33.33% - 20px);margin:0 0 20px 20px;color:#fff}.content-linkbox-list .linkbox-item .icon{width:25px;background:#fff}.content-linkbox-list .linkbox-item .head{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px}.content-linkbox-list .linkbox-item .head h3{font-size:2.2rem;line-height:32px;font-weight:400;margin:0;padding:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.content-linkbox-list .linkbox-item .body{display:block;padding:10px 10px 5px;font-size:1.3rem;line-height:1.7rem;border-top:1px solid rgba(0,0,0,.25)}.content-linkbox-list .linkbox-item .body p{margin:0 0 5px;padding:0}.content-linkbox-list .linkbox-item .body p.right{text-align:right}.content-linkbox-list .linkbox-item .tail{display:-webkit-box;display:-ms-flexbox;display:flex;padding:10px;border-top:1px solid hsla(0,0%,100%,.2)}.content-linkbox-list .linkbox-item .tail p{margin:0;padding:0;line-height:2.2rem;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.content-linkbox-list .linkbox-item a{position:relative;color:#fff;text-decoration:none}.content-linkbox-list .linkbox-item a:after{content:\"\";position:absolute;top:15px;right:15px;width:10px;height:10px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);border-color:#fff;border-style:solid;border-width:2px 2px 0 0;opacity:.5}.content-linkbox-list .linkbox-item a:focus:after,.content-linkbox-list .linkbox-item a:hover:after{opacity:1}.content-linkbox-list .linkbox-item a.head{padding-right:30px}.content-linkbox-list .linkbox-item a.head:after{top:20px}.content-linkbox-list .linkbox-item a.body:after{display:none}.content-linkbox-list .linkbox-item a.tail{padding-right:30px}.content-linkbox-list .linkbox-item .head{background:#5e5e5e}.content-linkbox-list .linkbox-item .body{background:#777}.content-linkbox-list .linkbox-item .tail{background:#848484}.content-linkbox-list .linkbox-item a:focus.head,.content-linkbox-list .linkbox-item a:hover.head{background:#515151}.content-linkbox-list .linkbox-item a:focus.body,.content-linkbox-list .linkbox-item a:hover.body{background:#6a6a6a}.content-linkbox-list .linkbox-item a:focus.tail,.content-linkbox-list .linkbox-item a:hover.tail{background:#777}.content-linkbox-list .linkbox-item.primary .head{background:#063449}.content-linkbox-list .linkbox-item.primary .body{background:#0a5679}.content-linkbox-list .linkbox-item.primary .tail{background:#0e77a8}.content-linkbox-list .linkbox-item.primary a:focus.head,.content-linkbox-list .linkbox-item.primary a:hover.head{background:#042332}.content-linkbox-list .linkbox-item.primary a:focus.body,.content-linkbox-list .linkbox-item.primary a:hover.body{background:#084561}.content-linkbox-list .linkbox-item.primary a:focus.tail,.content-linkbox-list .linkbox-item.primary a:hover.tail{background:#0c6790}.content-linkbox-list .linkbox-item.secondary .head{background:#d68807}.content-linkbox-list .linkbox-item.secondary .body{background:#f7a319}.content-linkbox-list .linkbox-item.secondary .tail{background:#f8ad32}.content-linkbox-list .linkbox-item.secondary a:focus.head,.content-linkbox-list .linkbox-item.secondary a:hover.head{background:#be7806}.content-linkbox-list .linkbox-item.secondary a:focus.body,.content-linkbox-list .linkbox-item.secondary a:hover.body{background:#ef9708}.content-linkbox-list .linkbox-item.secondary a:focus.tail,.content-linkbox-list .linkbox-item.secondary a:hover.tail{background:#f7a319}@media only screen and (min-width:1140px){.content-linkbox-list .linkbox-item{width:25%;width:calc(25% - 20px)}}@media only screen and (max-width:959px){.content-linkbox-list .linkbox-item{width:50%;width:calc(50% - 20px)}}@media only screen and (max-width:759px){.content-linkbox-list .linkbox-item{width:100%;width:calc(100% - 20px)}}.more-link{background:#fff;height:40px;display:block;border:1px solid #dedede;border-bottom-width:2px;margin:0 0 15px;line-height:40px;text-align:center;font-size:1.7rem;text-decoration:none}.flexpage .main{display:block;height:auto;width:auto;margin:0;padding:0}.flexpage #content{width:100%;margin:0;padding:0}.flexpage .sub-header{display:none}.flexpage .flexpage-wrapper{max-width:1145px;margin:0 auto}.flexpage .flexpage-header{margin-bottom:20px;border-bottom:1px solid #fff;background-color:#19516b;background:#19516b radial-gradient(at top,hsla(0,0%,100%,.1),transparent 60%)}.flexpage .flexpage-column{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;margin-left:-20px}.flexpage .flexpage-column section{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:calc(50% - 20px);margin-left:20px}.flexpage .flexpage-title-tool{position:relative;padding:50px 50px 50px 200px;font-size:2rem;font-weight:100}.flexpage .flexpage-title-tool .picto{position:absolute;left:50px;top:50px;width:104px;height:60.04px;margin:30.02px 50px 30.02px 0;background:rgba(0,0,0,.2)}.flexpage .flexpage-title-tool .picto:after,.flexpage .flexpage-title-tool .picto:before{z-index:0;content:\"\";position:absolute;width:0;border-left:52px solid transparent;border-right:52px solid transparent}.flexpage .flexpage-title-tool .picto:before{bottom:100%;left:0;border-bottom:30.02px solid rgba(0,0,0,.2)}.flexpage .flexpage-title-tool .picto:after{top:100%;left:0;width:0;border-top:30.02px solid rgba(0,0,0,.2)}.flexpage .flexpage-title-tool .picto img{position:absolute;top:-20px;left:2px}.flexpage .flexpage-title-tool .title{display:block;color:#fff;font-size:2.2rem}.flexpage .flexpage-title-tool .title .line{display:block;line-height:34px}.flexpage .flexpage-title-tool .title .line .line-item{display:inline-block}.flexpage .flexpage-title-tool .title h1{display:block;margin:0;padding:0;color:inherit;font-size:5rem;line-height:50px;border:none;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.flexpage .flexpage-title-tool .title h2{display:inline-block;margin:0;padding:0;vertical-align:bottom;font-size:inherit;line-height:inherit;color:inherit;border:none}.flexpage .flexpage-title-tool .title .option{display:inline-block;margin:0 15px 0 0}.flexpage .flexpage-title-tool .title a{display:inline;color:#fff;text-decoration:none}.flexpage .flexpage-title-tool .title .has-separator{position:relative;padding-left:25px;padding-right:5px}.flexpage .flexpage-title-tool .title .has-separator:after{content:\"\";position:absolute;top:12px;left:0;width:10px;height:10px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);border-color:#fff;border-style:solid;border-width:2px 2px 0 0;opacity:.5}.flexpage .flexpage-title-tool .aside{display:-webkit-box;display:-ms-flexbox;display:flex;margin-top:10px;margin-right:150px;height:50px}.flexpage .flexpage-title-tool .aside .search{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background:#fff}.flexpage .flexpage-title-tool .aside .search label{line-height:50px;margin:0;padding:0 15px}.flexpage .flexpage-title-tool .aside .search input{line-height:50px;height:50px;margin:0;padding:0 15px;border:none;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:auto!important;min-width:0}.flexpage .flexpage-title-tool .aside .search button{width:50px;height:50px;line-height:50px;background:#fff}.flexpage .flexpage-title-tool .aside .search button:after{margin:16px!important;background-position:-256px -232px;width:16px;height:40px}.flexpage .flexpage-title-tool .aside .search button:focus,.flexpage .flexpage-title-tool .aside .search button:hover{background:#ccc!important}@media only screen and (max-width:959px){.flexpage .flexpage-wrapper{padding:20px 10px}.flexpage .flexpage-column{display:block;margin-left:0}.flexpage .flexpage-column section{width:100%;margin-left:0}.flexpage .flexpage-title-tool{padding:15px 25px}.flexpage .flexpage-title-tool .picto{display:none}.flexpage .flexpage-title-tool .aside{max-width:100%}}@media only screen and (max-width:759px){.flexpage .flexpage-title-tool{padding:15px 0}.flexpage .flexpage-title-tool .aside{margin-right:0}.flexpage .flexpage-title-tool .aside .search label{padding-right:5px}}.home .home-row{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:10px}.home .flexpage-header{margin-bottom:-170px;padding-top:20px;padding-bottom:180px}.home .home-description{display:-webkit-box;display:-ms-flexbox;display:flex}.home .home-description p{margin:0;padding:0;color:#fff;text-align:justify}.home .home-description ul{color:#eee;margin:10px 0}.home .home-description a:not(.home-description-button){color:#fff}.home .home-description a:not(.home-description-button):focus,.home .home-description a:not(.home-description-button):hover{color:#90abb6;text-decoration:none}.home .home-description .column{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 20px}.home .home-description .column h2{font-size:18px;font-size:1.8rem;color:#fff;margin:20px 0 10px;border-bottom-color:#fff;font-weight:300}.home .home-description blockquote{font-size:2.5rem;color:#fff;font-weight:300;padding:0;margin:0}.home .home-description blockquote span:first-of-type:before{content:\"«\\00A0\"}.home .home-description blockquote span:last-of-type:after{content:\"\\00A0»\"}.home .home-description:not(.connected):not(.short){padding-bottom:60px}.home .home-description.connected{text-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.home .home-description.connected .important{color:#f8ad32;text-transform:uppercase;font-weight:700}.home .home-description.connected p{margin-top:5px;text-align:center}.home .home-description.connected .home-description-button{margin-left:15px}.home .home-description.short{display:none;color:#fff;text-align:center;font-size:1.4em}.home .home-description.short .home-description-button{font-size:14px;font-size:1.4rem;line-height:24px;line-height:2.4rem;margin-top:12px;padding:0 10px}.home .home-description.short blockquote>span{display:inline-block}.home .home-description-button{display:inline-block;line-height:2rem;font-size:1.2rem;font-size:12px;color:#fff;text-decoration:none;border:1px solid hsla(0,0%,100%,.5);padding:0 6px;margin-top:5px}.home .home-description-button:focus,.home .home-description-button:hover{color:#084561;border-color:#fff;background-color:#fff}.home .home-description-button.close-description{display:none}.home .featured-resource-row{margin-bottom:30px;padding:1px 0 1px 1px;background-color:#f7f7f7;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home .featured-resource-row,.home .featured-resource-row .no-featured-resource{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.home .featured-resource-row .no-featured-resource{margin:0;text-align:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#777;padding:1em;height:230px}.home .home-heading.heading-white{color:#fff;border-bottom-color:#fff}@media only screen and (max-width:759px){.home .home-description:not(.connected):not(.short){display:none}.home .home-description.short{display:block;width:auto;padding:0 20px}.home .home-description.short:target .home-description-button{display:none}.home .home-description.short:target .home-description-button.close-description{display:inline-block}.home .home-description.short:target~.home-description:not(.short){display:block;margin-top:20px}.home .home-description.connected{padding:0 20px!important}.home .home-description .featured-message{display:none}.home .home-heading .btn{visibility:hidden}.home .featured-resource-row .featured-resource-item:nth-of-type(4){display:none}}@media only screen and (max-width:959px){.home .flexpage-header{padding-top:10px;padding-bottom:10px;margin-bottom:0}.home .featured-resource-row .featured-resource-item{margin:4px;padding:0!important}.home .featured-resource-row .featured-resource-item:last-of-type{display:none}.home .home-heading{margin-top:18px}.home .home-heading.heading-white{color:#084561;border-color:#f8ad32}.home .home-row{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.home .home-description.connected{width:auto;padding:0 80px}}@media only screen and (min-width:960px){.home .home-row{margin-right:-10px;margin-left:-10px}.home .home-row>section{margin:0 10px;-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:300px}.home .home-description .column h2{font-size:22px;font-size:2.2rem}.home .home-description .column p,.home .home-description .column ul{line-height:22px;font-size:15px;font-size:1.5rem}.home .home-description.connected{max-width:740px;margin:15px auto 0}}.gallery.grid-view{clear:both}.gallery.grid-view .gallery-item{position:relative;width:200px;height:200px;float:left;border:10px solid #fff;margin:10px;clear:none}.gallery.grid-view .gallery-item.active,.gallery.grid-view .gallery-item:hover{border-color:#1088bf!important}.gallery.grid-view .gallery-item.active:before,.gallery.grid-view .gallery-item:hover:before{display:none}.gallery.grid-view .gallery-item.active .topic-title,.gallery.grid-view .gallery-item:hover .topic-title{background:#1088bf!important;color:#fff;text-decoration:none}.gallery.grid-view .gallery-item .topic-infos{position:absolute;bottom:0;left:0;z-index:1;height:15px;width:15px;padding:3px 0}.gallery.grid-view .gallery-item .topic-infos input{margin:0}.gallery.grid-view .gallery-item .topic-description,.gallery.grid-view .gallery-item .topic-description a{display:block;width:100%;height:100%}.gallery.grid-view .gallery-item .topic-image{overflow:hidden;max-height:100%;min-width:100%}.gallery.grid-view .gallery-item .topic-title{height:15px;background-color:#fff;position:absolute;bottom:7px;left:0;right:0;padding:10px 20px 5px;font-size:15px;font-size:1.5rem;line-height:15px;color:#444}.gallery.grid-view .gallery-item.selected{border-color:#eaf7fd}.gallery.grid-view .gallery-item.selected .topic-title{background:#eaf7fd}.gallery.grid-view .gallery-item.add-image{font-size:120px;line-height:200px;text-align:center;background:#ddd;color:#555;text-decoration:none}.gallery.grid-view .gallery-item.add-image:focus,.gallery.grid-view .gallery-item.add-image:hover{background-color:#ccc;color:#1088bf}.gallery.list-view .topic .topic-description .topic-title{margin-top:12px}.gallery.list-view .add-image{display:none}.toggle-gallery-view{float:left!important}@media only screen and (min-width:960px){.gallery-col-image{float:left;width:50%}.gallery-col-image img{max-width:100%}.gallery-col-edit{float:right;width:calc(50% - 20px);padding-left:20px}}#resources_container .footer{display:none}.searchpage .flexpage-header{padding-top:50px}.searchpage .pagination-top{margin-top:30px}@media only screen and (max-width:959px){.pagination-top{margin-top:10px}}.tutorial-help-item{min-height:60px;padding:20px 2%;border-bottom:1px solid #e0e4e5;color:#424242;font-weight:400}.tutorial-help-item:nth-child(odd){background-color:hsla(0,0%,100%,.8)}.tutorial-help-item p{margin:0}.tutorial-help-item .tutorial-title{margin:0;padding:0;font-size:20px;font-size:2rem;height:27px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;clear:none;font-weight:400;color:#424242}.tutorial-help-item a{text-decoration:none}.tutorial-help-item a:focus,.tutorial-help-item a:hover{text-decoration:underline}.tutorial-help-item .tutorial-categories{margin:0 0 5px;padding:0;color:#ee8709}.tutorial-help-item .tutorial-categories a{color:#ee8709}.tutorial-help-item .tutorial-categories a:focus,.tutorial-help-item .tutorial-categories a:hover{text-decoration:underline}.tutorial-help-item .tutorial-illu{display:block;overflow:hidden;float:left}.tutorial-help-item .tutorial-infos{margin:7px 0 0 70px}.tutorial-help-item .tutorial-infos.no-illu{margin-left:0}.tutorial-help-item .tutorial-help{margin:12px 0 0}.tutorial-help-item .tutorial-help img.light{opacity:.2}.tutorial-help-item .tutorial-help img.light:focus,.tutorial-help-item .tutorial-help img.light:hover{opacity:.5}.commits-compare-form button{float:none!important}@media only screen and (-webkit-min-device-pixel-ratio:1.3),only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:1.3),only screen and (min-device-pixel-ratio:1.3),only screen and (min-resolution:2dppx),only screen and (min-resolution:192dpi){.header-container .header-logo-link{background-image:url(../images/logo@2x.png)}.breadcrumb ol li:not(:last-child):after,.content-item .content-reactions,.content-item .content-reactions:before,.ico,.ico-after:after,.main-container input[type=checkbox]:after,.main-container input[type=radio]:after,.modals-container input[type=checkbox]:after,.modals-container input[type=radio]:after{background-image:url(../images/sprite@2x.png);background-size:324px 312px}.home .home-search-box:before{background-image:url(../images/home-clem@2x.png)}body.vc-clem-christmas.home .home-search-box:before{background-image:url(../images/home-clem-christmas@2x.png)}body.vc-clem-halloween.home .home-search-box:before{background-image:url(../images/home-clem-halloween@2x.png)}}@media only screen and (-webkit-min-device-pixel-ratio:1.3) and (max-width:959px),only screen and (-webkit-min-device-pixel-ratio:2) and (max-width:959px),only screen and (min--moz-device-pixel-ratio:1.3) and (max-width:959px),only screen and (min-device-pixel-ratio:1.3) and (max-width:959px),only screen and (min-resolution:2dppx) and (max-width:959px),only screen and (min-resolution:192dpi) and (max-width:959px){.enable-mobile-menu .mobile-menu-hide .page-container .mobile-menu-btn:after{background-image:url(../images/sprite@2x.png);background-size:324px 312px}.page-container .header-logo-link{background-image:url(../images/logo-mobile@2x.png)!important}}\n/*# sourceMappingURL=main.css.map */\n"
  },
  {
    "path": "packages/zmarkdown/public/css/zmd.css",
    "content": "@charset \"UTF-8\";.hljs{display:block;overflow-x:auto;padding:.5em;color:#000;background:#fff}.hljs-subst,.hljs-title{font-weight:400;color:#000}.hljs-comment,.hljs-quote{color:gray;font-style:italic}.hljs-meta{color:olive}.hljs-tag{background:#efefef}.hljs-keyword,.hljs-literal,.hljs-name,.hljs-section,.hljs-selector-class,.hljs-selector-id,.hljs-selector-tag,.hljs-type{font-weight:700;color:navy}.hljs-attribute,.hljs-link,.hljs-number,.hljs-regexp{font-weight:700;color:#00f}.hljs-link,.hljs-number,.hljs-regexp{font-weight:400}.hljs-string{color:green;font-weight:700}.hljs-bullet,.hljs-formula,.hljs-symbol{color:#000;background:#d0eded;font-style:italic}.hljs-doctag{text-decoration:underline}.hljs-template-variable,.hljs-variable{color:#660e7a}.hljs-addition{background:#baeeba}.hljs-deletion{background:#ffc8bd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.alert-box{position:relative;padding:8px 30px 8px 15px;margin:0 0 15px 2%;color:#fff;text-shadow:rgba(0,0,0,.2) 0 0 2px;background:#777}.alert-box.alert-box-not-closable{padding-right:15px}.alert-box .alert-box-text{display:block;float:left}.alert-box .close-alert-box,.alert-box .view-alert-box{display:block;position:absolute;top:8px;right:15px;height:20px;width:20px;text-indent:-9999px;text-decoration:none;background-color:transparent;line-height:22px;color:#fff}.alert-box .close-alert-box.ico-after:after,.alert-box .view-alert-box.ico-after:after{margin-top:4px}.alert-box .close-alert-box-text{width:auto;text-indent:0;top:8px}.alert-box .alert-box-title{margin:5px 0;padding:0;font-size:18px;font-weight:400}.alert-box.info,.alert-box.success{background:#48a200}.alert-box.error{background:#c0392b}.alert-box.alert,.alert-box.warning{background:#e67e22}.alert-box.not-member{background:#fdfdfd;color:#333;text-shadow:none;border-bottom:3px solid #d2d5d6}.alert-box.ico-after{padding-left:40px}.alert-box.ico-after:after{margin:12px 0 0 13px}.alert-box h4,.alert-box p{margin-left:0!important;margin-right:0!important}.alert-box p{margin:0}.alert-box a{color:#eee}.alert-box .alert-box-btn{display:inline-block;background:#084561;text-decoration:none;padding:8px 15px;margin:5px 0;color:#fff!important}.alert-box .alert-box-btn:focus,.alert-box .alert-box-btn:hover{background:#0b5c82}.alert-box .alert-box-btn.alert-box-btn-right{position:absolute;top:0;right:0;margin:0}.alert-box.empty{display:none}.content-wrapper .alert-box{margin:0 0 20px}.content-wrapper .alert-box+.not-member{margin-top:-20px}.opinion-alerts .alert-box-text{float:none}@media only screen and (min-width:760px){.alert-box .alert-box-text{display:inline}.topic-message .alert-box{padding:8px 75px 8px 15px}}@media only screen and (max-width:759px){.alert-box .alert-box-btn,.alert-box .alert-box-btn.alert-box-btn-right{position:relative;float:none;display:block;margin:5px 0 0;text-align:center}}.ico{background-repeat:no-repeat;background-image:url(../images/sprite.png)}.custom-block-body,.ico-after{position:relative}.custom-block-body:after,.ico-after:after{content:\" \";display:block;position:absolute;top:0;left:0;width:16px;height:16px;background-repeat:no-repeat;background-image:url(../images/sprite.png)}.custom-block-body.alert:after,.custom-block-body.ico-alert:after,.ico-after.alert:after,.ico-after.ico-alert:after{background-position:-292px 0}.custom-block-body.alert.blue:after,.custom-block-body.ico-alert.blue:after,.ico-after.alert.blue:after,.ico-after.ico-alert.blue:after{background-position:-80px -232px}.custom-block-body.alert.light:after,.custom-block-body.ico-alert.light:after,.ico-after.alert.light:after,.ico-after.ico-alert.light:after{background-position:-260px -80px}.custom-block-body.arrow-left:after,.ico-after.arrow-left:after{background-position:-212px 0}.custom-block-body.arrow-left.blue:after,.ico-after.arrow-left.blue:after{background-position:-308px -80px}.custom-block-body.arrow-left.light:after,.ico-after.arrow-left.light:after{background-position:-196px 0}.custom-block-body.arrow-right:after,.custom-block-body.offline:after,.ico-after.arrow-right:after,.ico-after.offline:after{background-position:-64px -232px}.custom-block-body.arrow-right.blue:after,.custom-block-body.offline.blue:after,.ico-after.arrow-right.blue:after,.ico-after.offline.blue:after{background-position:-244px -80px}.custom-block-body.arrow-right.light:after,.custom-block-body.offline.light:after,.ico-after.arrow-right.light:after,.ico-after.offline.light:after{background-position:-260px -40px}.custom-block-body.beta:after,.ico-after.beta:after{background-position:-276px -80px}.custom-block-body.beta.blue:after,.ico-after.beta.blue:after{background-position:-160px -232px}.custom-block-body.beta.light:after,.ico-after.beta.light:after{background-position:-276px -40px}.custom-block-body.cite:after,.ico-after.cite:after{background-position:-164px 0}.custom-block-body.cite.blue:after,.ico-after.cite.blue:after{background-position:-126px -112px}.custom-block-body.cite.light:after,.ico-after.cite.light:after{background-position:-142px -112px}.custom-block-body.cross:after,.ico-after.cross:after{background-position:-180px -80px}.custom-block-body.cross.blue:after,.ico-after.cross.blue:after{background-position:-164px -40px}.custom-block-body.cross.red:after,.ico-after.cross.red:after{background-position:-180px 0}.custom-block-body.cross.light:after,.ico-after.cross.light:after{background-position:-164px -80px}.custom-block-body.cross.white:after,.ico-after.cross.white:after{background-position:-180px -40px}.custom-block-body.download:after,.ico-after.download:after{background-position:-80px -152px}.custom-block-body.download.blue:after,.ico-after.download.blue:after{background-position:-48px -152px}.custom-block-body.download.light:after,.ico-after.download.light:after{background-position:-64px -152px}.custom-block-body.downvote:after,.ico-after.downvote:after{background-position:-292px -80px}.custom-block-body.downvote.voted:after,.ico-after.downvote.voted:after{background-position:-292px -40px}.custom-block-body.edit:after,.ico-after.edit:after{background-position:-128px -152px}.custom-block-body.edit.blue:after,.ico-after.edit.blue:after{background-position:-96px -152px}.custom-block-body.edit.light:after,.ico-after.edit.light:after{background-position:-112px -152px}.custom-block-body.email:after,.ico-after.email:after{background-position:-176px -152px}.custom-block-body.email.blue:after,.ico-after.email.blue:after{background-position:-144px -152px}.custom-block-body.email.light:after,.ico-after.email.light:after{background-position:-160px -152px}.custom-block-body.diaspora:after,.ico-after.diaspora:after{background-position:-32px -152px}.custom-block-body.diaspora.blue:after,.ico-after.diaspora.blue:after{background-position:0 -152px}.custom-block-body.diaspora.light:after,.ico-after.diaspora.light:after{background-position:-16px -152px}.custom-block-body.facebook:after,.ico-after.facebook:after{background-position:-196px -120px}.custom-block-body.facebook.blue:after,.ico-after.facebook.blue:after{background-position:-196px -40px}.custom-block-body.facebook.light:after,.ico-after.facebook.light:after{background-position:-196px -80px}.custom-block-body.foursquare:after,.ico-after.foursquare:after{background-position:-212px -120px}.custom-block-body.foursquare.blue:after,.ico-after.foursquare.blue:after{background-position:-212px -40px}.custom-block-body.foursquare.light:after,.ico-after.foursquare.light:after{background-position:-212px -80px}.custom-block-body.gear:after,.ico-after.gear:after{background-position:-228px -80px}.custom-block-body.gear.blue:after,.ico-after.gear.blue:after{background-position:-228px 0}.custom-block-body.gear.light:after,.ico-after.gear.light:after{background-position:-228px -40px}.custom-block-body.github:after,.ico-after.github:after{background-position:-16px -192px}.custom-block-body.github.blue:after,.ico-after.github.blue:after{background-position:-228px -120px}.custom-block-body.github.light:after,.ico-after.github.light:after{background-position:0 -192px}.custom-block-body.google-plus:after,.ico-after.google-plus:after{background-position:-64px -192px}.custom-block-body.google-plus.blue:after,.ico-after.google-plus.blue:after{background-position:-32px -192px}.custom-block-body.google-plus.light:after,.ico-after.google-plus.light:after{background-position:-48px -192px}.custom-block-body.help:after,.ico-after.help:after{background-position:-112px -192px}.custom-block-body.help.blue:after,.ico-after.help.blue:after{background-position:-80px -192px}.custom-block-body.help.light:after,.ico-after.help.light:after{background-position:-96px -192px}.custom-block-body.hide:after,.ico-after.hide:after{background-position:-160px -192px}.custom-block-body.hide.blue:after,.ico-after.hide.blue:after{background-position:-128px -192px}.custom-block-body.hide.light:after,.ico-after.hide.light:after{background-position:-144px -192px}.custom-block-body.history:after,.ico-after.history:after{background-position:-208px -192px}.custom-block-body.history.blue:after,.ico-after.history.blue:after{background-position:-176px -192px}.custom-block-body.history.light:after,.ico-after.history.light:after{background-position:-192px -192px}.custom-block-body.import:after,.ico-after.import:after{background-position:-244px -40px}.custom-block-body.import.blue:after,.ico-after.import.blue:after{background-position:-224px -192px}.custom-block-body.import.light:after,.ico-after.import.light:after{background-position:-244px 0}.custom-block-body.lock:after,.ico-after.lock:after{background-position:-260px 0}.custom-block-body.lock.blue:after,.ico-after.lock.blue:after{background-position:-244px -120px}.custom-block-body.lock.light:after,.ico-after.lock.light:after{background-position:-244px -160px}.custom-block-body.more:after,.ico-after.more:after{background-position:0 -232px}.custom-block-body.more.blue:after,.ico-after.more.blue:after{background-position:-260px -120px}.custom-block-body.more.light:after,.ico-after.more.light:after{background-position:-260px -160px}.custom-block-body.move:after,.ico-after.move:after{background-position:-48px -232px}.custom-block-body.move.blue:after,.ico-after.move.blue:after{background-position:-16px -232px}.custom-block-body.move.light:after,.ico-after.move.light:after{background-position:-32px -232px}.custom-block-body.pin:after,.ico-after.pin:after{background-position:-128px -232px}.custom-block-body.pin.blue:after,.ico-after.pin.blue:after{background-position:-96px -232px}.custom-block-body.pin.light:after,.ico-after.pin.light:after{background-position:-112px -232px}.custom-block-body.rss:after,.ico-after.rss:after{background-position:-240px -232px}.custom-block-body.rss.blue:after,.ico-after.rss.blue:after{background-position:-192px -232px}.custom-block-body.rss.orange:after,.ico-after.rss.orange:after{background-position:-224px -232px}.custom-block-body.rss.light:after,.ico-after.rss.light:after{background-position:-208px -232px}.custom-block-body.star:after,.ico-after.star:after{background-position:-276px -200px}.custom-block-body.star.yellow:after,.ico-after.star.yellow:after{background-position:-276px -160px}.custom-block-body.star.blue:after,.ico-after.star.blue:after{background-position:-276px 0}.custom-block-body.star.light:after,.ico-after.star.light:after{background-position:-276px -120px}.custom-block-body.tick:after,.ico-after.tick:after{background-position:-308px -40px}.custom-block-body.tick.green:after,.ico-after.tick.green:after{background-position:-292px -200px}.custom-block-body.tick.light:after,.ico-after.tick.light:after{background-position:-308px 0}.custom-block-body.twitter:after,.ico-after.twitter:after{background-position:-308px -200px}.custom-block-body.twitter.blue:after,.ico-after.twitter.blue:after{background-position:-308px -120px}.custom-block-body.twitter.light:after,.ico-after.twitter.light:after{background-position:-308px -160px}.custom-block-body.unread:after,.ico-after.unread:after{background-position:-292px -240px}.custom-block-body.upvote:after,.ico-after.upvote:after{background-position:-292px -160px}.custom-block-body.upvote.voted:after,.ico-after.upvote.voted:after{background-position:-292px -120px}.custom-block-body.online:after,.custom-block-body.view:after,.ico-after.online:after,.ico-after.view:after{background-position:-110px -112px}.custom-block-body.online.blue:after,.custom-block-body.view.blue:after,.ico-after.online.blue:after,.ico-after.view.blue:after{background-position:-176px -232px}.custom-block-body.online.light:after,.custom-block-body.view.light:after,.ico-after.online.light:after,.ico-after.view.light:after{background-position:-144px -232px}h3:hover span.icon-link:after,h4:hover span.icon-link:after,h5:hover span.icon-link:after,h6:hover span.icon-link:after{content:\" \";display:inline-block;background-image:url(../images/sprite.png);background-position:-308px -240px;width:16px;height:16px}.zmarkdown{color:#424242}.zmarkdown h2,.zmarkdown h3{clear:both}.zmarkdown h2,.zmarkdown h2 a,.zmarkdown h3,.zmarkdown h3 a{color:#ea9408;margin-top:40px;text-decoration:none}.zmarkdown h2 a:focus,.zmarkdown h2 a:hover,.zmarkdown h3 a:focus,.zmarkdown h3 a:hover{text-decoration:underline}.zmarkdown h2{font-size:22px;font-size:2.2rem;line-height:50px;margin-bottom:20px;background:#fff;border-top:1px solid #e0e4e5;padding-left:1%;font-weight:400}.zmarkdown h3{font-size:20px;font-size:2rem;margin-bottom:14px}.zmarkdown h4{font-size:18px;font-size:1.8rem;margin-bottom:12px}.zmarkdown h5{font-size:16px;font-size:1.6rem;margin-bottom:10px}.zmarkdown h6{font-size:15px;font-size:1.5rem;margin-bottom:10px}.zmarkdown .actions-title{float:right;margin:-60px 10px 0 0}.zmarkdown .actions-title .btn{height:30px;line-height:30px;margin-left:3px;opacity:.7;z-index:1}.zmarkdown .actions-title .btn.ico-after:after{margin-top:7px}.zmarkdown .actions-title .btn:focus,.zmarkdown .actions-title .btn:hover{opacity:1}.zmarkdown .custom-block{margin:25px 0}.zmarkdown .custom-block-body{padding:7px 15px 7px 45px}.zmarkdown .custom-block-body:after{position:absolute;top:50%;left:23px;margin:-11px 0 0 -11px;height:22px;width:22px}.zmarkdown .custom-block-heading{padding:3px 15px;font-weight:700}.zmarkdown .custom-block-information{background:#daeaee}.zmarkdown .custom-block-information .custom-block-heading{color:#fff;background:#53b2e4}.zmarkdown .custom-block-information .custom-block-body:after{background-position:-88px -112px}.zmarkdown .custom-block-question{background:#e2daee}.zmarkdown .custom-block-question .custom-block-heading{color:#fff;background:#9560e6}.zmarkdown .custom-block-question .custom-block-body:after{background-position:0 -112px}.zmarkdown .custom-block-error{background:#eedada}.zmarkdown .custom-block-error .custom-block-heading{color:#fff;background:#e45353}.zmarkdown .custom-block-error .custom-block-body:after{background-position:-44px -112px}.zmarkdown .custom-block-warning{background:#eee7da}.zmarkdown .custom-block-warning .custom-block-heading{color:#fff;background:#ebb552}.zmarkdown .custom-block-warning .custom-block-body:after{background-position:-66px -112px}.zmarkdown .custom-block-neutral,.zmarkdown .custom-block-spoiler{background:#eee}.zmarkdown .custom-block-neutral .custom-block-heading,.zmarkdown .custom-block-spoiler .custom-block-heading{color:#fff;background:#888}.zmarkdown .custom-block-neutral .custom-block-body,.zmarkdown .custom-block-spoiler .custom-block-body{padding-left:15px}.zmarkdown .custom-block-neutral .custom-block-body:after,.zmarkdown .custom-block-spoiler,.zmarkdown .custom-block-spoiler .custom-block-body:after,.zmarkdown .js .spoiler{display:none}.zmarkdown .spoiler-title{display:block;background:#eee;margin:15px 0;padding:3px 15px 3px 40px;text-decoration:none;border-bottom:1px solid #ddd;color:#555}.zmarkdown .spoiler-title.ico-after:after{margin:8px 0 0 10px}.zmarkdown .spoiler-title:nth-last-child(2){margin-bottom:15px}.zmarkdown .spoiler-title:hover{text-decoration:underline}.zmarkdown :not(.alert-box).error,.zmarkdown :not(.alert-box).information,.zmarkdown :not(.alert-box).question,.zmarkdown :not(.alert-box).spoiler,.zmarkdown :not(.alert-box).warning{margin:25px 0;padding:7px 15px 7px 45px}.zmarkdown :not(.alert-box).error.ico-after:after,.zmarkdown :not(.alert-box).information.ico-after:after,.zmarkdown :not(.alert-box).question.ico-after:after,.zmarkdown :not(.alert-box).spoiler.ico-after:after,.zmarkdown :not(.alert-box).warning.ico-after:after{position:absolute;top:50%;left:23px;margin:-11px 0 0 -11px;height:22px;width:22px}.zmarkdown :not(.alert-box).information{background:#daeaee}.zmarkdown :not(.alert-box).information.ico-after:after{background-position:-88px -112px}.zmarkdown :not(.alert-box).question{background:#e2daee}.zmarkdown :not(.alert-box).question.ico-after:after{background-position:0 -112px}.zmarkdown :not(.alert-box).error{background:#eedada}.zmarkdown :not(.alert-box).error.ico-after:after{background-position:-44px -112px}.zmarkdown :not(.alert-box).warning{background:#eee7da}.zmarkdown :not(.alert-box).warning.ico-after:after{background-position:-66px -112px}.zmarkdown .spoiler{margin-top:0;padding-left:15px;background:#eee}.zmarkdown img{max-width:100%}.zmarkdown figure{margin:30px 0;text-align:center}.zmarkdown figure>blockquote,.zmarkdown figure>code,.zmarkdown figure>embed,.zmarkdown figure>img,.zmarkdown figure>pre,.zmarkdown figure>table,.zmarkdown figure>video{max-width:100%;margin:0 auto;text-align:left}.zmarkdown figure>code,.zmarkdown figure>figcaption,.zmarkdown figure>img,.zmarkdown figure>pre,.zmarkdown figure>video{display:block}.zmarkdown figure>blockquote~figcaption{padding:0 0 1px 2%;font-style:italic;text-align:left;color:#999;border-left:5px solid #ccc}.zmarkdown figure>blockquote~figcaption p{margin:0 0 5px}.zmarkdown figure>blockquote~figcaption p:before{content:\"— \"}.zmarkdown blockquote{margin:0;color:#777;padding:1px 2%;border-left:5px solid #ccc}.zmarkdown blockquote>p:first-child{margin-top:5px}.zmarkdown blockquote>p:last-child{margin-bottom:5px}.zmarkdown blockquote figure{margin:15px 0}.zmarkdown blockquote:last-child{margin-bottom:15px}.zmarkdown .hljs-code-div,.zmarkdown code,.zmarkdown kbd,.zmarkdown pre,.zmarkdown samp{font-family:Source Code Pro,monospace,serif}.zmarkdown .hljs-code-div{background-color:#fff;margin:0 auto;padding:.5em;border-radius:.25em;display:-webkit-box;display:-ms-flexbox;display:flex;line-height:18px;font-style:normal;font-size:14px}.zmarkdown .hljs-code-div .hljs-line-numbers{counter-reset:a;border-right:1px solid #ddd;margin:0;padding:.5em;color:#888;text-align:right}.zmarkdown .hljs-code-div .hljs-line-numbers span:before{counter-increment:a;content:counter(a);display:block}.zmarkdown .hljs-code-div pre{margin:0;width:100%;overflow-x:auto}.zmarkdown kbd{background-color:#f8f6ea;padding:2px 6px;border-radius:3px;border:1px solid #e0dab6;border-bottom-width:3px;text-shadow:0 1px 0 #fff;color:#5e551f}.zmarkdown li code,.zmarkdown p code,.zmarkdown td code{color:#a00;background:#eee;border:1px solid #ccc;padding:0 5px}.zmarkdown .ping{color:inherit;text-decoration:none}.zmarkdown .ping:focus,.zmarkdown .ping:hover{text-decoration:underline}.zmarkdown .ping .ping-username{font-weight:700}.zmarkdown .mathjax-wrapper{max-width:100%;overflow:auto}.zmarkdown .mathjax-wrapper mathjax{font-size:16px;font-size:1.6rem}.zmarkdown .footnote,.zmarkdown .footnotes{opacity:.7}.zmarkdown .footnote ol,.zmarkdown .footnotes ol{padding-left:25px}.zmarkdown .footnote ol p,.zmarkdown .footnotes ol p{display:inline}.zmarkdown .video-container{margin:0 auto;max-width:560px;max-height:315px}.zmarkdown .video-container .video-wrapper{position:relative;padding-bottom:56.25%}.zmarkdown .video-container .video-wrapper iframe{width:100%}.zmarkdown .katex-display>.katex{display:contents}.zmarkdown .inlineMathDouble .katex{max-width:100%;overflow-x:auto}.zmarkdown .iframe-wrapper{overflow-x:auto}.zmarkdown div.align-center{text-align:center}.zmarkdown div.align-right{text-align:right}.zmarkdown div.align-left,.zmarkdown figure pre code.hljs{text-align:left}.zmarkdown .language-console{color:#ddd;background-color:#000;font-family:Source Code Pro,monospace,serif;display:block;overflow-x:auto;padding:.5em}.zmarkdown .table-wrapper{max-width:100%;overflow:auto}.zmarkdown table{margin:15px auto;border-top:1px solid #ddd;border-collapse:collapse}.zmarkdown table thead{background:#ddd;color:#084561}.zmarkdown table td,.zmarkdown table th{text-align:left;padding:5px 15px 5px 7px;border-right:1px solid #ddd}.zmarkdown table td:first-child,.zmarkdown table th:first-child{border-left:1px solid #ddd}.zmarkdown table td p,.zmarkdown table th p{margin:0}.zmarkdown table tbody tr{background:#fdfdfd;border-bottom:1px solid #ddd}.zmarkdown table tbody tr:nth-child(odd){background:#f7f7f7}.zmarkdown table.fullwidth{width:100%}.zmarkdown .diff_delta{overflow-x:auto;width:100%;margin:15px 0}.zmarkdown .diff_delta table.diff{font-family:Source Code Pro,monospace,serif;font-size:.9em;border:2px solid gray;margin:0}.zmarkdown .diff_delta table.diff tr{line-height:1em;border-bottom:none}.zmarkdown .diff_delta table.diff .diff_header{background-color:#e0e0e0;padding:5px}.zmarkdown .diff_delta table.diff td.diff_header{text-align:right}.zmarkdown .diff_delta table.diff .diff_next{display:none}.zmarkdown .diff_add{background-color:#afa}.zmarkdown .diff_chg{background-color:#fff8ab}.zmarkdown .diff_sub{background-color:#faa}\n/*# sourceMappingURL=zmd.css.map */\n"
  },
  {
    "path": "packages/zmarkdown/public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <title>ZMarkdown client converter</title>\n\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/normalize/3.0.3/normalize.css\">\n\n  <!-- mon template.css -->\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css\" crossorigin=\"anonymous\">\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.10.0/katex.min.css\" crossorigin=\"anonymous\">\n  <link rel=\"stylesheet\" href=\"./css/zmd.css\">\n  <link rel=\"stylesheet\" href=\"./css/main.css\">\n  <link rel=\"stylesheet\" href=\"./main.css\" media=\"screen\">\n</head>\n<body>\n<div id=\"left\" class=\"split split-horizontal\">\n  <div id=\"left-top\" class=\"split split-vertical\">\n    <textarea class=\"editor\" spellcheck=\"false\" contenteditable=\"true\" placeholder=\"Write here…\" autofocus>\nCeci est mon premier paragraphe.\n\nCeci est mon second paragraphe.\n\nCeci est mon premier paragraphe.\nIci, je reviens à la ligne, mais cette phrase sera toujours dans le premier paragraphe.\n\nCeci est mon second paragraphe.\n\n# Titre de niveau 1\n\n## Titre de niveau 2\n\n### Titre de niveau 3\n\n#### Titre de niveau 4\n\nLe mot *italique* est en italique.\n\nLe mot _italique_ est en italique.\n\nLe mot **gras** est en gras.\n\nLe mot __gras__ est en gras.\n\n\nLe mot ~~barré~~ est barré.\n\n-> Ce texte est centré. <-\n\n-> Ce texte est aligné à droite. ->\n\n2^10^ vaut 1024.\n\nLa molécule de l'eau est H~2~O.\n\n- Ma très belle ;\n- liste ;\n- à puces.\n\n1. Mon premier.\n2. Mon second.\n3. Mon troisième.\n\n- Ma très belle ;\n- liste ;\n    - avec une sous-liste ;\n- à puces.\n\nPour faire un [lien](http://www.zestedesavoir.com \"Zeste de Savoir\") sur un morceau de texte\n\nPour nous contacter, cliquez [ici](mailto:contact@monsite.com).\n\nNom     |   Age\n------|-----\nFred |   39\nSam |   38\nAlice  |   35\nMathilde  | 35\n\n\n+-------+----------+------+\n| Table Headings   | Here |\n+-------+----------+------+\n| Sub   | Headings | Too  |\n+=======+==========+======+\n| cell  | column spanning |\n+ spans +----------+------+\n| rows  | normal   | cell |\n+-------+----------+------+\n| multi | cells can be    |\n| line  | *formatted*     |\n|       | **paragraphs**  |\n| cells |                 |\n| too   |                 |\n+-------+-----------------+\n\nNom     |   Age\n------|-----\nFred |   39\nSam |   38\nAlice  |   35\nMathilde  | 35\nTable: Tableau des âges\n\n\n------\n\n\n$$a \\cdot x^2 + b \\cdot x + c = 0 \\quad \\Longrightarrow \\quad x = \\frac {-b \\pm \\sqrt{b^2 - 4ac}}{2a}$$\n\nSi vous voulez écrire votre formule au sein même d'un paragraphe (comme ceci : $a \\cdot x^2 + b \\cdot x + c = 0$), alors n'utilisez cette fois qu'un seul caractère dollar `$` avant et après votre formule.\n\n\n```\n#!/usr/bin/env python3\n\nprint(\"Hello, World!\")\n```\n\nAvec un langage :\n\n```python\n#!/usr/bin/env python3\n\nprint(\"Hello, World!\")\n```\n\nSurligner des lignes :\n\n```perl hl_lines=\"1 4-6\"\nuse strict;\nuse warnings;\n\nprint \"Comment vous appelez-vous ? \";\nmy $nom = <>; # Récupération du nom de l'utilisateur\nchomp $nom;   # Retrait du saut de ligne\nprint \"Bonjour, $nom !\\n\";\n```\n\n![Logo Creative Commons](http://mirrors.creativecommons.org/presskit/logos/cc.logo.png)\n\n!(http://www.youtube.com/watch?v=oavMtUWDBTM)\n\nUtilisez ||Ctrl|| + ||C|| pour copier.\n\nSmileys\n:)\n\n:p :euh:\n\n[[information]]\n| Ceci est une balise d'information.\n|\n| Cool, non ?\n\n> Ceci est une citation\n> sur plusieurs lignes\nSource: Citez vos sources !\n\n\n[[neutre | Théorème de Pythagore]]\n| Un triangle ABC est rectangle en a si et seulement si $AB^2 + AC^2 = BC^2$\n\n\n[[secret]]\n| Ceci est un secret\n|\n| Cool, non ?\n\n\nBienvenue sur ZdS !\n\n*[ZdS]: Zeste de Savoir\n\nMarkdown[^mdown] est une syntaxe légère d'écriture de documents. Pandoc[^pandoc] est un convertisseur de documents.\n\n[^mdown]: Plus d'informations sur [Markdown](http://daringfireball.net/projects/markdown/).\n\n[^pandoc]: Plus d'informations sur [Pandoc](http://johnmacfarlane.net/pandoc/).\n</textarea>\n  </div>\n  <div id=\"left-bottom\" class=\"split split-vertical\"><pre class=\"bottom-style\"><code></code></pre></div>\n</div>\n<div id=\"center\" class=\"split split-horizontal\">\n  <div id=\"center-top\" class=\"split split-vertical\">\n    <div class=\"result render zmarkdown\"></div>\n  </div>\n  <div id=\"center-bottom\" class=\"split split-vertical\"><pre class=\"bottom-style\"><code></code></pre></div>\n</div>\n<div id=\"right\" class=\"split split-horizontal\">\n  <pre class=\"result render latex-result\">\n  </pre>\n</div>\n<script src=\"./js/zmarkdown-zmdast.js\"></script>\n<script src=\"./js/zmarkdown-zhtml.js\"></script>\n<script src=\"./js/zmarkdown-zlatex.js\"></script>\n<script src=\"https://unpkg.com/split.js@1.5.9/dist/split.min.js\"></script>\n<script src=\"https://unpkg.com/ansi_up@2.0.3/ansi_up.js\"></script>\n<script src=\"./script.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "packages/zmarkdown/public/main.css",
    "content": "/* Global style */\nhtml, body {\n  height: 100%;\n}\n\nbody {\n  bottom: 0;\n  left: 0;\n  right: 0;\n  top: 0;\n  height: 100%;\n  margin: 0;\n  box-sizing: border-box;\n  overflow: hidden;\n}\n\n/* Editor style */\n\n.editor {\n  font-family: monospace;\n  font-size: 14px;\n  border: 0;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  color: #333;\n  height: 100%;\n  margin: 0;\n  min-width: 0;\n  outline-width: 0;\n  overflow-y: auto;\n  padding: 30px;\n  resize: none;\n  width: 100%;\n}\n\n#left-bottom, #center, #center-bottom, #center-top, #right {\n  overflow-y: auto;\n}\n\n#left-bottom {\n  background-color: #084561;\n}\n\n.result {\n  padding: 30px;\n  position: relative;\n}\n\n.bottom-style {\n  height: 100%;\n  margin: auto;\n  padding: 0;\n}\n\n.latex-result {\n  height: 100%;\n  margin: 0;\n  padding: 0 0 0 30px;\n}\n\n/* Resizer style */\n\n.gutter {\n  background-color: transparent;\n  background-repeat: no-repeat;\n  background-position: 50%;\n\n  box-shadow: inset 0 1px 2px #CCC;\n  background-color: #EEE;\n}\n\n.gutter:hover {\n  background-color: #ddd;\n}\n\n.gutter.gutter-horizontal {\n  cursor: col-resize;\n}\n\n.gutter.gutter-vertical {\n  cursor: row-resize;\n}\n\n.split.split-horizontal, .gutter.gutter-horizontal {\n  height: 100%;\n  float: left;\n}\n\n.gutter.gutter-vertical {\n  background-image:  url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=')\n}\n\n.gutter.gutter-horizontal {\n  background-image:  url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==')\n}\n\n.zmarkdown > p > .inlineMathDouble {\n  display: block;\n  text-align: center;\n}\n\n.zmarkdown > .align-right {\n  text-align: right;\n}\n\n.zmarkdown > .align-center {\n  text-align: center;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ntable, th, td {\n  border: 1px solid black;\n}\n"
  },
  {
    "path": "packages/zmarkdown/public/script.js",
    "content": "Split(['#left', '#center', '#right'], {\n  minSize: 200,\n})\n\nSplit(['#left-top', '#left-bottom'], {\n  sizes: [75, 25],\n  direction: 'vertical'\n})\n\nSplit(['#center-top', '#center-bottom'], {\n  sizes: [75, 25],\n  direction: 'vertical'\n})\n\nconst ansiUp = new AnsiUp()\nconst editor = document.querySelector('#left-top > textarea')\nconst ast = document.querySelector('#left-bottom > pre > code')\nconst render = document.querySelector('#center-top > div')\nconst html = document.querySelector('#center-bottom > pre > code')\nconst latex = document.querySelector('#right > pre')\neditor.addEventListener('input', update)\n\ndocument.addEventListener('DOMContentLoaded', update)\n\nfunction buildSpoilers (elems) {\n  elems.forEach(elem => {\n    if (!elem.classList.contains('spoiler-build')) {\n      let a = document.createElement('a');\n      a.textContent = 'Afficher/Masquer le contenu masqué'\n      a.classList.add('spoiler-title')\n      a.classList.add('ico-after')\n      a.classList.add('view')\n      a.href = '#'\n      a.onclick = (e) => {\n        elem.style.display = !elem.style.display || elem.style.display === 'none' ? 'block' : 'none'\n        e.preventDefault()\n      }\n      elem.parentNode.insertBefore(a, elem)\n      elem.classList.add('spoiler-build')\n    }\n  })\n}\n\nfunction update () {\n  ZMarkdownZHTML.render(editor.value, (err, vFile) => {\n    render.innerHTML = vFile.toString().trim()\n    html.textContent = vFile.toString().trim()\n    buildSpoilers(render.querySelectorAll('.custom-block-spoiler'))\n  })\n\n  ZMarkdownZLATEX.render(editor.value, (err, vFile) => {\n    latex.textContent = vFile.toString().trim()\n  })\n\n  const mdast = ZMarkdownZMDAST.render(editor.value)\n  ast.innerHTML = ansiUp.ansi_to_html(ZMarkdownZMDAST.inspect.color(mdast))\n}\n"
  },
  {
    "path": "packages/zmarkdown/renderers/html.js",
    "content": "const rendererForge = require('./renderer-forge')\n\nconst remark2rehype = require('remark-rehype')\nconst rehypeStringify = require('rehype-stringify')\n\nconst defaultStringifierList = {\n  highlight: require('rehype-highlight'),\n  slug: require('rehype-slug'),\n  autolinkHeadings: require('rehype-autolink-headings'),\n  footnotesTitles: require('rehype-footnotes-title'),\n  htmlBlocks: require('rehype-html-blocks'),\n  katex: require('rehype-katex'),\n  postfixFootnotes: require('rehype-postfix-footnote-anchors'),\n  sanitize: require('rehype-sanitize')\n}\n\n// KaTeX uses globals: load the mhchem extension\nrequire('katex/dist/contrib/mhchem')\n\nconst postProcessorList = {\n  footnotesReorder: require('../postprocessors/html-footnotes-reorder'),\n  iframeWrappers: require('../postprocessors/html-iframe-wrappers'),\n  lazyLoadImages: require('../postprocessors/html-lazy-load-images'),\n  wrapCode: require('../postprocessors/html-wrap-code')\n}\n\nmodule.exports = (tokenizer, config) => {\n  tokenizer\n    .use(remark2rehype, config.bridge)\n\n  rendererForge(\n    tokenizer,\n    defaultStringifierList,\n    postProcessorList\n  )(config)\n\n  return tokenizer\n    .use(rehypeStringify, config.stringify)\n}\n"
  },
  {
    "path": "packages/zmarkdown/renderers/latex.js",
    "content": "const rebberStringify = require('rebber/src')\n\n// Rebber is actually a stringifier-only\nmodule.exports = (tokenizer, config) => {\n  return tokenizer\n    .use(rebberStringify, config)\n}\n"
  },
  {
    "path": "packages/zmarkdown/renderers/mdast.js",
    "content": "const rendererForge = require('./renderer-forge')\n\nconst unified = require('unified')\nconst remarkParse = require('remark-parse')\nconst remarkDisableTokenizers = require('remark-disable-tokenizers/src')\n\nconst defaultTokenizerList = {\n  abbr: require('remark-abbr/src'),\n  alignBlocks: require('remark-align/src'),\n  captions: require('remark-captions/src'),\n  codeMeta: require('../plugins/remark-code-meta'),\n  comments: require('remark-comments/src'),\n  customBlocks: require('remark-custom-blocks/src'),\n  emoticons: require('remark-emoticons/src'),\n  escapeEscaped: require('remark-escape-escaped/src'),\n  fixGuillemets: require('remark-fix-guillemets/src'),\n  footnotes: require('remark-footnotes'),\n  gridTables: require('remark-grid-tables/src'),\n  headingShifter: require('remark-heading-shift/src'),\n  iframes: require('remark-iframes/src'),\n  imageToFigure: require('../plugins/remark-image-to-figure'),\n  imagesDownload: require('remark-images-download/src'),\n  kbd: require('remark-kbd/src'),\n  math: require('remark-math'),\n  numberedFootnotes: require('remark-numbered-footnotes/src'),\n  ping: require('remark-ping/src'),\n  subSuper: require('remark-sub-super/src'),\n  textr: require('../plugins/remark-textr'),\n  trailingSpaceHeading: require('remark-heading-trailing-spaces')\n}\n\nconst postProcessorList = {\n  detectQuizzes: require('../postprocessors/md-detect-quizzes'),\n  getStats: require('../postprocessors/md-get-stats'),\n  limitDepth: require('../postprocessors/md-limit-depth'),\n  listLanguages: require('../postprocessors/md-list-languages'),\n  wrapIntroCcl: require('../postprocessors/md-wrap-intro-ccl')\n}\n\nmodule.exports = (config) => {\n  const baseTokenizer = unified()\n    .use(remarkParse, config.parse)\n\n  rendererForge(\n    baseTokenizer,\n    defaultTokenizerList,\n    postProcessorList\n  )(config)\n\n  return baseTokenizer\n    .use(remarkDisableTokenizers, config.disableTokenizers)\n}\n"
  },
  {
    "path": "packages/zmarkdown/renderers/renderer-forge.js",
    "content": "module.exports = (base, defaultPluginList, postProcessorList) => config => {\n  // Use defaults\n  if (!config.disableTokenizers) {\n    config.disableTokenizers = {\n      internal: [],\n      meta: [],\n      inline: []\n    }\n  }\n\n  const disabledInternalTokenizers = config.disableTokenizers.internal || []\n\n  if (!config.extraPlugins) {\n    config.extraPlugins = {}\n  }\n\n  // Create an unified list of plugins\n  const pluginList = Object.assign({}, defaultPluginList, config.extraPlugins)\n  const pluginNames = Object.keys(pluginList)\n\n  const postProcessorNames = Object.keys(postProcessorList)\n\n  const filteredPlugins = pluginNames\n    .filter(name => !disabledInternalTokenizers.includes(name))\n\n  const filteredPostProcessors = postProcessorNames\n    .filter(name => {\n      const ppc = config.postProcessors\n\n      return (ppc && ppc[name]) ? Boolean(ppc[name]) : false\n    })\n\n  for (const pluginName of filteredPlugins) {\n    base.use(pluginList[pluginName], config[pluginName])\n  }\n\n  // Add postprocessors, that are handled differently\n  for (const postProcessorName of filteredPostProcessors) {\n    if (typeof config.postProcessors[postProcessorName] === 'boolean') {\n      base.use(postProcessorList[postProcessorName])\n    } else {\n      base.use(postProcessorList[postProcessorName], config.postProcessors[postProcessorName])\n    }\n  }\n\n  return base\n}\n"
  },
  {
    "path": "packages/zmarkdown/server/controllers/munin.js",
    "content": "const pm2 = require('pm2')\n\nmodule.exports = isConfig => (req, res) => {\n  const endpoints = Object.keys(require('../factories/io-factory'))\n\n  const status = {\n    online: 0,\n    stopped: 1,\n    errored: 2\n  }\n\n  const supportedStats = {\n    status: {\n      graph: [\n        'graph_title Process Status',\n        `graph_vlabel Status\\n(${Object.entries(status).map(([l, s]) => `${s}=${l}`).join(', ')})`,\n        'graph_args --lower-limit 0 --upper-limit 3'\n      ],\n      fields: (name) => [\n        `${name}.label ${name}`,\n        `${name}.critical 1`\n      ]\n    },\n    memory: {\n      stack: true,\n      graph: [\n        'graph_title RAM Usage',\n        'graph_vlabel Bytes',\n        'graph_args --base 1024 --lower-limit 0'\n      ],\n      fields: (name) => [\n        `${name}.label ${name}`,\n        `${name}.draw STACK`\n      ]\n    },\n    cpu: {\n      graph: [\n        'graph_title CPU Usage',\n        'graph_vlabel percent',\n        'graph_args --base 1000 --lower-limit 0 --rigid',\n        'graph_scale no'\n      ],\n      fields: (name) => `${name}.label ${name}`\n    },\n    event_loop_lag: {\n      graph: [\n        'graph_title Event Loop Lag',\n        'graph_vlabel ms',\n        'graph_args --lower-limit 0'\n      ],\n      fields: (name) => `${name}.label ${name}`\n    },\n    avg_per_process: {\n      stack: true,\n      graph: [\n        'graph_title Requests Per Second Per Process',\n        'graph_vlabel requests per second',\n        'graph_args --lower-limit 0'\n      ],\n      fields: (name) => [\n        `${name}.label ${name}`,\n        `${name}.draw STACK`\n      ]\n    },\n    avg_per_endpoint: {\n      stack: true,\n      graph: [\n        'graph_title Requests Per Second Per Endpoint',\n        'graph_vlabel requests per second',\n        'graph_args --lower-limit 0'\n      ],\n      fields: () => endpoints.map(endpoint =>\n        `${endpoint}.label ${endpoint}\\n${endpoint}.draw STACK`)\n    }\n  }\n\n  const stat = req.params.plugin\n  const collected = []\n\n  if (!(Object.prototype.hasOwnProperty.call(supportedStats, stat))) {\n    return res.status(500).send({\n      error: `Invalid stat, given : ${stat}, ` +\n        `expected one of ${JSON.stringify(supportedStats, null, 2)}.`\n    })\n  }\n\n  if (isConfig) {\n    run(printConfig)\n  } else {\n    run(printStats)\n  }\n\n  function gatherData (procList) {\n    let maxMem = 0\n\n    const procs = procList.reduce((acc, proc, i) => {\n      let avgPerProcess\n      let loopLag\n\n      if (proc.pm2_env.axm_monitor) {\n        avgPerProcess = endpoints.map(endpoint => {\n          const metric = proc.pm2_env.axm_monitor[`${endpoint} rpm`]\n          return metric ? parseFloat(metric.value) : 0\n        }).reduce((sum, val) => sum + val, 0)\n\n        // Sometimes not available after start\n        if (proc.pm2_env.axm_monitor['Event Loop Latency']) {\n          loopLag = parseFloat(proc.pm2_env.axm_monitor['Event Loop Latency'].value)\n        }\n      }\n\n      const data = {\n        status: proc.pm2_env.status in status ? status[proc.pm2_env.status] : 3,\n        memory: proc.monit.memory,\n        cpu: proc.monit.cpu,\n        event_loop_lag: loopLag || 'U',\n        avg_per_process: avgPerProcess\n      }\n\n      if (!maxMem && proc.pm2_env.max_memory_restart) {\n        maxMem = proc.pm2_env.max_memory_restart\n      }\n      if (maxMem) data.maxMem = maxMem\n\n      acc[`${proc.name}-${proc.pm_id}`] = data\n\n      return acc\n    }, {})\n\n    const _endpoints = {\n      avg_per_endpoint: endpoints.reduce((acc, endpoint) => {\n        acc[endpoint] = procList.reduce((sum, proc) => {\n          const metric = proc.pm2_env.axm_monitor[`${endpoint} rpm`]\n          return sum + (metric ? parseFloat(metric.value) : 0)\n        }, 0)\n        return acc\n      }, {})\n    }\n\n    return { procs, endpoints: _endpoints }\n  }\n\n  // prints a munin readable config\n  function printConfig (stats) {\n    if (!supportedStats[stat]) {\n      return res.status(500).send({\n        error: `\"${stat}\" not configured`\n      })\n    }\n    const procs = stats.procs\n\n    l(supportedStats[stat].graph.join('\\n'))\n    l('graph_category zmd')\n\n    let output = ''\n    if (stat === 'avg_per_endpoint') {\n      output = supportedStats[stat].fields().join('\\n')\n    } else {\n      output = Object.keys(procs).map(job => {\n        const tmp = supportedStats[stat].fields(job)\n        return Array.isArray(tmp)\n          ? tmp.join('\\n')\n          : tmp\n      }).join('\\n')\n    }\n    if (supportedStats[stat].stack) {\n      output = output.replace(' STACK', ' AREA')\n    }\n    l(output)\n\n    pm2.disconnect()\n    res.send(collected.join('\\n'))\n  }\n\n  // prints a munin readable output\n  function printStats (stats) {\n    const procs = stats.procs\n\n    if (stat === 'avg_per_endpoint') {\n      endpoints.forEach(endpoint => {\n        l(`${endpoint}.value ${stats.endpoints[stat][endpoint]}`)\n      })\n    } else {\n      Object.keys(procs).forEach((procName) => {\n        const value = procs[procName][stat]\n        l(`${procName}.value ${value}`)\n      })\n    }\n\n    pm2.disconnect()\n    res.send(collected.join('\\n'))\n  }\n\n  function run (callback) {\n    pm2.connect((err) => {\n      if (err) {\n        return res.status(500).send({ error: err })\n      }\n\n      pm2.list((err, plist) => {\n        if (err) {\n          return res.status(500).send({ error: err })\n        }\n\n        plist = plist.filter(process => !process.name.startsWith('pm2'))\n\n        callback(gatherData(plist))\n      })\n    })\n  }\n\n  function l (string) {\n    collected.push(string)\n  }\n}\n"
  },
  {
    "path": "packages/zmarkdown/server/factories/config-factory.js",
    "content": "const clone = require('clone')\n\nconst defaultMdastConfig = require('../../config/mdast')\n\nmodule.exports = opts => {\n  // Convert endpoint options to configuration\n  const mdastConfig = clone(defaultMdastConfig)\n\n  if (opts.disable_ping === true) {\n    mdastConfig.ping.pingUsername = () => false\n  }\n\n  if (typeof opts.heading_shift === 'number') {\n    mdastConfig.headingShifter = opts.heading_shift\n  }\n\n  if (opts.disable_jsfiddle === true) {\n    mdastConfig.iframes['jsfiddle.net'].disabled = true\n    mdastConfig.iframes['www.jsfiddle.net'].disabled = true\n  }\n\n  if (\n    typeof opts.disable_tokenizers === 'object' &&\n    !Array.isArray(opts.disable_tokenizers)\n  ) {\n    mdastConfig.disableTokenizers = opts.disable_tokenizers\n  }\n\n  mdastConfig.postProcessors.getStats = opts.stats === true\n  mdastConfig.imagesDownload.disabled = opts.disable_images_download === true\n\n  if (mdastConfig.imagesDownload.disabled !== true) {\n    if (typeof opts.images_download_dir === 'string') {\n      mdastConfig.imagesDownload.downloadDestination = opts.images_download_dir\n    }\n\n    if (\n      Array.isArray(opts.local_url_to_local_path) &&\n      opts.local_url_to_local_path.length === 2\n    ) {\n      mdastConfig.imagesDownload.localUrlToLocalPath = opts.local_url_to_local_path\n    }\n\n    if (typeof opts.images_download_timeout === 'number') {\n      mdastConfig.imagesDownload.httpRequestTimeout = opts.images_download_timeout\n    }\n\n    if (typeof opts.images_download_default === 'string') {\n      mdastConfig.imagesDownload.defaultImagePath = opts.images_download_default\n    }\n  }\n\n  // Allow using a custom element for iframes, initially for GDPR compliance\n  if (opts.hide_iframes) {\n    for (const providerName in mdastConfig.iframes) {\n      mdastConfig.iframes[providerName].tag = 'hidden-frame'\n    }\n  }\n\n  if (opts.inline === true) {\n    if (!Array.isArray(mdastConfig.disableTokenizers.block)) {\n      mdastConfig.disableTokenizers.block = []\n    }\n\n    mdastConfig.disableTokenizers.block = mdastConfig.disableTokenizers.block.concat([\n      'indentedCode',\n      'fencedCode',\n      'blockquote',\n      'atxHeading',\n      'setextHeading',\n      'footnote',\n      'table',\n      'custom_blocks'\n    ])\n  }\n\n  if (typeof opts.extract_type === 'string') {\n    if (['introduction', 'conclusion'].includes(opts.extract_type)) {\n      mdastConfig.postProcessors.wrapIntroCcl = {\n        type: opts.extract_type,\n        level: opts.ic_shift || 0\n      }\n    }\n  }\n\n  return mdastConfig\n}\n"
  },
  {
    "path": "packages/zmarkdown/server/factories/controller-factory.js",
    "content": "const processorFactory = require('./processor-factory')\nconst manifest = require('../utils/manifest')\nconst io = require('../factories/io-factory')\n\nmodule.exports = (givenProc, template) => (req, res, next) => {\n  // Gather data about the request\n  const rawContent = req.body.md\n  const options = req.body.opts || {}\n\n  const manifestRender = (typeof rawContent !== 'string')\n  const useTemplate = (typeof template === 'function')\n  const baseShift = options.heading_shift || 0\n\n  // Increment endpoint usage for monitoring\n  if (!useTemplate) io[givenProc]()\n  else io['latex-document']()\n\n  let extractPromises\n\n  // Get a collection of Promises to execute\n  if (manifestRender) {\n    extractPromises = manifest\n      .gatherExtracts(rawContent)\n      .map(extract => {\n        // Manifest rendering requires forging a new processor\n        // to handle title depths\n        const { text, options: localOptions } = extract\n        if (localOptions.depth) {\n          localOptions.heading_shift = baseShift + localOptions.depth\n          localOptions.ic_shift = localOptions.depth\n        }\n\n        const mergedOptions = Object.assign({}, options, localOptions)\n        const processor = processorFactory(givenProc, mergedOptions)\n\n        return processor(text)\n      })\n  } else {\n    extractPromises = [processorFactory(givenProc, req.body.opts)(rawContent)]\n  }\n\n  Promise.all(extractPromises)\n    .then(vfiles => {\n      if (useTemplate) {\n        let processedContent\n        // When using the template, we need to assemble\n        // the content first.\n        if (manifestRender) processedContent = vfiles.reduce(manifest.assemble)\n        else processedContent = vfiles[0]\n\n        const templateOpts = Object.assign(options, {\n          latex: processedContent.contents\n        })\n        const finalDocument = template(templateOpts)\n\n        // Replace the content, and discard metadata, which have no meaning in LaTeX\n        Object.assign(processedContent, { contents: finalDocument, data: {} })\n\n        return processedContent\n      }\n\n      // Add parsed content to original manifest and return\n      if (manifestRender) return manifest.dispatch(vfiles, rawContent)\n      else return vfiles[0]\n    })\n    .then(vfile => res.json([vfile.contents, vfile.data, vfile.messages]))\n    .catch(e => next(e))\n}\n"
  },
  {
    "path": "packages/zmarkdown/server/factories/io-factory.js",
    "content": "const io = require('@pm2/io')\n\nconst endpoints = ['html', 'epub', 'latex', 'latex-document']\n\nmodule.exports = endpoints.reduce((acc, endpoint) => {\n  const meter = io.meter({\n    name: `${endpoint} rpm`,\n    samples: 1,\n    timeframe: 60\n  })\n\n  acc[endpoint] = () => {\n    meter.mark()\n  }\n\n  return acc\n}, {})\n"
  },
  {
    "path": "packages/zmarkdown/server/factories/processor-factory.js",
    "content": "const defaultMdastConfig = require('../../config/mdast')\nconst configFactory = require('./config-factory')\nconst zmd = require('../../common')\n\n// ZMd parser memoization\nconst processors = {}\n\nmodule.exports = (processor, opts = {}) => {\n  if (!['epub', 'html', 'latex'].includes(processor)) {\n    const error = new Error(`Unknown target '${processor}'`)\n\n    return (md, cb) => {\n      if (typeof cb !== 'function') {\n        return new Promise((resolve, reject) => reject(error))\n      }\n\n      return cb(error)\n    }\n  }\n\n  if (processor === 'html') {\n    opts.disable_images_download = true\n  }\n\n  if (processor === 'latex') {\n    opts.disable_ping = true\n    opts.disable_jsfiddle = true\n  } else {\n    delete opts.extract_type\n  }\n\n  if (processor === 'epub') {\n    opts.disable_ping = true\n    opts.disable_jsfiddle = true\n    opts.inline = false\n\n    // EPub is HTML\n    processor = 'html'\n  }\n\n  const procId = processor + JSON.stringify(opts)\n\n  if (!Object.prototype.hasOwnProperty.call(processors, procId)) {\n    // Merge new config with defaults\n    const mdastConfig = Object.assign(\n      {},\n      defaultMdastConfig,\n      configFactory(opts)\n    )\n\n    processors[procId] = zmd(processor, mdastConfig)\n  }\n\n  return processors[procId]\n}\n"
  },
  {
    "path": "packages/zmarkdown/server/index.js",
    "content": "/* eslint-disable no-console */\nconst Sentry = require('@sentry/node')\nconst express = require('express')\nconst cors = require('cors')\nconst path = require('path')\n\nconst zmdVersion = require('../package.json').version\n\nconst app = express()\n\nSentry.init({\n  dsn: process.env.SENTRY_DSN,\n  release: process.env.SENTRY_RELEASE || zmdVersion,\n  environment: process.env.SENTRY_ENVIRONMENT || process.env.ZDS_ENVIRONMENT\n})\n\napp.use(Sentry.Handlers.requestHandler())\napp.use(cors())\n\n// Expose an image for tests\nif (process.env.ZMD_ENV !== 'production') {\n  app.use('/static', express.static(path.join(__dirname, 'static')))\n}\n\n// Depend on routers\napp.use('/', require('./routes/endpoints'))\napp.use('/munin', require('./routes/munin'))\n\n// Sentry error handler\napp.use(Sentry.Handlers.errorHandler())\n\n// Custom error handler, called only if a route throws\napp.use((err, req, res, next) => {\n  res.status(500).json({\n    type: 'InternalServerError',\n    statusCode: 500,\n    errorMessage: err.toString(),\n    uniqueId: res.sentry\n  })\n  // eslint-disable-next-line no-useless-return\n  return\n})\n\nconst server = app.listen(process.env.PORT || 27272, () => {\n  const host = server.address().address\n  const port = server.address().port\n\n  console.log('zmarkdown server listening at http://%s:%s', host, port)\n})\n"
  },
  {
    "path": "packages/zmarkdown/server/routes/endpoints.js",
    "content": "const bodyParser = require('body-parser')\nconst express = require('express')\n\nconst controllerFactory = require('../factories/controller-factory')\n\nconst router = express.Router()\nconst limit = '4mb'\n\nrouter.post(\n  '/html',\n  bodyParser.json({ limit }),\n  controllerFactory('html')\n)\n\nrouter.post(\n  '/latex',\n  bodyParser.json({ limit }),\n  controllerFactory('latex')\n)\n\nrouter.post(\n  '/epub',\n  bodyParser.json({ limit }),\n  controllerFactory('epub')\n)\n\nrouter.post(\n  '/latex-document',\n  bodyParser.json({ limit }),\n  controllerFactory('latex', require('../templates/latex-document'))\n)\n\nrouter.get('/', (_, res) => {\n  res.send('zmd is running!\\n')\n})\n\nmodule.exports = router\n"
  },
  {
    "path": "packages/zmarkdown/server/routes/munin.js",
    "content": "const express = require('express')\n\nconst munin = require('../controllers/munin')\n\nconst router = express.Router()\n\nrouter.get(\n  '/config/:plugin',\n  munin('config')\n)\n\nrouter.get(\n  '/:plugin',\n  munin()\n)\n\nmodule.exports = router\n"
  },
  {
    "path": "packages/zmarkdown/server/templates/latex-document.js",
    "content": "const assert = require('assert')\nconst escape = require('rebber/dist/escaper')\n\nmodule.exports = opts => {\n  const {\n    disableToc = false,\n    content_type: contentType,\n    license_directory: licenseDirectory,\n    license_url: licenseUrl,\n    license_logo: licenseLogo,\n    logo_directory: logoDirectory,\n    content_logo: contentLogo,\n    content_link: contentLink,\n    editor_logo: editorLogo,\n    editor_link: editorLink,\n    smileys_directory: smileysDirectory,\n    title,\n    authors,\n    license,\n    date,\n    latex\n  } = opts\n  // Required options\n  assert(contentType, 'Error with argument: \"contentType\"')\n  assert(title, 'Error with argument: \"title\"')\n  assert(Array.isArray(authors), 'Error with argument: \"authors\"')\n  assert(license, 'Error with argument: \"license\"')\n  assert(licenseDirectory, 'Error with argument: \"licenseDirectory\"')\n  assert(smileysDirectory, 'Error with argument: \"smileysDirectory\"')\n  assert(latex, 'Error with argument: \"latex\"')\n\n  const licenceLogoPath = licenseLogo ? `${licenseDirectory}/${licenseLogo}` : ''\n  const licenseLine = `\\\\licence[${licenceLogoPath}]{${license}}{${licenseUrl || ''}}`\n\n  // Optional arguments\n  const extraHeaders = []\n  if (date) extraHeaders.push(`\\\\date{${date}}`)\n  if (logoDirectory && contentLogo) extraHeaders.push(`\\\\logo{${logoDirectory}/${contentLogo}}`)\n  if (logoDirectory && editorLogo) extraHeaders.push(`\\\\editorLogo{${logoDirectory}/${editorLogo}}`)\n  if (contentLink) extraHeaders.push(`\\\\tutoLink{${contentLink}}`)\n  if (editorLink) extraHeaders.push(`\\\\editor{${editorLink}}`)\n\n  return `\\\\documentclass[${contentType}]{zmdocument}\n\n\\\\usepackage{blindtext}\n\\\\title{${escape(title)}}\n\\\\author{${escape(authors.join(', '))}}\n${licenseLine}\n${extraHeaders.join('\\n')}\n\\\\smileysPath{${smileysDirectory}}\n\\\\makeglossaries\n\n\\\\begin{document}\n\\\\maketitle\n${disableToc ? '' : '\\\\tableofcontents'}\n\n${latex}\n\\\\end{document}`\n}\n"
  },
  {
    "path": "packages/zmarkdown/server/utils/manifest.js",
    "content": "const manifestUtils = {}\n\n// Concatenate two arrays, excluding duplicates\nconst listConcatUnique = (a, b) => {\n  if (Array.isArray(a) && Array.isArray(b)) {\n    return Array.from(new Set(a.concat(b)))\n  }\n\n  return []\n}\n\n// Execute a given function on a manifest\n// If the function returns, then content inside the manifest\n// will be replaced by the returned value.\nconst executeOnExtracts = (children, execFunction, depth = 0) => {\n  function changeIfReturn (obj, extractType, d) {\n    const r = execFunction(obj[extractType], {\n      extract_type: extractType,\n      depth: d\n    })\n    if (typeof r === 'string') obj[extractType] = r\n  }\n\n  depth++\n\n  children.forEach(child => {\n    if (child.title) {\n      // Titles need to be handled as titles\n      child.title = `# ${child.title}`\n      changeIfReturn(child, 'title', depth - 1)\n    }\n\n    if (child.introduction) changeIfReturn(child, 'introduction', depth)\n    if (child.text) changeIfReturn(child, 'text', depth)\n\n    // Process element's children\n    if (child.children) executeOnExtracts(child.children, execFunction, depth)\n\n    if (child.conclusion) changeIfReturn(child, 'conclusion', depth)\n  })\n\n  return children\n}\n\n// List of rules to assemble VFile `data` section\nconst metadataPropertiesRules = {\n  disableToc: (a, b) => a && b,\n  languages: listConcatUnique,\n  stats: (a, b) => ({ signs: a.signs + b.signs, words: a.words + b.words }),\n  ping: listConcatUnique\n}\n\nmanifestUtils.gatherExtracts = manifest => {\n  const rawExtracts = []\n\n  const appendToExtracts = (text, options = {}) => {\n    rawExtracts.push({ text, options })\n  }\n\n  // Start recursion by top-level element\n  executeOnExtracts([manifest], appendToExtracts)\n\n  return rawExtracts\n}\n\nmanifestUtils.assemble = (beginVfile, endVfile) => {\n  const assembledVfile = {\n    contents: `${beginVfile.contents}\\n${endVfile.contents}`,\n    messages: [],\n    data: {}\n  }\n\n  if (beginVfile.messages) {\n    assembledVfile.messages = assembledVfile.messages.concat(beginVfile.messages)\n  }\n\n  if (endVfile.messages) {\n    assembledVfile.messages = assembledVfile.messages.concat(endVfile.messages)\n  }\n\n  if (beginVfile.data) {\n    // Append unique items from A\n    for (const [item, value] of Object.entries(beginVfile.data)) {\n      if (!Object.keys(endVfile.data).includes(item)) {\n        assembledVfile.data[item] = value\n      }\n    }\n  }\n\n  if (endVfile.data) {\n    for (const [item, value] of Object.entries(endVfile.data)) {\n      // Append unique items from B\n      if (!Object.keys(beginVfile.data).includes(item)) {\n        assembledVfile.data[item] = value\n        continue\n      }\n\n      // Append assembled cross-items\n      const assemblyRule = metadataPropertiesRules[item]\n      if (assemblyRule) {\n        assembledVfile.data[item] = assemblyRule(beginVfile.data[item], endVfile.data[item])\n      }\n    }\n  }\n\n  return assembledVfile\n}\n\nmanifestUtils.dispatch = (parsedExtracts, originalManifest) => {\n  // Create a clone of the original manifest\n  const finalManifest = Object.assign({}, originalManifest)\n  // Dispatching is quite weird: we want the manifest to be rendered\n  // but returning every part as a vfile makes a huge response...\n  const assembledExtracts = parsedExtracts.reduce(manifestUtils.assemble)\n\n  // Replace each extract where it belongs\n  let i = 0\n  executeOnExtracts([finalManifest], () => parsedExtracts[i++].contents)\n\n  assembledExtracts.contents = finalManifest\n  return assembledExtracts\n}\n\nmodule.exports = manifestUtils\n"
  },
  {
    "path": "packages/zmarkdown/utils/code-handler.js",
    "content": "module.exports = code\n\nconst codeNodeConstructor = (lang, value) => {\n  // no properties, except if a langage is specified\n  // remark-highlight takes care of adding the right coloration\n  const properties = {}\n  if (lang) properties.className = [`language-${lang}`]\n\n  // pre > code(.language-xxx)?\n  return {\n    type: 'element',\n    tagName: 'pre',\n    properties: {},\n    children: [{\n      type: 'element',\n      tagName: 'code',\n      properties,\n      children: [{\n        type: 'text',\n        value\n      }]\n    }]\n  }\n}\n\n// div.hljs-code-div\nconst parentDivConstructor = children => ({\n  type: 'element',\n  tagName: 'div',\n  properties: { className: ['hljs-code-div'] },\n  children\n})\n\n// div.hljs-line-numbers\nconst lineNumberDivConstructor = children => ({\n  type: 'element',\n  tagName: 'div',\n  properties: { className: ['hljs-line-numbers'] },\n  children\n})\n\n// span[data-count](.hll)?\nconst lineNumberElemConstructor = (count, hl) => {\n  const properties = { 'data-count': String(count) }\n  if (hl) properties.className = 'hll'\n\n  return {\n    type: 'element',\n    tagName: 'span',\n    properties,\n    children: []\n  }\n}\n\n// Parse ranges for hl_lines\nconst rangeHandler = range => {\n  const fullRange = []\n\n  for (const bit of range.split(' ')) {\n    if (bit.match('-')) {\n      const [rangeStart, rangeStop] = bit.split('-')\n\n      const minLineNumber = parseInt(rangeStart)\n      const maxLineNumber = parseInt(rangeStop)\n\n      const rangeLength = (maxLineNumber - minLineNumber) + 1\n\n      fullRange.push(...[...Array(rangeLength).keys()]\n        .map(i => i + minLineNumber))\n    } else {\n      fullRange.push(parseInt(bit))\n    }\n  }\n\n  return fullRange\n}\n\nfunction code (_, node) {\n  const value = node.value ? `${node.value}\\n` : ''\n  const lang = (node.lang && node.lang.match(/^[^ \\t]+(?=[ \\t]|$)/)) || 'text'\n  const attrs = node.meta\n\n  const hlLines = rangeHandler(attrs.hlLines)\n\n  const linesSplitted = value\n    .split('\\n')\n    .slice(0, -1)\n\n  const lineNumberElems = linesSplitted\n    .map((_, i) => {\n      const realLn = i + attrs.linenostart\n      return lineNumberElemConstructor(realLn, hlLines.includes(realLn))\n    })\n\n  const parentDivChildren = []\n\n  if (linesSplitted.length > 1) {\n    parentDivChildren.push(lineNumberDivConstructor(lineNumberElems))\n  }\n\n  parentDivChildren.push(codeNodeConstructor(lang, value))\n\n  return parentDivConstructor(parentDivChildren)\n}\n"
  },
  {
    "path": "packages/zmarkdown/utils/create-wrappers.js",
    "content": "const assert = require('assert')\n\nmodule.exports = createWrapper\n\nconst allowAll = () => true\n\nfunction createWrapper (tagToWrap, wrapInTags, classes, filter = allowAll) {\n  if (!Array.isArray(wrapInTags)) wrapInTags = [wrapInTags]\n  if (!Array.isArray(classes)) classes = [classes]\n  assert(\n    wrapInTags.length === classes.length,\n    'You should provide the same number of wrapInTags and classes'\n  )\n\n  const visitor = (node, index, parent) => {\n    if (node.type === 'element' && node.tagName === tagToWrap) {\n      if ((filter && filter(node)) && !node.__wrapped) {\n        wrap({ wrapInTags, classes }, { node, index, parent })\n      }\n    }\n  }\n\n  return visitor\n}\n\nfunction wrap ({ wrapInTags, classes }, { node, index, parent }) {\n  let wrapped = node\n  for (let i = 0; i < wrapInTags.length; i++) {\n    node.__wrapped = true\n    wrapped = {\n      type: 'element',\n      tagName: wrapInTags[i] || 'div',\n      properties: {\n        class: classes[i] || []\n      },\n      children: [wrapped]\n    }\n  }\n  parent.children.splice(index, 1, wrapped)\n}\n"
  },
  {
    "path": "packages/zmarkdown/utils/latex-code.js",
    "content": "const customCodeMacro = (content, lang, attrs) => {\n  // Default language is \"text\"\n  if (!lang) lang = 'text'\n\n  // Escape CodeBlocks\n  let escaped = content\n\n  const escapeRegex = /\\\\end\\s*{CodeBlock}/g\n\n  while (escapeRegex.test(escaped)) {\n    escaped = escaped.replace(escapeRegex, '')\n  }\n\n  // Detect features\n  const hasHlLines = (attrs && attrs.hlLines && attrs.hlLines !== [])\n  const hasLinenostart = (attrs && attrs.linenostart && attrs.linenostart !== 1)\n\n  let params = ''\n\n  // Optional caption is not used\n  if (hasHlLines || hasLinenostart) {\n    params += '[]'\n  }\n\n  // Line highlight\n  if (hasHlLines) {\n    params += `[${attrs.hlLines.split(' ').join(',')}]`\n  } else if (hasLinenostart) {\n    params += '[]'\n  }\n\n  if (hasLinenostart) {\n    params += `[${attrs.linenostart}]`\n  }\n\n  return `\\\\begin{CodeBlock}${params}{${lang}}\\n${escaped}\\n\\\\end{CodeBlock}\\n\\n`\n}\n\n/* Expose. */\nmodule.exports = customCodeMacro\n"
  },
  {
    "path": "packages/zmarkdown/utils/renderer-tests.js",
    "content": "const clone = require('clone')\n\nconst zmarkdown = require('../common')\n\nconst defaultMdastConfig = clone(require('../config/mdast'))\nconst defaultHtmlConfig = clone(require('../config/html'))\nconst defaultLatexConfig = clone(require('../config/latex'))\n\ndefaultMdastConfig.disableTokenizers = {\n  internal: ['textr'],\n  meta: [],\n  inline: []\n}\ndefaultMdastConfig.ping.pingUsername = () => false\n\ndefaultHtmlConfig.disableTokenizers = {\n  internal: ['highlight']\n}\ndefaultHtmlConfig.postfixFootnotes = '-shortId'\n// Remove custom handlers (only code for now)\ndefaultHtmlConfig.bridge.handlers = {}\ndefaultHtmlConfig.postProcessors.codeHighlight = false\n\nmodule.exports.defaultMdastConfig = defaultMdastConfig\n\nmodule.exports.defaultHtmlConfig = defaultHtmlConfig\n\nmodule.exports.defaultLatexConfig = defaultLatexConfig\n\nmodule.exports.configOverride = (a, b) => Object.assign({}, a, b)\n\nmodule.exports.renderAs = type => (mdastConfig, renderConfig) => {\n  let usedMdastConfig = mdastConfig\n  let usedRenderConfig = renderConfig\n\n  const renderWithConfig = (input, vfile) => {\n    if (!vfile) {\n      return zmarkdown(type, usedMdastConfig, usedRenderConfig)(input)\n        .then(vfile => vfile.contents.trim())\n    } else {\n      return zmarkdown(type, usedMdastConfig, usedRenderConfig)(input)\n    }\n  }\n\n  // Handle case where no config was given\n  if (typeof mdastConfig === 'string') {\n    usedMdastConfig = defaultMdastConfig\n    usedRenderConfig = type === 'latex' ? defaultLatexConfig : defaultHtmlConfig\n\n    return renderWithConfig(mdastConfig, renderConfig)\n  }\n\n  return renderWithConfig\n}\n"
  },
  {
    "path": "packages/zmarkdown/webpack.config.js",
    "content": "const webpack = require('webpack')\nconst path = require('path')\n\nconst mode = process.env.NODE_ENV ? process.env.NODE_ENV : 'production'\n\nconst defaultConf = {\n  resolve: {\n    fallback: {\n      assert: require.resolve('assert'),\n      path:   require.resolve('path-browserify'),\n      url:    require.resolve('url'),\n    },\n  },\n  mode,\n  module: {\n    rules: [\n      {\n        test:    /\\.js$/,\n        exclude: /(node_modules|bower_components)/,\n        use:     {\n          loader: 'babel-loader',\n        },\n      },\n    ],\n  },\n  plugins: [\n    new webpack.ProvidePlugin({\n      process: 'process/browser',\n    }),\n  ],\n}\n\nconst makeExportObject = (type) => {\n  const upperType = type.toUpperCase()\n\n  return Object.assign({}, defaultConf, {\n    name:   `ZMarkdown${upperType}`,\n    entry:  [`./client/${type}`],\n    output: {\n      path:     path.resolve(__dirname, 'client/dist'),\n      filename: `zmarkdown-${type}.js`,\n      library:  `ZMarkdown${upperType}`,\n    },\n  })\n}\n\nmodule.exports = ['zmdast', 'zhtml', 'zhlite', 'zlatex'].map(makeExportObject)\n"
  }
]