├── VERSION ├── bin ├── 01_clean.cmd ├── 03_build.cmd ├── 02_01_run_tests.cmd ├── 01_clean.sh ├── 03_build.sh └── 02_01_run_tests.sh ├── pmlc-data ├── bin │ ├── 01_clean.cmd │ ├── 03_build.cmd │ ├── 02_01_run_tests.cmd │ ├── 02_02_display_test_results.sh │ ├── 01_clean.sh │ ├── 02_02_display_test_results.cmd │ ├── 03_build.sh │ └── 02_01_run_tests.sh ├── src │ └── main │ │ └── java │ │ ├── dev │ │ └── pmlc │ │ │ └── data │ │ │ ├── node │ │ │ ├── block │ │ │ │ ├── TOCPosition.java │ │ │ │ ├── code │ │ │ │ │ ├── SourceCodeHighlighter.java │ │ │ │ │ ├── InputNode.java │ │ │ │ │ ├── OutputNode.java │ │ │ │ │ ├── HTMLCodeNode.java │ │ │ │ │ └── SourceCodeNode.java │ │ │ │ ├── DivisionNode.java │ │ │ │ ├── CaptionNode.java │ │ │ │ ├── table │ │ │ │ │ ├── TableNode.java │ │ │ │ │ ├── TableRowNode.java │ │ │ │ │ ├── TableCellNode.java │ │ │ │ │ ├── TableFooterNode.java │ │ │ │ │ └── TableHeaderNode.java │ │ │ │ ├── quote │ │ │ │ │ ├── QuoteSourceNode.java │ │ │ │ │ └── QuoteNode.java │ │ │ │ ├── HeaderNode.java │ │ │ │ ├── admonition │ │ │ │ │ ├── AdmonitionLabelNode.java │ │ │ │ │ ├── NoteNode.java │ │ │ │ │ └── AdmonitionNode.java │ │ │ │ ├── chapter │ │ │ │ │ ├── SubtitleNode.java │ │ │ │ │ ├── TitleNode.java │ │ │ │ │ └── ChapterNode.java │ │ │ │ ├── list │ │ │ │ │ ├── ListNode.java │ │ │ │ │ └── ListElementNode.java │ │ │ │ ├── footnote │ │ │ │ │ ├── FootnotesPlaceholderNode.java │ │ │ │ │ └── FootnoteDefinitionNode.java │ │ │ │ ├── MonospaceNode.java │ │ │ │ ├── media │ │ │ │ │ ├── AudioNode.java │ │ │ │ │ ├── VideoNode.java │ │ │ │ │ ├── YoutubeVideoNode.java │ │ │ │ │ └── ImageNode.java │ │ │ │ ├── ParagraphNode.java │ │ │ │ └── TOCNode.java │ │ │ ├── inline │ │ │ │ ├── SpanNode.java │ │ │ │ ├── SpaceNode.java │ │ │ │ ├── NewLineNode.java │ │ │ │ ├── VerbatimTextNode.java │ │ │ │ ├── font │ │ │ │ │ ├── BoldNode.java │ │ │ │ │ ├── ItalicNode.java │ │ │ │ │ ├── SubscriptNode.java │ │ │ │ │ ├── InlineCodeNode.java │ │ │ │ │ ├── SuperscriptNode.java │ │ │ │ │ └── StrikethroughNode.java │ │ │ │ ├── PMLInlineNode.java │ │ │ │ ├── TextNode.java │ │ │ │ ├── footnote │ │ │ │ │ ├── InlineFootnoteNode.java │ │ │ │ │ └── FootnoteReferenceNode.java │ │ │ │ └── LinkNode.java │ │ │ └── validator │ │ │ │ ├── NodeValidator.java │ │ │ │ └── NodeValidatorContext.java │ │ │ ├── PMLConstants.java │ │ │ ├── nodespec │ │ │ ├── block │ │ │ │ ├── table │ │ │ │ │ ├── TableBodyNodeSpec.java │ │ │ │ │ ├── TableFooterNodeSpec.java │ │ │ │ │ ├── TableHeaderNodeSpec.java │ │ │ │ │ ├── TableRowNodeSpec.java │ │ │ │ │ └── TableCellNodeSpec.java │ │ │ │ ├── TOCNodeSpec.java │ │ │ │ ├── admonition │ │ │ │ │ ├── NoteNodeSpec.java │ │ │ │ │ ├── AdmonitionLabelNodeSpec.java │ │ │ │ │ └── AdmonitionNodeSpec.java │ │ │ │ ├── CaptionNodeSpec.java │ │ │ │ ├── DocumentNodeSpec.java │ │ │ │ ├── DivisionNodeSpec.java │ │ │ │ ├── code │ │ │ │ │ ├── InputNodeSpec.java │ │ │ │ │ ├── OutputNodeSpec.java │ │ │ │ │ ├── HtmlCodeNodeSpec.java │ │ │ │ │ └── SourceCodeNodeSpec.java │ │ │ │ ├── chapter │ │ │ │ │ ├── TitleNodeSpec.java │ │ │ │ │ ├── SubtitleNodeSpec.java │ │ │ │ │ └── ChapterNodeSpec.java │ │ │ │ ├── quote │ │ │ │ │ ├── QuoteSourceNodeSpec.java │ │ │ │ │ └── QuoteNodeSpec.java │ │ │ │ ├── HeaderNodeSpec.java │ │ │ │ ├── list │ │ │ │ │ ├── ListElementNodeSpec.java │ │ │ │ │ └── ListNodeSpec.java │ │ │ │ ├── ParagraphNodeSpec.java │ │ │ │ ├── media │ │ │ │ │ ├── AudioNodeSpec.java │ │ │ │ │ └── VideoNodeSpec.java │ │ │ │ ├── footnote │ │ │ │ │ ├── FootnotesPlaceholderNodeSpec.java │ │ │ │ │ └── FootnoteDefinitionNodeSpec.java │ │ │ │ └── MonospaceNodeSpec.java │ │ │ ├── inline │ │ │ │ ├── font │ │ │ │ │ ├── BoldNodeSpec.java │ │ │ │ │ ├── ItalicNodeSpec.java │ │ │ │ │ ├── InlineCodeNodeSpec.java │ │ │ │ │ ├── StrikethroughNodeSpec.java │ │ │ │ │ ├── SubscriptNodeSpec.java │ │ │ │ │ └── SuperscriptNodeSpec.java │ │ │ │ ├── NewLineNodeSpec.java │ │ │ │ ├── SpanNodeSpec.java │ │ │ │ ├── TextNodeSpec.java │ │ │ │ ├── VerbatimTextNodeSpec.java │ │ │ │ ├── SpaceNodeSpec.java │ │ │ │ ├── footnote │ │ │ │ │ └── InlineFootnoteNodeSpec.java │ │ │ │ └── LinkNodeSpec.java │ │ │ └── SharedNodeSpecAttributes.java │ │ │ └── PmlcVersion.java │ │ └── module-info.java └── build.gradle ├── pmlc-utils ├── bin │ ├── 01_clean.cmd │ ├── 03_build.cmd │ ├── 02_01_run_tests.cmd │ ├── 01_clean.sh │ ├── 02_02_display_test_results.sh │ ├── 03_build.sh │ ├── 02_01_run_tests.sh │ └── 02_02_display_test_results.cmd ├── src │ ├── main │ │ ├── resources │ │ │ └── data │ │ │ │ └── ref_manual │ │ │ │ └── resources │ │ │ │ ├── media │ │ │ │ ├── bird_talk.mp3 │ │ │ │ ├── gold_star.png │ │ │ │ ├── red_flower.mp4 │ │ │ │ └── strawberries.jpg │ │ │ │ └── source_code │ │ │ │ └── hello_world.ppl │ │ └── java │ │ │ ├── dev │ │ │ └── pmlc │ │ │ │ └── utils │ │ │ │ ├── nodehandlers │ │ │ │ ├── impls │ │ │ │ │ ├── NodesHandlerDelegate.java │ │ │ │ │ └── tests │ │ │ │ │ │ ├── MyIncompleteTextOutputWriter2.java │ │ │ │ │ │ ├── MyIncompleteTextOutputWriter1.java │ │ │ │ │ │ └── WriteNodeNameDelegate.java │ │ │ │ └── PMLNodesHandlerRegistrar.java │ │ │ │ ├── referencemanual │ │ │ │ └── ReferenceManualResources.java │ │ │ │ └── PMLToHTMLSnippetWriter.java │ │ │ └── module-info.java │ └── test │ │ └── java │ │ └── dev │ │ └── pmlc │ │ └── utils │ │ └── PMLToHTMLSnippetWriterTest.java └── build.gradle ├── pmlc-commands ├── bin │ ├── 01_clean.cmd │ ├── 03_build.cmd │ ├── 02_01_run_tests.cmd │ ├── 04_create_dist.cmd │ ├── 01_clean.sh │ ├── 02_02_display_test_results.sh │ ├── 03_build.sh │ ├── 02_02_display_test_results.cmd │ ├── test.sh │ ├── 02_01_run_tests.sh │ ├── 04_create_dist.sh │ └── 05_01_create_compressed_dist.cmd └── src │ └── main │ └── java │ ├── module-info.java │ └── dev │ └── pmlc │ └── commands │ ├── Start.java │ ├── PMLVersionCommand.java │ ├── Dummy.java │ ├── CreateCommandsReferenceManualCommand.java │ ├── PMLCommands.java │ ├── pmltohtml │ └── PMLToHTMLParametersHelper.java │ └── PMLInfoCommand.java ├── pmlc-converter ├── bin │ ├── 01_clean.cmd │ ├── 03_build.cmd │ ├── 02_01_run_tests.cmd │ ├── 02_02_display_test_results.sh │ ├── 01_clean.sh │ ├── 02_02_display_test_results.cmd │ ├── 03_build.sh │ └── 02_01_run_tests.sh ├── src │ └── main │ │ ├── resources │ │ └── config │ │ │ └── PML_to_HTML │ │ │ ├── html │ │ │ ├── default_html_footer_template.txt │ │ │ └── default_html_header_template.txt │ │ │ ├── options.pdml │ │ │ └── css │ │ │ └── pml-print-default.css │ │ └── java │ │ ├── module-info.java │ │ └── dev │ │ └── pmlc │ │ └── converter │ │ ├── pmltohtml │ │ ├── options │ │ │ ├── PMLToHTMLOptions.java │ │ │ ├── PMLToHTMLDefaultOptions.java │ │ │ └── PMLToHTMLResources.java │ │ └── writer │ │ │ └── AdmonitionHTMLWriter.java │ │ └── PMLCResources.java └── build.gradle ├── pmlc-parser ├── bin │ ├── 01_clean.cmd │ ├── 03_build.cmd │ ├── 02_01_run_tests.cmd │ ├── 01_clean.sh │ ├── 02_02_display_test_results.sh │ ├── 03_build.sh │ ├── 02_01_run_tests.sh │ └── 02_02_display_test_results.cmd ├── build.gradle └── src │ ├── main │ └── java │ │ ├── module-info.java │ │ └── dev │ │ └── pmlc │ │ └── parser │ │ └── PMLAttributeUtils.java │ └── test │ └── java │ └── dev │ └── pmlc │ └── parser │ └── PMLParserTest.java ├── dependencies ├── pdml-ext-0.27.0.jar ├── pdml-xml-0.27.0.jar ├── pp-text-0.21.0.jar ├── pdml-data-0.27.0.jar ├── pdml-parser-0.27.0.jar ├── pdml-reader-0.27.0.jar ├── pdml-shared-0.27.0.jar ├── pdml-utils-0.27.0.jar ├── pdml-writer-0.27.0.jar ├── pp-basics-0.21.0.jar ├── pp-commands-0.21.0.jar ├── pp-datatype-0.21.0.jar ├── pdml-commands-0.27.0.jar ├── pp-parameters-0.21.0.jar ├── pp-scripting-0.21.0.jar ├── pp-texttable-0.21.0.jar ├── pdml-ext-shared-0.27.0.jar ├── pdml-ext-types-0.27.0.jar ├── pdml-ext-utils-0.27.0.jar └── pdml-ext-scripting-0.27.0.jar ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── README.md ├── settings.gradle ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── enhancement.md ├── .gitattributes ├── .gitignore ├── .editorconfig └── gradlew.bat /VERSION: -------------------------------------------------------------------------------- 1 | 4.0.0 -------------------------------------------------------------------------------- /bin/01_clean.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call gradlew clean 5 | 6 | rem pause 7 | -------------------------------------------------------------------------------- /bin/03_build.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call gradlew build 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /bin/02_01_run_tests.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call gradlew test 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-data/bin/01_clean.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew clean 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-data/bin/03_build.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew build 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-utils/bin/01_clean.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew clean 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-utils/bin/03_build.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew build 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-commands/bin/01_clean.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew clean 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-commands/bin/03_build.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew build 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-converter/bin/01_clean.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew clean 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-converter/bin/03_build.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew build 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-data/bin/02_01_run_tests.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew test 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-parser/bin/01_clean.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew clean 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-parser/bin/03_build.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew build 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-commands/bin/02_01_run_tests.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew test 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-converter/bin/02_01_run_tests.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew test 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-parser/bin/02_01_run_tests.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew test 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /pmlc-utils/bin/02_01_run_tests.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew test 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /bin/01_clean.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ./gradlew clean 5 | 6 | # read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /bin/03_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ./gradlew build 5 | 6 | # read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-commands/bin/04_create_dist.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | call ..\gradlew installDist 5 | 6 | pause 7 | -------------------------------------------------------------------------------- /bin/02_01_run_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ./gradlew test 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /dependencies/pdml-ext-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-ext-0.27.0.jar -------------------------------------------------------------------------------- /dependencies/pdml-xml-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-xml-0.27.0.jar -------------------------------------------------------------------------------- /dependencies/pp-text-0.21.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pp-text-0.21.0.jar -------------------------------------------------------------------------------- /pmlc-converter/src/main/resources/config/PML_to_HTML/html/default_html_footer_template.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /pmlc-data/bin/02_02_display_test_results.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | xdg-open build\reports\tests\test\index.html 5 | -------------------------------------------------------------------------------- /dependencies/pdml-data-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-data-0.27.0.jar -------------------------------------------------------------------------------- /dependencies/pdml-parser-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-parser-0.27.0.jar -------------------------------------------------------------------------------- /dependencies/pdml-reader-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-reader-0.27.0.jar -------------------------------------------------------------------------------- /dependencies/pdml-shared-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-shared-0.27.0.jar -------------------------------------------------------------------------------- /dependencies/pdml-utils-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-utils-0.27.0.jar -------------------------------------------------------------------------------- /dependencies/pdml-writer-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-writer-0.27.0.jar -------------------------------------------------------------------------------- /dependencies/pp-basics-0.21.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pp-basics-0.21.0.jar -------------------------------------------------------------------------------- /dependencies/pp-commands-0.21.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pp-commands-0.21.0.jar -------------------------------------------------------------------------------- /dependencies/pp-datatype-0.21.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pp-datatype-0.21.0.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /pmlc-commands/bin/01_clean.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew clean 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-commands/bin/02_02_display_test_results.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | xdg-open build\reports\tests\test\index.html 5 | -------------------------------------------------------------------------------- /pmlc-commands/bin/03_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew build 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-converter/bin/02_02_display_test_results.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | xdg-open build\reports\tests\test\index.html 5 | -------------------------------------------------------------------------------- /pmlc-data/bin/01_clean.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew clean 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-data/bin/02_02_display_test_results.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | start "" "build\reports\tests\test\index.html" 5 | -------------------------------------------------------------------------------- /pmlc-data/bin/03_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew build 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-parser/bin/01_clean.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew clean 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-parser/bin/02_02_display_test_results.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | xdg-open build\reports\tests\test\index.html 5 | -------------------------------------------------------------------------------- /pmlc-parser/bin/03_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew build 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-utils/bin/01_clean.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew clean 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-utils/bin/02_02_display_test_results.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | xdg-open build\reports\tests\test\index.html 5 | -------------------------------------------------------------------------------- /pmlc-utils/bin/03_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew build 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /dependencies/pdml-commands-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-commands-0.27.0.jar -------------------------------------------------------------------------------- /dependencies/pp-parameters-0.21.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pp-parameters-0.21.0.jar -------------------------------------------------------------------------------- /dependencies/pp-scripting-0.21.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pp-scripting-0.21.0.jar -------------------------------------------------------------------------------- /dependencies/pp-texttable-0.21.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pp-texttable-0.21.0.jar -------------------------------------------------------------------------------- /pmlc-commands/bin/02_02_display_test_results.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | start "" "build\reports\tests\test\index.html" 5 | -------------------------------------------------------------------------------- /pmlc-commands/bin/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | /mnt/c/WINDOWS/system32/wsl.exe 4 | 5 | read -p "Press Enter to continue... " 6 | -------------------------------------------------------------------------------- /pmlc-converter/bin/01_clean.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew clean 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-converter/bin/02_02_display_test_results.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | start "" "build\reports\tests\test\index.html" 5 | -------------------------------------------------------------------------------- /pmlc-converter/bin/03_build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew build 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-data/bin/02_01_run_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew test 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-parser/bin/02_01_run_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew test 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-parser/bin/02_02_display_test_results.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | start "" "build\reports\tests\test\index.html" 5 | -------------------------------------------------------------------------------- /pmlc-utils/bin/02_01_run_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew test 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-utils/bin/02_02_display_test_results.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | cd .. 4 | start "" "build\reports\tests\test\index.html" 5 | -------------------------------------------------------------------------------- /dependencies/pdml-ext-shared-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-ext-shared-0.27.0.jar -------------------------------------------------------------------------------- /dependencies/pdml-ext-types-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-ext-types-0.27.0.jar -------------------------------------------------------------------------------- /dependencies/pdml-ext-utils-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-ext-utils-0.27.0.jar -------------------------------------------------------------------------------- /pmlc-commands/bin/02_01_run_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew test 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-converter/bin/02_01_run_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew test 5 | 6 | read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /dependencies/pdml-ext-scripting-0.27.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/dependencies/pdml-ext-scripting-0.27.0.jar -------------------------------------------------------------------------------- /pmlc-commands/bin/04_create_dist.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd .. 4 | ../gradlew installDist 5 | 6 | # read -p "Press Enter to continue... " 7 | -------------------------------------------------------------------------------- /pmlc-converter/src/main/resources/config/PML_to_HTML/options.pdml: -------------------------------------------------------------------------------- 1 | [options 2 | [- This file can be used to define default options applied to all PML documents -] 3 | ] -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/TOCPosition.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block; 2 | 3 | public enum TOCPosition { 4 | 5 | LEFT, TOP, NONE // TD , specified 6 | } 7 | -------------------------------------------------------------------------------- /pmlc-utils/src/main/resources/data/ref_manual/resources/media/bird_talk.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/pmlc-utils/src/main/resources/data/ref_manual/resources/media/bird_talk.mp3 -------------------------------------------------------------------------------- /pmlc-utils/src/main/resources/data/ref_manual/resources/media/gold_star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/pmlc-utils/src/main/resources/data/ref_manual/resources/media/gold_star.png -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/code/SourceCodeHighlighter.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.code; 2 | 3 | public enum SourceCodeHighlighter { 4 | 5 | HIGHLIGHTJS, PRISM, NONE 6 | } 7 | -------------------------------------------------------------------------------- /pmlc-utils/src/main/resources/data/ref_manual/resources/media/red_flower.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/pmlc-utils/src/main/resources/data/ref_manual/resources/media/red_flower.mp4 -------------------------------------------------------------------------------- /pmlc-utils/src/main/resources/data/ref_manual/resources/media/strawberries.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pml-lang/pml-companion/HEAD/pmlc-utils/src/main/resources/data/ref_manual/resources/media/strawberries.jpg -------------------------------------------------------------------------------- /pmlc-utils/src/main/resources/data/ref_manual/resources/source_code/hello_world.ppl: -------------------------------------------------------------------------------- 1 | // Hello world program written in PPL 2 | // www.ppl-lang.dev 3 | 4 | function start 5 | OS.out.write_line ( "Hello world" ) 6 | . 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # _PML Companion_ Java Source Code 2 | 3 | This repository contains the source code files of the _PML Companion_ (PMLC), written in Java. 4 | 5 | For more information about PML please visit its [website](https://pml-lang.dev/). -------------------------------------------------------------------------------- /pmlc-commands/bin/05_01_create_compressed_dist.cmd: -------------------------------------------------------------------------------- 1 | cd .. 2 | 3 | rem call ..\gradlew distZip 4 | call ..\gradlew assembleDist 5 | if errorlevel 1 goto FAILURE 6 | 7 | exit /B 0 8 | 9 | :FAILURE 10 | pause 11 | exit /B 1 12 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /pmlc-data/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'dev.pmlc.java-library-conventions' 3 | } 4 | 5 | dependencies { 6 | implementation fileTree ( dir: '../dependencies' ) 7 | // implementation fileTree ( dir: '../dependencies', include: 'pp-basics*.jar') 8 | } 9 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/PMLConstants.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data; 2 | 3 | import dev.pp.basics.annotations.NotNull; 4 | 5 | public class PMLConstants { 6 | 7 | public static final @NotNull String PML_FILE_NAME_EXTENSION = "pml"; 8 | public static final @NotNull String PML_FILE_NAME_EXTENSION_WITH_DOT = "." + PML_FILE_NAME_EXTENSION; 9 | } 10 | -------------------------------------------------------------------------------- /pmlc-converter/src/main/resources/config/PML_to_HTML/html/default_html_header_template.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{title}} 7 | {{stylesheets}} 8 | 9 | 10 | {{Javascript}} 11 | -------------------------------------------------------------------------------- /pmlc-converter/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'dev.pmlc.java-library-conventions' 3 | } 4 | 5 | dependencies { 6 | implementation fileTree ( dir: '../dependencies' ) 7 | // implementation fileTree ( dir: '../dependencies', include: 'pp-basics*.jar') 8 | 9 | // PMLC 10 | implementation project ( ':pmlc-data' ) 11 | implementation project ( ':pmlc-parser' ) 12 | } 13 | -------------------------------------------------------------------------------- /pmlc-parser/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'dev.pmlc.java-library-conventions' 3 | } 4 | 5 | dependencies { 6 | implementation fileTree ( dir: '../dependencies' ) 7 | // implementation fileTree ( dir: '../dependencies', include: 'pp-basics*.jar') 8 | 9 | implementation group: 'org.graalvm.js', name: 'js', version: '22.3.1' 10 | 11 | // PMLC 12 | implementation project ( ':pmlc-data' ) 13 | } 14 | -------------------------------------------------------------------------------- /pmlc-utils/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'dev.pmlc.java-library-conventions' 3 | } 4 | 5 | dependencies { 6 | implementation fileTree ( dir: '../dependencies' ) 7 | // implementation fileTree ( dir: '../dependencies', include: 'pp-basics*.jar') 8 | 9 | // PMLC 10 | implementation project ( ':pmlc-data' ) 11 | implementation project ( ':pmlc-parser' ) 12 | implementation project ( ':pmlc-converter' ) 13 | } 14 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/table/TableBodyNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.table; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 4 | import dev.pp.basics.annotations.NotNull; 5 | 6 | public class TableBodyNodeSpec { 7 | 8 | public static final @NotNull String HTML_TAG = "tbody"; 9 | 10 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "table-body" ); 11 | } 12 | -------------------------------------------------------------------------------- /pmlc-utils/src/main/java/dev/pmlc/utils/nodehandlers/impls/NodesHandlerDelegate.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.utils.nodehandlers.impls; 2 | 3 | import dev.pmlc.data.node.PMLNode; 4 | import dev.pp.basics.annotations.NotNull; 5 | 6 | public interface NodesHandlerDelegate { 7 | 8 | @NotNull String getName(); 9 | 10 | void start() throws Exception; 11 | 12 | void end() throws Exception; 13 | 14 | void handleNode ( @NotNull PMLNode node ) throws Exception; 15 | } 16 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/DivisionNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.DivisionNodeSpec; 5 | import dev.pp.basics.annotations.NotNull; 6 | 7 | public class DivisionNode extends PMLBlockNode { 8 | 9 | public DivisionNode () { super(); } 10 | 11 | public @NotNull PMLNodeSpec getNodeSpec () { return DivisionNodeSpec.NODE; } 12 | } 13 | -------------------------------------------------------------------------------- /pmlc-converter/src/main/java/module-info.java: -------------------------------------------------------------------------------- 1 | module dev.pmlc.converter { 2 | 3 | requires dev.pp.basics; 4 | requires dev.pp.text; 5 | requires dev.pp.texttable; 6 | 7 | requires dev.pdml.utils; 8 | 9 | requires dev.pmlc.data; 10 | requires dev.pmlc.parser; 11 | 12 | exports dev.pmlc.converter; 13 | exports dev.pmlc.converter.pmltohtml; 14 | exports dev.pmlc.converter.pmltohtml.options; 15 | exports dev.pmlc.converter.pmltohtml.writer; 16 | } 17 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/SpanNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.SpanNodeSpec; 5 | import dev.pp.basics.annotations.NotNull; 6 | 7 | public class SpanNode extends PMLInlineNode { 8 | 9 | public SpanNode() { super(); } 10 | 11 | @SuppressWarnings ( "unchecked" ) 12 | public @NotNull PMLNodeSpec getNodeSpec () { return SpanNodeSpec.NODE; } 13 | } 14 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/SpaceNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.SpaceNodeSpec; 5 | import dev.pp.basics.annotations.NotNull; 6 | 7 | public class SpaceNode extends PMLInlineNode { 8 | 9 | public SpaceNode () { super(); } 10 | 11 | @SuppressWarnings ( "unchecked" ) 12 | public @NotNull PMLNodeSpec getNodeSpec () { return SpaceNodeSpec.NODE; } 13 | } 14 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/CaptionNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.CaptionNodeSpec; 5 | import dev.pp.basics.annotations.NotNull; 6 | 7 | public class CaptionNode extends PMLBlockNode { 8 | 9 | public CaptionNode () { super(); } 10 | 11 | @SuppressWarnings ( "unchecked" ) 12 | public @NotNull PMLNodeSpec getNodeSpec () { return CaptionNodeSpec.NODE; } 13 | } 14 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/NewLineNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.NewLineNodeSpec; 5 | import dev.pp.basics.annotations.NotNull; 6 | 7 | public class NewLineNode extends PMLInlineNode { 8 | 9 | public NewLineNode () { super(); } 10 | 11 | @SuppressWarnings ( "unchecked" ) 12 | public @NotNull PMLNodeSpec getNodeSpec () { return NewLineNodeSpec.NODE; } 13 | } 14 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/table/TableNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.table; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.table.TableNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class TableNode extends PMLBlockNode { 9 | 10 | public TableNode () { super(); } 11 | 12 | public @NotNull PMLNodeSpec getNodeSpec () { return TableNodeSpec.NODE; } 13 | } 14 | -------------------------------------------------------------------------------- /pmlc-commands/src/main/java/module-info.java: -------------------------------------------------------------------------------- 1 | module dev.pmlc.commands { 2 | 3 | requires dev.pp.basics; 4 | requires dev.pp.datatype; 5 | requires dev.pp.parameters; 6 | requires dev.pp.commands; 7 | requires dev.pp.text; 8 | 9 | requires dev.pdml.shared; 10 | requires dev.pdml.ext; 11 | requires dev.pdml.commands; 12 | requires dev.pdml.utils; 13 | 14 | requires dev.pmlc.data; 15 | requires dev.pmlc.converter; 16 | requires dev.pmlc.utils; 17 | 18 | requires info.picocli; 19 | } 20 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/table/TableRowNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.table; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.table.TableRowNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class TableRowNode extends PMLBlockNode { 9 | 10 | public TableRowNode () { super(); } 11 | 12 | public @NotNull PMLNodeSpec getNodeSpec () { return TableRowNodeSpec.NODE; } 13 | } 14 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/table/TableCellNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.table; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.table.TableCellNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class TableCellNode extends PMLBlockNode { 9 | 10 | public TableCellNode () { super(); } 11 | 12 | public @NotNull PMLNodeSpec getNodeSpec () { return TableCellNodeSpec.NODE; } 13 | } 14 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/VerbatimTextNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.VerbatimTextNodeSpec; 5 | import dev.pp.basics.annotations.NotNull; 6 | 7 | public class VerbatimTextNode extends PMLInlineNode { 8 | 9 | public VerbatimTextNode () { super(); } 10 | 11 | @SuppressWarnings ( "unchecked" ) 12 | public @NotNull PMLNodeSpec getNodeSpec () { return VerbatimTextNodeSpec.NODE; } 13 | } 14 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/table/TableFooterNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.table; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.table.TableFooterNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class TableFooterNode extends PMLBlockNode { 9 | 10 | public TableFooterNode () { super(); } 11 | 12 | public @NotNull PMLNodeSpec getNodeSpec () { return TableFooterNodeSpec.NODE; } 13 | } 14 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/table/TableHeaderNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.table; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.table.TableHeaderNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class TableHeaderNode extends PMLBlockNode { 9 | 10 | public TableHeaderNode () { super(); } 11 | 12 | public @NotNull PMLNodeSpec getNodeSpec () { return TableHeaderNodeSpec.NODE; } 13 | } 14 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/font/BoldNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline.font; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.font.BoldNodeSpec; 5 | import dev.pmlc.data.node.inline.PMLInlineNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class BoldNode extends PMLInlineNode { 9 | 10 | public BoldNode() { super(); } 11 | 12 | @SuppressWarnings ( "unchecked" ) 13 | public @NotNull PMLNodeSpec getNodeSpec () { return BoldNodeSpec.NODE; } 14 | } 15 | -------------------------------------------------------------------------------- /pmlc-parser/src/main/java/module-info.java: -------------------------------------------------------------------------------- 1 | module dev.pmlc.parser { 2 | 3 | requires dev.pp.basics; 4 | requires dev.pp.text; 5 | requires dev.pp.parameters; 6 | requires dev.pp.datatype; 7 | requires dev.pp.scripting; 8 | 9 | requires dev.pdml.data; 10 | requires dev.pdml.reader; 11 | requires dev.pdml.parser; 12 | requires dev.pdml.ext; 13 | requires dev.pdml.extscripting; 14 | requires dev.pdml.exttypes; 15 | requires dev.pdml.utils; 16 | 17 | requires dev.pmlc.data; 18 | 19 | exports dev.pmlc.parser; 20 | } 21 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/font/ItalicNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline.font; 2 | 3 | import dev.pmlc.data.nodespec.inline.font.ItalicNodeSpec; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.node.inline.PMLInlineNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class ItalicNode extends PMLInlineNode { 9 | 10 | public ItalicNode() { super(); } 11 | 12 | @SuppressWarnings ( "unchecked" ) 13 | public @NotNull PMLNodeSpec getNodeSpec () { return ItalicNodeSpec.NODE; } 14 | } 15 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/code/InputNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.code; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.code.InputNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class InputNode extends PMLBlockNode { 9 | 10 | 11 | public InputNode () { super(); } 12 | 13 | 14 | @SuppressWarnings ( "unchecked" ) 15 | public @NotNull PMLNodeSpec getNodeSpec () { return InputNodeSpec.NODE; } 16 | } 17 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/code/OutputNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.code; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.code.OutputNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class OutputNode extends PMLBlockNode { 9 | 10 | 11 | public OutputNode () { super(); } 12 | 13 | 14 | @SuppressWarnings ( "unchecked" ) 15 | public @NotNull PMLNodeSpec getNodeSpec () { return OutputNodeSpec.NODE; } 16 | } 17 | -------------------------------------------------------------------------------- /pmlc-utils/src/main/java/module-info.java: -------------------------------------------------------------------------------- 1 | module dev.pmlc.utils { 2 | 3 | requires dev.pp.basics; 4 | requires dev.pp.text; 5 | requires dev.pp.parameters; 6 | requires dev.pp.datatype; 7 | requires dev.pp.texttable; 8 | requires dev.pp.commands; 9 | 10 | requires dev.pdml.shared; 11 | requires dev.pdml.data; 12 | 13 | requires dev.pmlc.data; 14 | requires dev.pmlc.parser; 15 | requires dev.pmlc.converter; 16 | 17 | exports dev.pmlc.utils; 18 | exports dev.pmlc.utils.nodehandlers; 19 | exports dev.pmlc.utils.referencemanual; 20 | } 21 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/font/SubscriptNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline.font; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.font.SubscriptNodeSpec; 5 | import dev.pmlc.data.node.inline.PMLInlineNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class SubscriptNode extends PMLInlineNode { 9 | 10 | public SubscriptNode () { super(); } 11 | 12 | @SuppressWarnings ( "unchecked" ) 13 | public @NotNull PMLNodeSpec getNodeSpec () { return SubscriptNodeSpec.NODE; } 14 | } 15 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/code/HTMLCodeNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.code; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.code.HtmlCodeNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class HTMLCodeNode extends PMLBlockNode { 9 | 10 | 11 | public HTMLCodeNode () { super(); } 12 | 13 | 14 | @SuppressWarnings ( "unchecked" ) 15 | public @NotNull PMLNodeSpec getNodeSpec () { return HtmlCodeNodeSpec.NODE; } 16 | } 17 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/font/InlineCodeNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline.font; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.font.InlineCodeNodeSpec; 5 | import dev.pmlc.data.node.inline.PMLInlineNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class InlineCodeNode extends PMLInlineNode { 9 | 10 | public InlineCodeNode () { super(); } 11 | 12 | @SuppressWarnings ( "unchecked" ) 13 | public @NotNull PMLNodeSpec getNodeSpec () { return InlineCodeNodeSpec.NODE; } 14 | } 15 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/font/SuperscriptNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline.font; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.font.SuperscriptNodeSpec; 5 | import dev.pmlc.data.node.inline.PMLInlineNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class SuperscriptNode extends PMLInlineNode { 9 | 10 | public SuperscriptNode () { super(); } 11 | 12 | @SuppressWarnings ( "unchecked" ) 13 | public @NotNull PMLNodeSpec getNodeSpec () { return SuperscriptNodeSpec.NODE; } 14 | } 15 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/quote/QuoteSourceNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.quote; 2 | 3 | import dev.pmlc.data.node.block.PMLBlockNode; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.block.quote.QuoteSourceNodeSpec; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class QuoteSourceNode extends PMLBlockNode { 9 | 10 | 11 | public QuoteSourceNode () { super(); } 12 | 13 | 14 | @SuppressWarnings ( "unchecked" ) 15 | public @NotNull PMLNodeSpec getNodeSpec() { return QuoteSourceNodeSpec.NODE; } 16 | } 17 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/font/StrikethroughNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline.font; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.font.StrikethroughNodeSpec; 5 | import dev.pmlc.data.node.inline.PMLInlineNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class StrikethroughNode extends PMLInlineNode { 9 | 10 | public StrikethroughNode () { super(); } 11 | 12 | @SuppressWarnings ( "unchecked" ) 13 | public @NotNull PMLNodeSpec getNodeSpec () { return StrikethroughNodeSpec.NODE; } 14 | } 15 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/HeaderNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.HeaderNodeSpec; 5 | import dev.pp.basics.annotations.NotNull; 6 | 7 | public class HeaderNode extends PMLBlockNode { 8 | 9 | /* 10 | private int level = 1; 11 | public int getLevel() { return level; } 12 | public void setLevel ( int level ) { this.level = level; } 13 | */ 14 | 15 | 16 | public HeaderNode () { super(); } 17 | 18 | 19 | public @NotNull PMLNodeSpec getNodeSpec () { return HeaderNodeSpec.NODE; } 20 | } 21 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/admonition/AdmonitionLabelNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.admonition; 2 | 3 | import dev.pmlc.data.node.block.PMLBlockNode; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.block.admonition.AdmonitionLabelNodeSpec; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class AdmonitionLabelNode extends PMLBlockNode { 9 | 10 | 11 | public AdmonitionLabelNode () { super(); } 12 | 13 | 14 | @SuppressWarnings ( "unchecked" ) 15 | public @NotNull PMLNodeSpec getNodeSpec() { return AdmonitionLabelNodeSpec.NODE; } 16 | } 17 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Detailed information about configuring a multi-project build in Gradle can be found 3 | * in the user manual at https://docs.gradle.org/7.4/userguide/multi_project_builds.html 4 | */ 5 | 6 | rootProject.name = 'pml-companion' 7 | include ( 'pmlc-data', 'pmlc-parser', 'pmlc-converter', 'pmlc-utils', 'pmlc-commands' ) 8 | 9 | /* 10 | String PPDevRootDir = '../../../PP/dev/' 11 | // hack, to be removed if a better solution is found 12 | copy { 13 | from "${PPDevRootDir}buildSrc/src/main/groovy" 14 | into "./buildSrc/src/main/groovy" 15 | } 16 | include 'PP_basics' 17 | project ( ':PP_basics' ).projectDir = file ( "${PPDevRootDir}PP_basics" ) 18 | */ -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Description** 11 | A clear and concise description of the bug. 12 | 13 | **Reproducing** 14 | The simplest possible code example and/or steps to reproduce the bug. 15 | 16 | **Expected vs actual behavior** 17 | What result did you expect? 18 | What happened instead? 19 | 20 | **Application version** 21 | (e.g. PMLC v3.0.0) 22 | 23 | **Your OS name and version** 24 | (e.g. Windows 11) 25 | 26 | **Optional: Suggestion(s) to fix the bug** 27 | 28 | **Optional: Any other information that helps to fix the bug** 29 | -------------------------------------------------------------------------------- /pmlc-utils/src/test/java/dev/pmlc/utils/PMLToHTMLSnippetWriterTest.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.utils; 2 | 3 | import dev.pp.basics.utilities.string.StringConstants; 4 | import org.junit.jupiter.api.Test; 5 | 6 | import static org.junit.jupiter.api.Assertions.assertEquals; 7 | 8 | class PMLToHTMLSnippetWriterTest { 9 | 10 | @Test 11 | public void testGetHTMLSnippet() throws Exception { 12 | 13 | String input = "This is [i important]."; 14 | String output = "

