pax_global_header00006660000000000000000000000064146500521320014510gustar00rootroot0000000000000052 comment=c467e81f0c2b89732debc57792738d124263f53f omnilib-sphinx-mdinclude-1d4ad03/000077500000000000000000000000001465005213200170145ustar00rootroot00000000000000omnilib-sphinx-mdinclude-1d4ad03/.flake8000066400000000000000000000002751465005213200201730ustar00rootroot00000000000000[flake8] ignore = # mccabe complexity C901 # covered by black/usort E1 E2 E3 E4 E501 W503 max-line-length = 88 per-file-ignores = __init__.py: F401 omnilib-sphinx-mdinclude-1d4ad03/.github/000077500000000000000000000000001465005213200203545ustar00rootroot00000000000000omnilib-sphinx-mdinclude-1d4ad03/.github/dependabot.yml000066400000000000000000000003171465005213200232050ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" - package-ecosystem: "pip" directory: "/" schedule: interval: "monthly" omnilib-sphinx-mdinclude-1d4ad03/.github/issue_template.md000066400000000000000000000002131465005213200237150ustar00rootroot00000000000000### Description ### Details * OS: * Python version: * Project version: * Can you repro on main? * Can you repro in a clean virtualenv? omnilib-sphinx-mdinclude-1d4ad03/.github/pull_request_template.md000066400000000000000000000000751465005213200253170ustar00rootroot00000000000000### Description Fixes: # omnilib-sphinx-mdinclude-1d4ad03/.github/workflows/000077500000000000000000000000001465005213200224115ustar00rootroot00000000000000omnilib-sphinx-mdinclude-1d4ad03/.github/workflows/build.yml000066400000000000000000000012521465005213200242330ustar00rootroot00000000000000name: Build on: push: branches: - main tags: - v* pull_request: jobs: sphinx-mdinclude: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] os: [macOS-latest, ubuntu-latest, windows-latest] steps: - name: Checkout uses: actions/checkout@v4 - name: Set Up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install run: make install - name: Test run: make test - name: Lint run: make lint omnilib-sphinx-mdinclude-1d4ad03/.gitignore000066400000000000000000000021031465005213200210000ustar00rootroot00000000000000html/ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python env/ build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # Virtualenv bin/ lib/ lib64 pyvenv.cfg .venv # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .coverage .coverage.* .cache .mypy_cache nosetests.xml coverage.xml *,cover .hypothesis/ # Translations *.mo *.pot # Django stuff: *.log # Sphinx documentation docs/_build/ # PyBuilder target/ # pyenv python configuration file .python-version ###### direnv ###### .direnv .envrc ###### zsh-autoenv ###### .autoenv.zsh .autoenv_leave.zsh ### project specific ignore files wiki tmp pytest.xml chromedriver # node files node_modules # phantomjs ghostdriver.log # vim **.swp # nox .nox/* omnilib-sphinx-mdinclude-1d4ad03/.mailmap000066400000000000000000000000621465005213200204330ustar00rootroot00000000000000Amethyst Reese omnilib-sphinx-mdinclude-1d4ad03/.readthedocs.yml000066400000000000000000000003021465005213200220750ustar00rootroot00000000000000version: 2 sphinx: configuration: docs/conf.py build: os: ubuntu-22.04 tools: python: "3.10" python: install: - method: pip path: . extra_requirements: - dev omnilib-sphinx-mdinclude-1d4ad03/CHANGELOG.md000066400000000000000000000167661465005213200206450ustar00rootroot00000000000000sphinx-mdinclude ================ [![Generated by attribution][attribution-badge]][attribution-url] v0.6.2 ------ Maintenance release - Fix minimum docutils dependency requirement (#80) ```text $ git shortlog -s v0.6.1...v0.6.2 2 Amethyst Reese 1 Emil van der Westhuizen ``` v0.6.1 ------ Bugfix release - Fix rendering of codespans within link text (#68) - Added explicit dependency on Sphinx (#70) ```text $ git shortlog -s v0.6.0...v0.6.1 2 Amethyst Reese 1 Peter Sobot 5 dependabot[bot] ``` v0.6.0 ------ Feature release - Added support for mistune v3, dropped support for mistune v2 (#22, #46) - Added strict type annotations and type checking (#62) - Cleaned up legacy implementation from m2r (#58) Many thanks to Julian Gilbey for the help upgrading to mistune v3! ```text $ git shortlog -s v0.5.4...v0.6.0 3 Amethyst Reese 1 Julian Gilbey 3 dependabot[bot] ``` v0.5.4 ------ Maintenance release - Better testing of sphinx extension and docutils directive (#48) - Support fixes for docutils v0.21 (#55) - Add support for Python 3.11 and 3.12 (#25, #39) - Drop support for Python 3.7 (#25) ```text $ git shortlog -s v0.5.3...v0.5.4 8 Amethyst Reese 16 dependabot[bot] ``` v0.5.3 ------ Bugfix release - Fix deprecation warnings from docutils (#11) - Fix dependency ranges and validate compatibility - Pin to mistune `2.x` in preparation for breaking changes in `3.0` (#15) - Package migrated to the Omnilib Project ```text $ git shortlog -s v0.5.2...v0.5.3 5 Amethyst Reese 2 Patrick Hoefler 3 Samuel Giffard ``` v0.5.2 ------ Maintenance release - Add support for docutils `0.19` (#8) - Enable building docs without installing package (#6) ```text $ git shortlog -s v0.5.1...v0.5.2 6 Amethyst Reese ``` v0.5.1 ------ Bugfix release - Fix autolinks (#3, #2) ```text $ git shortlog -s v0.5.0...v0.5.1 3 Amethyst Reese 2 Tim Hatch ``` v0.5.0 ------ Feature release - Support for mistune 2.0 with major refactoring of codebase - Removal of sphinx configuration options with better defaults ```text $ git shortlog -s v0.5.0b1...v0.5.0 3 Amethyst Reese ``` v0.5.0b1 -------- Feature release - Support for mistune 2.0 with major refactoring of codebase - Removal of sphinx configuration options with better defaults ```text $ git shortlog -s v0.4.0...v0.5.0b1 7 Amethyst Reese ``` v0.4.0 ------ Feature release - Forked project from m2r2 - Renamed package to `sphinx-mdinclude` - Removes CLI to focus on Sphinx extension - Remove mermaid extension support - Overhauled documentation with less boilerplate - Move tests into `sphinx_mdinclude` namespace - Pin dependencies to mistune<1.0 and docutils<0.18 - Build using flit instead of setuptools - Formatted with latest black and µsort ```text $ git shortlog -s v0.4.0b1...v0.4.0 4 Amethyst Reese 1 dependabot[bot] ``` v0.4.0b1 -------- Beta release * Forked project from m2r2 * Renamed package to `sphinx-mdinclude` * Removes CLI to focus on Sphinx extension * Overhauled documentation with less boilerplate * Move tests into `sphinx_mdinclude` namespace * Pin dependencies to mistune<1.0 and docutils<0.18 * Build using flit instead of setuptools * Formatted with latest black and µsort ```text $ git shortlog -s v0.2.7...v0.4.0b1 18 Amethyst Reese 10 CrossNox 1 Ezequiel Rosas 1 illes 1 kalvdans ``` v0.3.1 ------ * Fix argparse for python3.10 ```text $ git shortlog -s v0.3.0...v0.3.1 1 Bas Nijholt 13 CrossNox 1 Daniel Caballero 1 illes 1 kalvdans ``` v0.3.0 ------ * Add support for mermaid code * Change bump for bump2version ```text $ git shortlog -s v0.2.8...v0.3.0 1 CrossNox ``` v0.2.8 ------ * Fix bug that made multiple inline mathematical expressions fail to render ```text $ git shortlog -s v0.2.5...v0.2.8 1 CrossNox ``` v0.2.7 ------ * Add official python3.9 support * Fix classifiers ```text $ git shortlog -s v0.2.6...v0.2.7 2 CrossNox ``` v0.2.6 ------ * Fix error for Sphinx3.3.0 ```text $ git shortlog -s v0.2.5...v0.2.6 1 Bas Nijholt 1 CrossNox 1 Daniel Caballero ``` v0.2.5 ------ * Update repo name in every reference ```text $ git shortlog -s v0.2.4...v0.2.5 1 CrossNox ``` v0.2.4 ------ * Central versioning * Add bump ```text $ git shortlog -s v0.2.3...v0.2.4 4 CrossNox ``` v0.2.3 ------ * Fix https://github.com/miyakogi/m2r/issues/51 * Change `tox` for `nox` * Add `pre-commit` hooks and fix styling ```text $ git shortlog -s v0.2.1...v0.2.3 9 CrossNox ``` v0.2.1 ------ * Add `--disable-inline-math` and `m2r_disable_inline_math` sphinx option ```text $ git shortlog -s v0.2.0...v0.2.1 3 Morgan Willcock 1 kyluca 9 miyakogi ``` v0.2.0 ------ * Add `start-line` and `end-line` option to `mdinclude` directive * Add `anonymous_references` option ([#26](https://github.com/miyakogi/m2r/pull/26)) ```text $ git shortlog -s v0.1.15...v0.2.0 3 Jake VanderPlas 11 miyakogi ``` v0.1.15 ------- * Support Sphinx's doc/ref directives for relative links ([#16](https://github.com/miyakogi/m2r/pull/16)) ```text $ git shortlog -s v0.1.14...v0.1.15 9 Ryan Lane 7 miyakogi ``` v0.1.14 ------- * Implement markdown link with title ```text $ git shortlog -s v0.1.13...v0.1.14 11 miyakogi ``` v0.1.13 ------- * Catch up sphinx updates ```text $ git shortlog -s v0.1.12...v0.1.13 8 miyakogi ``` v0.1.12 ------- * Support multi byte characters for heading ```text $ git shortlog -s v0.1.11...v0.1.12 6 miyakogi ``` v0.1.11 ------- * Add metadata for sphinx * Add `convert(src)` function, which is shortcut of `m2r.M2R()(src)` ```text $ git shortlog -s v0.1.10...v0.1.11 13 miyakogi ``` v0.1.10 ------- * Include CHANGES and test files in source distribution ```text $ git shortlog -s v0.1.9...v0.1.10 4 miyakogi ``` v0.1.9 ------ * Print help when input_file is not specified on command-line ```text $ git shortlog -s v0.1.8...v0.1.9 5 miyakogi ``` v0.1.8 ------ * Update metadata on setup.py ```text $ git shortlog -s v0.1.7...v0.1.8 6 miyakogi ``` v0.1.7 ------ * Fix undefined name error (PR #5). ```text $ git shortlog -s v0.1.6...v0.1.7 1 Kai Fricke 1 cclauss 9 miyakogi ``` v0.1.6 ------ * Drop python 3.3 support * Improve image_link regex (PR #3) ```text $ git shortlog -s v0.1.5...v0.1.6 1 John W. O'Brien 1 Nikola Forró 6 miyakogi ``` v0.1.5 ------ * Support multiple backticks in inline code, like: ```backticks (``) in code``` ```text $ git shortlog -s v0.1.4...v0.1.5 6 miyakogi ``` v0.1.4 ------ * Support indented directives/reST-comments * Support role-name after backticks (`` `text`:role: style``) ```text $ git shortlog -s v0.1.3...v0.1.4 6 miyakogi ``` v0.1.3 ------ * Remove extra escaped-spaces ('\ ') * before and after normal spaces * at the beginning of lines * before dots ```text $ git shortlog -s v0.1.2...v0.1.3 4 miyakogi ``` v0.1.2 ------ * Add reST's `::` marker support * Add options to disable emphasis by underscore (`_` or `__`) ```text $ git shortlog -s v0.1.1...v0.1.2 9 miyakogi ``` v0.1.1 ------ * Fix Bug: when code or link is placed at the end of line, spaces to the next word is disappeared ```text $ git shortlog -s v0.1...v0.1.1 6 miyakogi ``` v0.1 ---- First public release. ```text $ git shortlog -s v0.1 40 miyakogi ``` [attribution-badge]: https://img.shields.io/badge/generated%20by-attribution-informational [attribution-url]: https://attribution.omnilib.dev omnilib-sphinx-mdinclude-1d4ad03/LICENSE000066400000000000000000000020721465005213200200220ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016 Hiroyuki Takagi Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. omnilib-sphinx-mdinclude-1d4ad03/README.md000066400000000000000000000057221465005213200203010ustar00rootroot00000000000000sphinx-mdinclude ================ Sphinx extension for including or writing pages in Markdown format. [![version](https://img.shields.io/pypi/v/sphinx-mdinclude.svg)](https://pypi.python.org/pypi/sphinx-mdinclude) [![documentation](https://img.shields.io/badge/docs-latest-success)](https://sphinx-mdinclude.readthedocs.io) [![changelog](https://img.shields.io/badge/change-log-blue)](https://sphinx-mdinclude.omnilidb.dev/en/latest/changelog.html) [![license](https://img.shields.io/pypi/l/sphinx-mdinclude.svg)](https://github.com/omnilib/sphinx-mdinclude/blob/main/LICENSE) sphinx-mdinclude is a simple Sphinx extension that enables including Markdown documents from within reStructuredText. It provides the `.. mdinclude::` directive, and automatically converts the content of Markdown documents to reStructuredText format. sphinx-mdinclude is a fork of [m2r](https://github.com/miyakogi/m2r) and [m2r2](https://github.com/crossnox/m2r2), focused only on providing a Sphinx extension. ## Features * Basic markdown and some extensions (see below) * inline/block-level raw html * fenced-code block * tables * footnotes (``[^1]``) * Inline- and Block-level rst markups * single- and multi-line directives (`.. directive::`) * inline-roles (``:code:`print(1)` ...``) * ref-link (``see `ref`_``) * footnotes (``[#fn]_``) * math extension inspired by [recommonmark](https://recommonmark.readthedocs.io/en/latest/index.html) * Sphinx extension * add markdown support for sphinx * ``mdinclude`` directive to include markdown from md or rst files * option to parse relative links into ref and doc directives (``md_parse_relative_links``) ## Restrictions * In the rst's directives, markdown is not available. Please write in rst. * Column alignment of tables is not supported. (rst does not support this feature) * Heading with overline-and-underline is not supported. * Heading with underline is OK * Rst heading marks are currently hard-coded and unchangeable. * H1: `=`, H2: `-`, H3: `^`, H4: `~`, H5: `"`, H6: `#` ## Installation Python 3.6 or newer is required. ``` pip install sphinx-mdinclude ``` ## Usage In your Sphinx `conf.py`, add the following lines: ```python extensions = [ ..., 'sphinx_mdinclude', ] ``` Markdown files with the `.md` extension will be loaded and used by Sphinx, similar to any other `.rst` files. To include Markdown files within other files, use the `.. mdinclude:: ` directive. This applies the conversion from Markdown to reStructuredText format. ## License `sphinx-mdinclude` is copyright Hiroyuki Takagi, CrossNox, and [Amethyst Reese][], and licensed under the MIT license. I am providing code in this repository to you under an open source license. This is my personal repository; the license you receive to my code is from me and not from my employer. See the [LICENSE][] file for details. [Amethyst Reese]: https://noswap.com [LICENSE]: https://github.com/omnilib/sphinx-mdinclude/blob/main/LICENSE omnilib-sphinx-mdinclude-1d4ad03/docs/000077500000000000000000000000001465005213200177445ustar00rootroot00000000000000omnilib-sphinx-mdinclude-1d4ad03/docs/_static/000077500000000000000000000000001465005213200213725ustar00rootroot00000000000000omnilib-sphinx-mdinclude-1d4ad03/docs/_static/custom.css000066400000000000000000000011261465005213200234160ustar00rootroot00000000000000div.omnilib { margin-top: 24px; } div.omnilib-badges { margin-top: 12px; margin-bottom: 10px; } div.omnilib-badges a { color: #bbb; text-decoration: none; font-size: 24px; border: none; } div.omnilib-badges a:hover { color: #97F; border: none; } div.sphinxsidebarwrapper h1.logo a { font-family: ff-tisa-web-pro, Georgia, serif; } dl.function, dl.attribute, dl.class, dl.method, dl.field-list, dl.data { margin-bottom: 15px; } div.deprecated { margin: 20px 0px; padding: 10px 30px; background-color: #EEE; border: 1px solid #CCC; } omnilib-sphinx-mdinclude-1d4ad03/docs/_static/omnilib.png000066400000000000000000001221401465005213200235310ustar00rootroot00000000000000PNG  IHDRXʙhiTXtXML:com.adobe.xmp rocket-purple-squat siCCPsRGB IEC61966-2.1(u+DQ?C#3bҰѠFiIeyK͏{#V*JlZUJ)Yʚؠ缙̹s?{9{.XcyP(h(虋{q3X$}I؍߬8_sҺfQE“ᕲj[%R§>M.(|k*Z,:vaO' rRW8;#k.ta COv4T)I"^e%(uYe͈g߾juW [i}G(K0.f]C:]ֵo@烚&Ӛ ơZ=s|5+݃^o[ֈg}p pHYs   IDATxw$Uӵ P$b#0`&*pŀ^sN}ū-k ׀D%t. KòVbOOOLל|֝y[_                              Fٞ  B=wLѻ3˳  B=~g_e1X  ,X| ؗTm;DIq` `=w);Zjy:I` PUb^3ҦAA{&[<  :~̀kw6c#KA{2-6`` P|"Z` Pt|}X\ZFY% =q18u3h:,AA[ q}6\l1άAa0 ,Og63ܝuP1X  dv ny:sLm#t~A` 06A2z]XxMA% ˜+C2! Fh2,AAf X<0gA3 (& b>N+1X  n{/SF4ztfp1X  =MUm%G ~<^3Aa]ؿ<\3g2X ^  ﹋0-Og>GK FomD(  s.0Wt{m\4sbAa{3mejV˃ 5X =w Q7 jbAAs xXb5\v, ‚W`8i_  ܥ׀w۞K8+un,1X Pa|ϭO=p5`5fDAK!*F M#W$3#KA*6=\uHAB؞K% B6|u1-^`{.D$% h|8x+FoEQ^氃` B=wgTѶR`As7OǥNLA/f1WI_ 9-,AA(-lb{.g ƄZbA_OŖR.pg2X5` B=sٞGOink@` B=P\eN3FϛDP1X PeڞGɸiJ|;tI% %O=3B3&T  s? mϣZ5`inD`1X P`C=rQ01'X  s? |+O_%=wSF7 A{I2s)9G\ۇѦU  T sln{.Nrځ#WMx$bA2.k\* xD'% !f K;u݀/6ѓ,AAHpAQ!~0F4zNzbA9_p"yMxyLD  X'?=qr`4>SwN1X 0pT 6jyѻ%Ap 'Q1.u˓|xgrY1X 0{f rL} KA扠껶QAV wr,AA_!uWy93, A;mO8vxL KAr7o=Y'/ 4z:IA ^߶=g!?,\nC` B|$*ʡ(sc395NK  ﹯4,L˜FC;1PDAn\*ʋFs[MeN'A6bAs&7W0O+% 1]ą|skGF5⹛#'?% ݀mϣ4z{ˀF<5[ߴ"KA&";~Ӄګύxnü&5bAa*`0u\54z4i- s$O1RU4z}u0Ʀ+niV<)HKA·s}As9 $% sܭ1xa|i5x-1;q-Xѻ-MdAan|1Wyq;i-sAY{にE^i~5x= FQV 1s <**LQ|s{8^ ,AAy"TxmQjod~m50@=wtlϥNw[N^0v1I"K',dsRFtt[B/¼.~hFOkzsxG0*ƠZK{4% {Qlϣ4zvKn]MUD` zc<"ľ6]9^=wC`Cs)9?s7{ 0r=/,aRow6Ř0Kmv2h~|j0P1|}fO=/q7|A~ c|iB ਷;[aB_bdkm]9p0=dEQb.q s72/vNa%,ζǀKx/Ihm/Vc/C駵p=݃mϥ\u5e1Q !ˆ[mϣ$4zW{0pgtJd` <&!-viY6+C|Qff =snp'99JGY |(meڎ?W*LI,{{1hĘ ==wa2WWOx~V%z|LyE|ηv*k̲aJ8< s.~zqb,۝%0]Zmiom500`j6=ONwp1n ';b K(1;'ۍ9;F\%Ē| /۲km/6;xwռ'Ca cku̮d!i;}i21XB;lhm/żWYk;ڛw[͡l٨0Dleof5N.l<@4z䊎,5_Eڎ_6\|t<&8 s7&m٨eVnp? =wK{eᅵF=ɕ1XuN8uhUڎ@j>dc9&/^4z=9`1w:ޏ&8R KJy%/[1'eNr?c o0f=w p>а/,Z˦ڻv[K3<_)|qـ/wwo >ȸ^4zOh~C 0ٞi$E{]k;~?jaJdK=…LӔO~ aFoA-KWVG/ .~eڎ_6U1ߏ0N=wO`T |h9{R3ǀE\4Y1X¼Qow6AZ]QMk;l?趚exhR` s8+79ީ7|}& < x譞J,a^;['0yUڎ_68u[usc业|9 xݒ|r2>;BE ;vc>bEWeڎ?Z8jV*Kc8xTFǃ7|!a2a'N`~B +vgWLjtl˥lڼ8jޑB{7\9Nwc_ 2y RdX-` Qow\m]WYk; uk`|}(\=Wf1ifr4du0v73GL_sA;E3x zt?Px T8՞%S\F2Xĩ;_'m /eڎ_uʜ=w1[_! $c-f9͘]y 1XD 72<"/[1'eڎ?L{2$n 8x'-kNj3\ &F,3g_Jڎ_6UVd%=w'b 9ᅠYOr~ܧ%Lx`)-vimǟz*jBĆ,wjFo=D|S7[)dq Rvgn(Kh˦ٌy=n2ó͈ewFƜIѻ-`7}L֡NWɦ,aN۝gs%/lv|ڿb2Yk2Y |}qvko`3ʅ?q?3!uU7L7qMk;~ٴ~V ϗH\ @ S ߷=,a,ˀ \.cjmǯv<m5+{Hodb)R-6%Hd1eydڎ_6UűCfqJ 8nŇ:ޝ'c}Wvg)c+yڎ_6E c# wǝFEfء {0A;LW6tM;ߟ!vg. sB\`;@̕}dPzR#$:#~ٴUxuռ)s=%bSoS,` C;אKq^e_eeڎ?3 fP[.a{.N+lOF` S:s$èqUڎ_6mR#p( q ٵ̕)?in{2H 0$]E;ߵ,skE3zi/,.UcpsNNz1WGv%Lw5Q/+/~ٴM;1^m5o0U|!6G4zϲ= a|$%D۝o %Yɲ̷v:lkymF ea+0 %Bjb}MյMk;~ek=lbJdOBHE>2j#vq#4V=Q,w ۝}Rl*EkZ|num07=K*b8AK( a鰭+W>CFs7ĘGڞE` 1X{_Pb^E ?[ٍ3?E~!Qk;~ٴMW5G%ɅoQП(hLւd*bvcU}yTUk;~ϧj9M :h-8؞ 1X 0 /UNz{t[f7]7kR}sA+`lVi <HdZ@۝2D[eڎ_4]uͅu?U~DJ+SR;G ւC lo-Uڎ_6`-˅u?Š% 0YrKuA@ѻ+'4P"`->lt(vim/Z̲]Ʌ.t_5$\i m̖eAS LVJor?_11` 1X zĥ"#//rim/vWd'h݁K͕x N TƪX-;.in=`9)dZsL QTUڎ_&_00n.=1X 1XkPBMk;~ٴ3~|j;'@GS3( Q XJ3=XT #u,fN^4z맹?Bw1X%C V;r !vimǯvhO>m5 C>2Bj!̠vE2kj֦=&|64Yrm5aXs#5RuU@³uK!)a;d;=ŝe \::ø#ZeD]k;~ٴMV趚zϚ5oP[O"@:n`2VN`~5M>Z'MX?80l#u ZGGg6 :qN\e~7s ,}qˈvm5/=p6Ku_*_DH :'|>jcvaA{\9=4v#8eY?pBc/;ޚI Powp[_WYk;~ٴU{e#8oM'@mL[ulU\ gjSYQD}be‘/q-cxB2X e[deӎ;j~?Cxm eJG׌ɊP ?RWMWl` DM9U|]3aa#۝e~Kv*km/vc>|j1Xqn'tEthfcrSӦ1PYPFZ>&ۖhrzRzѻcN $U~6^Q_ Ik;~祽Xռ6عy>8r :Cc6j>ZkˁfZ $RC K,EN*ԋE}~[U~^BMk;~ٴ_'l8k@0G7 (4}mjj*mhwjW%Rua:2Pɂ~gx"EڹZfn B!;COy<vimǷ06bnYЇFI/ "F%_2E)0A\b%~։ud`pQEtFL,j Vy q~\ʤlZ;?g;VH%s5aU6VQ{ v*ٗʘ9Yf03݉:1iAV,] _]`h{?9NR*7~!UYk;~ٴYu[_e'7zg?vFt^"栢{ .өd:0&JGcTĒ_TTN$ъkֺŻ9X0bJJ !/"Ưvim_ |j^aMANCB])0 W~ cJ*LME*JVLuWb r!(vim/vnyUswc}:R/G*8&bA24\ګ0K<&zFuSbzkGjJ XrN$U^v*km/vq7ﶚg37zg?vtS3&pAsM_ĒI-*I RK$ј-f y*/Y=!۝- VWYk;~ٴJLBrُGOTM/ E!lVl]}}V aZ?6Hi"]'jЩV_=%@ V9yEyy˦R3v[ʍ-T# _ t6=m8p?C-HUä>0p!55  L 1X~_4lZ˦2O3scYu_>xC@SCt"dH}LڙZ;hQӔ#p s q3}bUڎ?:kV ˁ_xEdbBNg >ĻlU9"6ZG> /I4MFdX&4D s^ҝ]Qowv6efl/v*kg0V;7VU 8I*T8v&eb;L9$]agvU' W.sg DU>1䚼lkm/v궚7ex.7VîOFGk(&OJ=q-IdwZҵV݆amV !5PoiYZQJdϕ#|SŘhm/v*k'1?Vռ'X l:RK;0 Z u*=PS/)E0F-]%U710o \?M!D6䖼]HZ񋠽b|(عqZ]z*kԔ/OEMB~]P(UK)JvdOӂ.D``J%K\q?-A,b6,񫬵lkf1r3vtSûST\T?DdEkT 07Q`(;v&kh%' W8f"{u\?/A1Xb.W-F*kmǷû2Z7Wk @?dO0b=\$lEˈd=V2Y&Q*2W -]leH3Ȱ}>l;YA1Xb+2ڎ_6eڎj{aV ƽgp2sx-lŐj" z DK}gJ{J#q:=FڨY?g%y#$۝ES*ʋƦv*km/:V =gLෘcN%0Km:Tv"5}KP5p`$V:U#hFfk݃Xe~F0*OaX]QWYk;t[B4猝^g2M'e>WJtO']eŻY+ij@S5OV1=j8 (U}saU~Ak;~ٴMV9)>JE]C–ZHR?=?Ass{XO:Q2ZSz>}ǽbÓmٴMk;L՘ g/79 "3Ѭ3RG%;GjJ0~H<5!ḾhWal,~W* L߿l; B)Uz_Jڎ_6UjZ࿻ύU=qg'TȴML|r?8eR9'z^v H.E-D8ev6f:Z}n=| bJ@YlllZ'=ߢ[:퉯RJ\IfiIվE ufJe(5.7՚ەү\ϭ ltlR*b*km/vj&Cܸ]_>S :R&*3mt=T2wQˆ8fF,XsU0`pyP^bN>b[%ó]6CcA=,TJ&!q_XN݊Pt{qg`o-!^G S˅lK}nY7OM"l/ /%񫬵lI>m50^n:u݀5KzȒ`p/cSy!|h:Ti:.',]3єi۠umRoń?:Ar_^eڎ_eyjm5 EYuoF=Vf`lBs-'vЄ'uSjcJdtzKIT{ܾ!gk }ӕsX*ۍgd;~ٴM;_}Aͅ8OSv]ԚwEYp).Q̋Y.`1]D?)!&904JQw=+44[ZL֜~Ͼ|hP0``eڎ_66`aܸ]~ 9,#}/wL )FL@S@бa#9d% xqmv6xMZ B%UpΦD۱K[k;~ٴ]{5n2X'Q)[C- A&H2Qa7p`LDQ!UYAډ ㍉qo)E*m9j͊~e-GO̕Pi`Q!򲵯lZm5gx&7VwŚdzzM6)rA&Q:9U`4I(^Q6MD?Ͻk_^Ǎm1h]own)څ"$믊R˶LZˮ]:5,SJ8\If}WwjxBG|6Bm oԷs2ڒpB-[ BQU|$eOk;~ٴ㏣sU̍'?u[пAݒՠQ(XڀG$:0A#i`Y(Õi5vjhDF+h>/Z?>c;o}Z-~nP&`z`y) h˦lquu[ͳ2!7Vn 15*OCAlO%e]DM=MjkqAJ= T%[[1˘zšz\3dIho>#l9U2XŎ_esѮ, +qꉨiv} ,aUУJ:hjR]$Iq,N'0[AVxز)WVV+x⾇\g{z*6|of;~ٴWY;=b]'=hDM̕JcnMZ橰UetrOf4aۆi I֜f%aτ&L_rNy9/Ykg)֛ BUl6`]Mk;~S]'=]*J)J1x(8& фD9hP |@aڈ4=ȀE"mՊÛf.Gkʒf1XBUl6^^WY;1[aܸglHFA_ Ĺق [(DJEF ƍHZ,T{(C{CKx噯߈t1#ݷ`mA4bB`َ_6w_궚 ]'=Oaq1B J\ IHP fKNC!gMJ@JAԶAmN=, ïCMcht*6`XFeG|Nռ?qIx# .axWDSV84U>exQo8aDwf>yxT$N}m eG VZv*kmǷ}8jaܸr@GE*~8Eṁq2teLRT d`x64U IDATaxiz_3W?T B Ul$5?Z˦&V Ɲ}֖R~]JfaI&6Y( LZP\"W2gWDL_z6|΋$mI-K,brZ=a\aܸg @C00GS:-$. viH?Ľj©}S*͕h+8ȫw go%B*6 V_tEڎ_ek0/0fnqⳖ`֨8{4c'dY]V|KtT8Q(nB+0Wu|͙/wPbb"HzZ˦ um5o#78p4G{EMq&]U6dQp/fAjxY02WKadi/[o9煵zl иg9 1XF2Xڎ_6~Qo?a7.hʽkPPHLT`4 LOuS Y&)JTr䁇}q_rs~G?!D(T1X."le͍O}#w QuUSUlT [G&SC>'h &ڪ蘛h$-U qq~v'NqnL R PY`d/żMk;~UɍOcK?Z=o nPfPĵU:ZSt8T(+5x>`Ŋq%sg]Yo|M3wڧ.}FMWLP$*6E`َ_6E^%xksyz_<.:ı14=V ah%E #2c)φY0kbpɑ}CVY\?Xă9L Cߗ PY`*~im?s܍]c G|A)8\ND%=G0&0n.UpĨC-n8JPeΝ<#8!c5G#5P Pa`3X_eڎ_F}2<A= Cw&0vo-3*6lM;Jgn:CܸWIk}8 7\S:hut"w,O25cUL;*;5(z,Bs^?t1M.djR:Uý*6EZhGu[337 z[%Rue L KkvD r"SIKKDck$U- .3&YВ{7߿i~|Y Ls!؄/вimǯvPw5nyGXqӱ:8¶AI/)H3!+z鉏 ]2N@mzt;DŹ3cfÌXpRqOk_eG.+I\sJ4b͝HJZ'] 8jZBx5RֵK'O :ìVH)숅RDMHQ&˥` |,4yF" ˄Q(˥A+vWݳ8}f2H Pi`05 #vM/ڎ_6m1dn\ntw}H+ wFGS{[YiRuxZ)?aٓ-t-"e'y>wN_ =xY Zh#T1Xj]H]ZS88n:5 ,;77ZZ܂!)zZņ,`I,I'2Rv# Tnzw%{\ٹc5əoTj+L@ʆs'E}_̓ڎ_6Ǽ >øq15G(wvDFdH/`PcMꞓR*Rg&!4za#p9!Kf +w]WmYt6$ex^Js;4Ĝڎjl.x j0^.o5e:mTT+MBс)S~ .'PXoN,7R;G3TЀmv)>n_?=ݹrH iLV9øP:`;(vZ˦c&Xq1/V{Ά8S@iJGV*O9&@Mq6,K*+h(ZKd@z޴韹tE}jgR6+5\RbJ#>uhVXk;me;n8 x|Q)8k/.34؆Ae&+*4CQ/cIO~QRɥX> Xij+.uWodO/{nw\A(#bLn Gh{ JmEၡq9QCQCФ|-FĘeb*ZL4 Mw:W=a9+F*v|35E(!y"L?%ڎ_k2 7"uJouQ<9L]6 qc`dCDpP+w*.8kr#z3yk.$YL1 q?+/q˦`n |cAD>IgB3SBPX.L80&Q sfQҩD5 ֠A[ק+So|Tp]LMOW A V鶚:腵-@k;~ni|Zܨ1gd( hd=; (a:ih$ni."Q8ϊ'\{Ɋ-Nھ<d|ʒʑ+*w[#c_k;8v[?f37?@x$[$$j*\@]NcՂcl@,z}'ߊa*ND&+<אԽd֧В?g^}G,i)wVj ¯dmE!j!O`[' \+KAR,h\=,Ҙ;Pi`/S+Dt#EɍzcE@V LT\D+RɢuBY4٪p_*>Z'ylp:Ϻ%Dm&b-^~Vlu5Vs! kXԗ\M;oB3!7;o5tm#S T= rEt(N|iŇ%'MNQ=Vi3fdʢk*7}u_S_,f?F*śnͶ?Cv 1X%jRowz3Hm쫬ڵ1V uGѨ< <Ɯ%8-Rh%u"/+ӔC%J5ݿꞇ3XnXöluKڒ,aA <\<9}^E_e(ݿv[BԻ\wKߪJ6F .%LVUx/ RJı9 azH [BT+a ~t+λm\ն2c\UsK6Loözp!o`kZ>}ٴ]8j2kmy\U뜪L=33j>^PTPѫ\T^R$4: 2 "O \&@BB4!$aN*$aIzHwY}TWuIW^'ΪOw_o_ 1Wn #s`7xnRspfWviaX.`t-6m/pk }|{j&s7%XhF">$eMPn*M)`\1(!@Lk vAZ<QjxiyFTbrFm-v$G>³o7֘-]g݁c)QNmoSZ"-Ua=Q[TBlNwVŒ ?{α6ЭQmvs#{[;  >1p5)z&eJ|^w.S'$# bԀDlY3&ݚI:#ܓ T-"L:>(ٸri+;[~QZJt{@ж )T!; 'k`PYCS@ȦfwƫcKYYܱzjrjg#D HD`U p=nQ q?]nz6\w4Wt-3OiLi*%Gb޿bL:*F/_9 >:}T62%@JhdTA/tҟ>ct) ]}_ڇ_8*JYyjɆ]Iw#nfeR&rGP͈.^-ЅJ=%NE)ϔ_:&Ϙ) X*ic|88H>,ߊ5*Lhy)qeY6@gki!jJE,^{jSJU"2TOk[s)|ej^_{ⱀw7oS)O98O {¬׷\h,!LcDzTOq ?S:O#h_;)߆eUHA :{X}ۦ.:>IYOԵt''Ԍ)tXc p# ɤS־[p+6utku>/AՆOᙼjgYOL á ְ]sĔQZ~G콰nOWmݵ.TU L>`S3.RxaT"zYk-]n>瓏`>8(pc s==S. "U&C>,h1}c;٫y}{{\UYS3]Θ fFue<!^F "Jm%}&}pq*1 oXo"Un̤SoGx^Yx'O! |~>sXfҩ.}C0bc[nȤSk"S$"> ji>33_*kbgҩM[ 8 IDAT<l#E/9G(oJGbI(m8IۀzVdravVǣt NAr`h LnK4H6"qӱ". 3@ޅMdgIjmk_CU8wXR Gӟ/K>V^|TgrM9ߊ, J~_ckϣ:uɅONnP¬є>$wiS?RF5".'|g?s?7cͤSGX,{"gL:B5a!+"+]f|?9?P.VC5Q7>L?t- ;I?elSdC#AَSzbA? ﺴ@'RQ2iJLCg>hڷ@$'Nh) WdQ"Y~ޥI.f7}?L:嵶? Q/ȥV@9wFX,<| 0'KL*J@\(?K[6u=tf+tfbqWGa7NKY@ukZp_g"X~eS[K⾟<,MؿSrI> 5kg݉`5 2C ĺg,لp&+04*hh,@`6&g꓂ _kgz=*+UD:q6%Nm\A]I7u#Nmomk!E>^+ynOg7N%d2@`댮2U)( ײi3T uߔRZIFu]fzl{ ܂bǘg=+] TZV NS:|bEPL8 D` s/>kᢸgx$t`Gϟ{GxlMc\n(J=晫w0 8)na˄Ŗe@)Cd'8N{ݲr+ >z`;J}n}OY"*cL:H TsgƵInQI "=~٨Ղ.j}xꍧ#RZx1cGoOp >+U(5^ajgiZ%k)?oBIG%νnfEܹW)ֶ_8҅pFYjv=0;+O;/ؚ78lUdEг2/}DVܵaf[`\c¢9kFOb%rΘɦ9q,;tjeˆF2X͹{ʉϝ{zNC`1Ab2$؅SWv0 |A5Zh!pHVfIƎJ5c|GwK '*E {_=v'{}sKH Kp'4w''k-ݺ{Gې es$. /?7⾯> T PbK6dҩKO]yz#s:=/ =%~-s݈n7C}dڽ]X`u,=>s<\Iz# ¨` sjpk8z+*%t[nqpʼ5še+8Y)r=/t9]ʆK]2\^-ݏ, MDG]i?o⢜&Ð*3'838@j(`h]|A5*tU na8+>ģP'w9vaU畅'pF#Ù! R}{µC2' s\ 4m>01^}KˊMfcl RY t:cMrh%Jds B{jb[9~KZX{]Ne\}?+?SDr 1ʆQ0j& m!{x``lhfQ:&_[ZӒ_?;s "|[bJYhḡDdӴ|٪Jeb{Hc `Tf_ f#>|w}_#oP9s^]{"WIp0_~GNS?ֽR*s H-a?Y.اsek輧ftvLB_e$B8''w%w:c"wl̤S]QňX;:_>a0sy tkmk_$jC畅`.dqv6Hg4˄K@~xcٽ]pygw]8{$\ .*.+Uv|oizGqJw{{!갈 sf :mWw6< `&A7bwCSw7<~B/L;5M:sU{f?ĝ-j`%?bZ#}w\ޛR/ƾ `A&z*ºeK~LipI%?BƒB>'?,TߤjgR$j>u7lni&un}KWiz;1%Gǽb?9AFD| 7)` c K: @ӴxLنvߔBM!uA]3ÔJ>铄vOs"P?1~ne+.[לȱo-?*tIfM:M3:M%ڿ c˵Jjֽk?Olp-;<2ֶs)7B;,ϸ2?qjΌh[]WS!5"J]%[$i 8Rmsju HFliYB^`ܿnϵaU YBn]swiF;ުj2Fx zZ`;/[4A} m߉7YcMi7{v5 4Fkhگ3lmxڍp WFV$D}: [sUBQug_:]LDN5OW/1Q.r7N~ ag}ZVٽN {lMwde ]7v 钣]ꎁ2ѝuܰqՍ/՛Vf ᎩS٪ g&d*%֎{Iĕ U%}ݿ|i0:DmUVmdҩW[paz1?>Ln 6A6o1X%`hN0wu29H A}k_lY{ڛaJڝ԰}:1e劍{b=C& U#}\b.78Y#DYՓxݿ}\n bjBʆحkN6]t/Wظ/UNʤS C g_ N&aG?Yaֶ8//@ oĬI4y\2W<zBBh޿]7ó%m+wǐ;{ǽL 9f$.5+U(5ddNr]ɂc˹t!..2pW@l"f*)wh0zl/ޛJHhV?'O6 >~/=Ü}T*<`,=*fQ rbl=ҋ7nzbG 琗RE$ft$&Bbc3s+Nf}br#U^SG?y]7hmka`WՓ%!w2GDԜ{Ftp AFgx`R/N})zv'\~3;kB&*t!hZoٯé7R-;\I#-B*R`-u{rOdr uh7Rimk?Ox `1sw  #v*[KDp(h2ZyVS|P#SNt FuؕWБp+1+U'Yۛlёha7.FX')#+.u; =G_9j"Rbr_wX5/0ֱ6]xo0\P6wl~PTYt Ҵ'Ll-y=1nFb+(##ӑW:y[Lw7u'gtqZz#56}@ĕ `-u ?Hu|{ֶF?0fN(A`&R* ]8K L 4T 7~ZW߁͂*,k{eis\k3z]9Uq @NB9Ԍ:n!kǽIn P1E:,)qvfooԐIv<@7Xt*_bXyGp=??TY*0]S)C^W J,3a1fz\Z߬{^Q*HA5 YB85c3v'S{bw;Z AEdͺa,"?@sFk[|z CPexJo% ?| t)b'YHl&m>z~?VeCxn!|foMؽ3[hN 9+5к ɉvbIJPz*$1N>KGxjwꟿu~I.2AgЃ17a/*2]OJM e0Pku9{Jc.3sP1/S;ˀq_؇D\ By=h_gs\9q{7imko+n7G{n-",+l;tr_ݜ4R6 s3XLCp_}=NUoԮtønJRԌKNёle;}ݽQ|* Q p.8 oΛ@ħS@-mcMϔ>uQ87M fmK\=Y1Rm6˃eRDrnbwew|`劍{ L:a A"[pᬿ p*D뾄ymM?biVdgr#R85 ξ.˖̒퉜RVp(cɦi?h;(q?P 0ZEn<@Azzǜ!fvfpiDGʃ?$YnO)=Yf{h> Ϗ IDATB:԰ÉdN$`%We]Pf)(ȰdI<9{3I5p8{].8Y)qM}Cc@gG^þ8 b;3!((AelY#ҍ];vSAq3bSכl֑hVAƽPc&Ja*% jQA-ه_ =I"F*J7}V>A BnDO%YA/l*U5woyڗެr0*ld~Ï{j-}Iތ %%{7Aw919p]L·f}r߃0|T |ٷzhu[뗼,Tq7u'w& q j{ܕI6Fx %{7Op9 8Y&"F]1`gV_ |k'_݈N)vrUD[lA46^rl"ևQHPrL_ijgyNJ3-xe$Q q+A2y>UMS;Ljb{ @ pv @p/ SADHd߿:m`IU*dIߔ CȚRgr6PWJg X?o,` յѨmT걳ss7y;~k,b*Ϛĉf%'{j}Nĕ TeX  zRo|YpV9n&ΠÍigpI-QԯA {' r⥇ D%++glݞDd.rJ|/ElW[l1qXIuALIBL gD`R'mopO BH'r(. WÁG$\h*/y;xXԎ,wQrL"d⏍{]ICD s 5 1b."O+Ps{pdz7;FlQN;+qXkyoچ/8D" )ӗԝl錩M@+鍹q_mZL:DAFJ,?_8g;ciJyL{`PIgl;I<\*YkNg{Pyظz=-=%9;$1dm6Q?+8i]2劍{rzfҩ"-0S2uO<88]gJg.=Oa3VkS}StmAagL0X5MC9*`f׷U5 QUIS;׭kJ4NvU⏍{j,̤S/FXC(br6o. .+>޳[D8;NQpo.3wP׏l2[gN~q#=\U[K]^AUr1=D.f@ Un"82wvc1`AJ(/+YMMJOr&bM-6_܋gҩ<Ap^"$tƕ޹E`esxL-)v">TʔSIgNF,b}lu&}FTeL&`:,U{ ;DYz!凪β=ne;ɿlƽƽ12Ԫk Pa D[ &V@Xu>Z{,ι "(w70Ja8%6Hۥ=903Z0Y?5kw @&2GS@UOcSE\Sb+`jݛ5w/NṂ T C`F8<(IFp%Q9W%8 .M.+M J6ߖ(C2%Cߩ_[̬+vwOf `B1ϱT9p6$&4w'&u[NqF{j{Rže a-A*! ,I̾ zKfx>R[}wՓX(m ^D`k8rndˡ2YQ_1֥D\=W9'\ %ȃgpS:WpQOf M{ݺ,@TpƽŖcMtjuAp$ ?N]wsnmk2DK5+Q팭+ x$1ظX]PAau29I}jP57gU?T%k8T{?EPf_ 4SrkƒC}^/}&}fQ%amb/u"C>;1e[ߒKeSioqƽƵ.  @Z`-8 lC*8+:i xNrҲnu$};t/ yG}O~>RXfDQ_~dwSp2OgrӃ\N҂ɮ^Q(X8⍷t Q74#O4JxqR]ù. aAXw;#A)!"jaS*|/4 jY|uI""q=g@,,J S>bsgF0/ 82fRkO\VQfr> 1UH{j`at0Dp9p<ՓۉǶp_in?>}d&'Сk)Z\@*!*=zbgx*h v7f{:G@ejT˛mظظcwx8Nm\A! f&Hx}Q=n%~Mn=v !)ĢY7C>{G.L^{(G`tڄfi1;^앓Rd*5z?[9gToխmp`f[ q_m<OX%na1 7OˋV9gʈ뉽2 ;"&/Wb83~"7献|ֶ,]"đ.`L ċ>!dKIk[XpHl+!6-vo2 Dx #!fn!KR19g( 97O)l)-f4J餚5-tYЎEdeН=U| E>ޘGkl*,tqAFCXC Й)%>@! aoja>Jh[ ,70a0t50dxŌjqpp>0RZl'2Ovʈ$K~F{:^ 7˻RgTST4+/u? {< ]9ʾkp$V1r2iӆ{oq?cKfzr`UaoA'ߋy ä-V\3v/}ʱGP=_nSb+6-}s-<'^&OvͬCbp$bpb߇#{{Ժ^ټƆoiʃkA>Yh2S!XCe2"oN)iFk[d)M<-v8j`*NuGXCQLI5N̍ 80mtiLg]#NEĔG_r=Ƈ8k܃Ԧ]gߔ9tZW-7}_yV? e-yˏlC}К6X,劍{Jidҩ N`ٷƠ{ Jdac5CL漠Y] \~hp2>A:ٍRVP҇XƂ GG ZFܾ7k40HLq8 T`]xw{ Jdl 2ԍ69/M ,HSLb٪~_,!DN `PKsq\bA(A a8eQ' {a 7?FetOζt}˘eG- 壵} ԉ 4naPmq?PNkd2TA RYpmfr{'xK5'Q3 ;&w J}Z(ٍݶHg„Ę 7C}FZkΚceU?`R l$j͍%6dҩ]AkU`,}[3"L&`NIq0-1~A] 5'PN/B g}k=rcNA Yw&큚!Na=Ae9&z]~gN_58Q-[m^UJFk[x5(D%J-&2 2T D,A [3MW8=P}U[luA*XP&Zk@HZ+A7kA m^%@k[?3< f%.?AXm`߿UikzހS* T#"Bm &A1RrQktJN P }:O}c<ҲRY(aNoѧ #XP|@ TSUP<;`2R;&tAF#"a JBG)W@$                                                      EC;lb|IENDB`omnilib-sphinx-mdinclude-1d4ad03/docs/_templates/000077500000000000000000000000001465005213200221015ustar00rootroot00000000000000omnilib-sphinx-mdinclude-1d4ad03/docs/_templates/badges.html000066400000000000000000000005261465005213200242170ustar00rootroot00000000000000 omnilib-sphinx-mdinclude-1d4ad03/docs/_templates/omnilib.html000066400000000000000000000021711465005213200244210ustar00rootroot00000000000000

