Docbook Tool for static documentation generation from Markdown files

Last update: Aug 1, 2022

Roave Docbook Tool

Static HTML and PDF generator tool for generating documentation from Markdown files.

  • Generates a deployable HTML file from Markdown documentation
  • Generates PDF files of the same documentation that can be deployed alongside
  • Link pages to a Confluence instance so the content can be mirrored there

Running with Docker

A Docker image is provided with all the pre-built tools. You will need to map several volumes into the container:

  • /docs-package - this will be where the tool writes the output
  • /docs-src/book - the path containing the Markdown files to be rendered
  • /docs-src/templates - the online.twig and pdf.twig templates to use for rendering HTML/PDF respectively
  • /docs-src/features - if you have features, this should contain your features

Additionally, you can provide environment variables to override the default paths used, or to enable the Confluence functionality.

# Will build the test fixtures and put in a folder called "build"
docker run \
  -v $(pwd)/test/fixture/docbook:/docs-src/book \
  -v $(pwd)/test/fixture/templates:/docs-src/templates \
  -v $(pwd)/test/fixture/feature:/docs-src/features \
  -v $(pwd)/build:/docs-package \
  --rm ghcr.io/roave/docbooktool:latest

# Will build your stuff - replace host paths as appropriate
docker run \
  -v $(pwd)/docs/book:/docs-src/book \
  -v $(pwd)/docs/templates:/docs-src/templates \
  -v $(pwd)/features:/docs-src/features \
  -v $(pwd)/build:/docs-package \
  --rm ghcr.io/roave/docbooktool:latest

# Will generate HTML, PDF, and update any configured Confluence pages
docker run \
  -v $(pwd)/docs/book:/docs-src/book \
  -v $(pwd)/docs/templates:/docs-src/templates \
  -v $(pwd)/features:/docs-src/features \
  -v $(pwd)/build:/docs-package \
  -e DOCBOOK_TOOL_CONFLUENCE_URL=https://confluence.mycompany.com \
  -e DOCBOOK_TOOL_CONFLUENCE_AUTH_TOKEN="Basic bXktdXNlcm5hbWU6bXktcGFzc3dvcmQ=" \
  --rm ghcr.io/roave/docbooktool:latest --html --pdf --confluence

Usage

bin/docbook-tool [--html] [--pdf] [--confluence]

For example, this command would generate only the HTML documentation:

$ DOCBOOK_TOOL_CONTENT_PATH=/path/to/myproject/docs/book \
> DOCBOOK_TOOL_TEMPLATE_PATH=/path/to/myproject/docs/template \
> DOCBOOK_TOOL_OUTPUT_HTML_FILE=/path/to/myproject/build/docs.html \
> bin/docbook-tool --html
[2021-01-28T12:28:41.000628+00:00] cli.INFO: Writing HTML output to /path/to/myproject/build/docs.html [] []
$

Formatting

We have limited support for YAML front matter:

  • title: Your title here - when specified, this will be used as the page title ({{ title }} in template)
  • pdf: true - when specified, a PDF will be generated for this
  • confluencePageId: 1234 - when specified, Confluence page 1234 will be updated (numeric ID only)
  • order: 100 - when specified, pages are ordered by this. Defaults to 100. Matching values are sorted alphabetically.

Additionally, we have a special Markdown syntax:

  • {{feature:test.feature}} will render $(DOCBOOK_TOOL_FEATURES_PATH)/test.feature as a code block
  • Code blocks (triple-backtick) with the puml syntax will be converted into a PlantUML diagram. Note your diagram must start and end with @startuml and @enduml respectively.

Example showing all syntax can be seen in test/fixture/docbook/test.md.

