146 lines
4.2 KiB
Smalltalk
146 lines
4.2 KiB
Smalltalk
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: '<div st-class="' , self class greaseString , '"';
|
|
nextPut: Character lf;
|
|
nextPutAll: ' st-data="' , (STON toStringPretty: self metadata) , '">';
|
|
nextPut: Character lf;
|
|
nextPutAll: self markdeepCustomOpener;
|
|
nextPutAll: self contentAsStringAnnotated;
|
|
nextPut: Character lf;
|
|
nextPutAll: self markdeepCustomCloser;
|
|
nextPutAll: '</div>';
|
|
nextPut: Character lf;
|
|
nextPut: Character lf.
|
|
^ output contents withInternetLineEndings
|
|
]
|
|
|
|
{ #category : #'*MiniDocs' }
|
|
LeTextualSnippet >> asMarkdown [
|
|
|
|
| output |
|
|
output := '' writeStream.
|
|
output
|
|
nextPutAll: self contentAsStringCustomized; lf.
|
|
^ output contents
|
|
]
|
|
|
|
{ #category : #'*MiniDocs' }
|
|
LeTextualSnippet >> asMarkdownWithMetadataWrappers [
|
|
"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: '<div st-class="', self class asString, '"'; lf;
|
|
nextPutAll: ' st-data="', (STON toString: self metadata), '">'; lf;
|
|
nextPutAll: self markdownCustomOpener;
|
|
nextPutAll: self contentAsStringCustomized; lf;
|
|
nextPutAll: self markdownCustomCloser;
|
|
nextPutAll: '</div>'; lf; lf.
|
|
^ output contents
|
|
]
|
|
|
|
{ #category : #'*MiniDocs' }
|
|
LeTextualSnippet >> contentAsStringAnnotated [
|
|
| annotations substitutions exported pageConfig|
|
|
self ast ifNil: [ ^ self contentAsString ].
|
|
annotations := self ast parts select: [:each | each className includesSubstring: 'AnnotationNode' ].
|
|
annotations ifEmpty: [ ^ self contentAsString ].
|
|
substitutions := OrderedDictionary new.
|
|
pageConfig := self page config.
|
|
annotations do: [ :each | | key type value color |
|
|
key := each source.
|
|
type := (key splitOn: ':') first copyWithoutAll: '{{'.
|
|
value := key copyFrom: type size + 4 to: key size - 2.
|
|
pageConfig
|
|
ifNil: [ color := 'default' ]
|
|
ifNotNil: [ | colors |
|
|
colors := pageConfig at: 'annotationColors' ifAbsent: [ nil ].
|
|
colors ifNotNil: [
|
|
color := colors at: type ifAbsent: [ colors at: 'defaultColor' ifAbsentPut: ['default'] ]
|
|
]
|
|
].
|
|
substitutions
|
|
at: key
|
|
put: '<span st-class="',type,'" style="color:', color, '">', value,'</span>'.
|
|
].
|
|
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 ]
|
|
]
|