The Omnilib Project

Omnilib is a group of MIT licensed software libraries developed under a common, inclusive Code of Conduct. We are committed to providing a welcoming and open space for all contributors who adhere to these rules.
   
omnilib-sphinx-mdinclude-1d4ad03/docs/changelog.rst000066400000000000000000000001071465005213200224230ustar00rootroot00000000000000Changelog ========= .. mdinclude:: ../CHANGELOG.md :start-line: 2 omnilib-sphinx-mdinclude-1d4ad03/docs/conf.py000066400000000000000000000054131465005213200212460ustar00rootroot00000000000000# Configuration file for the Sphinx documentation builder. # # This file only contains a selection of the most common options. For a full # list see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html # -- Project information ----------------------------------------------------- import datetime import os import pathlib import sys project = "sphinx-mdinclude" copyright = f"{datetime.date.today().year}, Hiroyuki Takagi, CrossNox, Amethyst Reese" author = "Amethyst Reese" root = pathlib.Path(__file__).parent.parent print(f"root = {repr(root)}") sys.path.insert(0, root.as_posix()) # -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ "sphinx.ext.autodoc", 'sphinx.ext.mathjax', 'sphinx.ext.viewcode', 'sphinx.ext.githubpages', "sphinx.ext.intersphinx", "sphinx_mdinclude", ] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. exclude_patterns = [] autodoc_default_options = { "show-inheritance": True, "members": True, "undoc-members": True, } autodoc_member_order = "groupwise" autodoc_typehints = "description" highlight_language = "python3" intersphinx_mapping = {"python": ("https://docs.python.org/3", None)} master_doc = "index" # Set canonical URL from the Read the Docs Domain html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "") # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = "alabaster" html_theme_options = { "description": "Markdown extension for Sphinx", "fixed_sidebar": True, "badge_branch": "main", "github_button": False, "github_user": "omnilib", "github_repo": "sphinx-mdinclude", "show_powered_by": False, "sidebar_collapse": False, "extra_nav_links": { "Report Issues": "https://github.com/omnilib/sphinx-mdinclude/issues", }, } html_sidebars = { "**": [ "about.html", "badges.html", "navigation.html", "relations.html", "searchbox.html", "omnilib.html", ], } # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] omnilib-sphinx-mdinclude-1d4ad03/docs/example.md000066400000000000000000000056571465005213200217360ustar00rootroot00000000000000# Example This page is written in mixed markdown and reST. Source code is [here](https://github.com/omnilib/sphinx-mdinclude/raw/main/docs/example.md). ## Basic Markups (inline) A **strong**, *emphasis*, ~~deleted~~, `code with single-backtick`, ``code with two-backticks``, ```code can include multiple (``) backticks```, :code:`reST's code role`, and inline html delete. ### Link Auto link to . Link to [example.com](http://example.com/) in markdown. Link to [anchor](#testlabel) in markdown. Link to `example.com `_ in reST. Link to `example`_ in reST_ref. Link to [example.com](http://example.com/ "example") with title in markdown. .. _example: http://example.com .. _testlabel: ## Basic Markups (block) This is a simple sentence. | sentence with | newlines | (reST) Sentence with hard-wrap (markdown, trailing two spaces) > block quote > second line > > nested quote ---
This is a red, raw-html block.
> Block quote after raw-html directive ### List #### Unordered list * unordered list new line * next item * nested list with new line * nested list item 2 * original depth 1. ordered list item 2. second with new line * original depth again #### Ordered list 1. ordered list in new line 2. second item * nested unordered list * second item with new line 3. original depth 1. nested ordered list with new line 2. again 4. original depth again ### Code Block Simple, indented code block pip install sphinx Code block with triple backticks and language. ```python def a(n: int) -> None: for i in range(n): print(i) ``` Triple-tildes (`~~~`) are also available. ~~~ def a(n: int) -> None: for i in range(n): print(i) ~~~ Here is reST style code block. .. code-block:: python if True: print('\n') ## Extensions ### Table (Markdown-Style) (cell-alignment is not supported currently) | Table Header 1 | Table Header 2 | Table Header 3 | |----------------|----------------|----------------| | normal | *italic* | **bold** | | `code` | ~~deleted~~ | inline-html | ### Math This is `$E = mc^2$` inline math. The below is math-block (markdown-style). ```math E = mc^2 ``` The below is reST-style math-block. .. math:: E = mc^2 ### Include Markdown file To include markdown file: ```rest .. mdinclude:: path-to-file.md ``` To include markdown file with specific lines: ```rest .. mdinclude:: included.md :start-line: 2 :end-line: -2 ``` Original ``included.md`` file is: .. include:: included.md :code: md This file included as: ```md #### Include this line ``` and results in HTML as below: .. mdinclude:: included.md :start-line: 2 :end-line: -2 ### Footnote Footnote[^1] and footnote[^key] with markdown. Footnote with reST\ [#a]_. [^1]: footnote 1 [^key]: footnote key .. [#a] reST footnote omnilib-sphinx-mdinclude-1d4ad03/docs/included.md000066400000000000000000000000631465005213200220540ustar00rootroot00000000000000NOT-INCLUDED #### Include this line NOT-INCLUDED omnilib-sphinx-mdinclude-1d4ad03/docs/index.md000066400000000000000000000001431465005213200213730ustar00rootroot00000000000000.. toctree:: :maxdepth: 1 :hidden: example changelog .. mdinclude:: ../README.md omnilib-sphinx-mdinclude-1d4ad03/makefile000066400000000000000000000014541465005213200205200ustar00rootroot00000000000000SRCS:=sphinx_mdinclude .venv: python -m venv .venv source .venv/bin/activate && make install echo 'run `source .venv/bin/activate` to use virtualenv' venv: .venv install: python -m pip install -U pip python -m pip install -Ue .[dev] release: lint test clean flit publish format: python -m ufmt format $(SRCS) lint: python -m flake8 $(SRCS) python -m ufmt check $(SRCS) test: python -m coverage run -m $(SRCS).tests python -m coverage report python -m mypy --install-types --non-interactive -p $(SRCS) deps: python -m pessimist --requirements= -c 'python -m sphinx_mdinclude.tests' . .PHONY: html html: .venv README.md docs/*.md docs/conf.py source .venv/bin/activate && sphinx-build -ab html docs html clean: rm -rf build dist html *.egg-info .mypy_cache distclean: clean rm -rf .venv omnilib-sphinx-mdinclude-1d4ad03/pyproject.toml000066400000000000000000000035051465005213200217330ustar00rootroot00000000000000[build-system] requires = ["flit_core >=3.8,<4"] build-backend = "flit_core.buildapi" [project] name = "sphinx_mdinclude" authors = [ {name = "Hiroyuki Takagi", email = "miyako.dev@gmail.com"}, {name = "CrossNox", email = "ijmermet+m2r2@gmail.com"}, {name = "Amethyst Reese", email = "amy@noswap.com"}, ] maintainers = [ {name = "Amethyst Reese", email = "amy@noswap.com"}, ] readme = "README.md" classifiers = [ "Development Status :: 4 - Beta", "Framework :: Sphinx :: Extension", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Topic :: Text Processing", ] keywords = ["Markdown", "reStructuredText", "sphinx-extension"] dynamic = ["version", "description"] requires-python = ">=3.8" dependencies = [ "mistune >=3.0,<4.0", "docutils >=0.19,<1.0", "pygments >= 2.8", "sphinx >= 6", ] [project.optional-dependencies] dev = [ "docutils==0.20.1; python_version < '3.9'", "docutils==0.21.2; python_version >= '3.9'", "mistune==3.0.2", "attribution==1.7.1", "black==24.4.2", "coverage==7.5.1", "flake8==7.0.0", "flit==3.9.0", "mypy==1.10.0", "sphinx==7.1.2; python_version < '3.9'", "sphinx==7.3.7; python_version >= '3.9'", "ufmt==2.5.1", "usort==1.0.8.post1", ] [project.urls] Github = "https://github.com/omnilib/sphinx-mdinclude" [tool.attribution] name = "sphinx-mdinclude" package = "sphinx_mdinclude" signed_tags = true version_file = true ignored_authors = ["dependabot"] [tool.coverage.run] branch = true include = ["sphinx_mdinclude/*"] omit = ["sphinx_mdinclude/tests/*"] [tool.coverage.report] fail_under = 50 precision = 1 show_missing = true skip_covered = true [tool.mypy] python_version = "3.8" strict = true ignore_missing_imports = true disallow_untyped_calls = false omnilib-sphinx-mdinclude-1d4ad03/sphinx_mdinclude/000077500000000000000000000000001465005213200223515ustar00rootroot00000000000000omnilib-sphinx-mdinclude-1d4ad03/sphinx_mdinclude/__init__.py000066400000000000000000000004661465005213200244700ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Markdown extension for Sphinx """ __author__ = "Hiroyuki Takagi " from .__version__ import __version__ from .render import convert, RestMarkdown from .sphinx import setup __all__ = [ "convert", "RestMarkdown", "setup", ] omnilib-sphinx-mdinclude-1d4ad03/sphinx_mdinclude/__version__.py000066400000000000000000000002341465005213200252030ustar00rootroot00000000000000""" This file is automatically generated by attribution. Do not edit manually. Get more info at https://attribution.omnilib.dev """ __version__ = "0.6.2" omnilib-sphinx-mdinclude-1d4ad03/sphinx_mdinclude/parse.py000066400000000000000000000066211465005213200240420ustar00rootroot00000000000000from typing import Any, Dict, Match, Tuple from mistune import BlockParser, InlineParser from mistune.core import BlockState, InlineState from mistune.helpers import HTML_ATTRIBUTES, HTML_TAGNAME State = Dict[str, Any] Token = Dict[str, Any] Element = Tuple[str, ...] class RestBlockParser(BlockParser): SPECIFICATION = BlockParser.SPECIFICATION.copy() SPECIFICATION.update( { "directive": r"(?ms:^(?P *\.\..*?)\n(?=\S))", "oneline_directive": r"(?ms:^(?P *\.\..*?)$)", "rest_code_block": r"(?m:^::\s*$)", } ) DEFAULT_RULES = BlockParser.DEFAULT_RULES + ( # type: ignore[has-type] "directive", "oneline_directive", "rest_code_block", ) def parse_directive(self, m: Match[str], state: BlockState) -> int: state.append_token({"type": "directive", "raw": m.group("directive_1")}) return m.end() def parse_oneline_directive(self, m: Match[str], state: BlockState) -> int: # reuse directive output state.append_token({"type": "directive", "raw": m.group("directive_2")}) # $ does not count '\n' return m.end() + 1 def parse_rest_code_block(self, m: Match[str], state: BlockState) -> int: state.append_token({"type": "rest_code_block", "text": ""}) # $ does not count '\n' return m.end() + 1 class RestInlineParser(InlineParser): # make inline_html span open/contents/close instead of just a single tag INLINE_HTML = ( r"(?" # open tag r"(.*)" r"(?|" # close tag r"(?|" # open/close tag r"(?|" r"(?|" # doctype r"(?" # cdata ) SPECIFICATION = InlineParser.SPECIFICATION.copy() SPECIFICATION.update( { "inline_html": INLINE_HTML, "inline_math": r"`\$(?P.*?)\$`", "rest_role": r":.*?:`.*?`|`[^`]+`:.*?:", "rest_link": r"`[^`]*?`_", "eol_literal_marker": r"(?P\s+)?::\s*$", } ) # Order is important: need these rules to be checked before the # default rules DEFAULT_RULES = ( "inline_math", "rest_role", "rest_link", "eol_literal_marker", ) + InlineParser.DEFAULT_RULES # type: ignore[has-type] def parse_rest_role(self, m: Match[str], state: InlineState) -> int: """Pass through rest role.""" state.append_token({"type": "rest_role", "raw": m.group(0)}) return m.end() def parse_rest_link(self, m: Match[str], state: InlineState) -> int: """Pass through rest link.""" state.append_token({"type": "rest_link", "raw": m.group(0)}) return m.end() def parse_inline_math(self, m: Match[str], state: InlineState) -> int: """Pass through inline math.""" state.append_token({"type": "inline_math", "raw": m.group("math_1")}) return m.end() def parse_eol_literal_marker(self, m: Match[str], state: InlineState) -> int: """Pass through rest link.""" marker = ":" if m.group("eol_space") is None else "" state.append_token({"type": "eol_literal_marker", "raw": marker}) # $ does not count '\n' return m.end() + 1 omnilib-sphinx-mdinclude-1d4ad03/sphinx_mdinclude/render.py000066400000000000000000000315511465005213200242070ustar00rootroot00000000000000import re import textwrap from functools import partial from importlib import import_module from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple from docutils.utils import column_width from mistune import Markdown from mistune.core import BaseRenderer, BlockState from mistune.plugins import _plugins from .parse import RestBlockParser, RestInlineParser CACHED_MODULES: Dict[str, Any] = {} DEFAULT_PLUGINS = ["strikethrough", "footnotes", "table"] PROLOG = """\ .. role:: raw-html-md(raw) :format: html """ class RestRenderer(BaseRenderer): _include_raw_html = False indent = " " * 3 list_marker = "{#__rest_list_mark__#}" hmarks = { 1: "=", 2: "-", 3: "^", 4: "~", 5: '"', 6: "#", } def __init__(self, *args: Any, **kwargs: Any) -> None: self._indent_block = partial(textwrap.indent, prefix=self.indent) super().__init__(*args, **kwargs) def render_token(self, token: Dict[str, Any], state: BlockState) -> str: # based on mistune 3.0.2, mistune/renderers/html.py func: Callable[..., str] = self._get_method(token["type"]) attrs = token.get("attrs") style = token.get("style") if "raw" in token: text = token["raw"] elif "children" in token: text = self.render_tokens(token["children"], state) else: if attrs: return func(**attrs) else: return func() # We have to special-case block_code, as it needs to know the # style as well to determine whether to add a blank line at the # end (so as to retain the original behaviour) if token["type"] == "block_code": if attrs: return func(text, style=style, **attrs) else: return func(text, style=style) if attrs: return func(text, **attrs) else: return func(text) def finalize(self, data: Iterable[str]) -> str: return "".join(data) def _raw_html(self, html: str) -> str: self._include_raw_html = True return r":raw-html-md:`{}`".format(html) def block_code(self, code: str, style: str, info: Optional[str] = None) -> str: if info == "math": first_line = "\n.. math::\n\n" elif info: first_line = "\n.. code-block:: {}\n\n".format(info) else: # first_line = "\n::\n\n" first_line = "\n.. code-block::\n\n" newline = "\n" if style == "indent" else "" return first_line + self._indent_block(code + newline) def block_quote(self, text: str) -> str: # text includes some empty line return "\n..\n\n{}\n\n".format(self._indent_block(text.strip("\n"))) def block_text(self, text: str) -> str: return text def block_html(self, html: str) -> str: """Rendering block level pure html content. :param html: text content of the html snippet. """ return "\n\n.. raw:: html\n\n" + self._indent_block(html) + "\n" def heading(self, text: str, level: int, **attrs: Any) -> str: """Rendering header/heading tags like ``

`` ``

``. :param text: rendered text content for the header. :param level: a number for the header level, for example: 1. :param attrs: other attributes of the header. """ return "\n{0}\n{1}\n".format(text, self.hmarks[level] * column_width(text)) def thematic_break(self) -> str: """Rendering method for ``
`` tag.""" return "\n----\n" def list(self, text: str, ordered: bool, **attrs: Any) -> str: """Rendering list tags like ``