MiniDocs/src/MiniDocs/LePage.extension.st

212 lines
5.7 KiB
Smalltalk
Raw Normal View History

2022-04-05 14:43:37 +00:00
Extension { #name : #LePage }
2022-07-19 21:51:20 +00:00
{ #category : #'*MiniDocs' }
LePage >> asHtmlFile [
2022-07-19 21:51:20 +00:00
self asMarkdownFile.
self defaultPandocTemplate exists
ifFalse: [ MarkupFile installTemplate: 'https://mutabit.com/repos.fossil/mutabit/doc/trunk/plantillas/Pandoc/clean-menu-mod.html' into: self defaultPandocTemplate parent ].
OSSUnixSubprocess new
command: 'pandoc' ;
2022-07-19 23:00:52 +00:00
arguments: {
self markdownFileName. '-o'. self htmlFileName .
'--toc' .
'--template=', self defaultPandocTemplate basenameWithoutExtension };
workingDirectory: self storage fullName;
runAndWaitOnExitDo: [ :process :outString | ^ self storage / self htmlFileName].
2022-07-19 21:51:20 +00:00
]
{ #category : #'*MiniDocs' }
2022-04-16 19:20:28 +00:00
LePage >> asMarkdeep [
| bodyStream markdeep |
bodyStream := '' writeStream.
self preorderTraversal do: [:snippet |
bodyStream nextPutAll: snippet asMarkdeep
].
markdeep := Markdeep new
title: self title;
body: bodyStream contents;
navTop: self navTop.
self metadata keysAndValuesDo: [:k :v |
k = 'lang'
ifTrue: [
markdeep head
add: '<meta lang="', v,'">';
yourself.
]
ifFalse: [
markdeep head
add: '<meta name="', k, '" content="', v,'">';
yourself.
]
].
self metadata at: 'authors' ifPresent: [:author | markdeep metadata at: 'authors' put: author ].
self metadata at: 'version' ifPresent: [:version | markdeep metadata at: 'version' put: version ].
^ markdeep.
]
{ #category : #'*MiniDocs' }
2022-04-12 17:08:40 +00:00
LePage >> asMarkdeepFile [
| folder |
folder := self options at: 'storage' ifAbsent: [ FileLocator temp ].
^ self asMarkdeep exportAsFileOn: folder / self markdeepFileName
]
2022-07-17 02:47:46 +00:00
{ #category : #'*MiniDocs' }
LePage >> asMarkdown [
| bodyStream markdown |
bodyStream := '' writeStream.
bodyStream
nextPutAll: '---';
nextPutAll: String lf.
self metadata keysAndValuesDo: [ :k :v |
bodyStream
nextPutAll: k , ': "' , v, '"';
2022-07-17 02:47:46 +00:00
nextPutAll: String lf ].
bodyStream nextPutAll: '---' , String lf , String lf.
self preorderTraversal
do: [ :snippet | bodyStream nextPutAll: snippet asMarkdown ].
markdown := Markdown new contents: bodyStream contents.
^ markdown
]
{ #category : #'*MiniDocs' }
LePage >> asMarkdownFile [
| folder |
folder := self options at: 'storage' ifAbsent: [ FileLocator temp ].
^ MarkupFile exportAsFileOn: folder / self markdownFileName containing: self asMarkdown contents
]
{ #category : #'*MiniDocs' }
LePage >> defaultPandocTemplate [
^ FileLocator home / '.pandoc' / 'templates' / 'clean-menu-mod.html'
]
2022-07-26 22:59:22 +00:00
{ #category : #'*MiniDocs' }
LePage >> detectParentSnippetWithUid: uidString [
"Answer a boolean indicating whether the supplied uid is present"
^ self preorderTraversal detect: [ :snippet | snippet uidString = uidString ] ifNone: [ ^ self ]
]
2022-07-19 20:40:40 +00:00
{ #category : #'*MiniDocs' }
LePage >> exportedFileName [
| sanitized |
sanitized := self title asDashedLowercase copyWithoutAll: #($/).
^ sanitized , '--' , (self uidString copyFrom: 1 to: 5)
]
2022-07-26 22:59:22 +00:00
{ #category : #'*MiniDocs' }
LePage >> fromMarkdeepUrl: aString [
| docTree pageMetadata |
docTree := GrafoscopioUtils xmlFromUrl: aString.
pageMetadata := Markdeep new metadataFromXML: docTree.
self
basicUid: (pageMetadata at: 'id');
title: (pageMetadata at: 'title');
createTime: (pageMetadata at: 'created') asDateAndTime;
editTime: (pageMetadata at: 'modified') asDateAndTime;
createEmail: (pageMetadata at: 'creator');
editEmail: (pageMetadata at: 'modifier');
optionAt: 'metadata' put: pageMetadata.
self populateChildrenFrom: (docTree xpath: '//div')
]
2022-07-19 20:40:40 +00:00
{ #category : #'*MiniDocs' }
LePage >> htmlFileName [
2022-07-19 23:00:52 +00:00
^ self exportedFileName, '.html'
2022-07-19 20:40:40 +00:00
]
{ #category : #'*MiniDocs' }
2022-04-05 14:43:37 +00:00
LePage >> markdeepFileName [
2022-07-17 02:47:46 +00:00
^ self markdownFileName , '.html'
]
{ #category : #'*MiniDocs' }
LePage >> markdownFileName [
2022-07-19 20:40:40 +00:00
^ self exportedFileName, '.md'
2022-04-05 14:43:37 +00:00
]
2022-06-16 16:25:02 +00:00
{ #category : #'*MiniDocs' }
LePage >> metadata [
^ self options at: 'metadata' ifAbsentPut: [ self metadataInit]
]
2022-07-25 23:30:24 +00:00
{ #category : #'*MiniDocs' }
LePage >> metadataInit [
^ OrderedDictionary new
at: 'id' put: self uidString;
at: 'title' put: self contentAsString;
at: 'created' put: self createTime greaseString;
at: 'modified' put: self latestEditTime greaseString;
at: 'creator' put: self createEmail greaseString;
at: 'modifier' put: self editEmail greaseString;
yourself
]
2022-07-26 22:59:22 +00:00
{ #category : #'*MiniDocs' }
LePage >> navTop [
| topNavFile |
2022-08-31 01:11:03 +00:00
topNavFile := ((self optionAt: 'storage' ifAbsentPut: [ FileLocator temp ]) / '_navtop.html').
2022-07-26 22:59:22 +00:00
topNavFile exists
ifFalse: [ ^ '' ]
ifTrue: [ ^ topNavFile contents ]
]
{ #category : #'*MiniDocs' }
LePage >> options [
^ options
]
{ #category : #'*MiniDocs' }
2022-06-16 16:25:02 +00:00
LePage >> preorderTraversal [
| output |
output := OrderedCollection new.
2022-07-25 23:51:28 +00:00
self withDeepCollect: [:each | each allChildrenBreadthFirstDo: [:child | output add: child]].
2022-06-16 16:25:02 +00:00
^ output.
]
2022-07-26 22:59:22 +00:00
{ #category : #'*MiniDocs' }
LePage >> removeSnippetsMetadata [
self preorderTraversal do: [ :snippet |
(snippet options isNotNil and: [ snippet options includesKey: 'metadata' ])
ifTrue: [ snippet options removeKey: 'metadata' ] ]
]
2022-07-27 17:11:51 +00:00
{ #category : #'*MiniDocs' }
LePage >> sharedVariablesBindings [
| codeSnippets shared |
codeSnippets := self preorderTraversal select: [:snippet |
snippet class = LePharoSnippet and: [ snippet code includesSubstring: ':=']
].
codeSnippets first in: [:snippet | | context |
context := snippet coder evaluationContext.
snippet coder doItInContext: context.
shared := context bindingStrategy bindings detect: [:each |
each isKindOf: GtSharedVariablesBindings
]
].
codeSnippets asArray allButFirstDo: [:snippet| | context|
context := snippet coder evaluationContext.
context addBindings: shared.
snippet coder doItInContext: context
].
^ shared asDictionary
]
{ #category : #'*MiniDocs' }
LePage >> storage [
^ self optionAt: 'storage'
ifAbsent: [ ^ FileLocator temp ]
]