This is important.

" + StringConstants.OS_NEW_LINE; 15 | assertEquals ( output, PMLToHTMLSnippetWriter.getHTMLSnippet ( input ) ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | 3 | ## Java Sources 4 | ############### 5 | *.gradle text 6 | *.java text 7 | 8 | ## Repository Configuration 9 | ########################### 10 | .editorconfig text eol=lf 11 | .gitattributes text eol=lf 12 | .gitconfig text eol=lf 13 | .gitignore text eol=lf 14 | .gitkeep text eol=lf 15 | .gitmodules text eol=lf 16 | .travis.yml text eol=lf 17 | 18 | ## Documentation Files 19 | ###################### 20 | *.md text 21 | *.pml text linguist-language=PML 22 | *.txt text 23 | LICENSE text 24 | 25 | ## Scripts 26 | ########## 27 | *.bat text eol=crlf 28 | *.cmd text eol=crlf 29 | *.sh text eol=lf 30 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/chapter/SubtitleNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.chapter; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.chapter.SubtitleNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | 8 | public class SubtitleNode extends PMLBlockNode { 9 | 10 | 11 | private int level = 1; 12 | public int getLevel() { return level; } 13 | public void setLevel ( int level ) { this.level = level; } 14 | 15 | 16 | public SubtitleNode () { super(); } 17 | 18 | 19 | public @NotNull PMLNodeSpec getNodeSpec () { return SubtitleNodeSpec.NODE; } 20 | } 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/enhancement.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Enhancement 3 | about: Suggest an enhancement or a new feature 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Description** 11 | A clear and concise description of the enhancement. 12 | 13 | **Motivation** 14 | Please explain _why_ the enhancement should be implemented. 15 | Tip: Provide before/after examples to demonstrate advantages. 16 | 17 | **Drawbacks** 18 | If applicable, please describe any disadvantages or inconveniences associated with the proposed enhancement/feature. 19 | If there are no drawbacks, just state "None". 20 | 21 | **Optional: Suggestion(s) to implement the enhancement** 22 | 23 | **Optional: Any other useful information** 24 | -------------------------------------------------------------------------------- /pmlc-parser/src/test/java/dev/pmlc/parser/PMLParserTest.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.parser; 2 | 3 | import dev.pmlc.data.nodespec.block.DocumentNodeSpec; 4 | import dev.pmlc.data.node.block.DocumentNode; 5 | import dev.pp.basics.annotations.NotNull; 6 | import dev.pp.text.inspection.TextErrorException; 7 | import org.junit.jupiter.api.Test; 8 | 9 | import static org.junit.jupiter.api.Assertions.*; 10 | 11 | class PMLParserTest { 12 | 13 | @Test 14 | public void testParseString() throws Exception { 15 | 16 | @NotNull DocumentNode documentNode = PMLParser.parseString ( "[doc]" ); 17 | assertEquals ( DocumentNodeSpec.NAME.toString(), documentNode.getName() ); 18 | 19 | assertThrows ( TextErrorException.class, () -> PMLParser.parseString ( "[foo]" ) ); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /pmlc-commands/src/main/java/dev/pmlc/commands/Start.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.commands; 2 | 3 | import dev.pmlc.data.PMLConstants; 4 | import dev.pp.basics.utilities.SimpleLogger; 5 | 6 | public class Start { 7 | 8 | public static void main ( String[] args ) { 9 | 10 | // https://clig.dev/#guidelines 11 | 12 | init(); 13 | 14 | int exitCode; 15 | if ( args.length == 1 && args[0].toLowerCase().endsWith ( PMLConstants.PML_FILE_NAME_EXTENSION_WITH_DOT ) ) { // e.g. pmlc index.pml 16 | exitCode = PMLCommands.PMLToHTML ( args[0] ); 17 | } else { 18 | exitCode = PMLCommands.runCommand ( args ); 19 | } 20 | 21 | System.exit ( exitCode ); 22 | } 23 | 24 | private static void init() { 25 | SimpleLogger.useSimpleFormat(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/PMLInlineNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline; 2 | 3 | import dev.pmlc.data.node.PMLNode; 4 | import dev.pp.basics.annotations.Nullable; 5 | import dev.pp.parameters.parameters.Parameters; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | public abstract class PMLInlineNode extends PMLNode { 11 | 12 | 13 | protected PMLInlineNode() { super(); } 14 | 15 | protected PMLInlineNode ( @Nullable Map HTMLAttributes ) { 16 | super ( HTMLAttributes ); 17 | } 18 | 19 | 20 | @Override 21 | public void setAttributes ( @Nullable Parameters parameters ) throws Exception { 22 | // do nothing 23 | } 24 | 25 | @Override 26 | public @Nullable List getChildNodes() { return inlineChildNodes; } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/list/ListNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.list; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.list.ListElementNodeSpec; 5 | import dev.pmlc.data.nodespec.block.list.ListNodeSpec; 6 | import dev.pmlc.data.node.block.PMLBlockNode; 7 | import dev.pmlc.data.node.validator.NodeValidatorContext; 8 | import dev.pp.basics.annotations.NotNull; 9 | 10 | public class ListNode extends PMLBlockNode { 11 | 12 | public ListNode () { super(); } 13 | 14 | public @NotNull PMLNodeSpec getNodeSpec () { return ListNodeSpec.NODE; } 15 | 16 | @Override 17 | public void validate ( @NotNull NodeValidatorContext context ) { 18 | 19 | context.checkHasChildren ( this ); 20 | context.checkChildrenType ( this, ListElementNodeSpec.NODE ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/list/ListElementNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.list; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.list.ListElementNodeSpec; 5 | import dev.pmlc.data.nodespec.block.list.ListNodeSpec; 6 | import dev.pmlc.data.node.block.PMLBlockNode; 7 | import dev.pmlc.data.node.validator.NodeValidatorContext; 8 | import dev.pp.basics.annotations.NotNull; 9 | 10 | public class ListElementNode extends PMLBlockNode { 11 | 12 | public ListElementNode () { super(); } 13 | 14 | public @NotNull PMLNodeSpec getNodeSpec () { return ListElementNodeSpec.NODE; } 15 | 16 | @Override 17 | public void validate ( @NotNull NodeValidatorContext context ) { 18 | 19 | context.checkHasChildren ( this ); 20 | context.checkParentType ( this, ListNodeSpec.NODE ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /pmlc-utils/src/main/java/dev/pmlc/utils/nodehandlers/impls/tests/MyIncompleteTextOutputWriter2.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.utils.nodehandlers.impls.tests; 2 | 3 | import dev.pmlc.data.node.block.DocumentNode; 4 | import dev.pmlc.utils.nodehandlers.impls.ThrowingNodesHandler; 5 | import dev.pp.basics.annotations.NotNull; 6 | 7 | import java.io.Writer; 8 | 9 | public class MyIncompleteTextOutputWriter2 extends ThrowingNodesHandler { 10 | 11 | private final @NotNull Writer writer; 12 | 13 | 14 | public MyIncompleteTextOutputWriter2 ( @NotNull Writer writer ) { 15 | this.writer = writer; 16 | } 17 | 18 | public @NotNull String getName () { return "text"; } 19 | 20 | 21 | public void document ( @NotNull DocumentNode node ) throws Exception { 22 | 23 | handleChildNodes ( node.getBlockChildNodes () ); 24 | } 25 | 26 | // public void writeItalic ( @NotNull ItalicNode node ) throws IOException 27 | } 28 | -------------------------------------------------------------------------------- /pmlc-commands/src/main/java/dev/pmlc/commands/PMLVersionCommand.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.commands; 2 | 3 | import dev.pmlc.data.PmlcVersion; 4 | import dev.pp.basics.annotations.NotNull; 5 | import dev.pp.basics.annotations.Nullable; 6 | import dev.pp.commands.command.CommandSpec; 7 | import dev.pp.parameters.parameters.Parameters; 8 | 9 | public class PMLVersionCommand { 10 | 11 | public static final @NotNull CommandSpec COMMAND = CommandSpec.builder ( 12 | "version", PMLVersionCommand::execute ) 13 | .documentation ( 14 | "Display PMLC's Version Number", 15 | "Write the PMLC version number to the standard output device.", 16 | "pmlc version" ) 17 | .build(); 18 | 19 | public static Void execute ( @Nullable Parameters parameters ) { 20 | 21 | System.out.println ( PmlcVersion.VERSION_TEXT ); 22 | 23 | return null; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/validator/NodeValidator.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.validator; 2 | 3 | import dev.pmlc.data.node.block.DocumentNode; 4 | import dev.pp.basics.annotations.NotNull; 5 | import dev.pp.text.inspection.message.TextError; 6 | import dev.pp.text.inspection.TextErrorException; 7 | import dev.pp.text.inspection.handler.TextInspectionMessageHandler; 8 | 9 | public class NodeValidator { 10 | 11 | public static void validateTree ( 12 | @NotNull DocumentNode documentNode, 13 | @NotNull TextInspectionMessageHandler errorHandler ) throws TextErrorException { 14 | 15 | TextError initialLastError = errorHandler.lastError(); 16 | 17 | NodeValidatorContext context = new NodeValidatorContext ( errorHandler ); 18 | documentNode.forEachNodeInTree ( true, node -> node.validate ( context ) ); 19 | 20 | errorHandler.throwIfNewErrors ( initialLastError ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /pmlc-utils/src/main/java/dev/pmlc/utils/nodehandlers/impls/tests/MyIncompleteTextOutputWriter1.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.utils.nodehandlers.impls.tests; 2 | 3 | import dev.pmlc.data.node.inline.font.ItalicNode; 4 | import dev.pmlc.utils.nodehandlers.impls.DoNothingNodesHandler; 5 | import dev.pp.basics.annotations.NotNull; 6 | 7 | import java.io.Writer; 8 | 9 | public class MyIncompleteTextOutputWriter1 extends DoNothingNodesHandler { 10 | 11 | private final @NotNull Writer writer; 12 | 13 | 14 | public MyIncompleteTextOutputWriter1 ( @NotNull Writer writer ) { 15 | this.writer = writer; 16 | } 17 | 18 | 19 | public @NotNull String getName () { return "text"; } 20 | 21 | 22 | // public void writeDocument ( @NotNull DocumentNode node ) throws IOException {} 23 | 24 | public void italic ( @NotNull ItalicNode node ) throws Exception { 25 | 26 | handleChildNodes ( node.getInlineChildNodes () ); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /pmlc-parser/src/main/java/dev/pmlc/parser/PMLAttributeUtils.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.parser; 2 | 3 | import dev.pp.basics.annotations.NotNull; 4 | 5 | public class PMLAttributeUtils { 6 | 7 | public static final @NotNull String HTML_ATTRIBUTE_PREFIX = "html_"; 8 | 9 | public static final int HTML_ATTRIBUTE_PREFIX_LENGTH = HTML_ATTRIBUTE_PREFIX.length(); 10 | // public static final @NotNull String HTML_CLASS_ATTRIBUTE_NAME = HTML_ATTRIBUTE_PREFIX + "class"; 11 | 12 | public static boolean isHTMLAttributeName ( @NotNull String name ) { 13 | 14 | return name.startsWith ( HTML_ATTRIBUTE_PREFIX ) && 15 | name.length() > HTML_ATTRIBUTE_PREFIX_LENGTH; 16 | } 17 | 18 | public static @NotNull String removeHTMLAttributePrefix ( @NotNull String prefixedName ) { 19 | 20 | assert prefixedName.length() > HTML_ATTRIBUTE_PREFIX_LENGTH; 21 | 22 | return prefixedName.substring ( HTML_ATTRIBUTE_PREFIX_LENGTH ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /pmlc-converter/src/main/java/dev/pmlc/converter/pmltohtml/options/PMLToHTMLOptions.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.converter.pmltohtml.options; 2 | 3 | import dev.pmlc.data.node.block.code.SourceCodeHighlighter; 4 | import dev.pmlc.data.node.block.TOCPosition; 5 | import dev.pp.basics.annotations.NotNull; 6 | import dev.pp.basics.annotations.Nullable; 7 | 8 | import java.nio.file.Path; 9 | import java.util.List; 10 | import java.util.function.Supplier; 11 | 12 | public record PMLToHTMLOptions( 13 | @Nullable List CSSFiles, 14 | @Nullable List resources, 15 | @Nullable Supplier HTMLPageStartTemplate, 16 | @Nullable Supplier HTMLPageEndTemplate, 17 | @NotNull TOCPosition TOCPosition, 18 | @Nullable String TOCTitle, 19 | int maxTOCChapterLevel, 20 | @NotNull SourceCodeHighlighter sourceCodeHighlighter, 21 | boolean omitCSS ) { 22 | 23 | 24 | public static @NotNull PMLToHTMLOptionsBuilder builder() { return new PMLToHTMLOptionsBuilder(); } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Customized Git scripts 2 | bin/Git/ 3 | 4 | # Gradle project-specific cache directory 5 | **/.gradle 6 | 7 | # IntelliJ Idea project-specific cache directory 8 | **/.idea 9 | 10 | # Gradle build output directory 11 | **/build 12 | 13 | # 'temp' directories 14 | **/temp 15 | 16 | # Directories and files starting with --- 17 | **/---* 18 | 19 | # Directories and files starting with NOGIT_ 20 | **/NOGIT_* 21 | 22 | 23 | ############################ 24 | ## COMMON IGNORE PATTERNS ## 25 | ############################ 26 | 27 | ## Apps Local Settings & Temp Files 28 | ################################### 29 | 30 | # Chrome's debug logs for local HTML pages: 31 | debug.log 32 | 33 | # Links and URLs: 34 | *.lnk 35 | *.url 36 | 37 | ## Linux 38 | ######## 39 | *~ 40 | .directory 41 | .fuse_hidden* 42 | .nfs* 43 | .Trash-* 44 | 45 | ## macOS 46 | ######## 47 | *.DS_Store 48 | ._* 49 | .AppleDouble 50 | .LSOverride 51 | Icon 52 | 53 | ## Windows 54 | ########## 55 | Thumbs.db 56 | ehthumbs.db 57 | ehthumbs_vista.db 58 | Desktop.ini 59 | .BIN/ 60 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/footnote/FootnotesPlaceholderNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.footnote; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.footnote.FootnotesPlaceholderNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | import dev.pp.basics.annotations.Nullable; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class FootnotesPlaceholderNode extends PMLBlockNode { 13 | 14 | 15 | private final @NotNull List definitions = new ArrayList<>(); 16 | @Nullable public List getDefinitions() { return definitions; } 17 | 18 | public void addDefinition ( FootnoteDefinitionNode definition ) { 19 | definitions.add ( definition ); 20 | } 21 | 22 | 23 | public FootnotesPlaceholderNode () { super(); } 24 | 25 | 26 | @SuppressWarnings ( "unchecked" ) 27 | public @NotNull PMLNodeSpec getNodeSpec () { return FootnotesPlaceholderNodeSpec.NODE; } 28 | } 29 | -------------------------------------------------------------------------------- /pmlc-commands/src/main/java/dev/pmlc/commands/Dummy.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.commands; 2 | 3 | import picocli.CommandLine; 4 | 5 | import java.util.concurrent.Callable; 6 | 7 | /* 8 | This dummy class is necessary to force the Picocli annotation processor to create files 9 | reflect-config.json, proxy-config.json, and resource-config.json 10 | in directory build\classes\java\main\META-INF\native-image\picocli-generated\PMLC_cli\ 11 | These files are needed by GraalVM to create native images (because Picocli uses reflection). 12 | 'mixinStandardHelpOptions = true' is needed to add 'picocli.CommandLine$AutoHelpMixin' in 'reflect-config.json' 13 | 14 | Reason for this class: bug(?) in Picocli 4.6.3: The json files are not created if Picocli commands are only created 15 | programmatically (and not declaratively using annotations) 16 | */ 17 | @CommandLine.Command (name = "dummy", mixinStandardHelpOptions = true) 18 | public class Dummy implements Callable { 19 | 20 | @Override 21 | public Integer call() throws Exception { // the business logic... 22 | return 0; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/TextNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.TextNodeSpec; 5 | import dev.pp.basics.annotations.NotNull; 6 | import dev.pp.basics.annotations.Nullable; 7 | import dev.pp.text.location.TextLocation; 8 | import dev.pp.text.token.TextToken; 9 | 10 | public class TextNode extends PMLInlineNode { 11 | 12 | // TODO? @NotNull -> @Nullable 13 | // private @NotNull String text = ""; 14 | public @NotNull String getText() { return rawText == null ? "" : rawText; } 15 | 16 | 17 | public TextNode() { super(); } 18 | 19 | public TextNode ( @NotNull TextToken token ) { 20 | 21 | super(); 22 | this.rawText = token.getText(); 23 | this.startToken = token; 24 | } 25 | 26 | public TextNode ( @NotNull String text, @Nullable TextLocation location ) { 27 | 28 | this ( new TextToken ( text, location ) ); 29 | } 30 | 31 | 32 | @SuppressWarnings ( "unchecked" ) 33 | public @NotNull PMLNodeSpec getNodeSpec () { return TextNodeSpec.NODE; } 34 | } 35 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/chapter/TitleNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.chapter; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.chapter.TitleNodeSpec; 5 | import dev.pmlc.data.node.block.DocumentNode; 6 | import dev.pmlc.data.node.block.PMLBlockNode; 7 | import dev.pmlc.data.node.inline.TextNode; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.basics.annotations.Nullable; 10 | import dev.pp.text.location.TextLocation; 11 | 12 | public class TitleNode extends PMLBlockNode { 13 | 14 | 15 | private int level = 1; 16 | public int getLevel() { return level; } 17 | public void setLevel ( int level ) { this.level = level; } 18 | 19 | 20 | public TitleNode () { super(); } 21 | 22 | public TitleNode ( @NotNull String text, int level, @Nullable TextLocation location ) { 23 | 24 | super(); 25 | this.level = level; 26 | addInlineChildNode ( new TextNode ( text, location ) ); 27 | } 28 | 29 | 30 | public @NotNull PMLNodeSpec getNodeSpec () { return TitleNodeSpec.NODE; } 31 | 32 | public boolean isDocumentTitle() { return parentNode instanceof DocumentNode; } 33 | } 34 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/font/BoldNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline.font; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.font.BoldNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.documentation.SimpleDocumentation; 10 | 11 | import java.util.function.Supplier; 12 | 13 | public class BoldNodeSpec { 14 | 15 | public static final @NotNull NodeName NAME = new NodeName ( "b" ); 16 | 17 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 18 | "Bold Text", 19 | null, 20 | "This is a [b huge] advantage." ); 21 | 22 | public static final @NotNull String HTML_TAG = "b"; 23 | 24 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "bold" ); 25 | 26 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForInlineNode ( 27 | NAME, null, true, true, DOCUMENTATION, 28 | BoldNode::new, PMLNodesHandler::bold, HTML_TAG, CSS_CLASS ); 29 | } 30 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/PmlcVersion.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data; 2 | 3 | import dev.pp.basics.annotations.NotNull; 4 | 5 | public class PmlcVersion { 6 | 7 | public static @NotNull String APPLICATION_NAME = "PML Companion"; 8 | public static @NotNull String APPLICATION_NAME_WITHOUT_SPACES = APPLICATION_NAME.replace ( ' ', '_' ); 9 | public static @NotNull String APPLICATION_SHORT_NAME = "PMLC"; 10 | 11 | public static @NotNull String VERSION = "4.0.0"; 12 | public static @NotNull String DATE_PUBLISHED = "2023-02-23"; 13 | public static @NotNull String VERSION_TEXT = APPLICATION_SHORT_NAME + " " + VERSION + " " + DATE_PUBLISHED; 14 | 15 | public static @NotNull String getMajorVersion() { 16 | 17 | int index = VERSION.indexOf ( "." ); 18 | return VERSION.substring ( 0, index ); 19 | } 20 | 21 | public static @NotNull String getMinorVersion() { 22 | 23 | int index = VERSION.lastIndexOf ( "." ); 24 | return VERSION.substring ( index + 1 ); 25 | } 26 | 27 | public static int getMajorVersionNumber() { 28 | return Integer.parseInt ( getMajorVersion() ); 29 | } 30 | 31 | public static int getMinorVersionNumber() { 32 | return Integer.parseInt ( getMinorVersion() ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/footnote/InlineFootnoteNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline.footnote; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.footnote.InlineFootnoteNodeSpec; 5 | import dev.pmlc.data.node.inline.PMLInlineNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | import dev.pp.basics.annotations.Nullable; 8 | 9 | public class InlineFootnoteNode extends PMLInlineNode { 10 | 11 | private @Nullable FootnoteReferenceNode referenceNode = null; 12 | @Nullable public FootnoteReferenceNode getReferenceNode () { return referenceNode; } 13 | public void setReferenceNode ( @NotNull FootnoteReferenceNode referenceNode ) { this.referenceNode = referenceNode; } 14 | 15 | /* 16 | private @Nullable FootnoteDefinitionNode definitionNode = null; 17 | @Nullable public FootnoteDefinitionNode getDefinitionNode() { return definitionNode; } 18 | public void setDefinitionNode ( @NotNull FootnoteDefinitionNode definitionNode ) { this.definitionNode = definitionNode; } 19 | */ 20 | 21 | public InlineFootnoteNode () { super(); } 22 | 23 | 24 | @SuppressWarnings ( "unchecked" ) 25 | public @NotNull PMLNodeSpec getNodeSpec () { return InlineFootnoteNodeSpec.NODE; } 26 | } 27 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/NewLineNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.NewLineNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.documentation.SimpleDocumentation; 10 | 11 | import java.util.function.Supplier; 12 | 13 | public class NewLineNodeSpec { 14 | 15 | public static final @NotNull NodeName NAME = new NodeName ( "nl" ); 16 | 17 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 18 | "New Line", 19 | "An explicit new line (line break) inserted in the document.", 20 | "Line 1[nl][nl]Line 2" ); 21 | 22 | public static final @NotNull String HTML_TAG = ""; 23 | 24 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "new-line" ); 25 | 26 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForInlineNode ( 27 | NAME, null, false, false, DOCUMENTATION, 28 | NewLineNode::new, PMLNodesHandler::newLine, HTML_TAG, CSS_CLASS ); 29 | } 30 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/font/ItalicNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline.font; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.font.ItalicNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.documentation.SimpleDocumentation; 10 | 11 | import java.util.function.Supplier; 12 | 13 | public class ItalicNodeSpec { 14 | 15 | public static final @NotNull NodeName NAME = new NodeName ( "i" ); 16 | 17 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 18 | "Italic Text", 19 | null, 20 | """ 21 | We want [i simplicity]. 22 | 23 | This is a [b [i very] important] point.""" ); 24 | 25 | public static final @NotNull String HTML_TAG = "i"; 26 | 27 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "italic" ); 28 | 29 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForInlineNode ( 30 | NAME, null, true, true, DOCUMENTATION, 31 | ItalicNode::new, PMLNodesHandler::italic, HTML_TAG, CSS_CLASS ); 32 | } 33 | -------------------------------------------------------------------------------- /pmlc-commands/src/main/java/dev/pmlc/commands/CreateCommandsReferenceManualCommand.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.commands; 2 | 3 | import dev.pmlc.utils.referencemanual.CommandsReferenceManualCreator; 4 | import dev.pp.basics.annotations.NotNull; 5 | import dev.pp.basics.annotations.Nullable; 6 | import dev.pp.commands.command.CommandSpec; 7 | import dev.pp.parameters.parameters.Parameters; 8 | 9 | public class CreateCommandsReferenceManualCommand { 10 | 11 | public static final @NotNull CommandSpec COMMAND = CommandSpec.builder ( 12 | "create_commands_reference_manual", CreateCommandsReferenceManualCommand::execute ) 13 | .alternativeName ( "ccrm" ) 14 | .documentation ( 15 | "Create Commands Reference Manual", 16 | """ 17 | This command creates the 'PML Commands Reference Manual'. 18 | The auto-generated PML file is stored in sub-directory 'input' of the current working directory. 19 | The output is stored in sub-directory 'output' of the current working directory.""", 20 | "pmlc create_commands_manual" ) 21 | .build(); 22 | 23 | public static Void execute ( @Nullable Parameters parameters ) throws Exception { 24 | 25 | new CommandsReferenceManualCreator().createManual ( PMLCommands.COMMANDS ); 26 | 27 | return null; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /pmlc-utils/src/main/java/dev/pmlc/utils/nodehandlers/impls/tests/WriteNodeNameDelegate.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.utils.nodehandlers.impls.tests; 2 | 3 | import dev.pmlc.data.node.PMLNode; 4 | import dev.pmlc.data.node.handler.PMLNodesHandler; 5 | import dev.pmlc.utils.nodehandlers.impls.DelegatingNodesHandler; 6 | import dev.pmlc.utils.nodehandlers.impls.NodesHandlerDelegate; 7 | import dev.pp.basics.annotations.NotNull; 8 | import dev.pp.basics.utilities.string.StringConstants; 9 | 10 | import java.io.IOException; 11 | import java.io.Writer; 12 | 13 | public class WriteNodeNameDelegate implements NodesHandlerDelegate { 14 | 15 | 16 | public static PMLNodesHandler getNodesHandler ( @NotNull Writer writer ) { 17 | return new DelegatingNodesHandler ( new WriteNodeNameDelegate ( writer ) ); 18 | } 19 | 20 | 21 | private final @NotNull Writer writer; 22 | 23 | 24 | public WriteNodeNameDelegate ( @NotNull Writer writer ) { 25 | this.writer = writer; 26 | } 27 | 28 | 29 | public @NotNull String getName() { return "node_names_writer"; } 30 | 31 | public void start() {} 32 | 33 | public void end() {} 34 | 35 | public void handleNode ( @NotNull PMLNode node ) throws IOException { 36 | 37 | writer.write ( node.getNodeSpec ().getName().toString() ); 38 | writer.write ( StringConstants.OS_NEW_LINE ); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/admonition/NoteNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.admonition; 2 | 3 | import dev.pmlc.data.node.block.PMLBlockNode; 4 | import dev.pmlc.data.node.block.ParagraphNode; 5 | import dev.pmlc.data.node.inline.TextNode; 6 | import dev.pmlc.data.nodespec.PMLNodeSpec; 7 | import dev.pmlc.data.nodespec.block.admonition.NoteNodeSpec; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.token.TextToken; 10 | 11 | public class NoteNode extends PMLBlockNode { 12 | 13 | 14 | private static final @NotNull AdmonitionLabelNode LABEL_NODE = createLabelNode(); 15 | 16 | private static @NotNull AdmonitionLabelNode createLabelNode() { 17 | 18 | TextNode textNode = new TextNode ( new TextToken ( "Note", null ) ); 19 | ParagraphNode paragraphNode = new ParagraphNode(); 20 | paragraphNode.addInlineChildNode ( textNode ); 21 | AdmonitionLabelNode labelNode = new AdmonitionLabelNode(); 22 | labelNode.addBlockChildNode ( paragraphNode ); 23 | return labelNode; 24 | } 25 | 26 | 27 | 28 | public NoteNode() { 29 | super(); 30 | } 31 | 32 | 33 | @SuppressWarnings ( "unchecked" ) 34 | public @NotNull PMLNodeSpec getNodeSpec() { return NoteNodeSpec.NODE; } 35 | 36 | public @NotNull AdmonitionLabelNode getLabelNode() { return LABEL_NODE; } 37 | } 38 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/font/InlineCodeNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline.font; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.font.InlineCodeNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.documentation.SimpleDocumentation; 10 | 11 | import java.util.function.Supplier; 12 | 13 | public class InlineCodeNodeSpec { 14 | 15 | public static final @NotNull NodeName NAME = new NodeName ( "c" ); 16 | 17 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 18 | "Inline Source Code", 19 | "Source code embedded within text.", 20 | "The assignment [c pi = 3.1415] means we are using [i four] decimals for [c pi]." ); 21 | 22 | public static final @NotNull String HTML_TAG = "code"; 23 | 24 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "inline-code" ); 25 | 26 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForRawTextInlineNode ( 27 | NAME, null, true, DOCUMENTATION, 28 | InlineCodeNode::new, PMLNodesHandler::inlineCode, HTML_TAG, CSS_CLASS ); 29 | } 30 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/code/SourceCodeNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.code; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.code.SourceCodeNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | import dev.pp.basics.annotations.Nullable; 8 | import dev.pp.parameters.parameters.Parameters; 9 | 10 | public class SourceCodeNode extends PMLBlockNode { 11 | 12 | private @Nullable String language = null; 13 | public @Nullable String getLanguage() { 14 | return language; 15 | } 16 | 17 | private boolean useHighlighter = true; 18 | public boolean getUseHighlighter() { 19 | return useHighlighter; 20 | } 21 | 22 | 23 | public SourceCodeNode () { super(); } 24 | 25 | 26 | @SuppressWarnings ( "unchecked" ) 27 | public @NotNull PMLNodeSpec getNodeSpec () { return SourceCodeNodeSpec.NODE; } 28 | 29 | @Override 30 | public void setAttributes ( @Nullable Parameters parameters ) throws Exception { 31 | 32 | super.setAttributes ( parameters ); 33 | 34 | if ( parameters == null ) return; 35 | 36 | language = parameters.castedValue ( SourceCodeNodeSpec.LANGUAGE_ATTRIBUTE ); 37 | useHighlighter = parameters.nonNullCastedValue ( SourceCodeNodeSpec.USE_HIGHLIGHTER_ATTRIBUTE ); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/SpanNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.SpanNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.documentation.SimpleDocumentation; 10 | 11 | import java.util.function.Supplier; 12 | 13 | public class SpanNodeSpec { 14 | 15 | public static final @NotNull NodeName NAME = new NodeName ( "span" ); 16 | 17 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 18 | "Span", 19 | "This inline node is typically used to render a HTML ... inline element with a specific set of HTML attributes.", 20 | "This is a [span (html_style=\"color:red;background-color:yellow\") huge] advantage." ); 21 | 22 | public static final @NotNull String HTML_TAG = "span"; 23 | 24 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "span" ); 25 | 26 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForInlineNode ( 27 | NAME, null, true, true, DOCUMENTATION, 28 | SpanNode::new, PMLNodesHandler::span, HTML_TAG, CSS_CLASS ); 29 | } 30 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/font/StrikethroughNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline.font; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.font.StrikethroughNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.documentation.SimpleDocumentation; 10 | 11 | import java.util.function.Supplier; 12 | 13 | public class StrikethroughNodeSpec { 14 | 15 | public static final @NotNull NodeName NAME = new NodeName ( "strike" ); 16 | 17 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 18 | "Strikethrough Text", 19 | "Strikethrough text is rendered with a line through it.", 20 | """ 21 | [strike Only 50 tickets left.] 22 | 23 | SOLD OUT!""" ); 24 | 25 | public static final @NotNull String HTML_TAG = "s"; 26 | 27 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "strikethrough" ); 28 | 29 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForInlineNode ( 30 | NAME, null, true, true, DOCUMENTATION, 31 | StrikethroughNode::new, PMLNodesHandler::strikethrough, HTML_TAG, CSS_CLASS ); 32 | } 33 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/TOCNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.block.TOCNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.basics.annotations.Nullable; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class TOCNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "toc" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "TOC Entry", 21 | "", 22 | "" ); 23 | 24 | public static final @Nullable ParameterSpecs ATTRIBUTES = null; 25 | 26 | public static final @NotNull String HTML_TAG = "li"; 27 | 28 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "toc-leaf-node" ); 29 | 30 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 31 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 32 | TOCNode::new, 33 | PMLNodesHandler::TOC, 34 | HTML_TAG, CSS_CLASS ); 35 | } 36 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/font/SubscriptNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline.font; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.font.SubscriptNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.documentation.SimpleDocumentation; 10 | 11 | import java.util.function.Supplier; 12 | 13 | public class SubscriptNodeSpec { 14 | 15 | public static final @NotNull NodeName NAME = new NodeName ( "sub" ); 16 | 17 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 18 | "Subscript Text", 19 | "Subscript text is rendered in a smaller font below the normal text line.", 20 | """ 21 | Water: H[sub 2]O 22 | 23 | This is [sub subscript], and this is [sup superscript]""" ); 24 | 25 | public static final @NotNull String HTML_TAG = "sub"; 26 | 27 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "subscript" ); 28 | 29 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForInlineNode ( 30 | NAME, null, true, true, DOCUMENTATION, 31 | SubscriptNode::new, PMLNodesHandler::subscript, HTML_TAG, CSS_CLASS ); 32 | } 33 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/font/SuperscriptNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline.font; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.font.SuperscriptNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.documentation.SimpleDocumentation; 10 | 11 | import java.util.function.Supplier; 12 | 13 | public class SuperscriptNodeSpec { 14 | 15 | public static final @NotNull NodeName NAME = new NodeName ( "sup" ); 16 | 17 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 18 | "Superscript Text", 19 | "Superscript text is rendered in a smaller font above the normal text line.", 20 | """ 21 | 2[sup 4] = 16 22 | 23 | This is [sup superscript], and this is [sub subscript]""" ); 24 | 25 | public static final @NotNull String HTML_TAG = "sup"; 26 | 27 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "superscript" ); 28 | 29 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForInlineNode ( 30 | NAME, null, true, true, DOCUMENTATION, 31 | SuperscriptNode::new, PMLNodesHandler::superscript, HTML_TAG, CSS_CLASS ); 32 | } 33 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/TextNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.TextNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.documentation.SimpleDocumentation; 10 | 11 | import java.util.function.Supplier; 12 | 13 | public class TextNodeSpec { 14 | 15 | public static final @NotNull NodeName NAME = new NodeName ( "text" ); 16 | 17 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 18 | "Text", 19 | """ 20 | A node containing text. 21 | Normally this node is not used in hand-written documents, because free text is implicitly contained in a 'text' node.""", 22 | """ 23 | [text All is very well.] 24 | All is very well. 25 | """ ); 26 | 27 | public static final @NotNull String HTML_TAG = ""; 28 | 29 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "text" ); 30 | 31 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForRawTextInlineNode ( 32 | NAME, null, true, DOCUMENTATION, 33 | TextNode::new, PMLNodesHandler::text, HTML_TAG, CSS_CLASS ); 34 | } 35 | -------------------------------------------------------------------------------- /pmlc-utils/src/main/java/dev/pmlc/utils/referencemanual/ReferenceManualResources.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.utils.referencemanual; 2 | 3 | import dev.pp.basics.annotations.NotNull; 4 | import dev.pp.basics.utilities.ResourcesUtils; 5 | 6 | import java.io.IOException; 7 | import java.nio.file.Path; 8 | 9 | public class ReferenceManualResources { 10 | 11 | private static final @NotNull Path REL_RESOURCES_DIR = Path.of ("data/ref_manual/resources" ); 12 | 13 | public static void copyResources ( @NotNull Path targetRootDirectory ) throws IOException { 14 | 15 | copyResource ( "media/bird_talk.mp3", targetRootDirectory, false ); 16 | copyResource ( "media/gold_star.png", targetRootDirectory, false ); 17 | copyResource ( "media/red_flower.mp4", targetRootDirectory, false ); 18 | copyResource ( "media/strawberries.jpg", targetRootDirectory, false ); 19 | copyResource ( "source_code/hello_world.ppl", targetRootDirectory, true ); 20 | } 21 | 22 | private static void copyResource ( 23 | @NotNull String resource, 24 | @NotNull Path targetRootDirectory, 25 | boolean isTextFile ) throws IOException { 26 | 27 | Path resourcePath = REL_RESOURCES_DIR.resolve ( Path.of ( resource ) ); 28 | @NotNull Path targetFile = targetRootDirectory.resolve ( resource ); 29 | ResourcesUtils.copyResourceToFile ( 30 | resourcePath, ReferenceManualResources.class, targetFile, isTextFile, true ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/VerbatimTextNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.VerbatimTextNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.documentation.SimpleDocumentation; 10 | 11 | import java.util.function.Supplier; 12 | 13 | public class VerbatimTextNodeSpec { 14 | 15 | public static final @NotNull NodeName NAME = new NodeName ( "verbatim" ); 16 | 17 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 18 | "Verbatim Text", 19 | """ 20 | Raw, verbatim text that is rendered as is, without any transformations. 21 | Note: The text still has to be escaped, according to the standard PML escaping rules.""", 22 | "Math's ring operator is [verbatim ∘]." ); 23 | 24 | public static final @NotNull String HTML_TAG = ""; 25 | 26 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "verbatim" ); 27 | 28 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForRawTextInlineNode ( 29 | NAME, null, true, DOCUMENTATION, 30 | VerbatimTextNode::new, PMLNodesHandler::verbatimText, HTML_TAG, CSS_CLASS ); 31 | } 32 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/admonition/NoteNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.admonition; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.admonition.NoteNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class NoteNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "note" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Note", 21 | "A note is an admonition with label 'Note'.", 22 | "[note Please remember that ...]" ); 23 | 24 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 25 | 26 | public static final @NotNull String HTML_TAG = AdmonitionNodeSpec.HTML_TAG; 27 | 28 | public static final @NotNull String CSS_CLASS = AdmonitionNodeSpec.CSS_CLASS; 29 | 30 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 31 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 32 | NoteNode::new, PMLNodesHandler::note, HTML_TAG, CSS_CLASS ); 33 | } 34 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/SpaceNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.SpaceNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.documentation.SimpleDocumentation; 10 | 11 | import java.util.function.Supplier; 12 | 13 | public class SpaceNodeSpec { 14 | 15 | public static final @NotNull NodeName NAME = new NodeName ( "sp" ); 16 | 17 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 18 | "Space Character", 19 | "An explicit space character inserted in the document. Whitespace composed of several characters (such as two spaces) is always converted into a single space (as in HTML). Hence, this node can be used to explicitly insert two or more spaces.", 20 | """ 21 | This is g o o d ! [- 2 spaces will result in ONE space -] 22 | 23 | This is [sp]g[sp][sp]o[sp][sp]o[sp][sp]d[sp]!""" ); 24 | 25 | public static final @NotNull String HTML_TAG = ""; 26 | 27 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "space" ); 28 | 29 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForInlineNode ( 30 | NAME, null, false, false, DOCUMENTATION, 31 | SpaceNode::new, PMLNodesHandler::space, HTML_TAG, CSS_CLASS ); 32 | } 33 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/MonospaceNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.MonospaceNodeSpec; 5 | import dev.pmlc.data.node.inline.PMLInlineNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | import dev.pp.basics.annotations.Nullable; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class MonospaceNode extends PMLBlockNode { 13 | 14 | // A monospace node can only contain _inline_ child nodes 15 | 16 | public void setBlockChildNodes ( @Nullable List blockChildNodes ) { 17 | if ( blockChildNodes != null ) throwIfAddingBlockChildNode(); 18 | } 19 | 20 | 21 | public MonospaceNode () { super(); } 22 | 23 | /* 24 | public MonospaceNode ( @Nullable List inlineChildNodes ) { 25 | 26 | super(); 27 | this.inlineChildNodes = inlineChildNodes; 28 | } 29 | */ 30 | 31 | public @NotNull PMLNodeSpec getNodeSpec () { return MonospaceNodeSpec.NODE; } 32 | 33 | public void addBlockChildNode ( @NotNull PMLBlockNode node ) { 34 | throwIfAddingBlockChildNode(); 35 | } 36 | 37 | public void addInlineChildNode ( @NotNull PMLInlineNode node ) { 38 | 39 | if ( inlineChildNodes == null ) inlineChildNodes = new ArrayList<>(); 40 | inlineChildNodes.add ( node ); 41 | } 42 | 43 | private void throwIfAddingBlockChildNode() { 44 | throw new RuntimeException ( "A monospace node can only contain inline child nodes. Block child nodes are not allowed." ); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/media/AudioNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.media; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.media.AudioNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | import dev.pp.basics.annotations.Nullable; 8 | import dev.pp.basics.utilities.string.HTextAlign; 9 | import dev.pp.parameters.parameters.Parameters; 10 | 11 | public class AudioNode extends PMLBlockNode { 12 | 13 | private @NotNull String source = ""; 14 | public @NotNull String getSource() { 15 | return source; 16 | } 17 | 18 | private @NotNull HTextAlign horizontalAlignment = HTextAlign.LEFT; 19 | public @NotNull HTextAlign getHorizontalAlignment() { 20 | return horizontalAlignment; 21 | } 22 | 23 | private @Nullable Boolean border = false; 24 | public @Nullable Boolean getBorder() { 25 | return border; 26 | } 27 | 28 | 29 | public AudioNode () { super(); } 30 | 31 | 32 | public @NotNull PMLNodeSpec getNodeSpec () { return AudioNodeSpec.NODE; } 33 | 34 | @Override 35 | public void setAttributes ( @Nullable Parameters parameters ) throws Exception { 36 | 37 | assert parameters != null; 38 | 39 | super.setAttributes ( parameters ); 40 | 41 | source = parameters.nonNullCastedValue ( AudioNodeSpec.SOURCE_ATTRIBUTE ); 42 | horizontalAlignment = parameters.nonNullCastedValue ( AudioNodeSpec.HORIZONTAL_ALIGNMENT ); 43 | border = parameters.nonNullCastedValue ( AudioNodeSpec.BORDER ); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/CaptionNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.CaptionNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class CaptionNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "caption" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Caption", 21 | "A small title that is not part of the table of contents, typically displayed below a block element (image, video, table, etc.).", 22 | "[caption Figure 1: Top Brain Boosters]" ); 23 | 24 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 25 | 26 | public static final @NotNull String HTML_TAG = "div"; 27 | 28 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "caption" ); 29 | 30 | public static final @NotNull PMLNodeSpec NODE = 31 | PMLNodeSpecCreator.createForBlockNodeWithInlineChildNodes ( 32 | NAME, ATTRIBUTES, true, 33 | DOCUMENTATION, CaptionNode::new, PMLNodesHandler::caption, HTML_TAG, CSS_CLASS ); 34 | } 35 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/ParagraphNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.ParagraphNodeSpec; 5 | import dev.pmlc.data.node.inline.PMLInlineNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | import dev.pp.basics.annotations.Nullable; 8 | import dev.pp.text.token.TextToken; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | public class ParagraphNode extends PMLBlockNode { 14 | 15 | // A paragraph node can only contain _inline_ child nodes 16 | 17 | public void setBlockChildNodes ( @Nullable List blockChildNodes ) { 18 | if ( blockChildNodes != null ) throwIfAddingBlockChildNode(); 19 | } 20 | 21 | 22 | public ParagraphNode() { super(); } 23 | 24 | public ParagraphNode ( @NotNull TextToken startToken ) { 25 | 26 | super(); 27 | this.startToken = startToken; 28 | } 29 | 30 | 31 | @SuppressWarnings ( "unchecked" ) 32 | public @NotNull PMLNodeSpec getNodeSpec () { return ParagraphNodeSpec.NODE; } 33 | 34 | public void addBlockChildNode ( @NotNull PMLBlockNode node ) { 35 | throwIfAddingBlockChildNode(); 36 | } 37 | 38 | public void addInlineChildNode ( @NotNull PMLInlineNode node ) { 39 | 40 | if ( inlineChildNodes == null ) inlineChildNodes = new ArrayList<>(); 41 | inlineChildNodes.add ( node ); 42 | } 43 | 44 | private void throwIfAddingBlockChildNode() { 45 | throw new RuntimeException ( "A paragraph node can only contain inline child nodes. Block child nodes are not allowed." ); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/DocumentNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.DocumentNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class DocumentNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "doc" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Document", 21 | "Every PML document must start with a 'doc' node. It is the root node of the document.", 22 | """ 23 | [doc [title A Nice Surprise] 24 | 25 | Author: Giovanni Spiridigliotsky 26 | 27 | Lorem ipsum blah blah blah 28 | ]""" ); 29 | 30 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 31 | 32 | public static final @NotNull String HTML_TAG = "article"; 33 | 34 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "doc-text" ); 35 | 36 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 37 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 38 | DocumentNode::new, PMLNodesHandler::document, HTML_TAG, CSS_CLASS ); 39 | } 40 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/module-info.java: -------------------------------------------------------------------------------- 1 | module dev.pmlc.data { 2 | 3 | requires dev.pp.basics; 4 | requires dev.pp.text; 5 | requires dev.pp.parameters; 6 | requires dev.pp.datatype; 7 | 8 | requires dev.pdml.shared; 9 | requires dev.pdml.data; 10 | requires dev.pdml.parser; 11 | requires dev.pdml.exttypes; 12 | 13 | exports dev.pmlc.data; 14 | exports dev.pmlc.data.nodespec; 15 | exports dev.pmlc.data.nodespec.block; 16 | exports dev.pmlc.data.nodespec.block.chapter; 17 | exports dev.pmlc.data.nodespec.block.code; 18 | exports dev.pmlc.data.nodespec.block.footnote; 19 | exports dev.pmlc.data.nodespec.block.list; 20 | exports dev.pmlc.data.nodespec.block.media; 21 | exports dev.pmlc.data.nodespec.block.table; 22 | exports dev.pmlc.data.nodespec.inline; 23 | exports dev.pmlc.data.nodespec.inline.font; 24 | exports dev.pmlc.data.nodespec.inline.footnote; 25 | exports dev.pmlc.data.node; 26 | exports dev.pmlc.data.node.block; 27 | exports dev.pmlc.data.node.block.chapter; 28 | exports dev.pmlc.data.node.block.code; 29 | exports dev.pmlc.data.node.block.footnote; 30 | exports dev.pmlc.data.node.block.list; 31 | exports dev.pmlc.data.node.block.media; 32 | exports dev.pmlc.data.node.block.table; 33 | exports dev.pmlc.data.node.handler; 34 | exports dev.pmlc.data.node.inline; 35 | exports dev.pmlc.data.node.inline.font; 36 | exports dev.pmlc.data.node.inline.footnote; 37 | exports dev.pmlc.data.node.validator; 38 | exports dev.pmlc.data.node.block.quote; 39 | exports dev.pmlc.data.nodespec.block.quote; 40 | exports dev.pmlc.data.nodespec.block.admonition; 41 | exports dev.pmlc.data.node.block.admonition; 42 | } 43 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/DivisionNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.DivisionNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class DivisionNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "div" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Division", 21 | "A division or section in the document. This node is typically used to render a HTML
...
block with a specific set of HTML attributes.", 22 | """ 23 | [div (html_style="color:red;") 24 | Important message: ... 25 | ]""" ); 26 | 27 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 28 | 29 | public static final @NotNull String HTML_TAG = "div"; 30 | 31 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "division" ); 32 | 33 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 34 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 35 | DivisionNode::new, PMLNodesHandler::division, HTML_TAG, CSS_CLASS ); 36 | } 37 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/code/InputNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.code; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.code.InputNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class InputNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "input" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Input", 21 | "Any input provided to a software application, such as a command typed in a terminal, text contained in a config file, etc.", 22 | """ 23 | [input 24 | ~~~ 25 | pmlc pml_to_html article.pml 26 | ~~~ 27 | ]""" ); 28 | 29 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 30 | 31 | public static final @NotNull String HTML_TAG = "pre"; 32 | 33 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "input" ); 34 | 35 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForRawTextBlockNode ( 36 | NAME, ATTRIBUTES, true, DOCUMENTATION, 37 | InputNode::new, PMLNodesHandler::input, HTML_TAG, CSS_CLASS ); 38 | } 39 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/chapter/TitleNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.chapter; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.chapter.TitleNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class TitleNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "title" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Chapter Title", 21 | "A title for a chapter. This node must be the first child-node of a chapter. The text of this node is used in the table of contents.", 22 | """ 23 | [ch [title Some [i Big] Advantages] 24 | ... 25 | ]""" ); 26 | 27 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 28 | 29 | public static final @NotNull String HTML_TAG = "h2"; 30 | 31 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "chapter-title" ); 32 | 33 | public static final @NotNull PMLNodeSpec NODE = 34 | PMLNodeSpecCreator.createForBlockNodeWithInlineChildNodes ( 35 | NAME, ATTRIBUTES, true, 36 | DOCUMENTATION, TitleNode::new, PMLNodesHandler::chapterTitle, HTML_TAG, CSS_CLASS ); 37 | } 38 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/admonition/AdmonitionLabelNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.admonition; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.node.block.admonition.AdmonitionLabelNode; 5 | import dev.pmlc.data.node.handler.PMLNodesHandler; 6 | import dev.pmlc.data.nodespec.PMLNodeSpec; 7 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 8 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class AdmonitionLabelNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "alabel" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Admonition Label", 21 | "The label (title) of an admonition, such as Tip, Warning, Important etc.", 22 | """ 23 | [admon 24 | [label Tip] 25 | Later you'll see some [i striking] examples. 26 | ]""" ); 27 | 28 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 29 | 30 | public static final @NotNull String HTML_TAG = "div"; 31 | 32 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "admonition-label" ); 33 | 34 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 35 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 36 | AdmonitionLabelNode::new, PMLNodesHandler::admonitionLabel, HTML_TAG, CSS_CLASS ); 37 | } 38 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/code/OutputNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.code; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.code.OutputNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class OutputNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "output" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Output", 21 | "Any output created by a software application, such as a result written to the OS's standard output device.", 22 | """ 23 | [output 24 | ~~~ 25 | Congratulations! 26 | The new database has been created successfully. 27 | ~~~ 28 | ]""" ); 29 | 30 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 31 | 32 | public static final @NotNull String HTML_TAG = "pre"; 33 | 34 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "output" ); 35 | 36 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForRawTextBlockNode ( 37 | NAME, ATTRIBUTES, true, DOCUMENTATION, 38 | OutputNode::new, PMLNodesHandler::output, HTML_TAG, CSS_CLASS ); 39 | } 40 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/quote/QuoteSourceNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.quote; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.node.block.quote.QuoteSourceNode; 5 | import dev.pmlc.data.node.handler.PMLNodesHandler; 6 | import dev.pmlc.data.nodespec.PMLNodeSpec; 7 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 8 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class QuoteSourceNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "qsource" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Source of Quote", 21 | "The source of the quote, such as the name of a person, the title of an article, etc.", 22 | """ 23 | [quote 24 | Everything should be as simple as possible, but not simpler. 25 | [qsource [i Albert Einstein, physicist]] 26 | ]""" ); 27 | 28 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 29 | 30 | public static final @NotNull String HTML_TAG = "div"; 31 | 32 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "quote-source" ); 33 | 34 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 35 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 36 | QuoteSourceNode::new, PMLNodesHandler::quoteSource, HTML_TAG, CSS_CLASS ); 37 | } 38 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/table/TableFooterNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.table; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.table.TableFooterNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class TableFooterNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "tfooter" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Table Footer", 21 | "A footer in a table.", 22 | """ 23 | Table with footer: 24 | 25 | [table 26 | [tr [tc cell 1.1] [tc cell 1.2] [tc cell 1.3]] 27 | [tr [tc cell 2.1] [tc cell 2.2] [tc cell 2.3]] 28 | [tfooter 29 | [tr [tc Footer 1] [tc Footer 2] [tc Footer 3]] 30 | ] 31 | ]""" ); 32 | 33 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 34 | 35 | public static final @NotNull String HTML_TAG = "tfoot"; 36 | 37 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "table-footer" ); 38 | 39 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 40 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 41 | TableFooterNode::new, PMLNodesHandler::tableFooter, HTML_TAG, CSS_CLASS ); 42 | } 43 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/table/TableHeaderNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.table; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.table.TableHeaderNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class TableHeaderNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "theader" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Table Header", 21 | "A header in a table.", 22 | """ 23 | Table with header: 24 | 25 | [table 26 | [theader 27 | [tr [tc Header 1] [tc Header 2] [tc Header 3]] 28 | ] 29 | [tr [tc cell 1.1] [tc cell 1.2] [tc cell 1.3]] 30 | [tr [tc cell 2.1] [tc cell 2.2] [tc cell 2.3]] 31 | ]""" ); 32 | 33 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 34 | 35 | public static final @NotNull String HTML_TAG = "thead"; 36 | 37 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "table-header" ); 38 | 39 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 40 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 41 | TableHeaderNode::new, PMLNodesHandler::tableHeader, HTML_TAG, CSS_CLASS ); 42 | } 43 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/HeaderNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.HeaderNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class HeaderNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "header" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Header", 21 | "A header (small title) displayed on a separate line. A header is not included in the table of contents. Headers can be inserted anywhere in a document.", 22 | """ 23 | [ch [title Advantages] 24 | [header Simple] 25 | ... 26 | [header Fast] 27 | ... 28 | [header Effective] 29 | ... 30 | ]""" ); 31 | 32 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 33 | 34 | public static final @NotNull String HTML_TAG = "div"; 35 | 36 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "header" ); 37 | 38 | public static final @NotNull PMLNodeSpec NODE = 39 | PMLNodeSpecCreator.createForBlockNodeWithInlineChildNodes ( 40 | NAME, ATTRIBUTES, true, 41 | DOCUMENTATION, HeaderNode::new, PMLNodesHandler::header, HTML_TAG, CSS_CLASS ); 42 | } 43 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/code/HtmlCodeNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.code; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.code.HTMLCodeNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class HtmlCodeNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "html" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "HTML Code", 21 | """ 22 | A node that contains HTML code. 23 | The HTML code is not processed in any way by the PML converter. It is passed as is to the resulting HTML document. 24 | This allows you to embed arbitrary HTML code in your final document.""", 25 | """ 26 | [html 27 | ~~~ 28 |

This is pure HTML code.

29 | ~~~ 30 | ]""" ); 31 | 32 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 33 | 34 | public static final @NotNull String HTML_TAG = "div"; 35 | 36 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "html" ); 37 | 38 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForRawTextBlockNode ( 39 | NAME, ATTRIBUTES, true, DOCUMENTATION, 40 | HTMLCodeNode::new, PMLNodesHandler::HTMLCode, HTML_TAG, CSS_CLASS ); 41 | } 42 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/chapter/SubtitleNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.chapter; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.chapter.SubtitleNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class SubtitleNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "subtitle" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Chapter Subtitle", 21 | "A subtitle for a chapter, displayed on a separate line after a chapter's title. If present, this node must follow a 'title' (chapter title) node. The subtitle is not displayed in the table of contents.", 22 | """ 23 | [ch [title My Life as a Gardener] 24 | [subtitle Why I Left the Corporate World] 25 | ... 26 | ]""" ); 27 | 28 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 29 | 30 | public static final @NotNull String HTML_TAG = "h2"; 31 | 32 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "chapter-subtitle" ); 33 | 34 | public static final @NotNull PMLNodeSpec NODE = 35 | PMLNodeSpecCreator.createForBlockNodeWithInlineChildNodes ( 36 | NAME, ATTRIBUTES, true, 37 | DOCUMENTATION, SubtitleNode::new, PMLNodesHandler::chapterSubtitle, HTML_TAG, CSS_CLASS ); 38 | } 39 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/list/ListElementNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.list; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.list.ListElementNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class ListElementNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "el" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "List Element", 21 | "An element of a list.", 22 | """ 23 | Some planets: 24 | [list 25 | [el [header Jupiter] 26 | Jupiter is ... 27 | ] 28 | [el [header Uranus] 29 | Uranus is ... 30 | ] 31 | [el [header Neptun] 32 | Neptun is ... 33 | ] 34 | ]""" ); 35 | 36 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 37 | 38 | public static final @NotNull String HTML_TAG = "li"; 39 | 40 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "list-element" ); 41 | 42 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 43 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 44 | ListElementNode::new, PMLNodesHandler::listElement, HTML_TAG, CSS_CLASS ); 45 | } 46 | -------------------------------------------------------------------------------- /pmlc-converter/src/main/java/dev/pmlc/converter/PMLCResources.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.converter; 2 | 3 | import dev.pmlc.data.PmlcVersion; 4 | import dev.pp.basics.annotations.NotNull; 5 | import dev.pp.basics.utilities.SimpleLogger; 6 | import dev.pp.basics.utilities.directory.DirectoryConfig; 7 | import dev.pp.basics.utilities.directory.DirectoryCreator; 8 | import dev.pp.basics.utilities.ResourcesUtils; 9 | 10 | import java.io.IOException; 11 | import java.nio.file.Files; 12 | import java.nio.file.Path; 13 | 14 | public class PMLCResources { 15 | 16 | public static final @NotNull Path ROOT_DIRECTORY = DirectoryConfig.userConfigDirectoryForApplication ( 17 | null, 18 | PmlcVersion.APPLICATION_NAME_WITHOUT_SPACES, 19 | PmlcVersion.getMajorVersionNumber(), 20 | PmlcVersion.getMinorVersionNumber() ); 21 | 22 | public static void createResourceFile ( 23 | @NotNull Class clazz, 24 | @NotNull Path resourcePath, 25 | boolean isTextFile ) throws IOException { 26 | 27 | createResourcesDirectoryIfNotExists(); 28 | 29 | SimpleLogger.info ( "Creating resource file " + resourcePath + " in directory " + ROOT_DIRECTORY ); 30 | 31 | ResourcesUtils.copyResourceToFile ( 32 | resourcePath, 33 | clazz, 34 | ROOT_DIRECTORY.resolve ( resourcePath ), 35 | isTextFile, 36 | true ); 37 | } 38 | 39 | public static @NotNull Path absoluteResourcePath ( @NotNull Path relativeResourcePath ) { 40 | return ROOT_DIRECTORY.resolve ( relativeResourcePath ); 41 | } 42 | 43 | private static void createResourcesDirectoryIfNotExists() throws IOException { 44 | 45 | if ( Files.exists ( ROOT_DIRECTORY ) ) return; 46 | 47 | SimpleLogger.info ( "Creating shared data directory " + ROOT_DIRECTORY ); 48 | DirectoryCreator.createWithParentsIfNotExists ( ROOT_DIRECTORY ); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/footnote/InlineFootnoteNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline.footnote; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.footnote.InlineFootnoteNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.text.documentation.SimpleDocumentation; 10 | 11 | import java.util.function.Supplier; 12 | 13 | public class InlineFootnoteNodeSpec { 14 | 15 | public static final @NotNull NodeName NAME = new NodeName ( "fnote" ); 16 | 17 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 18 | "Inline Footnote", 19 | """ 20 | Inline footnotes are footnotes whose content is defined inline. They are displayed later in the document, as soon as an 'fnotes' node is encountered. 21 | Inline footnotes can contain text and other inline nodes to style the footnote. They cannot contain block nodes.""", 22 | """ 23 | text text [fnote text of footnote 1] text 24 | 25 | text [fnote text of footnote 2 with [i italic] and [b bold] words] text text 26 | 27 | text text [fnote 28 | text of footnote 3 29 | ] text text 30 | 31 | [fnotes] 32 | """ ); 33 | 34 | public static final @NotNull String HTML_TAG = "span"; 35 | 36 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "inline-footnote" ); 37 | 38 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForInlineNode ( 39 | NAME, null, true, true, DOCUMENTATION, 40 | InlineFootnoteNode::new, PMLNodesHandler::inlineFootnote, HTML_TAG, CSS_CLASS ); 41 | } 42 | -------------------------------------------------------------------------------- /pmlc-commands/src/main/java/dev/pmlc/commands/PMLCommands.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.commands; 2 | 3 | import dev.pdml.commands.pdmltoxml.PdmlToXMLCommand; 4 | import dev.pdml.commands.standalone.PdmlToStandaloneCommand; 5 | import dev.pmlc.commands.pmltohtml.PMLToHTMLCommand; 6 | import dev.pmlc.converter.pmltohtml.PMLToHTMLConverter; 7 | import dev.pmlc.data.PmlcVersion; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.commands.command.CommandSpecs; 10 | import dev.pp.commands.errors.CLIExceptionHandler; 11 | import dev.pp.commands.picocli.PicocliCommandLineExecutor; 12 | 13 | import java.nio.file.Path; 14 | 15 | public class PMLCommands { 16 | 17 | @SuppressWarnings ( {"unchecked", "rawtypes"} ) 18 | /* TODO 19 | add PMLToXMLCommand (must provide node specs to PDML parser) 20 | add command to convert PML documents (must provide node specs to PDML parser) 21 | */ 22 | public static final @NotNull CommandSpecs COMMANDS = new CommandSpecs () 23 | .add ( PMLToHTMLCommand.COMMAND_SPEC ) 24 | .add ( PMLInfoCommand.COMMAND ) 25 | .add ( PMLVersionCommand.COMMAND ) 26 | .add ( PdmlToXMLCommand.COMMAND_SPEC ) 27 | .add ( PdmlToStandaloneCommand.COMMAND_SPEC ) 28 | .add ( ExportMetaDataCommand.COMMAND ) 29 | .add ( CreateNodesReferenceManualCommand.COMMAND ) 30 | .add ( CreateCommandsReferenceManualCommand.COMMAND ); 31 | 32 | public static int runCommand ( @NotNull String[] args ) { 33 | 34 | return PicocliCommandLineExecutor.executeCommand ( args, PmlcVersion.VERSION_TEXT, PMLCommands.COMMANDS ); 35 | } 36 | 37 | public static int PMLToHTML ( @NotNull String PMLInputFile ) { 38 | 39 | try { 40 | PMLToHTMLConverter.convertFile ( Path.of ( PMLInputFile ) ); 41 | return 0; 42 | } catch ( Exception e ) { 43 | return CLIExceptionHandler.handleThrowable ( e ); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | 4 | ## Java source code 5 | ################### 6 | [*.java] 7 | charset = utf-8 8 | end_of_line = unset 9 | indent_size = unset 10 | indent_style = space 11 | insert_final_newline = true 12 | trim_trailing_whitespace = true 13 | 14 | 15 | ## Repository Configurations 16 | ############################ 17 | [.{git*,editorconfig,*.yml}] 18 | charset = utf-8 19 | end_of_line = lf 20 | indent_size = unset 21 | indent_style = space 22 | insert_final_newline = true 23 | trim_trailing_whitespace = true 24 | 25 | [.gitmodules] 26 | indent_style = tab 27 | 28 | [.gitkeep] 29 | insert_final_newline = false 30 | 31 | 32 | ## Shell Scripts 33 | ################ 34 | [*.sh] 35 | charset = utf-8 36 | end_of_line = lf 37 | indent_size = unset 38 | indent_style = tab 39 | insert_final_newline = true 40 | trim_trailing_whitespace = true 41 | 42 | 43 | ## Batch Scripts 44 | ################ 45 | [*.{bat,cmd}] 46 | charset = utf-8 47 | end_of_line = crlf 48 | indent_size = unset 49 | indent_style = tab 50 | insert_final_newline = true 51 | trim_trailing_whitespace = true 52 | 53 | 54 | ## PML Sources 55 | ############## 56 | [*.pml] 57 | charset = utf-8 58 | end_of_line = unset 59 | indent_size = 4 60 | indent_style = space 61 | insert_final_newline = true 62 | trim_trailing_whitespace = true 63 | 64 | 65 | ## Markdown GFM 66 | ############### 67 | [*.md] 68 | charset = utf-8 69 | end_of_line = unset 70 | indent_size = unset 71 | indent_style = space 72 | insert_final_newline = true 73 | trim_trailing_whitespace = true 74 | 75 | 76 | ## Plain-Text Files 77 | ################### 78 | [*.txt] 79 | charset = utf-8 80 | indent_size = unset 81 | indent_style = space 82 | end_of_line = unset 83 | insert_final_newline = true 84 | trim_trailing_whitespace = true 85 | 86 | [{LICENSE,README}] 87 | charset = utf-8 88 | end_of_line = unset 89 | indent_size = unset 90 | indent_style = space 91 | insert_final_newline = true 92 | trim_trailing_whitespace = true 93 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/chapter/ChapterNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.chapter; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.chapter.ChapterNodeSpec; 5 | import dev.pmlc.data.nodespec.block.chapter.TitleNodeSpec; 6 | import dev.pmlc.data.node.block.PMLBlockNode; 7 | import dev.pp.basics.annotations.NotNull; 8 | import dev.pp.basics.annotations.Nullable; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | import java.util.function.Consumer; 13 | 14 | public class ChapterNode extends PMLBlockNode { 15 | 16 | 17 | private int level = 1; 18 | public int getLevel() { return level; } 19 | public void setLevel ( int level ) { this.level = level; } 20 | 21 | 22 | public ChapterNode() { super(); } 23 | 24 | 25 | public @NotNull PMLNodeSpec getNodeSpec () { return ChapterNodeSpec.NODE; } 26 | 27 | public @Nullable TitleNode getTitleNode() { 28 | 29 | return findFirstChildNodeByName ( TitleNodeSpec.NAME.toString() ); 30 | } 31 | 32 | public @Nullable String getTitleText() { 33 | 34 | TitleNode titleNode = getTitleNode(); 35 | if ( titleNode == null ) return null; 36 | 37 | return titleNode.getTextInTree(); 38 | } 39 | 40 | public void forEachDirectChildChapter ( @NotNull Consumer consumer ) { 41 | 42 | forEachChildNode ( childNode -> { 43 | if ( childNode instanceof ChapterNode chapterNode ) { 44 | consumer.accept ( chapterNode ); 45 | } 46 | }); 47 | } 48 | 49 | public @Nullable List getDirectChildChapters() { 50 | 51 | List childChapters = new ArrayList<>(); 52 | forEachDirectChildChapter ( childChapters::add ); 53 | return childChapters.isEmpty() ? null : childChapters; 54 | } 55 | 56 | public boolean hasChildChapters() { return getDirectChildChapters() != null; } 57 | } 58 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/table/TableRowNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.table; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.table.TableRowNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class TableRowNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "tr" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Table Row", 21 | "A row in a table.", 22 | """ 23 | Table with 2 rows: 24 | 25 | [table 26 | [tr [tc cell 1.1] [tc cell 1.2] [tc cell 1.3]] 27 | [tr [tc cell 2.1] [tc cell 2.2] [tc row 2.3]] 28 | ]""" ); 29 | 30 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 31 | 32 | public static final @NotNull String HTML_TAG = "tr"; 33 | 34 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "table-body-row" ); 35 | public static final @NotNull String CSS_CLASS_IN_HEADER = PMLNodeSpecCreator.prefixedHTMLClassName ( "table-header-row" ); 36 | public static final @NotNull String CSS_CLASS_IN_FOOTER = PMLNodeSpecCreator.prefixedHTMLClassName ( "table-footer-row" ); 37 | 38 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 39 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 40 | TableRowNode::new, PMLNodesHandler::tableRow, HTML_TAG, CSS_CLASS ); 41 | } 42 | -------------------------------------------------------------------------------- /pmlc-utils/src/main/java/dev/pmlc/utils/PMLToHTMLSnippetWriter.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.utils; 2 | 3 | import dev.pmlc.data.node.block.DocumentNode; 4 | import dev.pmlc.converter.pmltohtml.options.PMLToHTMLOptions; 5 | import dev.pmlc.converter.pmltohtml.writer.HTMLNodesWriter; 6 | import dev.pmlc.parser.PMLParser; 7 | import dev.pp.basics.annotations.NotNull; 8 | import dev.pp.basics.annotations.Nullable; 9 | import dev.pp.text.inspection.handler.TextInspectionMessageHandler; 10 | import dev.pp.text.resource.TextResource; 11 | import dev.pp.text.utilities.html.HTMLWriter; 12 | import dev.pp.texttable.writer.pretty.utilities.TextInspectionMessage_FormWriter; 13 | 14 | import java.io.*; 15 | 16 | public class PMLToHTMLSnippetWriter { 17 | 18 | public static @NotNull String getHTMLSnippet ( @NotNull String PMLSnippet ) throws Exception { 19 | 20 | if ( ! PMLSnippet.startsWith ( "[doc " ) ) 21 | PMLSnippet = "[doc " + PMLSnippet + "]"; 22 | 23 | try ( Reader PMLDocumentReader = new StringReader ( PMLSnippet ); 24 | Writer HTMLSnippetWriter = new StringWriter() ) { 25 | 26 | writeHTMLSnippet ( PMLDocumentReader, null, HTMLSnippetWriter, 27 | TextInspectionMessage_FormWriter.createLogMessageHandler() ); 28 | 29 | return HTMLSnippetWriter.toString(); 30 | } 31 | } 32 | 33 | public static void writeHTMLSnippet ( 34 | @NotNull Reader PMLDocumentReader, 35 | @Nullable TextResource inputTextResource, 36 | @NotNull Writer HTMLSnippetWriter, 37 | @NotNull TextInspectionMessageHandler errorHandler ) throws Exception { 38 | 39 | DocumentNode documentNode = PMLParser.parseReader ( PMLDocumentReader, inputTextResource, null, null, errorHandler ); 40 | 41 | HTMLNodesWriter htmlNodesWriter = new HTMLNodesWriter ( 42 | new HTMLWriter ( HTMLSnippetWriter ), PMLToHTMLOptions.builder().build() ); 43 | 44 | htmlNodesWriter.handleChildNodes ( documentNode.getChildNodes() ); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /pmlc-utils/src/main/java/dev/pmlc/utils/nodehandlers/PMLNodesHandlerRegistrar.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.utils.nodehandlers; 2 | 3 | import dev.pmlc.data.node.handler.PMLNodesHandler; 4 | import dev.pp.basics.annotations.NotNull; 5 | 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | 9 | public class PMLNodesHandlerRegistrar { 10 | 11 | /* 12 | public static interface OutputWriterSupplier { 13 | 14 | @NotNull PMLNodesHandler get ( @NotNull Writer writer ); 15 | } 16 | 17 | private static final @NotNull Map writers = new HashMap<>(); 18 | */ 19 | 20 | private static final @NotNull Map handlers = new HashMap<>(); 21 | 22 | /* 23 | static { 24 | addWriter ( new HTMLOutputWriter() ); 25 | } 26 | 27 | public static boolean hasWriter ( String format ) { 28 | return writers.containsKey ( format ); 29 | } 30 | 31 | public static PMLOutputWriter getWriter ( String format ) { 32 | 33 | if ( ! hasWriter ( format ) ) throw new IllegalArgumentException ( 34 | "A writer for format '" + format + "' is not registered."); 35 | 36 | return writers.get ( format ); 37 | } 38 | 39 | public static void addWriter ( PMLOutputWriter writer ) { 40 | 41 | String format = writer.getFormat(); 42 | if ( hasWriter ( format ) ) throw new IllegalArgumentException ( 43 | "A writer for format '" + format + "' is already registered."); 44 | 45 | addOrReplaceWriter ( writer ); 46 | } 47 | 48 | public static void replaceWriter ( PMLOutputWriter writer ) { 49 | 50 | String format = writer.getFormat(); 51 | if ( ! hasWriter ( format ) ) throw new IllegalArgumentException ( 52 | "A writer for format '" + format + "' is not registered."); 53 | 54 | addOrReplaceWriter ( writer ); 55 | } 56 | 57 | public static void addOrReplaceWriter ( PMLOutputWriter writer ) { 58 | writers.put ( writer.getFormat(), writer ); 59 | } 60 | */ 61 | } 62 | -------------------------------------------------------------------------------- /pmlc-commands/src/main/java/dev/pmlc/commands/pmltohtml/PMLToHTMLParametersHelper.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.commands.pmltohtml; 2 | 3 | import dev.pmlc.converter.pmltohtml.options.PMLToHTMLOptions; 4 | import dev.pp.basics.annotations.NotNull; 5 | import dev.pp.basics.annotations.Nullable; 6 | import dev.pp.parameters.parameters.ParameterValueGetter; 7 | import dev.pp.parameters.parameters.Parameters; 8 | 9 | import java.io.IOException; 10 | import java.nio.file.Path; 11 | 12 | public class PMLToHTMLParametersHelper { 13 | 14 | public static final @NotNull String STDIN_FILE_NAME = "stdin"; 15 | public static final @NotNull String STDOUT_FILE_NAME = "stdout"; 16 | 17 | public static boolean isStdinFilePath ( @Nullable Path filePath ) { 18 | return filePath == null || filePath.toString().equalsIgnoreCase ( STDIN_FILE_NAME ); 19 | } 20 | 21 | public static boolean isStdoutFilePath ( @Nullable Path filePath ) { 22 | return filePath == null || filePath.toString().equalsIgnoreCase ( STDOUT_FILE_NAME ); 23 | } 24 | 25 | public static @NotNull PMLToHTMLOptions createOptions ( 26 | @NotNull Parameters parameters ) throws IOException { 27 | 28 | ParameterValueGetter vg = parameters.valueGetter(); 29 | return PMLToHTMLOptions.builder() 30 | .CSSFiles ( vg.nullable ( PMLToHTMLParameters.CSS_FILES ) ) 31 | .resources ( vg.nullable ( PMLToHTMLParameters.RESOURCES ) ) 32 | .HTMLPageStartTemplate ( vg.nullable ( PMLToHTMLParameters.HTML_PAGE_START_TEMPLATE_FILE ) ) 33 | .HTMLPageEndTemplate ( vg.nullable ( PMLToHTMLParameters.HTML_PAGE_END_TEMPLATE_FILE ) ) 34 | .TOCPosition ( vg.nonNull ( PMLToHTMLParameters.TOC_POSITION ) ) 35 | .TOCTitle ( vg.nullable ( PMLToHTMLParameters.TOC_TITLE ) ) 36 | .maxTOCChapterLevel ( vg.nonNull ( PMLToHTMLParameters.MAX_TOC_CHAPTER_LEVEL ) ) 37 | .sourceCodeHighlighter ( vg.nonNull ( PMLToHTMLParameters.SOURCE_CODE_HIGHLIGHTER ) ) 38 | .omitCSS ( vg.nonNull ( PMLToHTMLParameters.OMIT_CSS ) ) 39 | .build(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/media/VideoNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.media; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.media.VideoNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | import dev.pp.basics.annotations.Nullable; 8 | import dev.pp.basics.utilities.string.HTextAlign; 9 | import dev.pp.parameters.parameters.ParameterValueGetter; 10 | import dev.pp.parameters.parameters.Parameters; 11 | 12 | public class VideoNode extends PMLBlockNode { 13 | 14 | private @NotNull String source = ""; 15 | public @NotNull String getSource() { 16 | return source; 17 | } 18 | 19 | private @Nullable Integer width = null; 20 | public @Nullable Integer getWidth() { 21 | return width; 22 | } 23 | 24 | private @Nullable Integer height = null; 25 | public @Nullable Integer getHeight() { 26 | return height; 27 | } 28 | 29 | private @NotNull HTextAlign horizontalAlignment = HTextAlign.LEFT; 30 | public @NotNull HTextAlign getHorizontalAlignment() { 31 | return horizontalAlignment; 32 | } 33 | 34 | private @Nullable Boolean border = false; 35 | public @Nullable Boolean getBorder() { 36 | return border; 37 | } 38 | 39 | 40 | public VideoNode () { super(); } 41 | 42 | 43 | public @NotNull PMLNodeSpec getNodeSpec () { return VideoNodeSpec.NODE; } 44 | 45 | @Override 46 | public void setAttributes ( @Nullable Parameters parameters ) throws Exception { 47 | 48 | assert parameters != null; 49 | 50 | super.setAttributes ( parameters ); 51 | 52 | ParameterValueGetter pg = parameters.valueGetter(); 53 | source = pg.nonNull ( VideoNodeSpec.SOURCE_ATTRIBUTE ); 54 | width = pg.nullable ( VideoNodeSpec.WIDTH_ATTRIBUTE ); 55 | height = pg.nullable ( VideoNodeSpec.HEIGHT_ATTRIBUTE ); 56 | horizontalAlignment = pg.nonNull ( VideoNodeSpec.HORIZONTAL_ALIGNMENT ); 57 | border = pg.nonNull ( VideoNodeSpec.BORDER ); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/table/TableCellNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.table; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.table.TableCellNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class TableCellNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "tc" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Table Cell", 21 | "A cell in a table row.", 22 | """ 23 | Table with 2 rows and 3 columns: 24 | 25 | [table 26 | [tr [tc cell 1.1] [tc cell 1.2] [tc cell 1.3]] 27 | [tr [tc cell 2.1] [tc cell 2.2] [tc cell 2.3]] 28 | ]""" ); 29 | 30 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 31 | 32 | public static final @NotNull String HTML_TAG = "td"; 33 | public static final @NotNull String HTML_TAG_IN_HEADER = "th"; 34 | public static final @NotNull String HTML_TAG_IN_FOOTER = "td"; 35 | 36 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "table-body-cell" ); 37 | public static final @NotNull String CSS_CLASS_IN_HEADER = PMLNodeSpecCreator.prefixedHTMLClassName ( "table-header-cell" ); 38 | public static final @NotNull String CSS_CLASS_IN_FOOTER = PMLNodeSpecCreator.prefixedHTMLClassName ( "table-footer-cell" ); 39 | 40 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 41 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 42 | TableCellNode::new, PMLNodesHandler::tableCell, HTML_TAG, CSS_CLASS ); 43 | } 44 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/chapter/ChapterNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.chapter; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.chapter.ChapterNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class ChapterNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "ch" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Chapter", 21 | """ 22 | A chapter or sub-chapter in the document. 23 | A chapter can have any number of sub-chapters. Chapters can be nested to any level. 24 | 25 | Note: The idiomatic way of identifying a chapter for cross-referencing is to assign an 'id' to the chapter node (and not to the chapter's title or subtitle node).""", 26 | """ 27 | [ch (id=intro) [title Introduction] 28 | [ch [title What is This About?] 29 | blah blah blah 30 | ] 31 | [ch [title Why is This Important?] 32 | blah blah blah 33 | ] 34 | ]""" ); 35 | 36 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 37 | 38 | public static final @NotNull String HTML_TAG = "section"; 39 | 40 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "chapter" ); 41 | 42 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 43 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 44 | ChapterNode::new, 45 | PMLNodesHandler::chapter, 46 | HTML_TAG, CSS_CLASS ); 47 | } 48 | -------------------------------------------------------------------------------- /pmlc-commands/src/main/java/dev/pmlc/commands/PMLInfoCommand.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.commands; 2 | 3 | import dev.pmlc.converter.PMLCResources; 4 | import dev.pmlc.data.PmlcVersion; 5 | import dev.pp.basics.annotations.NotNull; 6 | import dev.pp.basics.annotations.Nullable; 7 | import dev.pp.basics.utilities.os.OSDirectories; 8 | import dev.pp.basics.utilities.os.OSName; 9 | import dev.pp.basics.utilities.string.HTextAlign; 10 | import dev.pp.basics.utilities.string.StringAligner; 11 | import dev.pp.basics.utilities.string.StringConstants; 12 | import dev.pp.commands.command.CommandSpec; 13 | import dev.pp.parameters.parameters.Parameters; 14 | 15 | public class PMLInfoCommand { 16 | 17 | public static final @NotNull CommandSpec COMMAND = CommandSpec.builder ( 18 | "info", PMLInfoCommand::execute ) 19 | .documentation ( 20 | "Display PMLC Info", 21 | "Write info about PMLC to the standard output device.", 22 | "pmlc info" ) 23 | .build(); 24 | 25 | public static Void execute ( @Nullable Parameters parameters ) { 26 | 27 | StringBuilder sb = new StringBuilder(); 28 | 29 | append ( "Application name", PmlcVersion.APPLICATION_NAME, sb ); 30 | append ( "Short name", PmlcVersion.APPLICATION_SHORT_NAME, sb ); 31 | append ( "Version", PmlcVersion.VERSION, sb ); 32 | append ( "Version date", PmlcVersion.DATE_PUBLISHED, sb ); 33 | append ( "Shared data dir.", PMLCResources.ROOT_DIRECTORY.toString(), sb ); 34 | append ( "Working dir.", OSDirectories.currentWorkingDirectory().toString(), sb ); 35 | append ( "OS name", OSName.name (), sb ); 36 | append ( "Java version.", System.getProperty ( "java.version" ), sb ); 37 | 38 | System.out.println ( sb.toString() ); 39 | 40 | return null; 41 | } 42 | 43 | private static void append ( @NotNull String label, @NotNull String value, @NotNull StringBuilder sb ) { 44 | 45 | sb.append ( StringAligner.align ( label + ":", 20, HTextAlign.RIGHT ) ); 46 | sb.append ( " " ); 47 | sb.append ( value ); 48 | sb.append ( StringConstants.OS_NEW_LINE ); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/admonition/AdmonitionNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.admonition; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pmlc.data.node.block.admonition.AdmonitionNode; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.datatype.CommonDataTypes; 11 | import dev.pp.parameters.parameterspec.ParameterSpec; 12 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 13 | import dev.pp.text.documentation.SimpleDocumentation; 14 | 15 | import java.util.function.Supplier; 16 | 17 | public class AdmonitionNodeSpec { 18 | 19 | public static final @NotNull NodeName NAME = new NodeName ( "admon" ); 20 | 21 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 22 | "Admonition", 23 | "A labeled piece of advice, such as a note, tip, warning, etc.", 24 | """ 25 | [admon 26 | [alabel Tip] 27 | Later you'll see some [i striking] examples. 28 | ]""" ); 29 | 30 | @Deprecated 31 | public static final @NotNull ParameterSpec LABEL_ATTRIBUTE__REMOVED = new ParameterSpec.Builder<> ( 32 | "label", CommonDataTypes.STRING ) 33 | .documentation ( "Label", 34 | "The admonition's label, such as 'Note', 'Tip', 'Warning', etc.", 35 | "label = Tip" ) 36 | .build(); 37 | 38 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 39 | 40 | public static final @NotNull String HTML_TAG = "div"; 41 | 42 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "admonition" ); 43 | 44 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 45 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 46 | AdmonitionNode::new, PMLNodesHandler::admonition, HTML_TAG, CSS_CLASS ); 47 | } 48 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/media/YoutubeVideoNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.media; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.media.YoutubeVideoNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | import dev.pp.basics.annotations.Nullable; 8 | import dev.pp.basics.utilities.string.HTextAlign; 9 | import dev.pp.parameters.parameters.ParameterValueGetter; 10 | import dev.pp.parameters.parameters.Parameters; 11 | 12 | public class YoutubeVideoNode extends PMLBlockNode { 13 | 14 | private @NotNull String youtubeId = ""; 15 | public @NotNull String getYoutubeId() { 16 | return youtubeId; 17 | } 18 | 19 | private @Nullable Integer width = null; 20 | public @Nullable Integer getWidth() { 21 | return width; 22 | } 23 | 24 | private @Nullable Integer height = null; 25 | public @Nullable Integer getHeight() { 26 | return height; 27 | } 28 | 29 | private @NotNull HTextAlign horizontalAlignment = HTextAlign.LEFT; 30 | public @NotNull HTextAlign getHorizontalAlignment() { 31 | return horizontalAlignment; 32 | } 33 | 34 | private @Nullable Boolean border = false; 35 | public @Nullable Boolean getBorder() { 36 | return border; 37 | } 38 | 39 | 40 | public YoutubeVideoNode () { super(); } 41 | 42 | public @NotNull PMLNodeSpec getNodeSpec () { return YoutubeVideoNodeSpec.NODE; } 43 | 44 | @Override 45 | public void setAttributes ( @Nullable Parameters parameters ) throws Exception { 46 | 47 | assert parameters != null; 48 | 49 | super.setAttributes ( parameters ); 50 | 51 | ParameterValueGetter pg = parameters.valueGetter(); 52 | youtubeId = pg.nonNull ( YoutubeVideoNodeSpec.YOUTUBE_ID_PARAMETER ); 53 | width = pg.nullable ( YoutubeVideoNodeSpec.WIDTH_ATTRIBUTE ); 54 | height = pg.nullable ( YoutubeVideoNodeSpec.HEIGHT_ATTRIBUTE ); 55 | horizontalAlignment = pg.nonNull ( YoutubeVideoNodeSpec.HORIZONTAL_ALIGNMENT ); 56 | border = pg.nonNull ( YoutubeVideoNodeSpec.BORDER ); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /pmlc-converter/src/main/java/dev/pmlc/converter/pmltohtml/options/PMLToHTMLDefaultOptions.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.converter.pmltohtml.options; 2 | 3 | import dev.pmlc.data.node.block.code.SourceCodeHighlighter; 4 | import dev.pmlc.data.node.block.TOCPosition; 5 | import dev.pp.basics.annotations.NotNull; 6 | import dev.pp.basics.annotations.Nullable; 7 | import dev.pp.basics.utilities.file.TextFileIO; 8 | 9 | import java.io.IOException; 10 | import java.nio.file.Path; 11 | import java.util.List; 12 | import java.util.function.Supplier; 13 | 14 | public class PMLToHTMLDefaultOptions { 15 | 16 | public static final @NotNull List CSS_FILES = List.of ( 17 | PMLToHTMLResources.DEFAULT_CSS_FILE, 18 | PMLToHTMLResources.PRINT_DEFAULT_CSS_FILE ); 19 | 20 | public static final @NotNull Path RESOURCES_PATH = Path.of ( "resources" ); 21 | 22 | public static @Nullable List resources() { 23 | 24 | if ( RESOURCES_PATH.toFile().exists() ) { 25 | return List.of ( RESOURCES_PATH ); 26 | } else { 27 | return null; 28 | } 29 | } 30 | 31 | public static final @NotNull Supplier HTML_PAGE_START_TEMPLATE = 32 | throwableStringSupplierForFile ( PMLToHTMLResources.HTML_PAGE_START_TEMPLATE_FILE ); 33 | 34 | public static final @NotNull Supplier HTML_PAGE_END_TEMPLATE = 35 | throwableStringSupplierForFile ( PMLToHTMLResources.HTML_PAGE_END_TEMPLATE_FILE ); 36 | 37 | public static final @NotNull TOCPosition TOC_POSITION = TOCPosition.LEFT; 38 | 39 | public static final @Nullable String TOC_TITLE = "Table of Contents"; 40 | 41 | public static final int MAX_TOC_CHAPTER_LEVEL = 100; 42 | 43 | public static final @NotNull SourceCodeHighlighter SOURCE_CODE_HIGHLIGHTER = SourceCodeHighlighter.NONE; 44 | 45 | public static final boolean OMIT_CSS = false; 46 | 47 | 48 | private static @NotNull Supplier throwableStringSupplierForFile ( @NotNull Path path ) { 49 | return () -> { 50 | try { 51 | return TextFileIO.readTextFromUTF8File ( path ); 52 | } catch ( IOException e ) { 53 | throw new RuntimeException ( e ); 54 | } 55 | }; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/footnote/FootnoteDefinitionNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.footnote; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 5 | import dev.pmlc.data.nodespec.block.footnote.FootnoteDefinitionNodeSpec; 6 | import dev.pmlc.data.node.block.PMLBlockNode; 7 | import dev.pmlc.data.node.inline.footnote.FootnoteReferenceNode; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.basics.annotations.Nullable; 10 | import dev.pp.parameters.parameters.Parameters; 11 | import dev.pp.text.inspection.TextErrorException; 12 | import dev.pp.text.token.TextToken; 13 | 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | 17 | public class FootnoteDefinitionNode extends PMLBlockNode { 18 | 19 | 20 | private final @NotNull List references = new ArrayList<>(); 21 | @NotNull public List getReferences () { return references; } 22 | public void addReference ( FootnoteReferenceNode references_ ) { 23 | references.add ( references_ ); 24 | } 25 | 26 | private int renderPosition = 0; 27 | public int getRenderPosition() { return renderPosition; } 28 | public void setRenderPosition ( int renderPosition ) { this.renderPosition = renderPosition; } 29 | 30 | 31 | public FootnoteDefinitionNode () { super(); } 32 | 33 | 34 | @SuppressWarnings ( "unchecked" ) 35 | public @NotNull PMLNodeSpec getNodeSpec () { return FootnoteDefinitionNodeSpec.NODE; } 36 | 37 | @Override 38 | public void setAttributes ( @Nullable Parameters parameters ) throws Exception { 39 | 40 | super.setAttributes ( parameters ); 41 | 42 | if ( nodeId == null ) { 43 | TextToken token = parameters != null ? parameters.getStartToken() : null; 44 | if ( token == null ) token = getStartToken(); 45 | 46 | throw new TextErrorException ( 47 | "A footnote definition must have a unique identifier, defined by attribute '" + 48 | SharedNodeSpecAttributes.ID_ATTRIBUTE_NAME + "'.", 49 | "ID_REQUIRED", 50 | token ); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/quote/QuoteNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.quote; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.quote.QuoteNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.datatype.CommonDataTypes; 11 | import dev.pp.parameters.parameterspec.ParameterSpec; 12 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 13 | import dev.pp.text.documentation.SimpleDocumentation; 14 | 15 | import java.util.function.Supplier; 16 | 17 | public class QuoteNodeSpec { 18 | 19 | public static final @NotNull NodeName NAME = new NodeName ( "quote" ); 20 | 21 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 22 | "Quote", 23 | "The exact words said or written by somebody else.", 24 | """ 25 | [quote 26 | Everything should be as simple as possible, but not simpler. 27 | [qsource [i Albert Einstein, physicist]] 28 | ]""" ); 29 | 30 | @Deprecated 31 | public static final @NotNull ParameterSpec SOURCE_ATTRIBUTE__REMOVED = new ParameterSpec.Builder<> ( 32 | "source", CommonDataTypes.STRING_OR_NULL ) 33 | .defaultValue ( null ) 34 | .documentation ( "Source of Quote", 35 | "The source of the quote, such as the name of a person, the title of an article, etc.", 36 | "source = Dalai Lama" ) 37 | .build(); 38 | 39 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 40 | 41 | public static final @NotNull String HTML_TAG = "blockquote"; 42 | 43 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "quote" ); 44 | 45 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 46 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 47 | QuoteNode::new, PMLNodesHandler::quote, HTML_TAG, CSS_CLASS ); 48 | } 49 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/media/ImageNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.media; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.media.ImageNodeSpec; 5 | import dev.pmlc.data.node.block.PMLBlockNode; 6 | import dev.pp.basics.annotations.NotNull; 7 | import dev.pp.basics.annotations.Nullable; 8 | import dev.pp.basics.utilities.string.HTextAlign; 9 | import dev.pp.parameters.parameters.ParameterValueGetter; 10 | import dev.pp.parameters.parameters.Parameters; 11 | 12 | public class ImageNode extends PMLBlockNode { 13 | 14 | private @NotNull String source = ""; 15 | public @NotNull String getSource() { 16 | return source; 17 | } 18 | 19 | private @Nullable Integer width = null; 20 | public @Nullable Integer getWidth() { 21 | return width; 22 | } 23 | 24 | private @Nullable Integer height = null; 25 | public @Nullable Integer getHeight() { 26 | return height; 27 | } 28 | 29 | private @NotNull HTextAlign horizontalAlignment = HTextAlign.LEFT; 30 | public @NotNull HTextAlign getHorizontalAlignment () { 31 | return horizontalAlignment; 32 | } 33 | 34 | private @Nullable Boolean border = false; 35 | public @Nullable Boolean getBorder() { 36 | return border; 37 | } 38 | 39 | private @Nullable String link = null; 40 | public @Nullable String getLink() { 41 | return link; 42 | } 43 | 44 | 45 | public ImageNode () { super(); } 46 | 47 | 48 | public @NotNull PMLNodeSpec getNodeSpec () { return ImageNodeSpec.NODE; } 49 | 50 | @Override 51 | public void setAttributes ( @Nullable Parameters parameters ) throws Exception { 52 | 53 | assert parameters != null; 54 | 55 | super.setAttributes ( parameters ); 56 | 57 | ParameterValueGetter pg = parameters.valueGetter(); 58 | source = pg.nonNull ( ImageNodeSpec.SOURCE_ATTRIBUTE ); 59 | width = pg.nullable ( ImageNodeSpec.WIDTH_ATTRIBUTE ); 60 | height = pg.nullable ( ImageNodeSpec.HEIGHT_ATTRIBUTE ); 61 | horizontalAlignment = pg.nonNull ( ImageNodeSpec.HORIZONTAL_ALIGNMENT ); 62 | border = pg.nonNull ( ImageNodeSpec.BORDER ); 63 | link = pg.nullable ( ImageNodeSpec.LINK ); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /pmlc-converter/src/main/java/dev/pmlc/converter/pmltohtml/writer/AdmonitionHTMLWriter.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.converter.pmltohtml.writer; 2 | 3 | import dev.pmlc.data.node.block.admonition.AdmonitionLabelNode; 4 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 5 | import dev.pmlc.data.nodespec.block.admonition.AdmonitionLabelNodeSpec; 6 | import dev.pmlc.data.nodespec.block.admonition.AdmonitionNodeSpec; 7 | import dev.pmlc.data.node.block.PMLBlockNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.basics.annotations.Nullable; 11 | 12 | public class AdmonitionHTMLWriter { 13 | 14 | static void writeAdmonition ( 15 | @NotNull PMLBlockNode node, 16 | @Nullable AdmonitionLabelNode labelNode, 17 | @NotNull PMLNodesHandler nodesHandler, 18 | @NotNull HTMLNodesWriterHelper helper ) throws Exception { 19 | 20 | /* 21 |
22 |
23 |

Tip

24 |
25 |
26 |

This is a tip

27 |
28 |
29 | */ 30 | 31 | helper.writeBlockNodeStartLine ( node, AdmonitionNodeSpec.HTML_TAG, AdmonitionNodeSpec.CSS_CLASS, null, true ); 32 | 33 | if ( labelNode != null ){ 34 | writeAdmonitionLabel ( labelNode, helper ); 35 | } 36 | 37 | helper.writeHTMLBlockStartTag ( 38 | "div", null, PMLNodeSpecCreator.prefixedHTMLClassName ( "admonition-content" ), null, null ); 39 | 40 | helper.increaseIndent(); 41 | nodesHandler.handleChildNodes ( node.getBlockChildNodes() ); 42 | helper.decreaseIndent(); 43 | 44 | helper.writeBlockEndLine ( "div" ); 45 | 46 | helper.decreaseIndent(); 47 | helper.writeBlockEndLine ( "div" ); 48 | } 49 | 50 | static void writeAdmonitionLabel ( 51 | @NotNull AdmonitionLabelNode labelNode, 52 | @NotNull HTMLNodesWriterHelper helper ) throws Exception { 53 | 54 | helper.writeBlockNodeWithBlockChildren ( 55 | labelNode, AdmonitionLabelNodeSpec.HTML_TAG, AdmonitionLabelNodeSpec.CSS_CLASS ); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/ParagraphNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.ParagraphNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class ParagraphNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "p" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Paragraph", 21 | """ 22 | A paragraph is a set of one or more sentences. 23 | It is not required to embed a paragraph within a node. Text not explicitly embedded in a node is automatically converted to a paragraph node. 24 | A double-new-line creates a paragraph break. All other whitespace is converted to a single space. Hence, two sentences separated by a single new-line will result in a single paragraph composed of two sentences.""", 25 | """ 26 | First sentence of first paragraph. Second sentence of first paragraph. 27 | 28 | First sentence of second paragraph. 29 | Second sentence of second paragraph. 30 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 31 | [p Third paragraph.] 32 | """ ); 33 | 34 | 35 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 36 | 37 | public static final @NotNull String HTML_TAG = "p"; 38 | 39 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "paragraph" ); 40 | 41 | public static final @NotNull PMLNodeSpec NODE = 42 | PMLNodeSpecCreator.createForBlockNodeWithInlineChildNodes ( 43 | NAME, ATTRIBUTES, true, 44 | DOCUMENTATION, ParagraphNode::new, PMLNodesHandler::paragraph, HTML_TAG, CSS_CLASS ); 45 | } 46 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/footnote/FootnoteReferenceNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline.footnote; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.footnote.FootnoteReferenceNodeSpec; 5 | import dev.pmlc.data.node.block.footnote.FootnoteDefinitionNode; 6 | import dev.pmlc.data.node.inline.PMLInlineNode; 7 | import dev.pp.basics.annotations.NotNull; 8 | import dev.pp.basics.annotations.Nullable; 9 | import dev.pp.parameters.parameters.Parameters; 10 | 11 | public class FootnoteReferenceNode extends PMLInlineNode { 12 | 13 | private @NotNull String definitionId = "none"; 14 | public @NotNull String getDefinitionId() { return definitionId; } 15 | public void setDefinitionId ( @NotNull String definitionId ) { this.definitionId = definitionId; } 16 | 17 | private @Nullable String inlineText = null; 18 | public @Nullable String getInlineText() { return inlineText; } 19 | // public void setInlineText ( @Nullable String inlineText ) { this.inlineText = inlineText; } 20 | 21 | // The id used in the back-reference, auto-assigned 22 | private @NotNull String id = "none"; 23 | public @NotNull String getId() { return id; } 24 | public void setId ( @NotNull String id ) { this.id = id; } 25 | 26 | private @Nullable FootnoteDefinitionNode definitionNode = null; 27 | @Nullable public FootnoteDefinitionNode getDefinitionNode() { return definitionNode; } 28 | public void setDefinitionNode ( @NotNull FootnoteDefinitionNode definitionNode ) { this.definitionNode = definitionNode; } 29 | 30 | 31 | public int getListIndex() { 32 | assert definitionNode != null; 33 | return definitionNode.getRenderPosition(); 34 | } 35 | 36 | 37 | public FootnoteReferenceNode () { super(); } 38 | 39 | 40 | @SuppressWarnings ( "unchecked" ) 41 | public @NotNull PMLNodeSpec getNodeSpec () { return FootnoteReferenceNodeSpec.NODE; } 42 | 43 | @Override 44 | public void setAttributes ( @Nullable Parameters parameters ) throws Exception { 45 | 46 | super.setAttributes ( parameters ); 47 | 48 | assert parameters != null; 49 | definitionId = parameters.nonNullCastedValue ( FootnoteReferenceNodeSpec.DEFINITION_ID_ATTRIBUTE ); 50 | inlineText = parameters.castedValue ( FootnoteReferenceNodeSpec.INLINE_TEXT_ATTRIBUTE ); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/inline/LinkNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.inline; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.inline.LinkNodeSpec; 5 | import dev.pp.basics.annotations.NotNull; 6 | import dev.pp.basics.annotations.Nullable; 7 | import dev.pp.parameters.parameters.Parameters; 8 | import dev.pp.parameters.parameterspec.ParameterSpec; 9 | import dev.pp.text.inspection.handler.TextInspectionMessageHandler; 10 | import dev.pp.text.inspection.message.TextError; 11 | import dev.pp.text.token.TextToken; 12 | 13 | public class LinkNode extends PMLInlineNode { 14 | 15 | 16 | private @NotNull String URL = "dummy"; 17 | public @NotNull String getURL() { return URL; } 18 | 19 | 20 | public LinkNode() { super(); } 21 | 22 | 23 | @SuppressWarnings ( "unchecked" ) 24 | public @NotNull PMLNodeSpec getNodeSpec() { return LinkNodeSpec.NODE; } 25 | 26 | @Override 27 | public @Nullable Parameters stringToTypedAttributes ( 28 | @Nullable Parameters stringAttributes, 29 | @Nullable TextToken startToken, 30 | @NotNull TextInspectionMessageHandler errorHandler ) { 31 | 32 | ParameterSpec removedAttribute = LinkNodeSpec.TEXT_ATTRIBUTE__REMOVED; 33 | if ( stringAttributes != null && stringAttributes.containsSpecName ( removedAttribute ) ) { 34 | errorHandler.handleMessage ( new TextError ( 35 | "Attribute '" + removedAttribute.getName() + "' has been removed in node '" + 36 | LinkNodeSpec.NODE.getName() + "' (since version 4.0.0). The text should be defined in a child node.", 37 | "INVALID_ATTRIBUTE", 38 | stringAttributes.nameToken ( removedAttribute.getName() ) ) ); 39 | } 40 | 41 | return super.stringToTypedAttributes ( stringAttributes, startToken, errorHandler ); 42 | } 43 | 44 | @Override 45 | public void setAttributes ( @Nullable Parameters parameters ) throws Exception { 46 | 47 | super.setAttributes ( parameters ); 48 | 49 | assert parameters != null; 50 | URL = parameters.nonNullCastedValue ( LinkNodeSpec.URL_ATTRIBUTE ); 51 | } 52 | 53 | @Override 54 | public void onNodeParsed() { 55 | if ( inlineChildNodes == null ) { 56 | addInlineChildNode ( new TextNode ( URL, null ) ); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/media/AudioNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.media; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.media.AudioNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.basics.utilities.string.HTextAlign; 11 | import dev.pp.parameters.parameterspec.ParameterSpec; 12 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 13 | import dev.pp.text.documentation.SimpleDocumentation; 14 | 15 | import java.util.function.Supplier; 16 | 17 | public class AudioNodeSpec { 18 | 19 | public static final @NotNull NodeName NAME = new NodeName ( "audio" ); 20 | 21 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 22 | "Audio (Sound)", 23 | "An audio stream (sound), such as an .mp3 or .wav file.", 24 | """ 25 | [header Bird talk] 26 | [audio source=media/bird_talk.mp3] 27 | """ ); 28 | 29 | public static final @NotNull ParameterSpec SOURCE_ATTRIBUTE = SharedMediaNodeSpecAttributes.source ( 30 | "Audio Source", "source = audios/violin.mp3" ); 31 | 32 | public static final @NotNull ParameterSpec HORIZONTAL_ALIGNMENT = 33 | SharedMediaNodeSpecAttributes.HORIZONTAL_ALIGNMENT; 34 | 35 | public static final @NotNull ParameterSpec BORDER = SharedMediaNodeSpecAttributes.BORDER; 36 | 37 | // TODO add autoplay, controls, loop, muted (see https://www.w3schools.com/tags/tag_audio.asp) 38 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.mutableListWithIdAttribute() 39 | .add ( SOURCE_ATTRIBUTE ) 40 | .add ( HORIZONTAL_ALIGNMENT ) 41 | .add ( BORDER ) 42 | .copyToImmutable(); 43 | 44 | public static final @NotNull String HTML_TAG = "audio"; 45 | 46 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "audio" ); 47 | 48 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 49 | NAME, ATTRIBUTES, true, false, DOCUMENTATION, 50 | AudioNode::new, PMLNodesHandler::audio, HTML_TAG, CSS_CLASS ); 51 | } 52 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/list/ListNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.list; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.list.ListNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class ListNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "list" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "List", 21 | "A bulleted list of nodes.\n" + 22 | "CSS can be used to change the item marker's appearance (e.g. use numbers). The CSS must be assigned to attribute 'html_style'. See examples.", 23 | """ 24 | Standard list: 25 | [list 26 | [el item 1] 27 | [el item 2] 28 | ] 29 | 30 | Numbered list: 31 | [list (html_style="list-style-type:decimal") 32 | [el item 1] 33 | [el item 2] 34 | ] 35 | 36 | No markers: 37 | [list (html_style="list-style-type:none") 38 | [el item 1] 39 | [el item 2] 40 | ] 41 | 42 | Picture for marker: 43 | [list (html_style="list-style-image: url('images/gold_star.png')") 44 | [el item 1] 45 | [el item 2] 46 | ] 47 | 48 | Text for marker: 49 | [list (html_style="list-style-type: 'x '") 50 | [el item 1] 51 | [el item 2] 52 | ]""" ); 53 | 54 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 55 | 56 | public static final @NotNull String HTML_TAG = "ul"; 57 | 58 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "list" ); 59 | 60 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 61 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 62 | ListNode::new, PMLNodesHandler::list, HTML_TAG, CSS_CLASS ); 63 | } 64 | -------------------------------------------------------------------------------- /pmlc-converter/src/main/resources/config/PML_to_HTML/css/pml-print-default.css: -------------------------------------------------------------------------------- 1 | /* 2 | PML version: 4.0.0 3 | 4 | This is the default CSS style used when printing a PML document. 5 | 6 | If you want to change the presentation of your HTML document(s) created with PML, you can: 7 | - modify this file 8 | - create your own totally customized CSS file, based on this file 9 | 10 | The original file is stored in sub-directory runtime/resources/css of PML's root directory. 11 | Do not modify that file, unless you have a really good reason to do so. 12 | 13 | Official CSS documentation for print media: 14 | https://www.w3.org/TR/css-page-3/ 15 | https://www.w3.org/TR/css-gcpm-3/ 16 | */ 17 | 18 | @page { 19 | /* size: letter portrait; */ 20 | size: A4 portrait; 21 | margin-left: 2cm; 22 | margin-right: 1.5cm; 23 | margin-top: 1.5cm; 24 | margin-bottom: 1.5cm; 25 | } 26 | 27 | /* doesn't work yet in browsers (2021-02) 28 | @page { 29 | @bottom-right { 30 | content: counter(page) "/" counter(pages); 31 | } 32 | } 33 | */ 34 | 35 | html { 36 | height: auto; 37 | } 38 | 39 | body { 40 | font-family: Georgia, Helvetica, "Times New Roman"; 41 | font-size: 12pt; 42 | line-height: 1.6; 43 | color: black; 44 | background-color: white; 45 | } 46 | 47 | h1, h2, h3, h4, h5, h6 { 48 | color: black; 49 | page-break-after: avoid; 50 | } 51 | 52 | header, footer, aside, nav { 53 | display: none; 54 | } 55 | 56 | .pml-doc-text { 57 | margin: 0; 58 | padding: 0; 59 | } 60 | 61 | a { 62 | color: black; 63 | text-decoration: none; 64 | } 65 | 66 | a.pml-link::before, a.pml-xref::before { 67 | content: "'"; 68 | } 69 | 70 | a.pml-link::after { 71 | content: "' (" attr(href) ")"; 72 | } 73 | 74 | a.pml-xref::after { 75 | /* not supported yet in browsers (2021-02), but supported by www.princexml.com 76 | content: "' (page " target-counter(attr(href url), page) ")"; 77 | */ 78 | content: "'"; 79 | } 80 | 81 | table, figure, img, svg, pre, blockquote { 82 | page-break-inside: avoid; 83 | } 84 | 85 | .pml-doc-text { 86 | max-width: none; 87 | } 88 | 89 | 90 | 91 | /* Optional instructions that might be useful 92 | 93 | print columns on a page: 94 | article { 95 | column-width: 20em; 96 | column-gap: 3em; 97 | } 98 | 99 | start a chapter on a new page: 100 | h2 { 101 | page-break-before: always; 102 | } 103 | 104 | */ 105 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/inline/LinkNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.inline; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.node.inline.LinkNode; 7 | import dev.pmlc.data.node.handler.PMLNodesHandler; 8 | import dev.pp.basics.annotations.NotNull; 9 | import dev.pp.datatype.CommonDataTypes; 10 | import dev.pp.parameters.parameterspec.ParameterSpec; 11 | import dev.pp.parameters.parameterspecs.MutableParameterSpecs; 12 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 13 | import dev.pp.text.documentation.SimpleDocumentation; 14 | 15 | import java.util.function.Supplier; 16 | 17 | public class LinkNodeSpec { 18 | 19 | public static final @NotNull NodeName NAME = new NodeName ( "link" ); 20 | 21 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 22 | "URL Link", 23 | "A URL link to a resource, such as a website or a file to download.", 24 | "Please have a look at [link (url=https://www.pml-lang.dev/docs/articles/practical-document-markup-language/index.html) this article] for more information." ); 25 | 26 | public static final @NotNull ParameterSpec URL_ATTRIBUTE = new ParameterSpec.Builder<> ( 27 | "url", CommonDataTypes.STRING ) 28 | .documentation ( "URL", 29 | "The Uniform Resource Locator (URL) of the link.", 30 | "url = https://www.ppl-lang.dev" ) 31 | .build(); 32 | 33 | @Deprecated 34 | public static final @NotNull ParameterSpec TEXT_ATTRIBUTE__REMOVED = new ParameterSpec.Builder<> ( 35 | "text", CommonDataTypes.STRING_OR_NULL ) 36 | .defaultValue ( null ) 37 | .documentation ( "URL Text", 38 | "The text to be displayed instead of the URL. If no text is specified then the URL itself is displayed.", 39 | "text = our website" ) 40 | .build(); 41 | 42 | public static final @NotNull ParameterSpecs ATTRIBUTES = new MutableParameterSpecs() 43 | .add ( URL_ATTRIBUTE ) 44 | .makeImmutable(); 45 | 46 | public static final @NotNull String HTML_TAG = "a"; 47 | 48 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "link" ); 49 | 50 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForInlineNode ( 51 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 52 | LinkNode::new, PMLNodesHandler::link, HTML_TAG, CSS_CLASS ); 53 | } 54 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/TOCNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.nodespec.block.TOCNodeSpec; 5 | import dev.pmlc.data.node.PMLNode; 6 | import dev.pmlc.data.node.block.chapter.TitleNode; 7 | import dev.pp.basics.annotations.NotNull; 8 | import dev.pp.basics.annotations.Nullable; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | public class TOCNode extends PMLBlockNode { 14 | 15 | 16 | private final @NotNull TitleNode chapterTitleNode; 17 | public @NotNull TitleNode getChapterTitleNode () { return chapterTitleNode; } 18 | 19 | private final @NotNull String chapterId; 20 | public @NotNull String getChapterId() { return chapterId; } 21 | 22 | private final int chapterLevel; 23 | public int getChapterLevel() { return chapterLevel; } 24 | 25 | private @Nullable List childTOCNodes; 26 | public @Nullable List getChildTOCNodes () { return childTOCNodes; } 27 | 28 | 29 | public TOCNode() { 30 | 31 | // TODO 32 | this ( null, null, 0 ); 33 | throw new RuntimeException ( "Should never be called." ); 34 | } 35 | 36 | public TOCNode ( 37 | @NotNull TitleNode chapterTitleNode, 38 | @NotNull String chapterId, 39 | int chapterLevel ) { 40 | 41 | super(); 42 | this.chapterTitleNode = chapterTitleNode; 43 | this.chapterId = chapterId; 44 | this.chapterLevel = chapterLevel; 45 | this.childTOCNodes = null; 46 | } 47 | 48 | 49 | @SuppressWarnings ( "unchecked" ) 50 | public @NotNull PMLNodeSpec getNodeSpec () { return TOCNodeSpec.NODE; } 51 | 52 | @Override 53 | public @Nullable List getBlockChildNodes () { return childTOCNodes; } 54 | 55 | @Override 56 | public boolean hasBlockChildNodes() { return childTOCNodes != null && ! childTOCNodes.isEmpty(); } 57 | 58 | @Override 59 | public @Nullable List getChildNodes() { return childTOCNodes; } 60 | 61 | public boolean isRootNode() { return chapterLevel == 0; } 62 | 63 | public @NotNull String getChapterTitleTextOrEmpty () { 64 | 65 | @Nullable String text = chapterTitleNode.getTextInTree(); 66 | // assert text != null; 67 | // return text; 68 | return text != null ? text : ""; 69 | } 70 | 71 | public void addChildNode ( @NotNull TOCNode childNode ) { 72 | 73 | if ( childTOCNodes == null ) childTOCNodes = new ArrayList<>(); 74 | childTOCNodes.add ( childNode ); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/footnote/FootnotesPlaceholderNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.footnote; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.footnote.FootnotesPlaceholderNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class FootnotesPlaceholderNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "fnotes" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Footnotes Placeholder", 21 | """ 22 | Node 'fnotes' is used as a placeholder for printing/displaying footnotes. 23 | All footnotes not yet displayed will be displayed as soon as an 'fnotes' node is encountered. This includes inline and non-inline footnotes. 24 | A document can have any number of 'fnotes' nodes. This allows different sets of footnotes to be printed at different locations. For example, instead of displaying all footnotes at the end of the document, the footnotes contained in each chapter could be displayed at the end of each chapter.""", 25 | """ 26 | [ch [title Chapter 1] 27 | text [fnote footnote 1] text 28 | 29 | text [fnote footnote 2] text 30 | 31 | [header Footnotes of Chapter 1] 32 | [fnotes] 33 | ] 34 | 35 | [ch [title Chapter 2] 36 | text [fnote_ref did=f3] text 37 | 38 | text [fnote footnote 4] text 39 | 40 | [fnote_def (id=f3) 41 | footnote 3 42 | ] 43 | 44 | [header Footnotes of Chapter 2] 45 | [fnotes] 46 | ] 47 | """ ); 48 | 49 | 50 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 51 | 52 | public static final @NotNull String HTML_TAG = "div"; 53 | 54 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "footnotes" ); 55 | 56 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 57 | NAME, ATTRIBUTES, true, false, DOCUMENTATION, 58 | FootnotesPlaceholderNode::new, PMLNodesHandler::footnotes, HTML_TAG, CSS_CLASS ); 59 | } 60 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/SharedNodeSpecAttributes.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec; 2 | 3 | import dev.pdml.shared.constants.CorePdmlConstants; 4 | import dev.pp.basics.annotations.NotNull; 5 | import dev.pp.datatype.DataType; 6 | import dev.pp.datatype.nonunion.scalar.impls.string.StringDataType; 7 | import dev.pp.datatype.nonunion.scalar.impls.string.StringMatchesRegexValidator; 8 | import dev.pp.datatype.union.NullablePairDataType; 9 | import dev.pp.parameters.parameterspec.ParameterSpec; 10 | import dev.pp.parameters.parameterspecs.MutableParameterSpecs; 11 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 12 | 13 | public class SharedNodeSpecAttributes { 14 | 15 | public static final @NotNull String ID_ATTRIBUTE_NAME = "id"; 16 | 17 | public static final @NotNull DataType ID_DATA_TYPE = new NullablePairDataType<> ( new StringDataType ( 18 | "id", 19 | new StringMatchesRegexValidator ( 20 | CorePdmlConstants.NAME_PATTERN, 21 | "INVALID_ID", 22 | (value, pattern) -> "'" + value + "' is an invalid identifier. An identifier must start with a letter or an underscore (_), and can be followed by any number of letters, digits, underscores (_), dots (.), and hyphens (-)." ), 23 | null ) ); 24 | 25 | public static final @NotNull ParameterSpec ID_ATTRIBUTE = new ParameterSpec.Builder<> ( 26 | ID_ATTRIBUTE_NAME, ID_DATA_TYPE ) 27 | .defaultValue ( null ) 28 | .documentation ( "Node Identifier", 29 | """ 30 | A unique identifier for the node. 31 | 32 | An id can be used to: 33 | - identify a node so that an internal link can be done with an 'xref' (cross reference) node. 34 | - identify a node so that it can be styled individually with CSS 35 | - create an HTML anchor so that it can be accessed with the # (hash) sign (e.g. writing id=foo will enable you to have an HTML link ending with #foo. 36 | 37 | An identifier must start with a letter or an underscore (_), and can be followed by any number of letters, digits, underscores (_), dots (.), and hyphens (-).. Note for programmers: The regex of an identifier is: [a-zA-Z_][a-zA-Z0-9_\\.-]*. Identifiers are case-sensitive. The following identifiers are all different: name, Name, and NAME. 38 | """, 39 | "id = basic_concept" ) 40 | .build(); 41 | 42 | public static @NotNull MutableParameterSpecs mutableListWithIdAttribute() { 43 | return new MutableParameterSpecs().add ( ID_ATTRIBUTE ); 44 | } 45 | 46 | public static @NotNull ParameterSpecs listWithIdAttribute() { 47 | return mutableListWithIdAttribute().copyToImmutable(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/MonospaceNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.MonospaceNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class MonospaceNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "monospace" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Monospace", 21 | """ 22 | A paragraph in which whitespace is preserved, and a fixed-width font is used. The text will be rendered exactly as written in the PML document. 23 | The following rules apply to the text in a 'monospace' block: 24 | - The width of each character (letter, digit, symbol) is the same. 25 | - All spaces and line-breaks in the text are preserved and rendered in the final document. 26 | Inline nodes can be used within a 'monospace' block. Hence standard character escape rules are applied. 27 | """, 28 | """ 29 | [header A Pascal Triangle] 30 | [monospace 31 | 1 32 | 1 1 33 | 1 2 1 34 | 1 3 3 1 35 | ] 36 | """ ); 37 | 38 | 39 | /* 40 | r.add_yes_no_parameter ( 41 | ids = [# keep_indent_parameter_id.value, "ki" ] 42 | default_value_supplier = { no } 43 | title = "Keep Indent" 44 | description = """By default the indent (i.e. preceding space characters) of the first text line is removed in all lines of the 'monospace' block. This behavior can be disabled by setting '{{a_keep_indent_parameter_id}}' to 'yes'.""" 45 | examples = "keep_indent = yes" ) 46 | */ 47 | 48 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 49 | 50 | public static final @NotNull String HTML_TAG = "pre"; 51 | 52 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "monospace" ); 53 | 54 | public static final @NotNull PMLNodeSpec NODE = 55 | PMLNodeSpecCreator.createForBlockNodeWithInlineChildNodes ( 56 | NAME, ATTRIBUTES, true, 57 | DOCUMENTATION, MonospaceNode::new, PMLNodesHandler::monospace, HTML_TAG, CSS_CLASS ); 58 | } 59 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/media/VideoNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.media; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.media.VideoNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.basics.utilities.string.HTextAlign; 11 | import dev.pp.parameters.parameterspec.ParameterSpec; 12 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 13 | import dev.pp.text.documentation.SimpleDocumentation; 14 | 15 | import java.util.function.Supplier; 16 | 17 | public class VideoNodeSpec { 18 | 19 | public static final @NotNull NodeName NAME = new NodeName ( "video" ); 20 | 21 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 22 | "Video", 23 | "A video, such as an .mp4 or .webm file.", 24 | """ 25 | [header Beautiful Nature] 26 | [video source = media/red_flower.mp4] 27 | """ ); 28 | 29 | public static final @NotNull ParameterSpec SOURCE_ATTRIBUTE = 30 | SharedMediaNodeSpecAttributes.source ( "Video Source", "source = videos/happy_kids.mp4" ); 31 | 32 | public static final @NotNull ParameterSpec WIDTH_ATTRIBUTE = 33 | SharedMediaNodeSpecAttributes.width ( "Video Width" ); 34 | 35 | public static final @NotNull ParameterSpec HEIGHT_ATTRIBUTE = 36 | SharedMediaNodeSpecAttributes.height ( "Video Height" ); 37 | 38 | public static final @NotNull ParameterSpec HORIZONTAL_ALIGNMENT = 39 | SharedMediaNodeSpecAttributes.HORIZONTAL_ALIGNMENT; 40 | 41 | public static final @NotNull ParameterSpec BORDER = 42 | SharedMediaNodeSpecAttributes.BORDER; 43 | 44 | // TODO add autoplay, controls, loop, muted, poster (see https://www.w3schools.com/tags/tag_video.asp) 45 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.mutableListWithIdAttribute() 46 | .add ( SOURCE_ATTRIBUTE ) 47 | .add ( WIDTH_ATTRIBUTE ) 48 | .add ( HEIGHT_ATTRIBUTE ) 49 | .add ( HORIZONTAL_ALIGNMENT ) 50 | .add ( BORDER ) 51 | .copyToImmutable(); 52 | 53 | public static final @NotNull String HTML_TAG = "video"; 54 | 55 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "video" ); 56 | 57 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 58 | NAME, ATTRIBUTES, true, false, DOCUMENTATION, 59 | VideoNode::new, PMLNodesHandler::video, HTML_TAG, CSS_CLASS ); 60 | } 61 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/quote/QuoteNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.quote; 2 | 3 | import dev.pmlc.data.node.block.PMLBlockNode; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.block.quote.QuoteNodeSpec; 6 | import dev.pmlc.data.nodespec.block.quote.QuoteSourceNodeSpec; 7 | import dev.pp.basics.annotations.NotNull; 8 | import dev.pp.basics.annotations.Nullable; 9 | import dev.pp.basics.utilities.DebugUtils; 10 | import dev.pp.parameters.parameters.Parameters; 11 | import dev.pp.parameters.parameterspec.ParameterSpec; 12 | import dev.pp.text.inspection.handler.TextInspectionMessageHandler; 13 | import dev.pp.text.inspection.message.TextError; 14 | import dev.pp.text.token.TextToken; 15 | 16 | public class QuoteNode extends PMLBlockNode { 17 | 18 | 19 | private @Nullable QuoteSourceNode sourceNode = null; 20 | public @Nullable QuoteSourceNode getSourceNode() { return sourceNode; } 21 | 22 | 23 | public QuoteNode () { super(); } 24 | 25 | 26 | @SuppressWarnings ( "unchecked" ) 27 | public @NotNull PMLNodeSpec getNodeSpec() { return QuoteNodeSpec.NODE; } 28 | 29 | public void onNodeParsed() throws Exception { 30 | 31 | if ( blockChildNodes != null ) { 32 | // move the quote source node from the child nodes to field 'sourceNode' 33 | for ( int i = 0; i < blockChildNodes.size(); i++ ) { 34 | PMLBlockNode blockNode = blockChildNodes.get ( i ); 35 | if ( blockNode.getName().equals ( QuoteSourceNodeSpec.NAME.qualifiedName() ) ) { 36 | sourceNode = (QuoteSourceNode) blockNode; 37 | blockChildNodes.remove ( i ); 38 | break; 39 | } 40 | } 41 | } 42 | } 43 | 44 | // Remove when no more needed 45 | @Override 46 | public @Nullable Parameters stringToTypedAttributes ( 47 | @Nullable Parameters stringAttributes, 48 | @Nullable TextToken startToken, 49 | @NotNull TextInspectionMessageHandler errorHandler ) { 50 | 51 | ParameterSpec removedAttribute = QuoteNodeSpec.SOURCE_ATTRIBUTE__REMOVED; 52 | if ( stringAttributes != null && stringAttributes.containsSpecName ( removedAttribute ) ) { 53 | errorHandler.handleMessage ( new TextError ( 54 | "Attribute '" + removedAttribute.getName() + "' has been removed in node '" + 55 | QuoteNodeSpec.NODE.getName() + "' (since version 4.0.0). The source must be defined with node '" + QuoteSourceNodeSpec.NAME + "'.", 56 | "INVALID_ATTRIBUTE", 57 | stringAttributes.nameToken ( removedAttribute.getName() ) ) ); 58 | } 59 | 60 | return super.stringToTypedAttributes ( stringAttributes, startToken, errorHandler ); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/validator/NodeValidatorContext.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.validator; 2 | 3 | import dev.pmlc.data.nodespec.PMLNodeSpec; 4 | import dev.pmlc.data.node.PMLNode; 5 | import dev.pp.basics.annotations.NotNull; 6 | import dev.pp.basics.annotations.Nullable; 7 | import dev.pp.text.inspection.handler.TextInspectionMessageHandler; 8 | import dev.pp.text.inspection.message.TextError; 9 | import dev.pp.text.inspection.message.TextWarning; 10 | import dev.pp.text.token.TextToken; 11 | 12 | import java.util.List; 13 | 14 | public class NodeValidatorContext { 15 | 16 | private final @NotNull TextInspectionMessageHandler errorHandler; 17 | 18 | public NodeValidatorContext ( @NotNull TextInspectionMessageHandler errorHandler ) { 19 | this.errorHandler = errorHandler; 20 | } 21 | 22 | public void checkParentType ( @NotNull PMLNode node, @NotNull PMLNodeSpec allowedParent ) { 23 | 24 | PMLNode parentNode = node.getParentNode(); 25 | assert parentNode != null; 26 | 27 | if ( parentNode.getNodeSpec () != allowedParent ) { 28 | handleError ( 29 | "Node '" + node.getName() + "' can only be a child of node '" + allowedParent.getName() + "'. It cannot be a child of node '" + parentNode.getName() + "'.", 30 | "INVALID_PARENT_NODE", 31 | node.getStartToken() ); 32 | } 33 | } 34 | 35 | public void checkHasChildren ( @NotNull PMLNode node ) { 36 | 37 | @Nullable List childNodes = node.getChildNodes(); 38 | if ( childNodes == null ) { 39 | handleWarning ( 40 | "Node '" + node.getName() + "' has no content.", 41 | "EMPTY_NODE", 42 | node.getStartToken() ); 43 | } 44 | } 45 | 46 | public void checkChildrenType ( @NotNull PMLNode node, @NotNull PMLNodeSpec allowedChild ) { 47 | 48 | @Nullable List childNodes = node.getChildNodes(); 49 | if ( childNodes == null ) return; 50 | for ( PMLNode childNode : childNodes ) { 51 | if ( childNode.getNodeSpec () != allowedChild ) { 52 | handleError ( 53 | "Node '" + node.getName() + "' can only contain '" + allowedChild.getName() + "' nodes. It cannot contain '" + childNode.getName() + "' nodes.", 54 | "INVALID_CHILD_NODE", 55 | childNode.getStartToken() ); 56 | } 57 | } 58 | } 59 | 60 | public void handleError ( @NotNull String message, @Nullable String id, @Nullable TextToken token ) { 61 | errorHandler.handleMessage ( new TextError ( message, id, token ) ); 62 | } 63 | 64 | public void handleWarning ( @NotNull String message, @Nullable String id, @Nullable TextToken token ) { 65 | errorHandler.handleMessage ( new TextWarning ( message, id, token ) ); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/node/block/admonition/AdmonitionNode.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.node.block.admonition; 2 | 3 | import dev.pmlc.data.node.block.PMLBlockNode; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.block.admonition.AdmonitionLabelNodeSpec; 6 | import dev.pmlc.data.nodespec.block.admonition.AdmonitionNodeSpec; 7 | import dev.pp.basics.annotations.NotNull; 8 | import dev.pp.basics.annotations.Nullable; 9 | import dev.pp.basics.utilities.DebugUtils; 10 | import dev.pp.parameters.parameters.Parameters; 11 | import dev.pp.parameters.parameterspec.ParameterSpec; 12 | import dev.pp.text.inspection.handler.TextInspectionMessageHandler; 13 | import dev.pp.text.inspection.message.TextError; 14 | import dev.pp.text.token.TextToken; 15 | 16 | public class AdmonitionNode extends PMLBlockNode { 17 | 18 | 19 | private @Nullable AdmonitionLabelNode labelNode = null; 20 | public @Nullable AdmonitionLabelNode getLabelNode() { return labelNode; } 21 | 22 | 23 | public AdmonitionNode () { super(); } 24 | 25 | 26 | @SuppressWarnings ( "unchecked" ) 27 | public @NotNull PMLNodeSpec getNodeSpec () { return AdmonitionNodeSpec.NODE; } 28 | 29 | public void onNodeParsed() throws Exception { 30 | 31 | if ( blockChildNodes != null ) { 32 | // move the label node from the child nodes to field 'labelNode' 33 | for ( int i = 0; i < blockChildNodes.size(); i++ ) { 34 | PMLBlockNode blockNode = blockChildNodes.get ( i ); 35 | if ( blockNode.getName().equals ( AdmonitionLabelNodeSpec.NAME.qualifiedName() ) ) { 36 | labelNode = (AdmonitionLabelNode) blockNode; 37 | blockChildNodes.remove ( i ); 38 | break; 39 | } 40 | } 41 | } 42 | } 43 | 44 | // Remove when no more needed 45 | @Override 46 | public @Nullable Parameters stringToTypedAttributes ( 47 | @Nullable Parameters stringAttributes, 48 | @Nullable TextToken startToken, 49 | @NotNull TextInspectionMessageHandler errorHandler ) { 50 | 51 | ParameterSpec removedAttribute = AdmonitionNodeSpec.LABEL_ATTRIBUTE__REMOVED; 52 | if ( stringAttributes != null && stringAttributes.containsSpecName ( removedAttribute ) ) { 53 | errorHandler.handleMessage ( new TextError ( 54 | "Attribute '" + removedAttribute.getName() + "' has been removed in node '" + 55 | AdmonitionNodeSpec.NAME + "' (since version 4.0.0). The label must be defined with node '" + 56 | AdmonitionLabelNodeSpec.NAME + "'.", 57 | "INVALID_ATTRIBUTE", 58 | stringAttributes.nameToken ( removedAttribute.getName() ) ) ); 59 | } 60 | 61 | return super.stringToTypedAttributes ( stringAttributes, startToken, errorHandler ); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /pmlc-converter/src/main/java/dev/pmlc/converter/pmltohtml/options/PMLToHTMLResources.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.converter.pmltohtml.options; 2 | 3 | import dev.pmlc.converter.PMLCResources; 4 | import dev.pp.basics.annotations.NotNull; 5 | 6 | import java.io.IOException; 7 | import java.nio.file.Files; 8 | import java.nio.file.Path; 9 | 10 | public class PMLToHTMLResources { 11 | 12 | private static final @NotNull Path REL_RESOURCES_DIR = Path.of ("config/PML_to_HTML" ); 13 | 14 | private static final @NotNull Path REL_OPTIONS_PATH = Path.of ( "options.pdml" ); 15 | 16 | private static final @NotNull Path REL_DEFAULT_CSS_PATH = Path.of ( "css/pml-default.css" ); 17 | private static final @NotNull Path REL_PRINT_DEFAULT_CSS_PATH = Path.of ( "css/pml-print-default.css" ); 18 | 19 | private static final @NotNull Path REL_HTML_PAGE_START_TEMPLATE_PATH = Path.of ( 20 | "html/default_html_header_template.txt" ); 21 | private static final @NotNull Path REL_HTML_PAGE_END_TEMPLATE_PATH = Path.of ( 22 | "html/default_html_footer_template.txt" ); 23 | 24 | 25 | public static final @NotNull Path OPTIONS_FILE = absoluteResourcePath ( REL_OPTIONS_PATH ); 26 | public static final @NotNull Path DEFAULT_CSS_FILE = absoluteResourcePath ( REL_DEFAULT_CSS_PATH ); 27 | public static final @NotNull Path PRINT_DEFAULT_CSS_FILE = absoluteResourcePath ( REL_PRINT_DEFAULT_CSS_PATH ); 28 | public static final @NotNull Path HTML_PAGE_START_TEMPLATE_FILE = absoluteResourcePath ( 29 | REL_HTML_PAGE_START_TEMPLATE_PATH ); 30 | public static final @NotNull Path HTML_PAGE_END_TEMPLATE_FILE = absoluteResourcePath ( 31 | REL_HTML_PAGE_END_TEMPLATE_PATH ); 32 | 33 | private static @NotNull Path absoluteResourcePath ( @NotNull Path relativePath ) { 34 | return PMLCResources.absoluteResourcePath ( relativeResourcePath ( relativePath ) ); 35 | } 36 | 37 | private static @NotNull Path relativeResourcePath ( @NotNull Path relativePath ) { 38 | return REL_RESOURCES_DIR.resolve ( relativePath ); 39 | } 40 | 41 | 42 | public static void createResourceFilesIfNotExists() throws IOException { 43 | 44 | if ( Files.exists ( OPTIONS_FILE ) ) return; 45 | 46 | createResourceFiles(); 47 | } 48 | 49 | private static void createResourceFiles() throws IOException { 50 | 51 | createResourceFile ( REL_OPTIONS_PATH, true ); 52 | createResourceFile ( REL_DEFAULT_CSS_PATH, true ); 53 | createResourceFile ( REL_PRINT_DEFAULT_CSS_PATH, true ); 54 | createResourceFile ( REL_HTML_PAGE_START_TEMPLATE_PATH, true ); 55 | createResourceFile ( REL_HTML_PAGE_END_TEMPLATE_PATH, true ); 56 | } 57 | 58 | private static void createResourceFile ( @NotNull Path resourcePath, boolean isTextFile ) throws IOException { 59 | 60 | PMLCResources.createResourceFile ( 61 | PMLToHTMLResources.class, relativeResourcePath ( resourcePath ), isTextFile ); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/footnote/FootnoteDefinitionNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.footnote; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.footnote.FootnoteDefinitionNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 11 | import dev.pp.text.documentation.SimpleDocumentation; 12 | 13 | import java.util.function.Supplier; 14 | 15 | public class FootnoteDefinitionNodeSpec { 16 | 17 | public static final @NotNull NodeName NAME = new NodeName ( "fnote_def" ); 18 | 19 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 20 | "Footnote Definition", 21 | """ 22 | 'fnote_def' is used to define the content of a footnote. 23 | Every 'fnote_def' node must have a unique identifier, explicitly specified by attribute 'id'. This identifier is used in 'fnote_ref' nodes to insert a link to the footnote in the text, using attribute 'did'. 24 | Several references to the same footnote can exist in the document. This is done by re-using the identifier of an 'fnote_def' node in several 'fnote_ref' nodes. 25 | 'fnote_def' nodes can be defined anywhere in the document, but they must be defined before the 'fnotes' node used to display the footnotes. For example, the content of all footnotes could be defined at the beginning or the end of the document. Or, footnotes could be defined at the end of the paragraph in which they are used. 26 | 'fnote_def' nodes can contain block nodes (besides inline nodes), for example to include lists, tables, images etc. in a footnote. 27 | """, 28 | """ 29 | [fnote_def (id=fn_1) 30 | Text of [i footnote 1] 31 | 32 | Second paragraph. 33 | ] 34 | 35 | [fnote_def (id=fn_2) 36 | [sim_table 37 | ~~~ 38 | c11 | c12 | c13 39 | c21 | c22 | c23 40 | ~~~ 41 | ] 42 | ] 43 | 44 | text [fnote_ref did=fn_1] text 45 | 46 | text [fnote_ref did=fn_2] text [fnote_ref did=fn_1] text 47 | 48 | [header Footnotes] 49 | [fnotes]""" ); 50 | 51 | 52 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.listWithIdAttribute(); 53 | 54 | public static final @NotNull String HTML_TAG = "tr"; 55 | 56 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "footnote" ); 57 | 58 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForBlockNode ( 59 | NAME, ATTRIBUTES, true, true, DOCUMENTATION, 60 | FootnoteDefinitionNode::new, PMLNodesHandler::footnoteDefinition, HTML_TAG, CSS_CLASS ); 61 | } 62 | -------------------------------------------------------------------------------- /pmlc-data/src/main/java/dev/pmlc/data/nodespec/block/code/SourceCodeNodeSpec.java: -------------------------------------------------------------------------------- 1 | package dev.pmlc.data.nodespec.block.code; 2 | 3 | import dev.pdml.data.node.NodeName; 4 | import dev.pmlc.data.nodespec.PMLNodeSpec; 5 | import dev.pmlc.data.nodespec.PMLNodeSpecCreator; 6 | import dev.pmlc.data.nodespec.SharedNodeSpecAttributes; 7 | import dev.pmlc.data.node.block.code.SourceCodeNode; 8 | import dev.pmlc.data.node.handler.PMLNodesHandler; 9 | import dev.pp.basics.annotations.NotNull; 10 | import dev.pp.datatype.CommonDataTypes; 11 | import dev.pp.parameters.parameterspec.ParameterSpec; 12 | import dev.pp.parameters.parameterspecs.ParameterSpecs; 13 | import dev.pp.text.documentation.SimpleDocumentation; 14 | 15 | import java.util.function.Supplier; 16 | 17 | public class SourceCodeNodeSpec { 18 | 19 | public static final @NotNull NodeName NAME = new NodeName ( "code" ); 20 | 21 | public static final @NotNull Supplier DOCUMENTATION = () -> new SimpleDocumentation ( 22 | "Source Code", 23 | "A block of source code.", 24 | """ 25 | [code 26 | ~~~ 27 | repeat 3 times 28 | write_line ( "Hello" ) 29 | . 30 | ~~~ 31 | ] 32 | """ ); 33 | 34 | public static final @NotNull ParameterSpec LANGUAGE_ATTRIBUTE = new ParameterSpec.Builder<> ( 35 | "lang", CommonDataTypes.STRING_OR_NULL ) 36 | .defaultValue ( null ) 37 | .documentation ( "Language", 38 | """ 39 | The name of the language used in the source code. 40 | This value is used primarily for syntax highlighting. 41 | Specify 'auto' to request automatic language detection (works only if this feature is supported by the highlighter). 42 | Specify 'text' for simple plain text (without highlighting). 43 | To get the list of supported languages please consult the documentation of the syntax highlighter used. Some frequently used values are: c, css, java, javascript, html.""", 44 | "lang = java" ) 45 | .build(); 46 | 47 | public static final @NotNull ParameterSpec USE_HIGHLIGHTER_ATTRIBUTE = new ParameterSpec.Builder<> ( 48 | "highlight", CommonDataTypes.BOOLEAN ) 49 | .defaultValue ( true ) 50 | .documentation ( "Use Source Code Syntax Highlighter", 51 | "Specifies whether the source code should be highlighted or not.", 52 | "highlight = no" ) 53 | .build(); 54 | 55 | public static final @NotNull ParameterSpecs ATTRIBUTES = SharedNodeSpecAttributes.mutableListWithIdAttribute() 56 | .add ( LANGUAGE_ATTRIBUTE ) 57 | .add ( USE_HIGHLIGHTER_ATTRIBUTE ) 58 | .copyToImmutable(); 59 | 60 | public static final @NotNull String HTML_TAG = "pre"; 61 | 62 | public static final @NotNull String CSS_CLASS = PMLNodeSpecCreator.prefixedHTMLClassName ( "code" ); 63 | 64 | public static final @NotNull PMLNodeSpec NODE = PMLNodeSpecCreator.createForRawTextBlockNode ( 65 | NAME, ATTRIBUTES, true, DOCUMENTATION, 66 | SourceCodeNode::new, PMLNodesHandler::sourceCode, HTML_TAG, CSS_CLASS ); 67 | } 68 | --------------------------------------------------------------------------------