diff --git a/src/Markdeep/Markdeep.class.st b/src/Markdeep/Markdeep.class.st new file mode 100644 index 0000000..47b8a32 --- /dev/null +++ b/src/Markdeep/Markdeep.class.st @@ -0,0 +1,303 @@ +" +I model a Mardeep file as described in https://casual-effects.com/markdeep/ +" +Class { + #name : #Markdeep, + #superclass : #Object, + #instVars : [ + 'title', + 'body', + 'tocStyle', + 'comments', + 'tail', + 'language', + 'config', + 'metadata', + 'head', + 'navTop' + ], + #category : #Markdeep +} + +{ #category : #'as yet unclassified' } +Markdeep class >> fromMarkdownFile: aFileReference [ + ^ self new fromMarkdownFile: aFileReference. +] + +{ #category : #'instance creation' } +Markdeep >> authors [ + self metadata at: 'authors' ifPresent: [:k | ^ '**', k, '**' ]. + ^ ''. +] + +{ #category : #'instance creation' } +Markdeep >> authorsString [ + self authors + ifNil: [ ^ '' ] ifNotNil: [ ^ ' ', self authors ] +] + +{ #category : #accessing } +Markdeep >> body [ + ^ body +] + +{ #category : #accessing } +Markdeep >> body: anObject [ + body := anObject +] + +{ #category : #accessing } +Markdeep >> comments [ + ^ comments ifNil: [ ^ comments := true ] +] + +{ #category : #accessing } +Markdeep >> comments: aBoolean [ + "I tell if comments are enabled by default or not." + comments := aBoolean +] + +{ #category : #utilities } +Markdeep >> commentsProvider [ + "I return the url of the default service that provides annotation support. + I am used to add such support in the contents of the Markdeep page." + ^ 'https://hypothes.is' +] + +{ #category : #utilities } +Markdeep >> commentsProviderStrings [ + "I associate a comments service provider with the string that is required to be added + to the document to enable such provider." + | providers | + providers := Dictionary new. + providers at: 'https://hypothes.is' put: ' +'. + ^ providers + + +] + +{ #category : #utilities } +Markdeep >> commentsSupport [ + "I enable comments of the page." + + self comments ifFalse: [ ^ self ]. + ^ self commentsProviderStrings at: self commentsProvider +] + +{ #category : #accessing } +Markdeep >> config [ + + ^ config +] + +{ #category : #accessing } +Markdeep >> config: aDictionary [ + + config := aDictionary +] + +{ #category : #'instance creation' } +Markdeep >> contents [ + | output | + output := '' writeStream. + output + nextPutAll: self headContents; lf; lf; + nextPutAll: ' **', self title, '**'; lf; + nextPutAll: self authorsString ; lf; + nextPutAll: ' ', self version; lf; + nextPutAll: self navTop; lf; lf; + nextPutAll: self body; lf; lf; + nextPutAll: self tail; lf; lf; lf; lf; + nextPutAll: self commentsSupport. + ^ output contents. +] + +{ #category : #persistence } +Markdeep >> exportAsFile [ + | newFile | + self markdownFile ifNil: [ self inform: 'Define an input Markdown file or use #exportAsFileOn: instead.' ]. + newFile := (self markdownFile fullName, '.html') asFileReference. + self exportAsFileOn: newFile. +] + +{ #category : #persistence } +Markdeep >> exportAsFileOn: aFileReference [ + aFileReference ensureDelete. + aFileReference exists ifFalse: [ aFileReference ensureCreateFile ]. + aFileReference writeStreamDo: [ :stream | + stream nextPutAll: self contents ]. + self inform: 'Exported as: ', String cr, aFileReference fullName. + ^ aFileReference +] + +{ #category : #utilities } +Markdeep >> fontAwesomeHeader [ + "I enable the font awesome support in the document header" + + ^ '' +] + +{ #category : #'instance creation' } +Markdeep >> fromMarkdownFile: aFileReference [ + "I create a Markdeep document from a given Markdown file." + self processMarkdownFor: aFileReference. + ^ self. +] + +{ #category : #accessing } +Markdeep >> gtTextFor: aView [ + + ^ aView textEditor + title: 'Text'; + text: [ self contents ] +] + +{ #category : #accessing } +Markdeep >> head [ + ^ head ifNil: [ head := OrderedCollection new. + head add: self fontAwesomeHeader; yourself ] +] + +{ #category : #accessing } +Markdeep >> head: anOrderedCollection [ + head := anOrderedCollection +] + +{ #category : #'instance creation' } +Markdeep >> headContents [ + + ^ String streamContents: [ :stream | + stream + nextPutAll: ''; + nextPut: Character lf. + self head do: [ :line | + stream + nextPutAll: ' '; + nextPutAll: line; + nextPut: Character lf + ]. + stream + nextPutAll: ''; + nextPut: Character lf. + ]. +] + +{ #category : #accessing } +Markdeep >> language [ + ^ language +] + +{ #category : #accessing } +Markdeep >> language: anObject [ + language := anObject +] + +{ #category : #accessing } +Markdeep >> markdeepScriptTag [ + ^ ' +' +] + +{ #category : #accessing } +Markdeep >> markdownFile [ + ^ self config at: 'markdownFile' +] + +{ #category : #accessing } +Markdeep >> markdownFile: aFileReference [ + "Where the Mardown file associated with me is stored. Used for sync. and import/export purposes." + self config at: 'markdownFile' put: aFileReference +] + +{ #category : #'instance creation' } +Markdeep >> metadata [ + ^ metadata ifNil: [ metadata := OrderedDictionary new ] +] + +{ #category : #utilities } +Markdeep >> metadataFromXML: aXMLDocument [ + | metaDict | + + metaDict := OrderedDictionary new. + (aXMLDocument xpath: '//meta') do: [ :each | + metaDict at: (each @ 'name') stringValue put: (each @ 'content') stringValue ]. + ^ metaDict +] + +{ #category : #'instance creation' } +Markdeep >> navTop [ + ^ navTop +] + +{ #category : #'as yet unclassified' } +Markdeep >> navTop: aString [ + navTop:= aString. +] + +{ #category : #printing } +Markdeep >> printOn: aStream [ + + super printOn: aStream. + aStream + nextPutAll: '( ', self title, ' )' +] + +{ #category : #'instance creation' } +Markdeep >> processMarkdownFor: aFileReference [ + "comment stating purpose of message" + | markdownContent | + self markdownFile: aFileReference. + markdownContent := Markdown fromFile: aFileReference. + self body: (markdownContent commentYAMLMetadata contents). +] + +{ #category : #accessing } +Markdeep >> tail [ + "I enable the document tail, which, in turn, enables a Markdeep document" + | output | + output := '' writeStream. + output + nextPutAll: ''; lf; lf; + nextPutAll: ''; lf; + nextPutAll: ''; lf; + nextPutAll: self markdeepScriptTag; lf; + nextPutAll: ''. + ^ output contents +] + +{ #category : #accessing } +Markdeep >> tail: anObject [ + tail := anObject +] + +{ #category : #accessing } +Markdeep >> title [ + + ^ title +] + +{ #category : #accessing } +Markdeep >> title: anObject [ + + title := anObject +] + +{ #category : #accessing } +Markdeep >> tocStyle [ + ^ tocStyle ifNil: [ tocStyle := 'short' ] +] + +{ #category : #accessing } +Markdeep >> tocStyle: anObject [ + tocStyle := anObject +] + +{ #category : #'instance creation' } +Markdeep >> version [ + self metadata at: 'version' ifPresent: [:value | ^ 'v',value ]. + ^ '' +] diff --git a/src/Markdeep/package.st b/src/Markdeep/package.st new file mode 100644 index 0000000..fb64022 --- /dev/null +++ b/src/Markdeep/package.st @@ -0,0 +1 @@ +Package { #name : #Markdeep }