From 90d5b0125fb943eea852ab14ed7a8243c86d7d21 Mon Sep 17 00:00:00 2001 From: Jonas Smedegaard Date: Sun, 18 May 2025 12:41:35 +0200 Subject: define LinkTitle --- _def_dia.qmd | 2 ++ def.peg | 7 +++++-- def_LinkDefinition.py | 4 +--- def_LinkTitle.py | 36 ++++++++++++++++++++++++++++++++++++ def_LinkedWords.py | 11 ++++++++++- 5 files changed, 54 insertions(+), 6 deletions(-) create mode 100755 def_LinkTitle.py diff --git a/_def_dia.qmd b/_def_dia.qmd index d800c02..1afeeec 100644 --- a/_def_dia.qmd +++ b/_def_dia.qmd @@ -24,6 +24,8 @@ involving the negative predicate from PEG notation. ![LinkLabel](def_LinkLabel.svg) +![LinkTitle](def_LinkTitle.svg) + ![PlainWords](def_PlainWords.svg) ![Url](def_Uri.svg) diff --git a/def.peg b/def.peg index 8bec09d..336a446 100644 --- a/def.peg +++ b/def.peg @@ -11,17 +11,20 @@ Markdown <- MetaBlock* Block* Block <- Header / List / LinkDefinition / Paragraph Header <- '#'+ SPACE* !NEWLINE Words? SPACE* NEWLINE List <- ([-*]+ / [[:digit:]]+ [).]) (_ (List / Words))? NEWLINE -LinkDefinition <- LinkLabel ':' _? Uri (_ '"' !'"' PlainWords '"')? NEWLINE +LinkDefinition <- LinkLabel ':' _? Uri (_ LinkTitle)? NEWLINE Paragraph <- Words (HardBreak Words)* NEWLINE+ # Inline elements Words <- StyledWords / LinkedWords / AnnotatedWords / PlainWords StyledWords <- '*' Words '*' / '**' Words '**' / '_' Words '_' -LinkedWords <- '[' Words ']' '(' Uri ')' +LinkedWords <- '[' Words ']' '(' ((Uri _)? LinkTitle / Uri) ')' / '[' Words ']' LinkLabel / LinkLabel AnnotatedWords <- '[' Words ']' '{' ![{}] PlainWords '}' LinkLabel <- '[' _? ![\[\]] PlainWords _? ']' +LinkTitle <- '"' _? !'"' _? PlainWords _? '"' + / "'" _? !"'" PlainWords _? "'" + / "(" _? ![()] PlainWords _? ")" PlainWords <- PRINTABLES (_ PRINTABLES)* Uri <- '<' ![<>] PRINTABLES? '>' / ![<>] PRINTABLES HardBreak <- SPACE SPACE+ NEWLINE diff --git a/def_LinkDefinition.py b/def_LinkDefinition.py index 67b5797..a5cb2f2 100755 --- a/def_LinkDefinition.py +++ b/def_LinkDefinition.py @@ -14,9 +14,7 @@ Diagram( NonTerminal("Uri"), Optional(Sequence( NonTerminal("_"), - '"', - NonTerminal("!'\"' PlainWords"), - '"' + NonTerminal("LinkTitle") )), NonTerminal("NEWLINE"), End("complex") diff --git a/def_LinkTitle.py b/def_LinkTitle.py new file mode 100755 index 0000000..02f39d6 --- /dev/null +++ b/def_LinkTitle.py @@ -0,0 +1,36 @@ +#!/usr/bin/python3 + +# Copyright 2025, Jonas Smedegaard +# SPDX-License-Identifier: GPL-3+ + +from os.path import basename, splitext +from railroad import * + +Diagram( + Start("complex"), + Choice(0, + Sequence( + '"', + Optional(NonTerminal("_")), + NonTerminal("!'\"' PlainWords"), + Optional(NonTerminal("_")), + '"', + ), + Sequence( + "'", + Optional(NonTerminal("_")), + NonTerminal("!\"'\" PlainWords"), + Optional(NonTerminal("_")), + "'", + ), + Sequence( + "(", + Optional(NonTerminal("_")), + NonTerminal("![()] PlainWords"), + Optional(NonTerminal("_")), + ")", + ) + ), + End("complex") +).writeStandalone( + open(splitext(basename(__file__))[0] + ".svg", "w").write) diff --git a/def_LinkedWords.py b/def_LinkedWords.py index f5e2519..83ba83c 100755 --- a/def_LinkedWords.py +++ b/def_LinkedWords.py @@ -14,7 +14,16 @@ Diagram( NonTerminal("Words"), "]", "(", - NonTerminal("Uri"), + Choice(0, + Sequence( + Optional(Sequence( + NonTerminal("Uri"), + NonTerminal("_") + )), + NonTerminal("LinkTitle") + ), + NonTerminal("Uri"), + ), ")" ), Sequence( -- cgit v1.2.3