" I model the interaction between Pandoc and Grafoscopio. " Class { #name : #Pandoc, #superclass : #Object, #classInstVars : [ 'executable' ], #category : #'MiniDocs-Core' } { #category : #'*MiniDocs' } Pandoc class >> convertString: aString from: inputFormat to: outputFormat [ OSSUnixSubprocess new shellCommand: 'echo "', aString , '" | pandoc -f ', inputFormat,' -t ', outputFormat; redirectStdout; runAndWaitOnExitDo: [ :command :outString | ^ outString ]. ] { #category : #'as yet unclassified' } Pandoc class >> downloadLuaFilters [ self luaFilters do: [ :filter | | filterUrl | filterUrl := filter asUrl. (FileLocator temp asFileReference / (filterUrl segments last)) exists ifFalse: [ ZnClient new url: filterUrl; downloadTo: FileLocator temp ] ] ] { #category : #accessing } Pandoc class >> executable [ ^ executable ifNil: [ self executableLocation ] ] { #category : #accessing } Pandoc class >> executable: aFileReference [ executable := aFileReference ] { #category : #accessing } Pandoc class >> executableLocation [ | location | location := '/usr/bin/pandoc'. location asFileReference exists ifTrue: [ ^ location ] ifFalse: [ self definePandocExecutable ] ] { #category : #utility } Pandoc class >> extractImagesInUnixFor: aFileReference withFilter: aLuaFilter [ "I use Pandoc Lua scripting capabilities to extract al images links in aFileReference" OSSUnixSubprocess new command: 'pandoc'; arguments: {aFileReference fullName . '--lua-filter=',aLuaFilter fullName }; redirectStdout; redirectStderr; runAndWaitOnExitDo: [ :process :outString :errString | process isSuccess ifTrue: [ ^ ((Soup fromString: outString) findAllTags: 'td') collect: [ :each | each next ] ] ifFalse: [ "OSSUnixProcessExitStatus has a nice #printOn: " Transcript show: 'Command exit with error status: ', process exitStatusInterpreter printString; cr. Transcript show: 'Stderr contents: ', errString. ] ] ] { #category : #accessing } Pandoc class >> htmlStringToMarkdown: aString [ OSSUnixSubprocess new shellCommand: 'echo "', aString , '" | pandoc -f markdown -t html'; redirectStdout; runAndWaitOnExitDo: [ :command :outString | ^ outString ]. ] { #category : #converters } Pandoc class >> htmlToMarkdown: inputFile [ | outputFile | outputFile := FileLocator temp / 'body.md'. outputFile ensureDelete. outputFile ensureCreateFile. OSSUnixSubprocess new command: 'pandoc'; arguments: {'-f'. 'html'. '-t'. 'markdown'. '--atx-headers'. inputFile fullName. '--output'. outputFile fullName }; redirectStdout; redirectStderr; runAndWaitOnExitDo: [ :process :outString :errString | process isSuccess ifTrue: [ ^ outputFile contents ] ifFalse: [ ^inputFile contents ] ] ] { #category : #'as yet unclassified' } Pandoc class >> listImagesFrom: aFileReference [ "I provide a list of all images contained in aFile." | filter commandString outputString | filter := FileLocator temp asFileReference / 'image-links.lua'. filter exists ifFalse: [ self downloadLuaFilters ]. commandString := 'pandoc ' , aFileReference fullName , ' --lua-filter=' , filter fullName. ^ self extractImagesInUnixFor: aFileReference withFilter: filter ] { #category : #utility } Pandoc class >> luaFilters [ "I define the location of set of scripts, that allows to change the default behaviour of Pandoc and/or the processing of supported markup languages. For more information about Lua filters see: https://pandoc.org/lua-filters.html " | filters | filters := OrderedCollection new. filters add: 'http://mutabit.com/repos.fossil/dataweek/doc/tip/Artefactos/Scripts/image-links.lua'. ^ filters ] { #category : #converters } Pandoc class >> markdownToHtml: inputFile [ (Smalltalk os isUnix or: [ Smalltalk os isMacOS ]) ifTrue: [ ^ self markdownToHtmlOnUnix: inputFile ]. Smalltalk os isWindows ifTrue: [ ^ self markdownToHtmlOnWindows: inputFile ]. ] { #category : #converters } Pandoc class >> markdownToHtmlOnUnix: inputFile [ | outputFile | outputFile := inputFile parent / (inputFile basenameWithoutExtension , '.html'). outputFile ensureDelete. outputFile ensureCreateFile. OSSUnixSubprocess new command: 'pandoc'; arguments: {'-f'. 'markdown+startnum+task_lists'. '--standalone'. '-t'. 'html'. inputFile fullName. '--output'. outputFile fullName }; redirectStdout; redirectStderr; runAndWaitOnExitDo: [ :process :outString :errString | process isSuccess ifTrue: [ ^ outputFile ] ifFalse: [ ^ inputFile ] ] ] { #category : #converters } Pandoc class >> markdownToHtmlOnWindows: inputFile [ "ToDo: This command still doesn't receive any arguments." ^ (LibC resultOfCommand: 'pandoc ', inputFile fullName) correctAccentedCharacters. ]