"
I model the interaction between Pandoc and Grafoscopio.
"
Class {
	#name : #Pandoc,
	#superclass : #Object,
	#classInstVars : [
		'executable'
	],
	#category : #'Grafoscopio-Utils-Core'
}

{ #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 : #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 := FileLocator temp / (inputFile basenameWithoutExtension , '.html').
	outputFile ensureDelete.
	outputFile ensureCreateFile.
	OSSUnixSubprocess new
		command: 'pandoc';
		arguments: {'-f'. 'markdown+startnum+task_lists'. '-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.
]