Extension { #name : #LeTextualSnippet } { #category : #'*MiniDocs' } LeTextualSnippet >> asMarkdeep [ "Inspired by Alpine.js and Assembler CSS 'x-' properties, we are going to use 'st-' properties as a way to extend divs metadata regarding its contents." | output | output := WriteStream on: ''. output nextPutAll: '
'; nextPut: Character lf; nextPutAll: self markdeepCustomOpener; nextPutAll: self contentAsStringAnnotated; nextPut: Character lf; nextPutAll: self markdeepCustomCloser; nextPutAll: '
'; nextPut: Character lf; nextPut: Character lf. ^ output contents withInternetLineEndings ] { #category : #'*MiniDocs' } LeTextualSnippet >> asMarkdown [ "Inspired by Alpine.js and Assembler CSS 'x-' properties, we are going to use 'st-' properties as a way to extend divs metadata regarding its contents." | output | output := '' writeStream. output nextPutAll: '
'; lf; nextPutAll: self markdownCustomOpener; nextPutAll: self contentAsStringCustomized; lf; nextPutAll: self markdownCustomCloser; nextPutAll: '
'; lf; lf. ^ output contents ] { #category : #'*MiniDocs' } LeTextualSnippet >> contentAsStringAnnotated [ | annotations substitutions exported | self ast ifNil: [ ^ self contentAsString ]. annotations := self ast parts select: [:each | each className includesSubstring: 'AnnotationNode' ]. annotations ifEmpty: [ ^ self contentAsString ]. substitutions := OrderedDictionary new. annotations do: [ :each | | key type value | key := each source. type := (key splitOn: ':') first copyWithoutAll: '{{'. value := key copyFrom: type size + 4 to: key size - 2. substitutions at: key put: '', value,''. ]. exported := self contentAsString. substitutions keysAndValuesDo: [:k :v | exported := exported copyReplaceAll: k with: v. ]. ^ exported ] { #category : #'*MiniDocs' } LeTextualSnippet >> contentAsStringCustomized [ (self contentAsString beginsWith: '#') ifTrue: [ ^ '#', self contentAsString ] ifFalse: [ ^ self contentAsString ] ] { #category : #'*MiniDocs' } LeTextualSnippet >> markdeepCustomCloser [ ^ '' ] { #category : #'*MiniDocs' } LeTextualSnippet >> markdeepCustomOpener [ ^ '' ] { #category : #'*MiniDocs' } LeTextualSnippet >> markdownCustomCloser [ ^ self markdeepCustomCloser ] { #category : #'*MiniDocs' } LeTextualSnippet >> markdownCustomOpener [ ^ self markdeepCustomOpener ] { #category : #'*MiniDocs' } LeTextualSnippet >> metadata [ ^ self metadataUpdate ] { #category : #'*MiniDocs' } LeTextualSnippet >> metadataUpdate [ | createEmailSanitized editEmailSanitized | createEmailSanitized := self createEmail asString withoutXMLTagDelimiters. editEmailSanitized := self editEmail asString withoutXMLTagDelimiters. ^ OrderedDictionary new at: 'id' put: self uidString; at: 'parent' put: self parent uidString; at: 'created' put: self createTime asString; at: 'modified' put: self latestEditTime asString; at: 'creator' put: createEmailSanitized; at: 'modifier' put: editEmailSanitized; yourself ] { #category : #'*MiniDocs' } LeTextualSnippet >> sanitizeMetadata [ self options ifNil: [^ self ]. self options removeKey: 'metadata' ifAbsent: [^ self ]. self metadata keysAndValuesDo: [:k :v | (v asString includesAny: #($< $>)) ifTrue: [ self metadata at: k put: (v asString copyWithoutXMLDelimiters) ] ] ] { #category : #'*MiniDocs' } LeTextualSnippet >> tags [ ^ self metadata at: 'tags' ifAbsentPut: [ Set new ] ]