From 32a29b0f61c06013260872027d02610441d0f5b9 Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Fri, 20 May 2022 23:24:55 +0200 Subject: [PATCH 01/16] add a lot of hooks for extension --- src/Microdown/MicElement.class.st | 24 +++++++-- src/Microdown/MicInlineParser.class.st | 19 +++++-- .../MicMicrodownTextualBuilder.class.st | 2 +- src/Microdown/MicParagraphBlock.class.st | 5 +- src/Microdown/MicrodownParser.class.st | 51 +++++++++++++++---- 5 files changed, 77 insertions(+), 24 deletions(-) diff --git a/src/Microdown/MicElement.class.st b/src/Microdown/MicElement.class.st index c1664ad2..cb2256c9 100644 --- a/src/Microdown/MicElement.class.st +++ b/src/Microdown/MicElement.class.st @@ -21,12 +21,26 @@ MicElement >> hasProperty: aKey [ { #category : #public } MicElement >> inlineParse: aString [ - | inlineParser childrenCol | - inlineParser := MicInlineParser new. - childrenCol := inlineParser parse: aString. - childrenCol do: [ :each | each parent: self ]. - ^ childrenCol + | inlineParser inlinedChildren | + + inlineParser := self newInlineParser. + inlinedChildren := inlineParser parse: aString. + inlinedChildren do: [ :each | each parent: self ]. + + ^ inlinedChildren + +] + +{ #category : #private } +MicElement >> inlineParserClass [ + + ^ MicInlineParser +] + +{ #category : #private } +MicElement >> newInlineParser [ + ^ self inlineParserClass new ] { #category : #accessing } diff --git a/src/Microdown/MicInlineParser.class.st b/src/Microdown/MicInlineParser.class.st index fc886353..76593329 100644 --- a/src/Microdown/MicInlineParser.class.st +++ b/src/Microdown/MicInlineParser.class.st @@ -147,6 +147,12 @@ MicInlineParser >> delimiterFoundProcess [ +] + +{ #category : #'instance creation' } +MicInlineParser >> elementBlockClass [ + + ^ MicTextBlock ] { #category : #actions } @@ -287,11 +293,14 @@ MicInlineParser >> linkOrFigureProcess: indexOfAssociateOpener [ { #category : #'instance creation' } MicInlineParser >> newBasicInlineBlockFrom: stIndex to: eIndex [ - ^ (MicTextBlock - from: stIndex - to: eIndex - withSubstring: (string copyFrom: stIndex to: eIndex) - withChildren: Array empty) + | text | + + text := string copyFrom: stIndex to: eIndex. + ^ self elementBlockClass + from: stIndex + to: eIndex + withSubstring: text + withChildren: Array empty "should use copyFrom:to:" ] diff --git a/src/Microdown/MicMicrodownTextualBuilder.class.st b/src/Microdown/MicMicrodownTextualBuilder.class.st index 748cb68e..cee90b25 100644 --- a/src/Microdown/MicMicrodownTextualBuilder.class.st +++ b/src/Microdown/MicMicrodownTextualBuilder.class.st @@ -212,7 +212,7 @@ MicMicrodownTextualBuilder >> externalLink: aURL withDescription: aDescriptionBl aDescriptionBlock value. self raw: LinkNameCloserMarkup. self raw: URLOpenerMarkup. - self raw: aURL asString. + self raw: aURL asString trimmed. self raw: URLCloserMarkup. ] diff --git a/src/Microdown/MicParagraphBlock.class.st b/src/Microdown/MicParagraphBlock.class.st index e729b76c..99116f66 100644 --- a/src/Microdown/MicParagraphBlock.class.st +++ b/src/Microdown/MicParagraphBlock.class.st @@ -30,8 +30,7 @@ MicParagraphBlock >> addLineAndReturnNextNode: line [ text := text ifNil: [ line trim ] - ifNotNil: [ text , String cr , line trim ]. - ^ self + ifNotNil: [ text , String cr , line trim ] ] { #category : #private } @@ -44,8 +43,8 @@ MicParagraphBlock >> asUnindented: line [ { #category : #public } MicParagraphBlock >> canConsumeLine: line [ "A paragraph is closed by an empty line, " - | unIndented | + "if we are closing block that can contain other elements then do not consume their ends." (line isEmpty or: [ line beginsWith: EnvironmentClosingBlockMarkup]) ifTrue: [ ^ false ]. diff --git a/src/Microdown/MicrodownParser.class.st b/src/Microdown/MicrodownParser.class.st index 2204869c..2bdb6384 100644 --- a/src/Microdown/MicrodownParser.class.st +++ b/src/Microdown/MicrodownParser.class.st @@ -190,19 +190,19 @@ MicrodownParser >> blockStarterClassFrom: line [ line ifEmpty: [ ^ nil ]. (self matchOrdered: line) - ifTrue: [ ^ MicOrderedListBlock ] + ifTrue: [ ^ self orderedListBlockClass ] ifFalse: [ "the max significant length of a markup is 3" - (3 to: 1 by: -1) do: [:i | |prefix| + (3 to: 1 by: -1) do: [:i | | prefix | prefix := (line truncateTo: i). "If we have a inline starter, it takes precedence" (Delimiters includes: prefix) - ifTrue: [ ^ MicParagraphBlock ]. + ifTrue: [ ^ self delimiterBlockClassFor: prefix ]. dispatchTable at: prefix - ifPresent: [ :blockClass | ^ blockClass ] ]]. - ^ MicParagraphBlock + ifPresent: [ :blockClass | ^ blockClass ] ] ]. + ^ self nonMatchedBlockClassFor: line ] { #category : #accessing } @@ -218,6 +218,12 @@ MicrodownParser >> current [ ^ current ] +{ #category : #'node creation' } +MicrodownParser >> delimiterBlockClassFor: prefix [ + + ^ self paragraphBlockClass +] + { #category : #parsing } MicrodownParser >> handleErrorInLine: line [ @@ -238,8 +244,11 @@ MicrodownParser >> handleLine: line [ normalized := line copyReplaceAll: String tab with: String space. [ (current canConsumeLine: normalized) - ifTrue: [ ^ current := current addLineAndReturnNextNode: normalized ] - ifFalse: [ current closeMe ]. + ifTrue: [ + current := current addLineAndReturnNextNode: normalized. + ^ current ] + ifFalse: [ + current closeMe ]. current := current parent. self handleLine: normalized ] on: Error do: [ self handleErrorInLine: line ] ] @@ -288,6 +297,24 @@ MicrodownParser >> newRootBlock [ ^ MicRootBlock new ] +{ #category : #'node creation' } +MicrodownParser >> nonMatchedBlockClassFor: line [ + + ^ self paragraphBlockClass +] + +{ #category : #'node creation' } +MicrodownParser >> orderedListBlockClass [ + + ^ MicOrderedListBlock +] + +{ #category : #'node creation' } +MicrodownParser >> paragraphBlockClass [ + + ^ MicParagraphBlock +] + { #category : #parsing } MicrodownParser >> parse: aStreamOrString [ "returns the root node of aStreamOrText" @@ -299,10 +326,14 @@ MicrodownParser >> parse: aStreamOrString [ inStream := aStreamOrString isStream ifTrue: [ aStreamOrString readStream ] ifFalse: [ aStreamOrString asString readStream ]. - [ line := inStream nextLine. - line isNil ] whileFalse: [ self handleLine: line ]. + [ + line := inStream nextLine. + line isNil ] + whileFalse: [ + self handleLine: line ]. [ current = root ] - whileFalse: [ current closeMe. + whileFalse: [ + current closeMe. current := current parent ]. ^ root ] From 29c10308a2f3fe9be762c3d3eb6847132e56b0de Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Fri, 20 May 2022 23:25:23 +0200 Subject: [PATCH 02/16] required polymmorphism --- src/Microdown/MicArgumentsSplitter.class.st | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Microdown/MicArgumentsSplitter.class.st b/src/Microdown/MicArgumentsSplitter.class.st index 8be27934..efc85579 100644 --- a/src/Microdown/MicArgumentsSplitter.class.st +++ b/src/Microdown/MicArgumentsSplitter.class.st @@ -53,6 +53,12 @@ MicArgumentsSplitter class >> withString: aString [ ^ self split: aString ] +{ #category : #accessing } +MicArgumentsSplitter >> children [ + + ^ #() +] + { #category : #accessing } MicArgumentsSplitter >> defaultArg [ From 758ef195eb9c34a1c55c206169b06030c8a84766 Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 11:18:04 +0200 Subject: [PATCH 03/16] some refactors to improve legibility (I hate ifs, heh ;) and to make it easier to extent --- .../BaselineOfMicrodown.class.st | 7 +- .../MdsLineBreakBlock.extension.st | 7 + src/Microdown/MicAbstractDelimiter.class.st | 18 +++ .../MicFigureNameOpenerDelimiter.class.st | 15 ++ src/Microdown/MicInlineParser.class.st | 129 ++++++++++-------- .../MicLinkNameCloserDelimiter.class.st | 7 +- src/Microdown/MicLinkNameDelimiter.class.st | 26 ++++ .../MicLinkNameOpenerDelimiter.class.st | 7 +- src/Microdown/MicParagraphBlock.class.st | 10 +- 9 files changed, 151 insertions(+), 75 deletions(-) create mode 100644 src/Microdown-Pillar/MdsLineBreakBlock.extension.st create mode 100644 src/Microdown/MicLinkNameDelimiter.class.st diff --git a/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st b/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st index ea72b184..fb104489 100644 --- a/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st +++ b/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st @@ -66,7 +66,6 @@ BaselineOfMicrodown >> baseline: spec [ package: #'Microdown-LaTeXExporter-Tests' with: [ spec requires: #( #'Microdown-LaTeXExporter' #'Microdown-Tests') ]; - package: #'Microdown-BeamerExporter' with: [ spec requires: #( #'Microdown-LaTeXExporter' ) ]; @@ -75,6 +74,9 @@ BaselineOfMicrodown >> baseline: spec [ package: #'Microdown-PrettyPrinter' with: [ spec requires: #( #Microdown ) ]; + + package: #'Microdown-MarkdownStrict' + with: [ spec requires: #( #Microdown ) ]; "contains the asPillar and converter from MD to Pillar" package: #'Microdown-Pillar' @@ -90,6 +92,7 @@ BaselineOfMicrodown >> baseline: spec [ spec group: 'Core' with: #('Microdown'); group: 'Tests' with: #('Core' 'Microdown-Tests'); + group: 'MarkdownStrict' with: #('Core' 'Microdown-MarkdownStrict' ); group: 'RichText' with: #('Core' 'Microdown-RichTextComposer' ); group: 'Extensions' with: #( #'Microdown-RichTextPresenter' @@ -105,5 +108,5 @@ BaselineOfMicrodown >> baseline: spec [ #'Microdown-LaTeXExporter-Tests' #'Microdown-Transformer' #'Microdown-Transformer-Tests'); - group: 'All' with: #('Core' 'Tests' 'Extensions' #'Microdown-Pharo-Tools' 'RichText') ] + group: 'All' with: #('Core' 'Tests' 'Extensions' 'Microdown-MarkdownStrict' 'Microdown-Pharo-Tools' 'RichText') ] ] diff --git a/src/Microdown-Pillar/MdsLineBreakBlock.extension.st b/src/Microdown-Pillar/MdsLineBreakBlock.extension.st new file mode 100644 index 00000000..3e6ed6f1 --- /dev/null +++ b/src/Microdown-Pillar/MdsLineBreakBlock.extension.st @@ -0,0 +1,7 @@ +Extension { #name : #MdsLineBreakBlock } + +{ #category : #'*Microdown-Pillar' } +MdsLineBreakBlock >> associatedPillarClass [ + + ^ PRLineBreak +] diff --git a/src/Microdown/MicAbstractDelimiter.class.st b/src/Microdown/MicAbstractDelimiter.class.st index 7909bde1..98b2efca 100644 --- a/src/Microdown/MicAbstractDelimiter.class.st +++ b/src/Microdown/MicAbstractDelimiter.class.st @@ -31,6 +31,12 @@ MicAbstractDelimiter class >> associatedInlineBlock [ ^ self subclassResponsibility ] +{ #category : #accessing } +MicAbstractDelimiter class >> associatedTypes [ + + ^ { self type } +] + { #category : #accessing } MicAbstractDelimiter class >> index: anIndex [ ^ self new index: anIndex; yourself @@ -81,11 +87,23 @@ MicAbstractDelimiter class >> type [ ^ self subclassResponsibility ] +{ #category : #dispatching } +MicAbstractDelimiter >> addInlineBlock: anIndex to: inlineParser [ + + inlineParser addRegularInlineBlock: anIndex +] + { #category : #accessing } MicAbstractDelimiter >> associatedInlineBlock [ ^ self class associatedInlineBlock ] +{ #category : #accessing } +MicAbstractDelimiter >> endIndex [ + + ^ self index - 1 +] + { #category : #accessing } MicAbstractDelimiter >> index [ ^ index diff --git a/src/Microdown/MicFigureNameOpenerDelimiter.class.st b/src/Microdown/MicFigureNameOpenerDelimiter.class.st index 51fe41bb..8dca9a40 100644 --- a/src/Microdown/MicFigureNameOpenerDelimiter.class.st +++ b/src/Microdown/MicFigureNameOpenerDelimiter.class.st @@ -12,6 +12,15 @@ MicFigureNameOpenerDelimiter class >> associatedInlineBlock [ ^ MicFigureBlock ] +{ #category : #accessing } +MicFigureNameOpenerDelimiter class >> associatedTypes [ + + ^ { + MicLinkNameDelimiter type. + self type. + } +] + { #category : #accessing } MicFigureNameOpenerDelimiter class >> isCloser [ ^ false @@ -31,3 +40,9 @@ MicFigureNameOpenerDelimiter class >> markup [ MicFigureNameOpenerDelimiter class >> type [ ^ #figure ] + +{ #category : #dispatching } +MicFigureNameOpenerDelimiter >> addInlineBlock: anIndex to: inlineParser [ + + inlineParser linkOrFigureProcess: anIndex +] diff --git a/src/Microdown/MicInlineParser.class.st b/src/Microdown/MicInlineParser.class.st index 76593329..d8b1937a 100644 --- a/src/Microdown/MicInlineParser.class.st +++ b/src/Microdown/MicInlineParser.class.st @@ -68,34 +68,43 @@ MicInlineParser >> addATextFrom: start to: end toFinalArray: aFinalArray [ { #category : #process } MicInlineParser >> addInlineBlock: indexOfAssociateOpener [ - | startIndex endIndex | + opener := openersStack at: indexOfAssociateOpener. closer := delimiterClass index: index. - "Check the linkName or figure case" - (#(#linkName #figure) includes: opener type ) - ifTrue: [ self linkOrFigureProcess: indexOfAssociateOpener ] - ifFalse: [ - startIndex := opener index + opener size. - endIndex := closer index - 1. - correctSubstring := string copyFrom: startIndex to: endIndex. - "Delete openers above in stack, considered as unclosed so ignored" - self popFrom: 1 to: indexOfAssociateOpener. - "Add found inline block" - openersStack - ifNotEmpty: [ - (openersStack size > nestedLevel) - ifTrue: [ - children - ifEmpty: [ children add: self newInlineBlock ] - ifNotEmpty: [ children addLast: self newInlineBlock ] ] - ifFalse: [ children add: self newInlineBlockWithoutChildren ]. - ] - ifEmpty: [ - result add: self newInlineBlock. - children := LinkedList new. - ]. - nestedLevel := openersStack size. - ] + + opener addInlineBlock: indexOfAssociateOpener to: self + +] + +{ #category : #process } +MicInlineParser >> addInlineBlock: indexOfAssociateOpener from: startIndex to: endIndex [ + + correctSubstring := string copyFrom: startIndex to: endIndex. + "Delete openers above in stack, considered as unclosed so ignored" + self popFrom: 1 to: indexOfAssociateOpener. + "Add found inline block" + openersStack + ifNotEmpty: [ + (openersStack size > nestedLevel) + ifTrue: [ + children + ifEmpty: [ children add: self newInlineBlock ] + ifNotEmpty: [ children addLast: self newInlineBlock ] ] + ifFalse: [ children add: self newInlineBlockWithoutChildren ] ] + ifEmpty: [ + result add: self newInlineBlock. + children := LinkedList new ]. + + nestedLevel := openersStack size +] + +{ #category : #process } +MicInlineParser >> addRegularInlineBlock: indexOfAssociateOpener [ + + self + addInlineBlock: indexOfAssociateOpener + from: opener index + opener size + to: closer endIndex ] { #category : #accessing } @@ -106,7 +115,7 @@ MicInlineParser >> allDelimiters [ { #category : #process } MicInlineParser >> bothCase [ | indexOfAssociateOpener | - indexOfAssociateOpener := openersStack findFirst: [ :each | delimiterClass type = each type ]. + indexOfAssociateOpener := self findType: delimiterClass type. (openersStack isEmpty or: [ indexOfAssociateOpener = 0]) ifTrue: [ "We consider the delimiter as a new opener or it's the first opener" @@ -121,32 +130,21 @@ MicInlineParser >> closerOnlyCase [ "IF delimiter found is a closer which can close an opened inline block THEN we add the associate inline block ELSE we ignore it" - | indexOfAssociateOpener typesToFind| - typesToFind := (#(#linkName #figure) includes: delimiterClass type ) - ifTrue: [#(#linkName #figure)] - ifFalse: [ Array braceWith: delimiterClass type ]. - indexOfAssociateOpener := openersStack findFirst: [ :each | typesToFind includes: each type ]. - (indexOfAssociateOpener > 0) ifTrue: [ self addInlineBlock: indexOfAssociateOpener ] + | indexOfAssociateOpener | + + indexOfAssociateOpener := self findAnyType: delimiterClass associatedTypes. + (indexOfAssociateOpener > 0) + ifTrue: [ self addInlineBlock: indexOfAssociateOpener ] ] { #category : #process } MicInlineParser >> delimiterFoundProcess [ "Case 1: it's a opener only" - (delimiterClass isOpenerOnly) - ifTrue: [ self openerOnlyCase ] - ifFalse: [ - "Case 2: it's both opener and closer" - (delimiterClass isBoth) - ifTrue: [ self bothCase ] - ifFalse: [ - "Case 3: it's a closer only" - self closerOnlyCase - ] - ] - - - - + delimiterClass isOpenerOnly ifTrue: [ ^ self openerOnlyCase ]. + "Case 2: it's both opener and closer" + delimiterClass isBoth ifTrue: [ ^ self bothCase ]. + "Case 3: it's a closer only" + self closerOnlyCase ] { #category : #'instance creation' } @@ -155,15 +153,28 @@ MicInlineParser >> elementBlockClass [ ^ MicTextBlock ] +{ #category : #private } +MicInlineParser >> findAnyType: aCollectionOfType [ + + ^ openersStack findFirst: [ :each | aCollectionOfType includes: each type ] +] + +{ #category : #private } +MicInlineParser >> findType: aType [ + + ^ self findAnyType: { aType } +] + { #category : #actions } MicInlineParser >> identifyMarkupFor: aString [ - (self class keyBeginSet includes: aString first) ifFalse: [ ^self ]. + + (self class keyBeginSet includes: aString first) ifFalse: [ ^ 1 ]. keys do: [ :key | (aString beginsWith: key) ifTrue: [ incrementation := key size. delimiterClass := allDelimiters at: key. self delimiterFoundProcess. - ^ self ] ] + ^ 1 ] ] ] { #category : #actions } @@ -308,6 +319,7 @@ MicInlineParser >> newBasicInlineBlockFrom: stIndex to: eIndex [ { #category : #'instance creation' } MicInlineParser >> newInlineBlock [ | inlineBlockClass | + inlineBlockClass := opener associatedInlineBlock. ^ inlineBlockClass isEvaluated ifTrue: [ @@ -316,8 +328,8 @@ MicInlineParser >> newInlineBlock [ to: closer index + closer size - 1 withSubstring: correctSubstring withChildren: children asArray ] - ifFalse: [ self newInlineBlockWithoutChildren ] - + ifFalse: [ + self newInlineBlockWithoutChildren ] ] { #category : #'instance creation' } @@ -375,7 +387,7 @@ MicInlineParser >> openerOnlyCase [ { #category : #public } MicInlineParser >> parse: aString [ - aString ifEmpty: [ ^ Array empty ]. + aString ifEmpty: [ ^ #() ]. string := aString. ^ self read: aString ] @@ -394,19 +406,18 @@ MicInlineParser >> pushNewOpener [ { #category : #actions } MicInlineParser >> read: aString [ | next | + next := aString. [ next isEmpty ] whileFalse: [ - incrementation := 1. - self identifyMarkupFor: next. + incrementation := self identifyMarkupFor: next. "this is stupid to iterate all. We can stop as soon as we found one. " - next first = $\ ifTrue: [ incrementation := incrementation + 1 ]. self indexIncrement: incrementation. next := next size > incrementation ifTrue: [ (next allButFirst: incrementation)] - ifFalse: ['']. - ]. + ifFalse: [''] ]. + ^ self resultProcess ] @@ -414,7 +425,7 @@ MicInlineParser >> read: aString [ MicInlineParser >> resultProcess [ "At the end, we add all basic text between found inline blocks" - result ifEmpty: [ ^ { (self newBasicInlineBlockFrom: 1 to: string size)} ]. + result ifEmpty: [ ^ { self newBasicInlineBlockFrom: 1 to: string size } ]. result do: [ :e | | startSubstring endSubstring | e substring isEmpty diff --git a/src/Microdown/MicLinkNameCloserDelimiter.class.st b/src/Microdown/MicLinkNameCloserDelimiter.class.st index de50601e..93228cf7 100644 --- a/src/Microdown/MicLinkNameCloserDelimiter.class.st +++ b/src/Microdown/MicLinkNameCloserDelimiter.class.st @@ -3,7 +3,7 @@ I am the closer delimiter for link name. " Class { #name : #MicLinkNameCloserDelimiter, - #superclass : #MicAbstractDelimiter, + #superclass : #MicLinkNameDelimiter, #category : #'Microdown-Parser' } @@ -26,8 +26,3 @@ MicLinkNameCloserDelimiter class >> isOpener [ MicLinkNameCloserDelimiter class >> markup [ ^ LinkNameCloserMarkup ] - -{ #category : #accessing } -MicLinkNameCloserDelimiter class >> type [ - ^ #linkName -] diff --git a/src/Microdown/MicLinkNameDelimiter.class.st b/src/Microdown/MicLinkNameDelimiter.class.st new file mode 100644 index 00000000..ea2b88c1 --- /dev/null +++ b/src/Microdown/MicLinkNameDelimiter.class.st @@ -0,0 +1,26 @@ +Class { + #name : #MicLinkNameDelimiter, + #superclass : #MicAbstractDelimiter, + #category : #'Microdown-Parser' +} + +{ #category : #accessing } +MicLinkNameDelimiter class >> associatedTypes [ + + ^ { + self type. + MicFigureNameOpenerDelimiter type. + } +] + +{ #category : #accessing } +MicLinkNameDelimiter class >> type [ + + ^ #linkName +] + +{ #category : #dispatching } +MicLinkNameDelimiter >> addInlineBlock: anIndex to: inlineParser [ + + inlineParser linkOrFigureProcess: anIndex +] diff --git a/src/Microdown/MicLinkNameOpenerDelimiter.class.st b/src/Microdown/MicLinkNameOpenerDelimiter.class.st index 08d9f775..77d4f8e4 100644 --- a/src/Microdown/MicLinkNameOpenerDelimiter.class.st +++ b/src/Microdown/MicLinkNameOpenerDelimiter.class.st @@ -3,7 +3,7 @@ I am the opener delimiter for link name. " Class { #name : #MicLinkNameOpenerDelimiter, - #superclass : #MicAbstractDelimiter, + #superclass : #MicLinkNameDelimiter, #category : #'Microdown-Parser' } @@ -26,8 +26,3 @@ MicLinkNameOpenerDelimiter class >> isOpener [ MicLinkNameOpenerDelimiter class >> markup [ ^ LinkNameOpenerMarkup ] - -{ #category : #accessing } -MicLinkNameOpenerDelimiter class >> type [ - ^ #linkName -] diff --git a/src/Microdown/MicParagraphBlock.class.st b/src/Microdown/MicParagraphBlock.class.st index 99116f66..1ffbf1ea 100644 --- a/src/Microdown/MicParagraphBlock.class.st +++ b/src/Microdown/MicParagraphBlock.class.st @@ -28,9 +28,15 @@ MicParagraphBlock >> addLineAndReturnNextNode: line [ Notice, the action is allowed to create new nodes in the block tree. Returns the node to handle next line - typically self." - text := text + text := self appendLine: line to: text +] + +{ #category : #private } +MicParagraphBlock >> appendLine: line to: aString [ + + ^ aString ifNil: [ line trim ] - ifNotNil: [ text , String cr , line trim ] + ifNotNil: [ aString, String cr, line trim ] ] { #category : #private } From eff661e0443b1742bcaf68b53d19bc277652db98 Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 11:20:00 +0200 Subject: [PATCH 04/16] add "markdown strict" extension, a parser that adds some markdown behaviors not desired on microdown. --- .../MdsInlineParserTest.class.st | 35 +++++++++ .../MdsParagraphBlockTest.class.st | 27 +++++++ src/Microdown-MarkdownStrict-Tests/package.st | 1 + .../MarkdownStrictParser.class.st | 31 ++++++++ .../MdsConstants.class.st | 17 +++++ .../MdsInlineParser.class.st | 54 +++++++++++++ .../MdsLineBreakBlock.class.st | 20 +++++ .../MdsLineBreakDelimiter.class.st | 75 +++++++++++++++++++ .../MdsMailtoResourceReference.class.st | 19 +++++ .../MdsParagraphBlock.class.st | 34 +++++++++ .../MdsRawInlineParser.class.st | 14 ++++ .../MdsRawParagraphBlock.class.st | 51 +++++++++++++ .../MicAbstractDelimiter.extension.st | 13 ++++ ...ObjectToPillarObjectConverter.extension.st | 13 ++++ .../MicrodownVisitor.extension.st | 12 +++ src/Microdown-MarkdownStrict/package.st | 1 + 16 files changed, 417 insertions(+) create mode 100644 src/Microdown-MarkdownStrict-Tests/MdsInlineParserTest.class.st create mode 100644 src/Microdown-MarkdownStrict-Tests/MdsParagraphBlockTest.class.st create mode 100644 src/Microdown-MarkdownStrict-Tests/package.st create mode 100644 src/Microdown-MarkdownStrict/MarkdownStrictParser.class.st create mode 100644 src/Microdown-MarkdownStrict/MdsConstants.class.st create mode 100644 src/Microdown-MarkdownStrict/MdsInlineParser.class.st create mode 100644 src/Microdown-MarkdownStrict/MdsLineBreakBlock.class.st create mode 100644 src/Microdown-MarkdownStrict/MdsLineBreakDelimiter.class.st create mode 100644 src/Microdown-MarkdownStrict/MdsMailtoResourceReference.class.st create mode 100644 src/Microdown-MarkdownStrict/MdsParagraphBlock.class.st create mode 100644 src/Microdown-MarkdownStrict/MdsRawInlineParser.class.st create mode 100644 src/Microdown-MarkdownStrict/MdsRawParagraphBlock.class.st create mode 100644 src/Microdown-MarkdownStrict/MicAbstractDelimiter.extension.st create mode 100644 src/Microdown-MarkdownStrict/MicMicrodownObjectToPillarObjectConverter.extension.st create mode 100644 src/Microdown-MarkdownStrict/MicrodownVisitor.extension.st create mode 100644 src/Microdown-MarkdownStrict/package.st diff --git a/src/Microdown-MarkdownStrict-Tests/MdsInlineParserTest.class.st b/src/Microdown-MarkdownStrict-Tests/MdsInlineParserTest.class.st new file mode 100644 index 00000000..c97b7f61 --- /dev/null +++ b/src/Microdown-MarkdownStrict-Tests/MdsInlineParserTest.class.st @@ -0,0 +1,35 @@ +Class { + #name : #MdsInlineParserTest, + #superclass : #MicInlineParserTest, + #category : #'Microdown-MarkdownStrict-Tests' +} + +{ #category : #accessing } +MdsInlineParserTest >> splitter [ + + ^ MdsInlineParser new +] + +{ #category : #tests } +MdsInlineParserTest >> testParseLineBreak [ + | blocks | + + blocks := self splitter parse: 'x1 +x2 +'. + + self assert: blocks size equals: 3. + self assert: blocks second class equals: MdsLineBreakBlock +] + +{ #category : #tests } +MdsInlineParserTest >> testParseLineBreakManySpaces [ + | blocks | + + blocks := self splitter parse: 'a +b +'. + + self assert: blocks size equals: 3. + self assert: blocks second class equals: MdsLineBreakBlock +] diff --git a/src/Microdown-MarkdownStrict-Tests/MdsParagraphBlockTest.class.st b/src/Microdown-MarkdownStrict-Tests/MdsParagraphBlockTest.class.st new file mode 100644 index 00000000..34c9cc21 --- /dev/null +++ b/src/Microdown-MarkdownStrict-Tests/MdsParagraphBlockTest.class.st @@ -0,0 +1,27 @@ +Class { + #name : #MdsParagraphBlockTest, + #superclass : #MicParagraphBlockTest, + #category : #'Microdown-MarkdownStrict-Tests' +} + +{ #category : #accessing } +MdsParagraphBlockTest >> parserClass [ + + ^ MarkdownStrictParser +] + +{ #category : #tests } +MdsParagraphBlockTest >> testTwoSingleLinesWithSpaces [ + | root paragraph | + + root := parser parse: 'This is +a paragraph on two lines, separated by two spaces'. + self assert: root children size equals: 1. + paragraph := root children first. + + self assert: paragraph children first text equals: 'This is'. + self assert: paragraph children second class equals: MdsLineBreakBlock. + self assert: paragraph children third text equals: 'a paragraph on two lines, separated by two spaces'. + self assert: paragraph text equals: 'This is +a paragraph on two lines, separated by two spaces' +] diff --git a/src/Microdown-MarkdownStrict-Tests/package.st b/src/Microdown-MarkdownStrict-Tests/package.st new file mode 100644 index 00000000..3268def8 --- /dev/null +++ b/src/Microdown-MarkdownStrict-Tests/package.st @@ -0,0 +1 @@ +Package { #name : #'Microdown-MarkdownStrict-Tests' } diff --git a/src/Microdown-MarkdownStrict/MarkdownStrictParser.class.st b/src/Microdown-MarkdownStrict/MarkdownStrictParser.class.st new file mode 100644 index 00000000..d9770b43 --- /dev/null +++ b/src/Microdown-MarkdownStrict/MarkdownStrictParser.class.st @@ -0,0 +1,31 @@ +" +This is a variation of the MicrodownParser that tries to be as close as possible to the ""markdown strict"" definition, that can be seen here: https://www.markdownguide.org/basic-syntax. +" +Class { + #name : #MarkdownStrictParser, + #superclass : #MicrodownParser, + #category : #'Microdown-MarkdownStrict' +} + +{ #category : #'node creation' } +MarkdownStrictParser >> elementBlockClasses [ + + ^ { + MdsRawParagraphBlock. + } +] + +{ #category : #'node creation' } +MarkdownStrictParser >> nonMatchedBlockClassFor: line [ + + ^ self elementBlockClasses + detect: [ :each | each matches: line ] + ifFound: [ :aClass | aClass ] + ifNone: [ self paragraphBlockClass ] +] + +{ #category : #'node creation' } +MarkdownStrictParser >> paragraphBlockClass [ + + ^ MdsParagraphBlock +] diff --git a/src/Microdown-MarkdownStrict/MdsConstants.class.st b/src/Microdown-MarkdownStrict/MdsConstants.class.st new file mode 100644 index 00000000..6eacc8ff --- /dev/null +++ b/src/Microdown-MarkdownStrict/MdsConstants.class.st @@ -0,0 +1,17 @@ +" +Constants to be used on the extended parser. +" +Class { + #name : #MdsConstants, + #superclass : #SharedPool, + #classVars : [ + 'InlineParagraphDelimiter' + ], + #category : #'Microdown-MarkdownStrict' +} + +{ #category : #initialization } +MdsConstants class >> initialize [ + + InlineParagraphDelimiter := ' ' +] diff --git a/src/Microdown-MarkdownStrict/MdsInlineParser.class.st b/src/Microdown-MarkdownStrict/MdsInlineParser.class.st new file mode 100644 index 00000000..fc16acd8 --- /dev/null +++ b/src/Microdown-MarkdownStrict/MdsInlineParser.class.st @@ -0,0 +1,54 @@ +" +Inline parser to detect and parse extended parse functionality. + +- line break with two (or more) spaces. +" +Class { + #name : #MdsInlineParser, + #superclass : #MicInlineParser, + #pools : [ + 'MdsConstants' + ], + #category : #'Microdown-MarkdownStrict' +} + +{ #category : #adding } +MdsInlineParser >> addLineBreakInlineBlock: indexOfAssociateOpener [ + | startIndex endIndex | + + startIndex := opener index + opener size. + endIndex := string indexOf: Character cr startingAt: startIndex. + (endIndex = 0 + or: [ (endIndex - startIndex) = 0 ]) + ifTrue: [ ^ self ]. + + self + addInlineBlock: indexOfAssociateOpener + from: startIndex + to: endIndex +] + +{ #category : #private } +MdsInlineParser >> extentedDelimiters [ + + ^ { MdsLineBreakDelimiter } +] + +{ #category : #actions } +MdsInlineParser >> identifyMarkupFor: aString [ + + ^ self extentedDelimiters + detect: [ :each | each matches: aString ] + ifFound: [ :aDelimiterClass | + delimiterClass := aDelimiterClass. + aDelimiterClass applyOn: self ] + ifNone: [ super identifyMarkupFor: aString ] +] + +{ #category : #applying } +MdsInlineParser >> processLineBreak [ + + self delimiterFoundProcess. + self addInlineBlock: (self findType: delimiterClass type). + ^ result last text size +] diff --git a/src/Microdown-MarkdownStrict/MdsLineBreakBlock.class.st b/src/Microdown-MarkdownStrict/MdsLineBreakBlock.class.st new file mode 100644 index 00000000..07b68198 --- /dev/null +++ b/src/Microdown-MarkdownStrict/MdsLineBreakBlock.class.st @@ -0,0 +1,20 @@ +" +Block to process line breaks. +" +Class { + #name : #MdsLineBreakBlock, + #superclass : #MicInlineElement, + #category : #'Microdown-MarkdownStrict' +} + +{ #category : #visiting } +MdsLineBreakBlock >> accept: aVisitor [ + + ^ aVisitor visitLineBreak: self +] + +{ #category : #accessing } +MdsLineBreakBlock >> kind [ + + ^ #lineBreak +] diff --git a/src/Microdown-MarkdownStrict/MdsLineBreakDelimiter.class.st b/src/Microdown-MarkdownStrict/MdsLineBreakDelimiter.class.st new file mode 100644 index 00000000..adac3f3c --- /dev/null +++ b/src/Microdown-MarkdownStrict/MdsLineBreakDelimiter.class.st @@ -0,0 +1,75 @@ +" +Delimiter definition for line break. +" +Class { + #name : #MdsLineBreakDelimiter, + #superclass : #MicAbstractDelimiter, + #category : #'Microdown-MarkdownStrict' +} + +{ #category : #applying } +MdsLineBreakDelimiter class >> applyOn: inlineParser [ + + ^ inlineParser processLineBreak +] + +{ #category : #accessing } +MdsLineBreakDelimiter class >> associatedInlineBlock [ + + ^ MdsLineBreakBlock +] + +{ #category : #accessing } +MdsLineBreakDelimiter class >> isCloser [ + + ^ true +] + +{ #category : #accessing } +MdsLineBreakDelimiter class >> isOpener [ + + ^ true +] + +{ #category : #accessing } +MdsLineBreakDelimiter class >> markup [ + + ^ #lineBreak +] + +{ #category : #testing } +MdsLineBreakDelimiter class >> matches: aString [ + | indexOfCr | + + (aString size >= 3) ifFalse: [ ^ false ]. + + indexOfCr := (aString indexOf: Character cr) - 1. + indexOfCr < 2 ifTrue: [ ^ false ]. + + ^ (aString first: indexOfCr) allSatisfy: [ :each | each = Character space ] +] + +{ #category : #accessing } +MdsLineBreakDelimiter class >> size [ + + ^ 1 +] + +{ #category : #accessing } +MdsLineBreakDelimiter class >> type [ + + ^ #lineBreak +] + +{ #category : #adding } +MdsLineBreakDelimiter >> addInlineBlock: anIndex to: inlineParser [ + + inlineParser addLineBreakInlineBlock: anIndex + +] + +{ #category : #accessing } +MdsLineBreakDelimiter >> endIndex [ + + ^ self index + self size +] diff --git a/src/Microdown-MarkdownStrict/MdsMailtoResourceReference.class.st b/src/Microdown-MarkdownStrict/MdsMailtoResourceReference.class.st new file mode 100644 index 00000000..04f58d9d --- /dev/null +++ b/src/Microdown-MarkdownStrict/MdsMailtoResourceReference.class.st @@ -0,0 +1,19 @@ +" +Definition of ""mailto"" scheme (to let the links recognise it). +" +Class { + #name : #MdsMailtoResourceReference, + #superclass : #MicAbsoluteResourceReference, + #category : #'Microdown-MarkdownStrict' +} + +{ #category : #'instance creation' } +MdsMailtoResourceReference class >> handlesUriScheme: scheme [ + ^ scheme beginsWith: 'mailto' +] + +{ #category : #accessing } +MdsMailtoResourceReference >> contents [ + + ^ self error: 'Should not arrive here?' +] diff --git a/src/Microdown-MarkdownStrict/MdsParagraphBlock.class.st b/src/Microdown-MarkdownStrict/MdsParagraphBlock.class.st new file mode 100644 index 00000000..0dd98236 --- /dev/null +++ b/src/Microdown-MarkdownStrict/MdsParagraphBlock.class.st @@ -0,0 +1,34 @@ +" +Paragraph extension to process the extended inlines. +" +Class { + #name : #MdsParagraphBlock, + #superclass : #MicParagraphBlock, + #instVars : [ + 'textWithoutBreak' + ], + #pools : [ + 'MdsConstants' + ], + #category : #'Microdown-MarkdownStrict' +} + +{ #category : #parising } +MdsParagraphBlock >> addLineAndReturnNextNode: line [ + + super addLineAndReturnNextNode: line. + textWithoutBreak := self appendLine: line to: textWithoutBreak. + + (line endsWith: InlineParagraphDelimiter) ifFalse: [ ^ self ]. + "add nodes up to now, then insert break and continue" + children addAll: (self inlineParse: textWithoutBreak). + children add: (MdsLineBreakBlock new). + textWithoutBreak := nil +] + +{ #category : #visiting } +MdsParagraphBlock >> closeMe [ + + self children: self children, (self inlineParse: textWithoutBreak). + textWithoutBreak := nil +] diff --git a/src/Microdown-MarkdownStrict/MdsRawInlineParser.class.st b/src/Microdown-MarkdownStrict/MdsRawInlineParser.class.st new file mode 100644 index 00000000..55067a11 --- /dev/null +++ b/src/Microdown-MarkdownStrict/MdsRawInlineParser.class.st @@ -0,0 +1,14 @@ +" +When a raw is detected, the inline parser answer raw blocks. +" +Class { + #name : #MdsRawInlineParser, + #superclass : #MicInlineParser, + #category : #'Microdown-MarkdownStrict' +} + +{ #category : #'instance creation' } +MdsRawInlineParser >> elementBlockClass [ + + ^ MicRawBlock +] diff --git a/src/Microdown-MarkdownStrict/MdsRawParagraphBlock.class.st b/src/Microdown-MarkdownStrict/MdsRawParagraphBlock.class.st new file mode 100644 index 00000000..f402fd14 --- /dev/null +++ b/src/Microdown-MarkdownStrict/MdsRawParagraphBlock.class.st @@ -0,0 +1,51 @@ +" +A raw paragraph block is a block that containes raw content (e.g. plain HTML) +" +Class { + #name : #MdsRawParagraphBlock, + #superclass : #MicParagraphBlock, + #category : #'Microdown-MarkdownStrict' +} + +{ #category : #private } +MdsRawParagraphBlock class >> htmlTags [ + + ^ #('!--' 'a' 'abbr' 'address' 'area' 'article' 'aside' 'audio' 'b' 'base' 'bdi' 'bdo' 'blockquote' 'body' 'br' 'button' 'canvas' 'caption' 'cite' 'code' 'col' 'colgroup' 'data' 'datalist' 'dd' 'del' 'details' 'dfn' 'dialog' 'div' 'dl' 'dt' 'em' 'embed' 'fieldset' 'figcaption' 'figure' 'footer' 'form' 'h1' 'h2' 'h3' 'h4' 'h5' 'h6' 'head' 'header' 'hgroup' 'hr' 'html' 'i' 'iframe' 'img' 'input' 'ins' 'kbd' 'label' 'legend' 'li' 'link' 'main' 'map' 'mark' 'menu' 'meta' 'meter' 'nav' 'noscript' 'object' 'ol' 'optgroup' 'option' 'output' 'p' 'param' 'picture' 'pre' 'progress' 'q' 'rb' 'rp' 'rt' 'rtc' 'ruby' 's' 'samp' 'script' 'section' 'select' 'slot' 'small' 'source' 'span' 'strong' 'style' 'sub' 'summary' 'sup' 'table' 'tbody' 'td' 'template' 'textarea' 'tfoot' 'th' 'thead' 'time' 'title' 'tr' 'track' 'u' 'ul' 'var' 'video' 'wbr') +] + +{ #category : #testing } +MdsRawParagraphBlock class >> matches: aString [ + + ^ self startsWithHtmlTag: aString trimLeft +] + +{ #category : #private } +MdsRawParagraphBlock class >> startsWithHtmlTag: aString [ + | htmlTags | + + aString ifEmpty: [ ^ false ]. + + htmlTags := self htmlTags. + ^ (aString first = $<) + and: [ htmlTags includes: (aString readStream upToAnyOf: '> ') allButFirst ] +] + +{ #category : #visiting } +MdsRawParagraphBlock >> accept: aVisitor [ + + ^ aVisitor visitRawParagraph: self +] + +{ #category : #'parse support' } +MdsRawParagraphBlock >> closeMe [ + | nodes | + + nodes := self inlineParse: text. + self children: nodes +] + +{ #category : #private } +MdsRawParagraphBlock >> inlineParserClass [ + + ^ MdsRawInlineParser +] diff --git a/src/Microdown-MarkdownStrict/MicAbstractDelimiter.extension.st b/src/Microdown-MarkdownStrict/MicAbstractDelimiter.extension.st new file mode 100644 index 00000000..c0aec248 --- /dev/null +++ b/src/Microdown-MarkdownStrict/MicAbstractDelimiter.extension.st @@ -0,0 +1,13 @@ +Extension { #name : #MicAbstractDelimiter } + +{ #category : #'*Microdown-MarkdownStrict' } +MicAbstractDelimiter class >> applyOn: inlineParser [ + + self subclassResponsibility +] + +{ #category : #'*Microdown-MarkdownStrict' } +MicAbstractDelimiter class >> matches: aString [ + + ^ false +] diff --git a/src/Microdown-MarkdownStrict/MicMicrodownObjectToPillarObjectConverter.extension.st b/src/Microdown-MarkdownStrict/MicMicrodownObjectToPillarObjectConverter.extension.st new file mode 100644 index 00000000..91bf3c76 --- /dev/null +++ b/src/Microdown-MarkdownStrict/MicMicrodownObjectToPillarObjectConverter.extension.st @@ -0,0 +1,13 @@ +Extension { #name : #MicMicrodownObjectToPillarObjectConverter } + +{ #category : #'*Microdown-MarkdownStrict' } +MicMicrodownObjectToPillarObjectConverter >> visitLineBreak: aBreak [ + + ^ PRLineBreak new +] + +{ #category : #'*Microdown-MarkdownStrict' } +MicMicrodownObjectToPillarObjectConverter >> visitRawParagraph: aRawParagraph [ + + ^ PRRaw content: aRawParagraph text +] diff --git a/src/Microdown-MarkdownStrict/MicrodownVisitor.extension.st b/src/Microdown-MarkdownStrict/MicrodownVisitor.extension.st new file mode 100644 index 00000000..eae19f86 --- /dev/null +++ b/src/Microdown-MarkdownStrict/MicrodownVisitor.extension.st @@ -0,0 +1,12 @@ +Extension { #name : #MicrodownVisitor } + +{ #category : #'*Microdown-MarkdownStrict' } +MicrodownVisitor >> visitLineBreak: aBreak [ + +] + +{ #category : #'*Microdown-MarkdownStrict' } +MicrodownVisitor >> visitRawParagraph: aRawParagraph [ + + ^ self visitChildrenOf: aRawParagraph +] diff --git a/src/Microdown-MarkdownStrict/package.st b/src/Microdown-MarkdownStrict/package.st new file mode 100644 index 00000000..3422a3b8 --- /dev/null +++ b/src/Microdown-MarkdownStrict/package.st @@ -0,0 +1 @@ +Package { #name : #'Microdown-MarkdownStrict' } From 76bd05d25ea051902355e4013e991ddd684c34da Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 12:43:27 +0200 Subject: [PATCH 05/16] merge --- src/Microdown/MicInlineParser.class.st | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Microdown/MicInlineParser.class.st b/src/Microdown/MicInlineParser.class.st index e5b4d56b..a62ca814 100644 --- a/src/Microdown/MicInlineParser.class.st +++ b/src/Microdown/MicInlineParser.class.st @@ -454,8 +454,8 @@ MicInlineParser >> openerOnlyCase [ MicInlineParser >> parse: aString [ aString ifEmpty: [ ^ #() ]. - string := aString. - ^ self read: aString + string := self class escapeEncode: aString. + ^ self read ] { #category : #actions } @@ -491,11 +491,12 @@ MicInlineParser >> rawRead [ { #category : #actions } MicInlineParser >> read [ | next | - [ (next := string allButFirst: index-1 ) isEmpty ] whileFalse: [ - incrementation := 1. - self identifyMarkupFor: next. - self indexIncrement: incrementation. - ]. + + [ (next := string allButFirst: index-1) isEmpty ] + whileFalse: [ + incrementation := self identifyMarkupFor: next. + self indexIncrement: incrementation ]. + ^ self resultProcess ] @@ -508,7 +509,7 @@ MicInlineParser >> resultProcess [ | startSubstring endSubstring | e substring isEmpty ifTrue: [ startSubstring := endSubstring := 1 ] - ifFalse: [ startSubstring := (string indexOfSubCollection: e substring startingAt: e start) max: 1. + ifFalse: [ startSubstring := e start + e openingDelimiter size. endSubstring := startSubstring + e substring size - 1 ]. e children: (self insertBasicText: e children from: startSubstring to: endSubstring) ]. ^ self insertBasicText: result From 3beecfe28b812d82d5579c9eb82a9a15ffd84ed4 Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 13:46:40 +0200 Subject: [PATCH 06/16] add packages to baseline --- .../BaselineOfMicrodown.class.st | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st b/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st index fb104489..0fdd48dd 100644 --- a/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st +++ b/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st @@ -13,12 +13,8 @@ BaselineOfMicrodown >> baseline: spec [ spec for: #common do: [ - spec - baseline: 'PillarCore' - with: [ - spec - loads: #('Pillar-Core'); - repository: 'github://pillar-markup/pillar:dev-8' ]. + self pillar: spec. + self xmlParserHtml: spec. spec package: #Microdown; @@ -58,7 +54,7 @@ BaselineOfMicrodown >> baseline: spec [ package: #'Microdown-HTMLExporter' with: [ spec requires: #( #Microdown #'Microdown-LaTeXExporter') ]; package: #'Microdown-HTMLExporter-Tests' - with: [ spec requires: #( #'Microdown-HTMLExporter' 'Microdown-Tests') ]; + with: [ spec requires: #( #'Microdown-HTMLExporter' 'Microdown-Tests' 'XMLParserHTML') ]; package: #'Microdown-LaTeXExporter' with: [ spec requires: #( #Microdown ) ]; @@ -66,6 +62,7 @@ BaselineOfMicrodown >> baseline: spec [ package: #'Microdown-LaTeXExporter-Tests' with: [ spec requires: #( #'Microdown-LaTeXExporter' #'Microdown-Tests') ]; + package: #'Microdown-BeamerExporter' with: [ spec requires: #( #'Microdown-LaTeXExporter' ) ]; @@ -74,9 +71,6 @@ BaselineOfMicrodown >> baseline: spec [ package: #'Microdown-PrettyPrinter' with: [ spec requires: #( #Microdown ) ]; - - package: #'Microdown-MarkdownStrict' - with: [ spec requires: #( #Microdown ) ]; "contains the asPillar and converter from MD to Pillar" package: #'Microdown-Pillar' @@ -86,13 +80,19 @@ BaselineOfMicrodown >> baseline: spec [ with: [ spec requires: #( #'Microdown-Pillar' ) ]; package: #'Microdown-PrettyPrinter-Tests' - with: [ spec requires: #( #'Microdown-PrettyPrinter' #'Microdown-Tests') ]. + with: [ spec requires: #( #'Microdown-PrettyPrinter' #'Microdown-Tests') ]; + + package: 'Microdown-MarkdownStrict' + with: [ spec requires: #( #'Microdown') ]; + package: 'Microdown-MarkdownStrict-Tests' + with: [ spec requires: #( #'Microdown-MarkdownStrict' 'Microdown-Tests') ]. + + "I do not want group without tests for now" spec group: 'Core' with: #('Microdown'); group: 'Tests' with: #('Core' 'Microdown-Tests'); - group: 'MarkdownStrict' with: #('Core' 'Microdown-MarkdownStrict' ); group: 'RichText' with: #('Core' 'Microdown-RichTextComposer' ); group: 'Extensions' with: #( #'Microdown-RichTextPresenter' @@ -104,9 +104,33 @@ BaselineOfMicrodown >> baseline: spec [ #'Microdown-PrettyPrinter' #'Microdown-PrettyPrinter-Tests' #'Microdown-HTMLExporter' + #'Microdown-HTMLExporter-Tests' #'Microdown-LaTeXExporter' #'Microdown-LaTeXExporter-Tests' #'Microdown-Transformer' #'Microdown-Transformer-Tests'); - group: 'All' with: #('Core' 'Tests' 'Extensions' 'Microdown-MarkdownStrict' 'Microdown-Pharo-Tools' 'RichText') ] + group: 'MarkdownStrict' with: #('Microdown-MarkdownStrict' 'Microdown-MarkdownStrict-Tests'); + group: 'All' with: #('Core' 'Tests' 'Extensions' 'MarkdownStrict' 'Microdown-Pharo-Tools' 'RichText') ] +] + +{ #category : #'external projects' } +BaselineOfMicrodown >> pillar: spec [ + + spec + baseline: 'PillarCore' + with: [ + spec + loads: #('Pillar-Core'); + repository: 'github://pillar-markup/pillar:dev-8' ] +] + +{ #category : #'external projects' } +BaselineOfMicrodown >> xmlParserHtml: spec [ + + spec + baseline: 'XMLParserHTML' + with: [ + spec + loads: #('Core'); + repository: 'github://pharo-contributions/XML-XMLParserHTML/src' ] ] From 5717d68a7f99782648272f9ce48201950443e0f6 Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 14:26:36 +0200 Subject: [PATCH 07/16] address Kasper concerns and fix a mistmatch problem coming from last changes on dev --- .../MdsLineBreakBlock.class.st | 6 ++++++ .../MdsRawParagraphBlock.class.st | 14 +++++--------- src/Microdown/MicInlineElement.class.st | 12 ++++++++++++ src/Microdown/MicInlineParser.class.st | 10 +++++----- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/Microdown-MarkdownStrict/MdsLineBreakBlock.class.st b/src/Microdown-MarkdownStrict/MdsLineBreakBlock.class.st index 07b68198..458a4c5a 100644 --- a/src/Microdown-MarkdownStrict/MdsLineBreakBlock.class.st +++ b/src/Microdown-MarkdownStrict/MdsLineBreakBlock.class.st @@ -18,3 +18,9 @@ MdsLineBreakBlock >> kind [ ^ #lineBreak ] + +{ #category : #accessing } +MdsLineBreakBlock >> openingDelimiterSize [ + + ^ 0 +] diff --git a/src/Microdown-MarkdownStrict/MdsRawParagraphBlock.class.st b/src/Microdown-MarkdownStrict/MdsRawParagraphBlock.class.st index f402fd14..0bc17e83 100644 --- a/src/Microdown-MarkdownStrict/MdsRawParagraphBlock.class.st +++ b/src/Microdown-MarkdownStrict/MdsRawParagraphBlock.class.st @@ -38,14 +38,10 @@ MdsRawParagraphBlock >> accept: aVisitor [ { #category : #'parse support' } MdsRawParagraphBlock >> closeMe [ - | nodes | - nodes := self inlineParse: text. - self children: nodes -] - -{ #category : #private } -MdsRawParagraphBlock >> inlineParserClass [ - - ^ MdsRawInlineParser + self children: { + MicRawBlock + from: 1 + to: text size + withSubstring: text } ] diff --git a/src/Microdown/MicInlineElement.class.st b/src/Microdown/MicInlineElement.class.st index f8747b4e..860b0fd1 100644 --- a/src/Microdown/MicInlineElement.class.st +++ b/src/Microdown/MicInlineElement.class.st @@ -109,6 +109,18 @@ MicInlineElement >> literal [ ^ substring copyFrom: start to: end. ] +{ #category : #accessing } +MicInlineElement >> openingDelimiter [ + + self subclassResponsibility +] + +{ #category : #accessing } +MicInlineElement >> openingDelimiterSize [ + + ^ self openingDelimiter size +] + { #category : #accessing } MicInlineElement >> parent: aParent [ parent := aParent diff --git a/src/Microdown/MicInlineParser.class.st b/src/Microdown/MicInlineParser.class.st index a62ca814..7bf151b8 100644 --- a/src/Microdown/MicInlineParser.class.st +++ b/src/Microdown/MicInlineParser.class.st @@ -505,13 +505,13 @@ MicInlineParser >> resultProcess [ "At the end, we add all basic text between found inline blocks" result ifEmpty: [ ^ { self newBasicInlineBlockFrom: 1 to: string size } ]. - result do: [ :e | + result do: [ :each | | startSubstring endSubstring | - e substring isEmpty + each substring isEmpty ifTrue: [ startSubstring := endSubstring := 1 ] - ifFalse: [ startSubstring := e start + e openingDelimiter size. - endSubstring := startSubstring + e substring size - 1 ]. - e children: (self insertBasicText: e children from: startSubstring to: endSubstring) ]. + ifFalse: [ startSubstring := each start + each openingDelimiterSize. + endSubstring := startSubstring + each substring size - 1 ]. + each children: (self insertBasicText: each children from: startSubstring to: endSubstring) ]. ^ self insertBasicText: result ] From 28dac86e29fb09073f94df6cc73912b15d7b2b52 Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 14:32:31 +0200 Subject: [PATCH 08/16] remove unused class --- .../MdsRawInlineParser.class.st | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 src/Microdown-MarkdownStrict/MdsRawInlineParser.class.st diff --git a/src/Microdown-MarkdownStrict/MdsRawInlineParser.class.st b/src/Microdown-MarkdownStrict/MdsRawInlineParser.class.st deleted file mode 100644 index 55067a11..00000000 --- a/src/Microdown-MarkdownStrict/MdsRawInlineParser.class.st +++ /dev/null @@ -1,14 +0,0 @@ -" -When a raw is detected, the inline parser answer raw blocks. -" -Class { - #name : #MdsRawInlineParser, - #superclass : #MicInlineParser, - #category : #'Microdown-MarkdownStrict' -} - -{ #category : #'instance creation' } -MdsRawInlineParser >> elementBlockClass [ - - ^ MicRawBlock -] From 493fe4c47abfff6175ca1e0b9dc40c4f97652868 Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 14:37:04 +0200 Subject: [PATCH 09/16] this package was renamed --- .../MdsInlineParserTest.class.st | 35 --------- .../MdsParagraphBlockTest.class.st | 27 ------- src/Microdown-MarkdownStrict-Tests/package.st | 1 - .../MarkdownStrictParser.class.st | 31 -------- .../MdsConstants.class.st | 17 ----- .../MdsInlineParser.class.st | 54 ------------- .../MdsLineBreakBlock.class.st | 26 ------- .../MdsLineBreakDelimiter.class.st | 75 ------------------- .../MdsMailtoResourceReference.class.st | 19 ----- .../MdsParagraphBlock.class.st | 34 --------- .../MdsRawParagraphBlock.class.st | 47 ------------ .../MicAbstractDelimiter.extension.st | 13 ---- ...ObjectToPillarObjectConverter.extension.st | 13 ---- .../MicrodownVisitor.extension.st | 12 --- src/Microdown-MarkdownStrict/package.st | 1 - 15 files changed, 405 deletions(-) delete mode 100644 src/Microdown-MarkdownStrict-Tests/MdsInlineParserTest.class.st delete mode 100644 src/Microdown-MarkdownStrict-Tests/MdsParagraphBlockTest.class.st delete mode 100644 src/Microdown-MarkdownStrict-Tests/package.st delete mode 100644 src/Microdown-MarkdownStrict/MarkdownStrictParser.class.st delete mode 100644 src/Microdown-MarkdownStrict/MdsConstants.class.st delete mode 100644 src/Microdown-MarkdownStrict/MdsInlineParser.class.st delete mode 100644 src/Microdown-MarkdownStrict/MdsLineBreakBlock.class.st delete mode 100644 src/Microdown-MarkdownStrict/MdsLineBreakDelimiter.class.st delete mode 100644 src/Microdown-MarkdownStrict/MdsMailtoResourceReference.class.st delete mode 100644 src/Microdown-MarkdownStrict/MdsParagraphBlock.class.st delete mode 100644 src/Microdown-MarkdownStrict/MdsRawParagraphBlock.class.st delete mode 100644 src/Microdown-MarkdownStrict/MicAbstractDelimiter.extension.st delete mode 100644 src/Microdown-MarkdownStrict/MicMicrodownObjectToPillarObjectConverter.extension.st delete mode 100644 src/Microdown-MarkdownStrict/MicrodownVisitor.extension.st delete mode 100644 src/Microdown-MarkdownStrict/package.st diff --git a/src/Microdown-MarkdownStrict-Tests/MdsInlineParserTest.class.st b/src/Microdown-MarkdownStrict-Tests/MdsInlineParserTest.class.st deleted file mode 100644 index c97b7f61..00000000 --- a/src/Microdown-MarkdownStrict-Tests/MdsInlineParserTest.class.st +++ /dev/null @@ -1,35 +0,0 @@ -Class { - #name : #MdsInlineParserTest, - #superclass : #MicInlineParserTest, - #category : #'Microdown-MarkdownStrict-Tests' -} - -{ #category : #accessing } -MdsInlineParserTest >> splitter [ - - ^ MdsInlineParser new -] - -{ #category : #tests } -MdsInlineParserTest >> testParseLineBreak [ - | blocks | - - blocks := self splitter parse: 'x1 -x2 -'. - - self assert: blocks size equals: 3. - self assert: blocks second class equals: MdsLineBreakBlock -] - -{ #category : #tests } -MdsInlineParserTest >> testParseLineBreakManySpaces [ - | blocks | - - blocks := self splitter parse: 'a -b -'. - - self assert: blocks size equals: 3. - self assert: blocks second class equals: MdsLineBreakBlock -] diff --git a/src/Microdown-MarkdownStrict-Tests/MdsParagraphBlockTest.class.st b/src/Microdown-MarkdownStrict-Tests/MdsParagraphBlockTest.class.st deleted file mode 100644 index 34c9cc21..00000000 --- a/src/Microdown-MarkdownStrict-Tests/MdsParagraphBlockTest.class.st +++ /dev/null @@ -1,27 +0,0 @@ -Class { - #name : #MdsParagraphBlockTest, - #superclass : #MicParagraphBlockTest, - #category : #'Microdown-MarkdownStrict-Tests' -} - -{ #category : #accessing } -MdsParagraphBlockTest >> parserClass [ - - ^ MarkdownStrictParser -] - -{ #category : #tests } -MdsParagraphBlockTest >> testTwoSingleLinesWithSpaces [ - | root paragraph | - - root := parser parse: 'This is -a paragraph on two lines, separated by two spaces'. - self assert: root children size equals: 1. - paragraph := root children first. - - self assert: paragraph children first text equals: 'This is'. - self assert: paragraph children second class equals: MdsLineBreakBlock. - self assert: paragraph children third text equals: 'a paragraph on two lines, separated by two spaces'. - self assert: paragraph text equals: 'This is -a paragraph on two lines, separated by two spaces' -] diff --git a/src/Microdown-MarkdownStrict-Tests/package.st b/src/Microdown-MarkdownStrict-Tests/package.st deleted file mode 100644 index 3268def8..00000000 --- a/src/Microdown-MarkdownStrict-Tests/package.st +++ /dev/null @@ -1 +0,0 @@ -Package { #name : #'Microdown-MarkdownStrict-Tests' } diff --git a/src/Microdown-MarkdownStrict/MarkdownStrictParser.class.st b/src/Microdown-MarkdownStrict/MarkdownStrictParser.class.st deleted file mode 100644 index d9770b43..00000000 --- a/src/Microdown-MarkdownStrict/MarkdownStrictParser.class.st +++ /dev/null @@ -1,31 +0,0 @@ -" -This is a variation of the MicrodownParser that tries to be as close as possible to the ""markdown strict"" definition, that can be seen here: https://www.markdownguide.org/basic-syntax. -" -Class { - #name : #MarkdownStrictParser, - #superclass : #MicrodownParser, - #category : #'Microdown-MarkdownStrict' -} - -{ #category : #'node creation' } -MarkdownStrictParser >> elementBlockClasses [ - - ^ { - MdsRawParagraphBlock. - } -] - -{ #category : #'node creation' } -MarkdownStrictParser >> nonMatchedBlockClassFor: line [ - - ^ self elementBlockClasses - detect: [ :each | each matches: line ] - ifFound: [ :aClass | aClass ] - ifNone: [ self paragraphBlockClass ] -] - -{ #category : #'node creation' } -MarkdownStrictParser >> paragraphBlockClass [ - - ^ MdsParagraphBlock -] diff --git a/src/Microdown-MarkdownStrict/MdsConstants.class.st b/src/Microdown-MarkdownStrict/MdsConstants.class.st deleted file mode 100644 index 6eacc8ff..00000000 --- a/src/Microdown-MarkdownStrict/MdsConstants.class.st +++ /dev/null @@ -1,17 +0,0 @@ -" -Constants to be used on the extended parser. -" -Class { - #name : #MdsConstants, - #superclass : #SharedPool, - #classVars : [ - 'InlineParagraphDelimiter' - ], - #category : #'Microdown-MarkdownStrict' -} - -{ #category : #initialization } -MdsConstants class >> initialize [ - - InlineParagraphDelimiter := ' ' -] diff --git a/src/Microdown-MarkdownStrict/MdsInlineParser.class.st b/src/Microdown-MarkdownStrict/MdsInlineParser.class.st deleted file mode 100644 index fc16acd8..00000000 --- a/src/Microdown-MarkdownStrict/MdsInlineParser.class.st +++ /dev/null @@ -1,54 +0,0 @@ -" -Inline parser to detect and parse extended parse functionality. - -- line break with two (or more) spaces. -" -Class { - #name : #MdsInlineParser, - #superclass : #MicInlineParser, - #pools : [ - 'MdsConstants' - ], - #category : #'Microdown-MarkdownStrict' -} - -{ #category : #adding } -MdsInlineParser >> addLineBreakInlineBlock: indexOfAssociateOpener [ - | startIndex endIndex | - - startIndex := opener index + opener size. - endIndex := string indexOf: Character cr startingAt: startIndex. - (endIndex = 0 - or: [ (endIndex - startIndex) = 0 ]) - ifTrue: [ ^ self ]. - - self - addInlineBlock: indexOfAssociateOpener - from: startIndex - to: endIndex -] - -{ #category : #private } -MdsInlineParser >> extentedDelimiters [ - - ^ { MdsLineBreakDelimiter } -] - -{ #category : #actions } -MdsInlineParser >> identifyMarkupFor: aString [ - - ^ self extentedDelimiters - detect: [ :each | each matches: aString ] - ifFound: [ :aDelimiterClass | - delimiterClass := aDelimiterClass. - aDelimiterClass applyOn: self ] - ifNone: [ super identifyMarkupFor: aString ] -] - -{ #category : #applying } -MdsInlineParser >> processLineBreak [ - - self delimiterFoundProcess. - self addInlineBlock: (self findType: delimiterClass type). - ^ result last text size -] diff --git a/src/Microdown-MarkdownStrict/MdsLineBreakBlock.class.st b/src/Microdown-MarkdownStrict/MdsLineBreakBlock.class.st deleted file mode 100644 index 458a4c5a..00000000 --- a/src/Microdown-MarkdownStrict/MdsLineBreakBlock.class.st +++ /dev/null @@ -1,26 +0,0 @@ -" -Block to process line breaks. -" -Class { - #name : #MdsLineBreakBlock, - #superclass : #MicInlineElement, - #category : #'Microdown-MarkdownStrict' -} - -{ #category : #visiting } -MdsLineBreakBlock >> accept: aVisitor [ - - ^ aVisitor visitLineBreak: self -] - -{ #category : #accessing } -MdsLineBreakBlock >> kind [ - - ^ #lineBreak -] - -{ #category : #accessing } -MdsLineBreakBlock >> openingDelimiterSize [ - - ^ 0 -] diff --git a/src/Microdown-MarkdownStrict/MdsLineBreakDelimiter.class.st b/src/Microdown-MarkdownStrict/MdsLineBreakDelimiter.class.st deleted file mode 100644 index adac3f3c..00000000 --- a/src/Microdown-MarkdownStrict/MdsLineBreakDelimiter.class.st +++ /dev/null @@ -1,75 +0,0 @@ -" -Delimiter definition for line break. -" -Class { - #name : #MdsLineBreakDelimiter, - #superclass : #MicAbstractDelimiter, - #category : #'Microdown-MarkdownStrict' -} - -{ #category : #applying } -MdsLineBreakDelimiter class >> applyOn: inlineParser [ - - ^ inlineParser processLineBreak -] - -{ #category : #accessing } -MdsLineBreakDelimiter class >> associatedInlineBlock [ - - ^ MdsLineBreakBlock -] - -{ #category : #accessing } -MdsLineBreakDelimiter class >> isCloser [ - - ^ true -] - -{ #category : #accessing } -MdsLineBreakDelimiter class >> isOpener [ - - ^ true -] - -{ #category : #accessing } -MdsLineBreakDelimiter class >> markup [ - - ^ #lineBreak -] - -{ #category : #testing } -MdsLineBreakDelimiter class >> matches: aString [ - | indexOfCr | - - (aString size >= 3) ifFalse: [ ^ false ]. - - indexOfCr := (aString indexOf: Character cr) - 1. - indexOfCr < 2 ifTrue: [ ^ false ]. - - ^ (aString first: indexOfCr) allSatisfy: [ :each | each = Character space ] -] - -{ #category : #accessing } -MdsLineBreakDelimiter class >> size [ - - ^ 1 -] - -{ #category : #accessing } -MdsLineBreakDelimiter class >> type [ - - ^ #lineBreak -] - -{ #category : #adding } -MdsLineBreakDelimiter >> addInlineBlock: anIndex to: inlineParser [ - - inlineParser addLineBreakInlineBlock: anIndex - -] - -{ #category : #accessing } -MdsLineBreakDelimiter >> endIndex [ - - ^ self index + self size -] diff --git a/src/Microdown-MarkdownStrict/MdsMailtoResourceReference.class.st b/src/Microdown-MarkdownStrict/MdsMailtoResourceReference.class.st deleted file mode 100644 index 04f58d9d..00000000 --- a/src/Microdown-MarkdownStrict/MdsMailtoResourceReference.class.st +++ /dev/null @@ -1,19 +0,0 @@ -" -Definition of ""mailto"" scheme (to let the links recognise it). -" -Class { - #name : #MdsMailtoResourceReference, - #superclass : #MicAbsoluteResourceReference, - #category : #'Microdown-MarkdownStrict' -} - -{ #category : #'instance creation' } -MdsMailtoResourceReference class >> handlesUriScheme: scheme [ - ^ scheme beginsWith: 'mailto' -] - -{ #category : #accessing } -MdsMailtoResourceReference >> contents [ - - ^ self error: 'Should not arrive here?' -] diff --git a/src/Microdown-MarkdownStrict/MdsParagraphBlock.class.st b/src/Microdown-MarkdownStrict/MdsParagraphBlock.class.st deleted file mode 100644 index 0dd98236..00000000 --- a/src/Microdown-MarkdownStrict/MdsParagraphBlock.class.st +++ /dev/null @@ -1,34 +0,0 @@ -" -Paragraph extension to process the extended inlines. -" -Class { - #name : #MdsParagraphBlock, - #superclass : #MicParagraphBlock, - #instVars : [ - 'textWithoutBreak' - ], - #pools : [ - 'MdsConstants' - ], - #category : #'Microdown-MarkdownStrict' -} - -{ #category : #parising } -MdsParagraphBlock >> addLineAndReturnNextNode: line [ - - super addLineAndReturnNextNode: line. - textWithoutBreak := self appendLine: line to: textWithoutBreak. - - (line endsWith: InlineParagraphDelimiter) ifFalse: [ ^ self ]. - "add nodes up to now, then insert break and continue" - children addAll: (self inlineParse: textWithoutBreak). - children add: (MdsLineBreakBlock new). - textWithoutBreak := nil -] - -{ #category : #visiting } -MdsParagraphBlock >> closeMe [ - - self children: self children, (self inlineParse: textWithoutBreak). - textWithoutBreak := nil -] diff --git a/src/Microdown-MarkdownStrict/MdsRawParagraphBlock.class.st b/src/Microdown-MarkdownStrict/MdsRawParagraphBlock.class.st deleted file mode 100644 index 0bc17e83..00000000 --- a/src/Microdown-MarkdownStrict/MdsRawParagraphBlock.class.st +++ /dev/null @@ -1,47 +0,0 @@ -" -A raw paragraph block is a block that containes raw content (e.g. plain HTML) -" -Class { - #name : #MdsRawParagraphBlock, - #superclass : #MicParagraphBlock, - #category : #'Microdown-MarkdownStrict' -} - -{ #category : #private } -MdsRawParagraphBlock class >> htmlTags [ - - ^ #('!--' 'a' 'abbr' 'address' 'area' 'article' 'aside' 'audio' 'b' 'base' 'bdi' 'bdo' 'blockquote' 'body' 'br' 'button' 'canvas' 'caption' 'cite' 'code' 'col' 'colgroup' 'data' 'datalist' 'dd' 'del' 'details' 'dfn' 'dialog' 'div' 'dl' 'dt' 'em' 'embed' 'fieldset' 'figcaption' 'figure' 'footer' 'form' 'h1' 'h2' 'h3' 'h4' 'h5' 'h6' 'head' 'header' 'hgroup' 'hr' 'html' 'i' 'iframe' 'img' 'input' 'ins' 'kbd' 'label' 'legend' 'li' 'link' 'main' 'map' 'mark' 'menu' 'meta' 'meter' 'nav' 'noscript' 'object' 'ol' 'optgroup' 'option' 'output' 'p' 'param' 'picture' 'pre' 'progress' 'q' 'rb' 'rp' 'rt' 'rtc' 'ruby' 's' 'samp' 'script' 'section' 'select' 'slot' 'small' 'source' 'span' 'strong' 'style' 'sub' 'summary' 'sup' 'table' 'tbody' 'td' 'template' 'textarea' 'tfoot' 'th' 'thead' 'time' 'title' 'tr' 'track' 'u' 'ul' 'var' 'video' 'wbr') -] - -{ #category : #testing } -MdsRawParagraphBlock class >> matches: aString [ - - ^ self startsWithHtmlTag: aString trimLeft -] - -{ #category : #private } -MdsRawParagraphBlock class >> startsWithHtmlTag: aString [ - | htmlTags | - - aString ifEmpty: [ ^ false ]. - - htmlTags := self htmlTags. - ^ (aString first = $<) - and: [ htmlTags includes: (aString readStream upToAnyOf: '> ') allButFirst ] -] - -{ #category : #visiting } -MdsRawParagraphBlock >> accept: aVisitor [ - - ^ aVisitor visitRawParagraph: self -] - -{ #category : #'parse support' } -MdsRawParagraphBlock >> closeMe [ - - self children: { - MicRawBlock - from: 1 - to: text size - withSubstring: text } -] diff --git a/src/Microdown-MarkdownStrict/MicAbstractDelimiter.extension.st b/src/Microdown-MarkdownStrict/MicAbstractDelimiter.extension.st deleted file mode 100644 index c0aec248..00000000 --- a/src/Microdown-MarkdownStrict/MicAbstractDelimiter.extension.st +++ /dev/null @@ -1,13 +0,0 @@ -Extension { #name : #MicAbstractDelimiter } - -{ #category : #'*Microdown-MarkdownStrict' } -MicAbstractDelimiter class >> applyOn: inlineParser [ - - self subclassResponsibility -] - -{ #category : #'*Microdown-MarkdownStrict' } -MicAbstractDelimiter class >> matches: aString [ - - ^ false -] diff --git a/src/Microdown-MarkdownStrict/MicMicrodownObjectToPillarObjectConverter.extension.st b/src/Microdown-MarkdownStrict/MicMicrodownObjectToPillarObjectConverter.extension.st deleted file mode 100644 index 91bf3c76..00000000 --- a/src/Microdown-MarkdownStrict/MicMicrodownObjectToPillarObjectConverter.extension.st +++ /dev/null @@ -1,13 +0,0 @@ -Extension { #name : #MicMicrodownObjectToPillarObjectConverter } - -{ #category : #'*Microdown-MarkdownStrict' } -MicMicrodownObjectToPillarObjectConverter >> visitLineBreak: aBreak [ - - ^ PRLineBreak new -] - -{ #category : #'*Microdown-MarkdownStrict' } -MicMicrodownObjectToPillarObjectConverter >> visitRawParagraph: aRawParagraph [ - - ^ PRRaw content: aRawParagraph text -] diff --git a/src/Microdown-MarkdownStrict/MicrodownVisitor.extension.st b/src/Microdown-MarkdownStrict/MicrodownVisitor.extension.st deleted file mode 100644 index eae19f86..00000000 --- a/src/Microdown-MarkdownStrict/MicrodownVisitor.extension.st +++ /dev/null @@ -1,12 +0,0 @@ -Extension { #name : #MicrodownVisitor } - -{ #category : #'*Microdown-MarkdownStrict' } -MicrodownVisitor >> visitLineBreak: aBreak [ - -] - -{ #category : #'*Microdown-MarkdownStrict' } -MicrodownVisitor >> visitRawParagraph: aRawParagraph [ - - ^ self visitChildrenOf: aRawParagraph -] diff --git a/src/Microdown-MarkdownStrict/package.st b/src/Microdown-MarkdownStrict/package.st deleted file mode 100644 index 3422a3b8..00000000 --- a/src/Microdown-MarkdownStrict/package.st +++ /dev/null @@ -1 +0,0 @@ -Package { #name : #'Microdown-MarkdownStrict' } From 665b2a96a8e47bc533a2ffe4b26e8113ec4a4999 Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 14:38:34 +0200 Subject: [PATCH 10/16] adding macrodown classes --- .../MdsInlineParserTest.class.st | 35 +++++++++ .../MdsParagraphBlockTest.class.st | 27 +++++++ src/Microdown-Macrodown-Tests/package.st | 1 + src/Microdown-Macrodown/MacConstants.class.st | 17 +++++ .../MacInlineParser.class.st | 54 +++++++++++++ .../MacLineBreakBlock.class.st | 32 ++++++++ .../MacLineBreakDelimiter.class.st | 75 +++++++++++++++++++ .../MacMailtoResourceReference.class.st | 19 +++++ .../MacParagraphBlock.class.st | 34 +++++++++ .../MacRawParagraphBlock.class.st | 47 ++++++++++++ .../MacrodownParser.class.st | 31 ++++++++ .../MicAbstractDelimiter.extension.st | 13 ++++ ...ObjectToPillarObjectConverter.extension.st | 13 ++++ .../MicrodownVisitor.extension.st | 12 +++ src/Microdown-Macrodown/package.st | 1 + .../MacLineBreakBlock.extension.st | 7 ++ .../MdsLineBreakBlock.extension.st | 7 -- 17 files changed, 418 insertions(+), 7 deletions(-) create mode 100644 src/Microdown-Macrodown-Tests/MdsInlineParserTest.class.st create mode 100644 src/Microdown-Macrodown-Tests/MdsParagraphBlockTest.class.st create mode 100644 src/Microdown-Macrodown-Tests/package.st create mode 100644 src/Microdown-Macrodown/MacConstants.class.st create mode 100644 src/Microdown-Macrodown/MacInlineParser.class.st create mode 100644 src/Microdown-Macrodown/MacLineBreakBlock.class.st create mode 100644 src/Microdown-Macrodown/MacLineBreakDelimiter.class.st create mode 100644 src/Microdown-Macrodown/MacMailtoResourceReference.class.st create mode 100644 src/Microdown-Macrodown/MacParagraphBlock.class.st create mode 100644 src/Microdown-Macrodown/MacRawParagraphBlock.class.st create mode 100644 src/Microdown-Macrodown/MacrodownParser.class.st create mode 100644 src/Microdown-Macrodown/MicAbstractDelimiter.extension.st create mode 100644 src/Microdown-Macrodown/MicMicrodownObjectToPillarObjectConverter.extension.st create mode 100644 src/Microdown-Macrodown/MicrodownVisitor.extension.st create mode 100644 src/Microdown-Macrodown/package.st create mode 100644 src/Microdown-Pillar/MacLineBreakBlock.extension.st delete mode 100644 src/Microdown-Pillar/MdsLineBreakBlock.extension.st diff --git a/src/Microdown-Macrodown-Tests/MdsInlineParserTest.class.st b/src/Microdown-Macrodown-Tests/MdsInlineParserTest.class.st new file mode 100644 index 00000000..5f0ae966 --- /dev/null +++ b/src/Microdown-Macrodown-Tests/MdsInlineParserTest.class.st @@ -0,0 +1,35 @@ +Class { + #name : #MdsInlineParserTest, + #superclass : #MicInlineParserTest, + #category : #'Microdown-Macrodown-Tests' +} + +{ #category : #accessing } +MdsInlineParserTest >> splitter [ + + ^ MacInlineParser new +] + +{ #category : #tests } +MdsInlineParserTest >> testParseLineBreak [ + | blocks | + + blocks := self splitter parse: 'x1 +x2 +'. + + self assert: blocks size equals: 3. + self assert: blocks second class equals: MacLineBreakBlock +] + +{ #category : #tests } +MdsInlineParserTest >> testParseLineBreakManySpaces [ + | blocks | + + blocks := self splitter parse: 'a +b +'. + + self assert: blocks size equals: 3. + self assert: blocks second class equals: MacLineBreakBlock +] diff --git a/src/Microdown-Macrodown-Tests/MdsParagraphBlockTest.class.st b/src/Microdown-Macrodown-Tests/MdsParagraphBlockTest.class.st new file mode 100644 index 00000000..05914111 --- /dev/null +++ b/src/Microdown-Macrodown-Tests/MdsParagraphBlockTest.class.st @@ -0,0 +1,27 @@ +Class { + #name : #MdsParagraphBlockTest, + #superclass : #MicParagraphBlockTest, + #category : #'Microdown-Macrodown-Tests' +} + +{ #category : #accessing } +MdsParagraphBlockTest >> parserClass [ + + ^ MacrodownParser +] + +{ #category : #tests } +MdsParagraphBlockTest >> testTwoSingleLinesWithSpaces [ + | root paragraph | + + root := parser parse: 'This is +a paragraph on two lines, separated by two spaces'. + self assert: root children size equals: 1. + paragraph := root children first. + + self assert: paragraph children first text equals: 'This is'. + self assert: paragraph children second class equals: MacLineBreakBlock. + self assert: paragraph children third text equals: 'a paragraph on two lines, separated by two spaces'. + self assert: paragraph text equals: 'This is +a paragraph on two lines, separated by two spaces' +] diff --git a/src/Microdown-Macrodown-Tests/package.st b/src/Microdown-Macrodown-Tests/package.st new file mode 100644 index 00000000..49afc124 --- /dev/null +++ b/src/Microdown-Macrodown-Tests/package.st @@ -0,0 +1 @@ +Package { #name : #'Microdown-Macrodown-Tests' } diff --git a/src/Microdown-Macrodown/MacConstants.class.st b/src/Microdown-Macrodown/MacConstants.class.st new file mode 100644 index 00000000..7d24510d --- /dev/null +++ b/src/Microdown-Macrodown/MacConstants.class.st @@ -0,0 +1,17 @@ +" +Constants to be used on the extended parser. +" +Class { + #name : #MacConstants, + #superclass : #SharedPool, + #classVars : [ + 'InlineParagraphDelimiter' + ], + #category : #'Microdown-Macrodown' +} + +{ #category : #initialization } +MacConstants class >> initialize [ + + InlineParagraphDelimiter := ' ' +] diff --git a/src/Microdown-Macrodown/MacInlineParser.class.st b/src/Microdown-Macrodown/MacInlineParser.class.st new file mode 100644 index 00000000..cc635c6d --- /dev/null +++ b/src/Microdown-Macrodown/MacInlineParser.class.st @@ -0,0 +1,54 @@ +" +Inline parser to detect and parse extended parse functionality. + +- line break with two (or more) spaces. +" +Class { + #name : #MacInlineParser, + #superclass : #MicInlineParser, + #pools : [ + 'MacConstants' + ], + #category : #'Microdown-Macrodown' +} + +{ #category : #adding } +MacInlineParser >> addLineBreakInlineBlock: indexOfAssociateOpener [ + | startIndex endIndex | + + startIndex := opener index + opener size. + endIndex := string indexOf: Character cr startingAt: startIndex. + (endIndex = 0 + or: [ (endIndex - startIndex) = 0 ]) + ifTrue: [ ^ self ]. + + self + addInlineBlock: indexOfAssociateOpener + from: startIndex + to: endIndex +] + +{ #category : #private } +MacInlineParser >> extentedDelimiters [ + + ^ { MacLineBreakDelimiter } +] + +{ #category : #actions } +MacInlineParser >> identifyMarkupFor: aString [ + + ^ self extentedDelimiters + detect: [ :each | each matches: aString ] + ifFound: [ :aDelimiterClass | + delimiterClass := aDelimiterClass. + aDelimiterClass applyOn: self ] + ifNone: [ super identifyMarkupFor: aString ] +] + +{ #category : #applying } +MacInlineParser >> processLineBreak [ + + self delimiterFoundProcess. + self addInlineBlock: (self findType: delimiterClass type). + ^ result last text size +] diff --git a/src/Microdown-Macrodown/MacLineBreakBlock.class.st b/src/Microdown-Macrodown/MacLineBreakBlock.class.st new file mode 100644 index 00000000..2c3d681c --- /dev/null +++ b/src/Microdown-Macrodown/MacLineBreakBlock.class.st @@ -0,0 +1,32 @@ +" +Block to process line breaks. +" +Class { + #name : #MacLineBreakBlock, + #superclass : #MicInlineElement, + #category : #'Microdown-Macrodown' +} + +{ #category : #visiting } +MacLineBreakBlock >> accept: aVisitor [ + + ^ aVisitor visitLineBreak: self +] + +{ #category : #accessing } +MacLineBreakBlock >> kind [ + + ^ #lineBreak +] + +{ #category : #accessing } +MacLineBreakBlock >> openingDelimiter [ + + ^ nil +] + +{ #category : #accessing } +MacLineBreakBlock >> openingDelimiterSize [ + + ^ 0 +] diff --git a/src/Microdown-Macrodown/MacLineBreakDelimiter.class.st b/src/Microdown-Macrodown/MacLineBreakDelimiter.class.st new file mode 100644 index 00000000..0b87ab28 --- /dev/null +++ b/src/Microdown-Macrodown/MacLineBreakDelimiter.class.st @@ -0,0 +1,75 @@ +" +Delimiter definition for line break. +" +Class { + #name : #MacLineBreakDelimiter, + #superclass : #MicAbstractDelimiter, + #category : #'Microdown-Macrodown' +} + +{ #category : #applying } +MacLineBreakDelimiter class >> applyOn: inlineParser [ + + ^ inlineParser processLineBreak +] + +{ #category : #accessing } +MacLineBreakDelimiter class >> associatedInlineBlock [ + + ^ MacLineBreakBlock +] + +{ #category : #accessing } +MacLineBreakDelimiter class >> isCloser [ + + ^ true +] + +{ #category : #accessing } +MacLineBreakDelimiter class >> isOpener [ + + ^ true +] + +{ #category : #accessing } +MacLineBreakDelimiter class >> markup [ + + ^ #lineBreak +] + +{ #category : #testing } +MacLineBreakDelimiter class >> matches: aString [ + | indexOfCr | + + (aString size >= 3) ifFalse: [ ^ false ]. + + indexOfCr := (aString indexOf: Character cr) - 1. + indexOfCr < 2 ifTrue: [ ^ false ]. + + ^ (aString first: indexOfCr) allSatisfy: [ :each | each = Character space ] +] + +{ #category : #accessing } +MacLineBreakDelimiter class >> size [ + + ^ 1 +] + +{ #category : #accessing } +MacLineBreakDelimiter class >> type [ + + ^ #lineBreak +] + +{ #category : #adding } +MacLineBreakDelimiter >> addInlineBlock: anIndex to: inlineParser [ + + inlineParser addLineBreakInlineBlock: anIndex + +] + +{ #category : #accessing } +MacLineBreakDelimiter >> endIndex [ + + ^ self index + self size +] diff --git a/src/Microdown-Macrodown/MacMailtoResourceReference.class.st b/src/Microdown-Macrodown/MacMailtoResourceReference.class.st new file mode 100644 index 00000000..635f3a36 --- /dev/null +++ b/src/Microdown-Macrodown/MacMailtoResourceReference.class.st @@ -0,0 +1,19 @@ +" +Definition of ""mailto"" scheme (to let the links recognise it). +" +Class { + #name : #MacMailtoResourceReference, + #superclass : #MicAbsoluteResourceReference, + #category : #'Microdown-Macrodown' +} + +{ #category : #'instance creation' } +MacMailtoResourceReference class >> handlesUriScheme: scheme [ + ^ scheme beginsWith: 'mailto' +] + +{ #category : #accessing } +MacMailtoResourceReference >> contents [ + + ^ self error: 'Should not arrive here?' +] diff --git a/src/Microdown-Macrodown/MacParagraphBlock.class.st b/src/Microdown-Macrodown/MacParagraphBlock.class.st new file mode 100644 index 00000000..8b6bb9e8 --- /dev/null +++ b/src/Microdown-Macrodown/MacParagraphBlock.class.st @@ -0,0 +1,34 @@ +" +Paragraph extension to process the extended inlines. +" +Class { + #name : #MacParagraphBlock, + #superclass : #MicParagraphBlock, + #instVars : [ + 'textWithoutBreak' + ], + #pools : [ + 'MacConstants' + ], + #category : #'Microdown-Macrodown' +} + +{ #category : #parising } +MacParagraphBlock >> addLineAndReturnNextNode: line [ + + super addLineAndReturnNextNode: line. + textWithoutBreak := self appendLine: line to: textWithoutBreak. + + (line endsWith: InlineParagraphDelimiter) ifFalse: [ ^ self ]. + "add nodes up to now, then insert break and continue" + children addAll: (self inlineParse: textWithoutBreak). + children add: (MacLineBreakBlock new). + textWithoutBreak := nil +] + +{ #category : #visiting } +MacParagraphBlock >> closeMe [ + + self children: self children, (self inlineParse: textWithoutBreak). + textWithoutBreak := nil +] diff --git a/src/Microdown-Macrodown/MacRawParagraphBlock.class.st b/src/Microdown-Macrodown/MacRawParagraphBlock.class.st new file mode 100644 index 00000000..765e568a --- /dev/null +++ b/src/Microdown-Macrodown/MacRawParagraphBlock.class.st @@ -0,0 +1,47 @@ +" +A raw paragraph block is a block that containes raw content (e.g. plain HTML) +" +Class { + #name : #MacRawParagraphBlock, + #superclass : #MicParagraphBlock, + #category : #'Microdown-Macrodown' +} + +{ #category : #private } +MacRawParagraphBlock class >> htmlTags [ + + ^ #('!--' 'a' 'abbr' 'address' 'area' 'article' 'aside' 'audio' 'b' 'base' 'bdi' 'bdo' 'blockquote' 'body' 'br' 'button' 'canvas' 'caption' 'cite' 'code' 'col' 'colgroup' 'data' 'datalist' 'dd' 'del' 'details' 'dfn' 'dialog' 'div' 'dl' 'dt' 'em' 'embed' 'fieldset' 'figcaption' 'figure' 'footer' 'form' 'h1' 'h2' 'h3' 'h4' 'h5' 'h6' 'head' 'header' 'hgroup' 'hr' 'html' 'i' 'iframe' 'img' 'input' 'ins' 'kbd' 'label' 'legend' 'li' 'link' 'main' 'map' 'mark' 'menu' 'meta' 'meter' 'nav' 'noscript' 'object' 'ol' 'optgroup' 'option' 'output' 'p' 'param' 'picture' 'pre' 'progress' 'q' 'rb' 'rp' 'rt' 'rtc' 'ruby' 's' 'samp' 'script' 'section' 'select' 'slot' 'small' 'source' 'span' 'strong' 'style' 'sub' 'summary' 'sup' 'table' 'tbody' 'td' 'template' 'textarea' 'tfoot' 'th' 'thead' 'time' 'title' 'tr' 'track' 'u' 'ul' 'var' 'video' 'wbr') +] + +{ #category : #testing } +MacRawParagraphBlock class >> matches: aString [ + + ^ self startsWithHtmlTag: aString trimLeft +] + +{ #category : #private } +MacRawParagraphBlock class >> startsWithHtmlTag: aString [ + | htmlTags | + + aString ifEmpty: [ ^ false ]. + + htmlTags := self htmlTags. + ^ (aString first = $<) + and: [ htmlTags includes: (aString readStream upToAnyOf: '> ') allButFirst ] +] + +{ #category : #visiting } +MacRawParagraphBlock >> accept: aVisitor [ + + ^ aVisitor visitRawParagraph: self +] + +{ #category : #'parse support' } +MacRawParagraphBlock >> closeMe [ + + self children: { + MicRawBlock + from: 1 + to: text size + withSubstring: text } +] diff --git a/src/Microdown-Macrodown/MacrodownParser.class.st b/src/Microdown-Macrodown/MacrodownParser.class.st new file mode 100644 index 00000000..19e3bcf1 --- /dev/null +++ b/src/Microdown-Macrodown/MacrodownParser.class.st @@ -0,0 +1,31 @@ +" +This is a variation of the MicrodownParser that tries to be as close as possible to the ""markdown strict"" definition, that can be seen here: https://www.markdownguide.org/basic-syntax. +" +Class { + #name : #MacrodownParser, + #superclass : #MicrodownParser, + #category : #'Microdown-Macrodown' +} + +{ #category : #'node creation' } +MacrodownParser >> elementBlockClasses [ + + ^ { + MacRawParagraphBlock. + } +] + +{ #category : #'node creation' } +MacrodownParser >> nonMatchedBlockClassFor: line [ + + ^ self elementBlockClasses + detect: [ :each | each matches: line ] + ifFound: [ :aClass | aClass ] + ifNone: [ self paragraphBlockClass ] +] + +{ #category : #'node creation' } +MacrodownParser >> paragraphBlockClass [ + + ^ MacParagraphBlock +] diff --git a/src/Microdown-Macrodown/MicAbstractDelimiter.extension.st b/src/Microdown-Macrodown/MicAbstractDelimiter.extension.st new file mode 100644 index 00000000..8f3164cf --- /dev/null +++ b/src/Microdown-Macrodown/MicAbstractDelimiter.extension.st @@ -0,0 +1,13 @@ +Extension { #name : #MicAbstractDelimiter } + +{ #category : #'*Microdown-Macrodown' } +MicAbstractDelimiter class >> applyOn: inlineParser [ + + self subclassResponsibility +] + +{ #category : #'*Microdown-Macrodown' } +MicAbstractDelimiter class >> matches: aString [ + + ^ false +] diff --git a/src/Microdown-Macrodown/MicMicrodownObjectToPillarObjectConverter.extension.st b/src/Microdown-Macrodown/MicMicrodownObjectToPillarObjectConverter.extension.st new file mode 100644 index 00000000..10c8429e --- /dev/null +++ b/src/Microdown-Macrodown/MicMicrodownObjectToPillarObjectConverter.extension.st @@ -0,0 +1,13 @@ +Extension { #name : #MicMicrodownObjectToPillarObjectConverter } + +{ #category : #'*Microdown-Macrodown' } +MicMicrodownObjectToPillarObjectConverter >> visitLineBreak: aBreak [ + + ^ PRLineBreak new +] + +{ #category : #'*Microdown-Macrodown' } +MicMicrodownObjectToPillarObjectConverter >> visitRawParagraph: aRawParagraph [ + + ^ PRRaw content: aRawParagraph text +] diff --git a/src/Microdown-Macrodown/MicrodownVisitor.extension.st b/src/Microdown-Macrodown/MicrodownVisitor.extension.st new file mode 100644 index 00000000..e763473e --- /dev/null +++ b/src/Microdown-Macrodown/MicrodownVisitor.extension.st @@ -0,0 +1,12 @@ +Extension { #name : #MicrodownVisitor } + +{ #category : #'*Microdown-Macrodown' } +MicrodownVisitor >> visitLineBreak: aBreak [ + +] + +{ #category : #'*Microdown-Macrodown' } +MicrodownVisitor >> visitRawParagraph: aRawParagraph [ + + ^ self visitChildrenOf: aRawParagraph +] diff --git a/src/Microdown-Macrodown/package.st b/src/Microdown-Macrodown/package.st new file mode 100644 index 00000000..f1977b3d --- /dev/null +++ b/src/Microdown-Macrodown/package.st @@ -0,0 +1 @@ +Package { #name : #'Microdown-Macrodown' } diff --git a/src/Microdown-Pillar/MacLineBreakBlock.extension.st b/src/Microdown-Pillar/MacLineBreakBlock.extension.st new file mode 100644 index 00000000..ccb63762 --- /dev/null +++ b/src/Microdown-Pillar/MacLineBreakBlock.extension.st @@ -0,0 +1,7 @@ +Extension { #name : #MacLineBreakBlock } + +{ #category : #'*Microdown-Pillar' } +MacLineBreakBlock >> associatedPillarClass [ + + ^ PRLineBreak +] diff --git a/src/Microdown-Pillar/MdsLineBreakBlock.extension.st b/src/Microdown-Pillar/MdsLineBreakBlock.extension.st deleted file mode 100644 index 3e6ed6f1..00000000 --- a/src/Microdown-Pillar/MdsLineBreakBlock.extension.st +++ /dev/null @@ -1,7 +0,0 @@ -Extension { #name : #MdsLineBreakBlock } - -{ #category : #'*Microdown-Pillar' } -MdsLineBreakBlock >> associatedPillarClass [ - - ^ PRLineBreak -] From 8484a479962aad6d9c0a6a7370066f5f9b4200ce Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 14:39:04 +0200 Subject: [PATCH 11/16] fix baseline --- src/BaselineOfMicrodown/BaselineOfMicrodown.class.st | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st b/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st index 0fdd48dd..9ba238ea 100644 --- a/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st +++ b/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st @@ -109,8 +109,8 @@ BaselineOfMicrodown >> baseline: spec [ #'Microdown-LaTeXExporter-Tests' #'Microdown-Transformer' #'Microdown-Transformer-Tests'); - group: 'MarkdownStrict' with: #('Microdown-MarkdownStrict' 'Microdown-MarkdownStrict-Tests'); - group: 'All' with: #('Core' 'Tests' 'Extensions' 'MarkdownStrict' 'Microdown-Pharo-Tools' 'RichText') ] + group: 'Macrodown' with: #('Microdown-Macrodown' 'Microdown-Macrodown-Tests'); + group: 'All' with: #('Core' 'Tests' 'Extensions' 'Macrodown' 'Microdown-Pharo-Tools' 'RichText') ] ] { #category : #'external projects' } From d1740c1b708c0d72463ee8b0a850860f0dd1e133 Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 14:46:11 +0200 Subject: [PATCH 12/16] fix packages --- src/BaselineOfMicrodown/BaselineOfMicrodown.class.st | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st b/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st index 9ba238ea..aad7fc9b 100644 --- a/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st +++ b/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st @@ -82,10 +82,10 @@ BaselineOfMicrodown >> baseline: spec [ package: #'Microdown-PrettyPrinter-Tests' with: [ spec requires: #( #'Microdown-PrettyPrinter' #'Microdown-Tests') ]; - package: 'Microdown-MarkdownStrict' + package: 'Microdown-Macrodown' with: [ spec requires: #( #'Microdown') ]; - package: 'Microdown-MarkdownStrict-Tests' - with: [ spec requires: #( #'Microdown-MarkdownStrict' 'Microdown-Tests') ]. + package: 'Microdown-Macrodown-Tests' + with: [ spec requires: #( #'Microdown-Macrodown' 'Microdown-Tests') ]. From 560f353178317f927df6f399fe17f9b2b155c58c Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 15:38:54 +0200 Subject: [PATCH 13/16] if keys correspond, we need to answer the key size, not one --- src/Microdown/MicInlineParser.class.st | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Microdown/MicInlineParser.class.st b/src/Microdown/MicInlineParser.class.st index 7bf151b8..61c97f29 100644 --- a/src/Microdown/MicInlineParser.class.st +++ b/src/Microdown/MicInlineParser.class.st @@ -236,10 +236,11 @@ MicInlineParser >> identifyMarkupFor: aString [ (self class keyBeginSet includes: aString first) ifFalse: [ ^ 1 ]. keys do: [ :key | (aString beginsWith: key) ifTrue: [ - incrementation := key size. delimiterClass := allDelimiters at: key. self delimiterFoundProcess. - ^ 1 ] ] + ^ key size ] ]. + + ^ 1 ] { #category : #actions } From 04179f70591bf6f1b55f60ca6c9c471772b825bf Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 15:53:48 +0200 Subject: [PATCH 14/16] rename tests and make MicLinkNameDelimiter not active (but its children yes) --- ...eParserTest.class.st => MacInlineParserTest.class.st} | 8 ++++---- ...BlockTest.class.st => MacParagraphBlockTest.class.st} | 6 +++--- src/Microdown/MicInlineParser.class.st | 9 ++++++--- src/Microdown/MicLinkNameDelimiter.class.st | 6 ++++++ 4 files changed, 19 insertions(+), 10 deletions(-) rename src/Microdown-Macrodown-Tests/{MdsInlineParserTest.class.st => MacInlineParserTest.class.st} (75%) rename src/Microdown-Macrodown-Tests/{MdsParagraphBlockTest.class.st => MacParagraphBlockTest.class.st} (84%) diff --git a/src/Microdown-Macrodown-Tests/MdsInlineParserTest.class.st b/src/Microdown-Macrodown-Tests/MacInlineParserTest.class.st similarity index 75% rename from src/Microdown-Macrodown-Tests/MdsInlineParserTest.class.st rename to src/Microdown-Macrodown-Tests/MacInlineParserTest.class.st index 5f0ae966..ad306095 100644 --- a/src/Microdown-Macrodown-Tests/MdsInlineParserTest.class.st +++ b/src/Microdown-Macrodown-Tests/MacInlineParserTest.class.st @@ -1,17 +1,17 @@ Class { - #name : #MdsInlineParserTest, + #name : #MacInlineParserTest, #superclass : #MicInlineParserTest, #category : #'Microdown-Macrodown-Tests' } { #category : #accessing } -MdsInlineParserTest >> splitter [ +MacInlineParserTest >> splitter [ ^ MacInlineParser new ] { #category : #tests } -MdsInlineParserTest >> testParseLineBreak [ +MacInlineParserTest >> testParseLineBreak [ | blocks | blocks := self splitter parse: 'x1 @@ -23,7 +23,7 @@ x2 ] { #category : #tests } -MdsInlineParserTest >> testParseLineBreakManySpaces [ +MacInlineParserTest >> testParseLineBreakManySpaces [ | blocks | blocks := self splitter parse: 'a diff --git a/src/Microdown-Macrodown-Tests/MdsParagraphBlockTest.class.st b/src/Microdown-Macrodown-Tests/MacParagraphBlockTest.class.st similarity index 84% rename from src/Microdown-Macrodown-Tests/MdsParagraphBlockTest.class.st rename to src/Microdown-Macrodown-Tests/MacParagraphBlockTest.class.st index 05914111..05b890b7 100644 --- a/src/Microdown-Macrodown-Tests/MdsParagraphBlockTest.class.st +++ b/src/Microdown-Macrodown-Tests/MacParagraphBlockTest.class.st @@ -1,17 +1,17 @@ Class { - #name : #MdsParagraphBlockTest, + #name : #MacParagraphBlockTest, #superclass : #MicParagraphBlockTest, #category : #'Microdown-Macrodown-Tests' } { #category : #accessing } -MdsParagraphBlockTest >> parserClass [ +MacParagraphBlockTest >> parserClass [ ^ MacrodownParser ] { #category : #tests } -MdsParagraphBlockTest >> testTwoSingleLinesWithSpaces [ +MacParagraphBlockTest >> testTwoSingleLinesWithSpaces [ | root paragraph | root := parser parse: 'This is diff --git a/src/Microdown/MicInlineParser.class.st b/src/Microdown/MicInlineParser.class.st index 61c97f29..75a46000 100644 --- a/src/Microdown/MicInlineParser.class.st +++ b/src/Microdown/MicInlineParser.class.st @@ -37,13 +37,16 @@ MicInlineParser class >> abstractDelimiterClass [ { #category : #accessing } MicInlineParser class >> allDelimiters [ + AllDelimiters ifNil: [ AllDelimiters := Dictionary new. self abstractDelimiterClass subclasses select: [ :subclass | subclass isActive ] - thenDo: [ :subclass | AllDelimiters - at: subclass markup - put: subclass ]]. + thenDo: [ :subclass | + AllDelimiters + at: subclass markup + put: subclass ] ]. + ^ AllDelimiters ] diff --git a/src/Microdown/MicLinkNameDelimiter.class.st b/src/Microdown/MicLinkNameDelimiter.class.st index ea2b88c1..c6975ead 100644 --- a/src/Microdown/MicLinkNameDelimiter.class.st +++ b/src/Microdown/MicLinkNameDelimiter.class.st @@ -13,6 +13,12 @@ MicLinkNameDelimiter class >> associatedTypes [ } ] +{ #category : #testing } +MicLinkNameDelimiter class >> isActive [ + + ^ self ~= MicLinkNameDelimiter +] + { #category : #accessing } MicLinkNameDelimiter class >> type [ From 61ebf776675b9935a58cc3a3548c0eb1ade3f372 Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 16:05:17 +0200 Subject: [PATCH 15/16] moved tp its own package --- src/BaselineOfMicrodown/BaselineOfMicrodown.class.st | 6 ++++-- .../MacLineBreakBlock.extension.st | 2 +- src/Microdown-Macrodown-Pillar/package.st | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) rename src/{Microdown-Pillar => Microdown-Macrodown-Pillar}/MacLineBreakBlock.extension.st (69%) create mode 100644 src/Microdown-Macrodown-Pillar/package.st diff --git a/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st b/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st index aad7fc9b..cde6e060 100644 --- a/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st +++ b/src/BaselineOfMicrodown/BaselineOfMicrodown.class.st @@ -83,9 +83,11 @@ BaselineOfMicrodown >> baseline: spec [ with: [ spec requires: #( #'Microdown-PrettyPrinter' #'Microdown-Tests') ]; package: 'Microdown-Macrodown' - with: [ spec requires: #( #'Microdown') ]; + with: [ spec requires: #( 'Microdown') ]; + package: #'Microdown-Macrodown-Pillar' + with: [ spec requires: #( 'Microdown-Macrodown' 'PillarCore') ]; package: 'Microdown-Macrodown-Tests' - with: [ spec requires: #( #'Microdown-Macrodown' 'Microdown-Tests') ]. + with: [ spec requires: #( 'Microdown-Macrodown' 'Microdown-Tests') ]. diff --git a/src/Microdown-Pillar/MacLineBreakBlock.extension.st b/src/Microdown-Macrodown-Pillar/MacLineBreakBlock.extension.st similarity index 69% rename from src/Microdown-Pillar/MacLineBreakBlock.extension.st rename to src/Microdown-Macrodown-Pillar/MacLineBreakBlock.extension.st index ccb63762..693e4df1 100644 --- a/src/Microdown-Pillar/MacLineBreakBlock.extension.st +++ b/src/Microdown-Macrodown-Pillar/MacLineBreakBlock.extension.st @@ -1,6 +1,6 @@ Extension { #name : #MacLineBreakBlock } -{ #category : #'*Microdown-Pillar' } +{ #category : #'*Microdown-Macrodown-Pillar' } MacLineBreakBlock >> associatedPillarClass [ ^ PRLineBreak diff --git a/src/Microdown-Macrodown-Pillar/package.st b/src/Microdown-Macrodown-Pillar/package.st new file mode 100644 index 00000000..b67a073c --- /dev/null +++ b/src/Microdown-Macrodown-Pillar/package.st @@ -0,0 +1 @@ +Package { #name : #'Microdown-Macrodown-Pillar' } From 42badb7307ad9b933c55b68aded074cc9ff9ec1d Mon Sep 17 00:00:00 2001 From: Esteban Lorenzano Date: Wed, 25 May 2022 21:17:52 +0200 Subject: [PATCH 16/16] okay, that's what happens when you introduce an abstract subclas and the user is not aware :P --- src/Microdown/MicAbstractDelimiter.class.st | 6 ++++++ src/Microdown/MicInlineParser.class.st | 13 +++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Microdown/MicAbstractDelimiter.class.st b/src/Microdown/MicAbstractDelimiter.class.st index 98b2efca..788c435b 100644 --- a/src/Microdown/MicAbstractDelimiter.class.st +++ b/src/Microdown/MicAbstractDelimiter.class.st @@ -26,6 +26,12 @@ Class { #category : #'Microdown-Parser' } +{ #category : #accessing } +MicAbstractDelimiter class >> allActive [ + + ^ self allSubclasses select: [ :subclass | subclass isActive ] +] + { #category : #accessing } MicAbstractDelimiter class >> associatedInlineBlock [ ^ self subclassResponsibility diff --git a/src/Microdown/MicInlineParser.class.st b/src/Microdown/MicInlineParser.class.st index 75a46000..a89e05a1 100644 --- a/src/Microdown/MicInlineParser.class.st +++ b/src/Microdown/MicInlineParser.class.st @@ -32,6 +32,7 @@ Class { { #category : #accessing } MicInlineParser class >> abstractDelimiterClass [ + ^ MicAbstractDelimiter ] @@ -40,9 +41,7 @@ MicInlineParser class >> allDelimiters [ AllDelimiters ifNil: [ AllDelimiters := Dictionary new. - self abstractDelimiterClass subclasses - select: [ :subclass | subclass isActive ] - thenDo: [ :subclass | + self abstractDelimiterClass allActive do: [ :subclass | AllDelimiters at: subclass markup put: subclass ] ]. @@ -115,6 +114,7 @@ MicInlineParser class >> initialize [ { #category : #accessing } MicInlineParser class >> keyBeginSet [ + KeyBeginSet ifNil: [ KeyBeginSet := (self allDelimiters keys collect: #first) asSet ]. ^ KeyBeginSet ] @@ -184,7 +184,7 @@ MicInlineParser >> allDelimiters [ MicInlineParser >> bothCase [ | indexOfAssociateOpener | indexOfAssociateOpener := self findType: delimiterClass type. - (openersStack isEmpty or: [ indexOfAssociateOpener = 0]) + (openersStack isEmpty or: [ indexOfAssociateOpener = 0 ]) ifTrue: [ "We consider the delimiter as a new opener or it's the first opener" self pushNewOpener ] @@ -336,8 +336,8 @@ MicInlineParser >> linkOrFigureProcess: indexOfAssociateOpener [ "IF we find a ( just after and a ) after again THEN we add the associate link or figure inline block ELSE we ignore it" - | startIndex endIndex urlCloserIndex | + ((string allButFirst: (closer index + closer size - 1)) beginsWith: URLOpenerMarkup) ifTrue: [ urlCloserIndex := string indexOfSubCollection: URLCloserMarkup startingAt: closer index ifAbsent: [ 0 ]. @@ -380,7 +380,7 @@ MicInlineParser >> newBasicInlineBlockFrom: stIndex to: eIndex [ from: stIndex to: eIndex withSubstring: text - withChildren: Array empty + withChildren: #() "should use copyFrom:to:" ] @@ -478,6 +478,7 @@ MicInlineParser >> pushNewOpener [ { #category : #process } MicInlineParser >> rawRead [ | open rawType close startIndex endIndex rawContents rawBlock | + open := delimiterClass index: index. rawType := open associatedInlineBlock. close := rawType basicNew closingDelimiter.