Environment variables

  • DOCBOOK_TOOL_CONTENT_PATH - the path where your Markdown documentation is kept (Required)
    • Example: /path/to/myproject/docs/book
  • DOCBOOK_TOOL_TEMPLATE_PATH - the path to your Twig templates called online.twig and pdf.twig (Required)
    • Example: /path/to/myproject/docs/template
  • DOCBOOK_TOOL_FEATURES_PATH - the base path from where features are stored (Optional)
    • Example: /path/to/myproject/features
  • DOCBOOK_TOOL_OUTPUT_HTML_FILE - where to generate the HTML documentation (Required, if using --html)
    • Example: /path/to/myproject/build/docs/index.html
  • DOCBOOK_TOOL_OUTPUT_PDF_PATH - where to generate the PDF files, if used (Required, if using --pdf)
    • Example: /path/to/myproject/build/docs/pdf
  • DOCBOOK_TOOL_CONFLUENCE_URL - the base URL of confluence (/rest/api/content is appended to this, so don't include that) (Required, if using --confluence)
    • Example: https://confluence.mycompany.com
  • DOCBOOK_TOOL_CONFLUENCE_AUTH_TOKEN - the Authorization header value to use (Required, if using --confluence in a non-interactive terminal)
    • Example: Basic bXktdXNlcm5hbWU6bXktcGFzc3dvcmQ=

GitHub

https://github.com/Roave/DocbookTool
Comments
  • 1. Reduce image size by not installing apt recommended packages

    With 1.3.0 using apt to install wkhtmltopdf instead of a .deb the image size increased

    ghcr.io/roave/docbooktool   1.3.0             b8ad7ce04652   2 days ago      1.4GB
    ghcr.io/roave/docbooktool   1.2.0             0e74b895f381   3 days ago      743MB
    

    This PR uses the --no-install-recommended flag (suggested by @Ocramius) to reduce the amount of extra stuff we pull in, resulting in a ~700MB image again

    The layer of the main apt install is significantly reduced in size:

    < RUN /bin/sh -c export DEBIAN_FRONTEND="nonin…   629MB     buildkit.dockerfile.v0
    ---
    > RUN /bin/sh -c export DEBIAN_FRONTEND="nonin…   1.23GB    buildkit.dockerfile.v0
    
    Reviewed by ciaranmcnulty at 2022-03-19 20:12
  • 2. Change defaulting of TARGETARCH

    This doesn't actually work - it prevents the TARGETARCH being populated. I suspect buildkit implements it as a default, then this overrides the default

    Reviewed by ciaranmcnulty at 2021-10-08 13:09
  • 3. Cache CI build to GHA

    This caches the CI build directly into GHA cache without messing around writing it to files first

    CI build will build AMD layers of the development target, and push them into ci-cache scope.

    On release, the builder builds multi-arch production target, and can either re-use existing layers from release-cache scope, or if the Dockerfile has changed it can pull at least the AMD version of the shared new layers from the ci-cache scope. Layers built on release are only persisted back into release-cache scope.

    Lets all ignore the fact this change got accidentally pushed already

    (Checkout action is no longer needed if the docker build is the only thing we are running)

    Reviewed by ciaranmcnulty at 2022-03-25 16:59
  • 4. Cache apt activity

    Rather than deleting the apt cached .deb and lists, we can mount them into a cache directory

    To do this we need to remove the auto-cleanup script in /etc/apt/apt.conf.d/docker-clean

    You can't re-open a PR if you push to the branch in-between apparently? To recap the previous discussion, this cached stuff only lives in the buildkit cache, and is not in the final image

    Uncached build time when apt is invalidated becomes shorter (admittedly it's marginal in this repo)

    Reviewed by ciaranmcnulty at 2022-03-26 09:46
  • 5. Cache apt activity

    Rather than deleting apt's cached .deb and lists, we can mount them into a cache directory.

    To do this we need to remove the auto-cleanup script in /etc/apt/apt.conf.d/docker-clean

    This would mostly be useful if we start --cache-from and --cache-to more and benchmark things, but it makes a difference locally. for me

    Draft because it needs benchmarking once we get better GHA caching

    Reviewed by ciaranmcnulty at 2022-03-23 14:43
  • 6. `hexagon` usage in PlantUML breaks

    Creating a markdown with the following:

    @startuml
    Bob->Alice : hello
    hexagon TestingHexagon
    @enduml
    

    breaks the PlantUML renderer:

    $ vendor/bin/phpunit 
    PHPUnit 9.5.19 #StandWithUkraine
    
    E......                                                             7 / 7 (100%)
    
    Time: 00:00.930, Memory: 10.00 MB
    
    There was 1 error:
    
    1) Roave\DocbookToolIntegrationTest\DocbookToolGeneratorTest::testGeneration
    RuntimeException: Failed to render PUML in test - starts "
    @startuml
    Bob-". Output was: Error line 4 in file: /tmp/54ce0ad8736f73cf5236b6f67a827054.puml
    Some diagram description contains errors
    
    /home/james/workspace/docbook-tool/src/Formatter/RenderPlantUmlDiagramInline.php:57
    /home/james/workspace/docbook-tool/src/Formatter/RenderPlantUmlDiagramInline.php:71
    /home/james/workspace/docbook-tool/src/Formatter/AggregatePageFormatter.php:22
    /home/james/workspace/docbook-tool/test/integration/DocbookToolGeneratorTest.php:56
    
    ERRORS!
    Tests: 7, Assertions: 6, Errors: 1.
    
    Reviewed by asgrim at 2022-03-17 08:37
  • 7. Bump guzzlehttp/psr7 from 1.7.0 to 1.8.3

    Bumps guzzlehttp/psr7 from 1.7.0 to 1.8.3.

    Release notes

    Sourced from guzzlehttp/psr7's releases.

    1.8.3

    See change log for changes.

    1.8.2

    See change log for changes.

    1.8.1

    See change log for changes.

    1.8.0

    See change log for changes.

    Changelog

    Sourced from guzzlehttp/psr7's changelog.

    1.8.3 - 2021-10-05

    Fixed

    • Return null in caching stream size if remote size is null

    1.8.2 - 2021-04-26

    Fixed

    • Handle possibly unset url in stream_get_meta_data

    1.8.1 - 2021-03-21

    Fixed

    • Issue parsing IPv6 URLs
    • Issue modifying ServerRequest lost all its attributes

    1.8.0 - 2021-03-21

    Added

    • Locale independent URL parsing
    • Most classes got a @final annotation to prepare for 2.0

    Fixed

    • Issue when creating stream from php://input and curl-ext is not installed
    • Broken Utils::tryFopen() on PHP 8
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Reviewed by dependabot[bot] at 2022-03-16 19:47
  • 8. Bump thecodingmachine/safe from 2.2.2 to 2.2.3

    Bumps thecodingmachine/safe from 2.2.2 to 2.2.3.

    Release notes

    Sourced from thecodingmachine/safe's releases.

    v2.2.3

    What's Changed

    New Contributors

    Full Changelog: https://github.com/thecodingmachine/safe/compare/v2.2.2...v2.2.3

    Commits
    • e454a31 Automatically regenerate the files (#374)
    • a047dee issue 324: change parameter name from options to flags (#376)
    • d1a25a5 Automatically regenerate the files (#373)
    • d765946 Merge pull request #371 from TimWolla/patch-1
    • 87852a1 Update .gitattributes to export-ignore additional files
    • 38b93a7 Merge pull request #367 from thecodingmachine/dependabot/composer/generator/g...
    • 387c0d8 Bump guzzlehttp/guzzle from 7.4.3 to 7.4.5 in /generator
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Reviewed by dependabot[bot] at 2022-08-05 05:27
  • 9. Bump vimeo/psalm from 4.25.0 to 4.26.0

    Bumps vimeo/psalm from 4.25.0 to 4.26.0.

    Release notes

    Sourced from vimeo/psalm's releases.

    4.26.0

    What's Changed

    This release fix an regression introduced in the last version. Upgrade is recommended

    Fixes

    Full Changelog: https://github.com/vimeo/psalm/compare/4.25.0...4.26.0

    Commits
    • 6998fab Merge pull request #8349 from VincentLanglet/formatCurrency
    • 90ac39d Fix formatCurrency return type
    • dcc6636 Merge pull request #8344 from mathroc/chore/update-ReflectionProperty-getValu...
    • 14241d7 ReflectionProperty::getValue $object is nullable since php 8.0
    • 1482643 Merge pull request #8341 from someniatko/issue-7731
    • 0abde25 #7731 - recognize @psalm-allow-private-mutation in PHP 8+ constructors
    • 489706b Merge pull request #8335 from someniatko/issue-8330
    • 0c652f7 #8330 - take into account that static type may have been unwrapped in Exist...
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Reviewed by dependabot[bot] at 2022-08-03 05:25
  • 10. Bump symfony/console from 6.1.2 to 6.1.3

    Bumps symfony/console from 6.1.2 to 6.1.3.

    Release notes

    Sourced from symfony/console's releases.

    v6.1.3

    Changelog (https://github.com/symfony/console/compare/v6.1.2...v6.1.3)

    • bug #47022 get full command path for command in search path (remicollet)
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Reviewed by dependabot[bot] at 2022-08-01 05:37
  • 11. Bump symfony/yaml from 6.1.2 to 6.1.3

    Bumps symfony/yaml from 6.1.2 to 6.1.3.

    Release notes

    Sourced from symfony/yaml's releases.

    v6.1.3

    Changelog (https://github.com/symfony/yaml/compare/v6.1.2...v6.1.3)

    • no significant changes
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Reviewed by dependabot[bot] at 2022-08-01 05:37
  • 12. Bump ubuntu from 20.04 to 22.04

    Bumps ubuntu from 20.04 to 22.04.

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Reviewed by dependabot[bot] at 2022-04-22 05:26
  • 13. Automate PlantUML JAR download

    Since the JAR filenames do not appear to be deterministic, manual update of the bundled JAR is currently needed.

    You can download the latest JAR from https://github.com/plantuml/plantuml/releases.

    We should figure out a way of automating the download of the JAR.

    Reviewed by asgrim at 2022-03-17 08:33
  • 14. Detect line endings

    At the moment, the tool crashes if it encounters a file with CRLF (\r\n) line endings. The error is misleading (it says it can't find the title of the page), but we should detect these line endings being used and reject it with a more helpful error message.

    Expected behaviour

    • An error message saying that CRLF (\r\n) are not supported. Suggested remediation can be to use dos2unix <filename>.

    Actual behaviour

    [2021-10-06T16:23:13.821568+00:00] cli.INFO: Writing HTML output to /docs-package/index.html [] []
    PHP Fatal error:  Uncaught RuntimeException: First line of markdown file <filename> did not start with "# "... in /app/src/DocbookPage.php:71
    Stack trace:
    #0 /app/src/DocbookPage.php(83): Roave\DocbookTool\DocbookPage->determineTitleFromContent()
    #1 /app/vendor/twig/twig/src/Extension/CoreExtension.php(1541): Roave\DocbookTool\DocbookPage->title()
    #2 /app/vendor/twig/twig/src/Environment.php(358) : eval()'d code(226): twig_get_attribute()
    #3 /app/vendor/twig/twig/src/Template.php(394): __TwigTemplate_2904b74a3842d9b80ea20a5768e5df794dec35bfd57ea5620521eb0ac55c9c23->doDisplay()
    #4 /app/vendor/twig/twig/src/Template.php(367): Twig\Template->displayWithErrorHandling()
    #5 /app/vendor/twig/twig/src/Template.php(379): Twig\Template->display()
    #6 /app/vendor/twig/twig/src/TemplateWrapper.php(40): Twig\Template->render()
    #7 /app/vendor/twig/twig/src/Environment.php(277): Twig\TemplateWrapper->render()
    #8 /app/src/Writer/SingleStaticHtmlWriter.php(34): Twig\Environment->render()
    #9 /app/src/WriteAllTheOutputs.php(22): Roave\DocbookTool\Writer\SingleStaticHtmlWriter->__invoke()
    #10 /app/bin/docbook-tool.php(55): Roave\DocbookTool\WriteAllTheOutputs->__invoke()
    #11 /app/bin/docbook-tool.php(59): Roave\DocbookTool\{closure}()
    #12 /app/bin/docbook-tool(6): require_once('...')
    #13 {main}
    
    Next Twig\Error\RuntimeError: An exception has been thrown during the rendering of a template ("First line of markdown file <filename> did not start with "# "..."). in /docs-src/templates/online.twig:179
    Stack trace:
    #0 /app/vendor/twig/twig/src/Template.php(367): Twig\Template->displayWithErrorHandling()
    #1 /app/vendor/twig/twig/src/Template.php(379): Twig\Template->display()
    #2 /app/vendor/twig/twig/src/TemplateWrapper.php(40): Twig\Template->render()
    #3 /app/vendor/twig/twig/src/Environment.php(277): Twig\TemplateWrapper->render()
    #4 /app/src/Writer/SingleStaticHtmlWriter.php(34): Twig\Environment->render()
    #5 /app/src/WriteAllTheOutputs.php(22): Roave\DocbookTool\Writer\SingleStaticHtmlWriter->__invoke()
    #6 /app/bin/docbook-tool.php(55): Roave\DocbookTool\WriteAllTheOutputs->__invoke()
    #7 /app/bin/docbook-tool.php(59): Roave\DocbookTool\{closure}()
    #8 /app/bin/docbook-tool(6): require_once('...')
    #9 {main}
      thrown in /docs-src/templates/online.twig on line 179
    make: *** [Makefile:64: build-docs] Error 255
    
    Reviewed by asgrim at 2021-10-06 16:43
  • 15. Add PDF comparisons to improve testing

    At the moment we just assert the PDF is generated. We should also do a visual comparison to check the output matches. Note, just doing a binary diff is not sufficient, since the content DOES change every time (even if it is only /CreationDate etc.)

    Might be worth taking a look at rst2pdf technique https://github.com/rst2pdf/rst2pdf/blob/master/rst2pdf/tests/compare_pdf.sh for PDF comparison

    Reviewed by asgrim at 2021-01-28 13:24
Related tags
A PHP tool to generate templateable markdown documentation from the docblocks or type-hints of your codebase.

Roster Installation To install, simply require the package using composer: composer require

Sep 8, 2021
Generate pseudo-static pages from markdown and HTML files for Flarum

Flarum Pages Generator This is not a Flarum extension. This package provides a Flarum extender that you can use in the local extend.php to define cust

Feb 21, 2022
PHP based Markdown documentation viewer

PHP based viewer for Markdown files, to view them with fenced code highlighting and navigation.

Mar 31, 2022
Easily add routes to your Laravel app by creating Markdown or Blade files

Laravel Pages This package lets you create pages using Markdown or Blade without having to worry about creating routes or controllers yourself. Essent

Jul 6, 2022
PHP Documentation system.

PHP Documentation system Simple but powerful Markdown docs. Features Search within Markdown files Customizable Twig templates (Note: default design is

Jun 8, 2022
Better Markdown Parser in PHP
Better Markdown Parser in PHP

Parsedown Better Markdown Parser in PHP - Demo. Features One File No Dependencies Super Fast Extensible GitHub flavored Tested in 5.3 to 7.3 Markdown

Aug 11, 2022
Highly-extensible PHP Markdown parser which fully supports the CommonMark and GFM specs.
Highly-extensible PHP Markdown parser which fully supports the CommonMark and GFM specs.

league/commonmark league/commonmark is a highly-extensible PHP Markdown parser created by Colin O'Dell which supports the full CommonMark spec and Git

Aug 6, 2022
Convert HTML to Markdown with PHP

HTML To Markdown for PHP Library which converts HTML to Markdown for your sanity and convenience. Requires: PHP 7.2+ Lead Developer: @colinodell Origi

Aug 11, 2022
A highly configurable markdown renderer and Blade component for Laravel
A highly configurable markdown renderer and Blade component for Laravel

A highly configurable markdown renderer and Blade component for Laravel This package contains: a Blade component that can render markdown a highly con

Aug 13, 2022
Render colored Markdown contents on console terminal
Render colored  Markdown contents on console terminal

cli-markdown Render colored markdown contents on console terminal Preview run demo by php example/demo.php Features support auto render color on termi

Jan 27, 2022
PHP Markdown Engine Support

PHP Markdown Version v1.x support all PHP version >=5.4 v2.x support all PHP version >=7.0 Cài đặt thư viện Thư viện này được cài đặt thông qua Compos

Jul 1, 2022
markdown wiki/blog
markdown wiki/blog

Kwiki markdown wiki/blog Usage Place your markdown files in the /wiki directory. Categories are directories and subcategories are subdirectories. If y

May 29, 2022
Rendering markdown from PHP code

JBZoo / Markdown Installing composer require jbzoo/markdown Usage Rendering Table <?php declare(strict_types=1); use JBZoo\Markdown\Table; echo (new

Dec 26, 2021
Symfony 5 bundle to easily create dynamic subpages with Markdown. Useful for help sections and wikis.

MarkdownWikiBundle This bundle allows you to create rich subpages in a Symfony project using Markdown. Pages are stored in a file cache and sourced fr

Apr 26, 2022
Gruik ! An open-source markdown note-taking web app. [ABANDONED PROJECT]

What is Gruik ? It's a free & open-source note-taking service. A space where you can store notes, tutorials, code snippets... by writing them in markd

Mar 31, 2022
PHP Markdown & Extra

PHP Markdown & Extra An updated and stripped version of the original PHP Markdown by Michel Fortin. Works quite well with PSR-0 autoloaders and is Com

Jan 18, 2022
A simple regex-based Markdown parser in PHP

Slimdown A simple regex-based Markdown parser in PHP. Supports the following elements (and can be extended via Slimdown::add_rule()): Headers Links Bo

Jul 27, 2022
A super lightweight Markdown parser for PHP projects and applications.

A speedy Markdown parser for PHP applications. This is a super lightweight Markdown parser for PHP projects and applications. It has a rather verbose

May 31, 2022
Daux.io is an documentation generator that uses a simple folder structure and Markdown files to create custom documentation on the fly. It helps you create great looking documentation in a developer friendly way.

Daux.io - Deprecation Notice This repository is deprecated! Daux.io has been moved to an organization, to guarantee future development and support. So

Jul 30, 2022
Daux.io is an documentation generator that uses a simple folder structure and Markdown files to create custom documentation on the fly. It helps you create great looking documentation in a developer friendly way.

Daux.io Daux.io is a documentation generator that uses a simple folder structure and Markdown files to create custom documentation on the fly. It help

Aug 8, 2022