From 28e21b5e7978d5cfb2f53588c0e476774e74b280 Mon Sep 17 00:00:00 2001 From: Offray Luna Date: Sat, 16 Jul 2022 12:29:57 -0500 Subject: [PATCH] Repackaging and moving from Grafoscopio-Utils. --- src/Markdeep/package.st | 1 - .../LePage.extension.st | 8 +- .../LeSnippet.extension.st | 2 +- .../LeTextualSnippet.extension.st | 4 +- src/MiniDocs/ManifestMiniDocs.class.st | 13 ++ src/{Markdeep => MiniDocs}/Markdeep.class.st | 2 +- src/MiniDocs/Markdown.class.st | 166 ++++++++++++++++++ .../MarkupFile.class.st | 2 +- src/MiniDocs/package.st | 1 + 9 files changed, 189 insertions(+), 10 deletions(-) delete mode 100644 src/Markdeep/package.st rename src/{Markdeep => MiniDocs}/LePage.extension.st (91%) rename src/{Markdeep => MiniDocs}/LeSnippet.extension.st (92%) rename src/{Markdeep => MiniDocs}/LeTextualSnippet.extension.st (71%) create mode 100644 src/MiniDocs/ManifestMiniDocs.class.st rename src/{Markdeep => MiniDocs}/Markdeep.class.st (99%) create mode 100644 src/MiniDocs/Markdown.class.st rename src/{Markdeep => MiniDocs}/MarkupFile.class.st (95%) create mode 100644 src/MiniDocs/package.st diff --git a/src/Markdeep/package.st b/src/Markdeep/package.st deleted file mode 100644 index fb64022..0000000 --- a/src/Markdeep/package.st +++ /dev/null @@ -1 +0,0 @@ -Package { #name : #Markdeep } diff --git a/src/Markdeep/LePage.extension.st b/src/MiniDocs/LePage.extension.st similarity index 91% rename from src/Markdeep/LePage.extension.st rename to src/MiniDocs/LePage.extension.st index 462ebb9..11015de 100644 --- a/src/Markdeep/LePage.extension.st +++ b/src/MiniDocs/LePage.extension.st @@ -1,6 +1,6 @@ Extension { #name : #LePage } -{ #category : #'*Markdeep' } +{ #category : #'*MiniDocs' } LePage >> asMarkdeep [ | bodyStream markdeep | bodyStream := '' writeStream. @@ -29,21 +29,21 @@ LePage >> asMarkdeep [ ^ markdeep. ] -{ #category : #'*Markdeep' } +{ #category : #'*MiniDocs' } LePage >> asMarkdeepFile [ | folder | folder := self options at: 'storage' ifAbsent: [ FileLocator temp ]. ^ self asMarkdeep exportAsFileOn: folder / self markdeepFileName ] -{ #category : #'*Markdeep' } +{ #category : #'*MiniDocs' } LePage >> markdeepFileName [ | sanitized | sanitized := self title asDashedLowercase copyWithoutAll: #($/). ^ sanitized, '--',(self uidString copyFrom: 1 to: 5), '.md.html'. ] -{ #category : #'*Markdeep' } +{ #category : #'*MiniDocs' } LePage >> preorderTraversal [ | output | output := OrderedCollection new. diff --git a/src/Markdeep/LeSnippet.extension.st b/src/MiniDocs/LeSnippet.extension.st similarity index 92% rename from src/Markdeep/LeSnippet.extension.st rename to src/MiniDocs/LeSnippet.extension.st index a14bb87..00b03ac 100644 --- a/src/Markdeep/LeSnippet.extension.st +++ b/src/MiniDocs/LeSnippet.extension.st @@ -1,6 +1,6 @@ Extension { #name : #LeSnippet } -{ #category : #'*Markdeep' } +{ #category : #'*MiniDocs' } LeSnippet class >> fromMetaMarkdeep: div [ | className metadata snippet | className := (div xpath: '@st-class') stringValue. diff --git a/src/Markdeep/LeTextualSnippet.extension.st b/src/MiniDocs/LeTextualSnippet.extension.st similarity index 71% rename from src/Markdeep/LeTextualSnippet.extension.st rename to src/MiniDocs/LeTextualSnippet.extension.st index 92c7eca..c9088d1 100644 --- a/src/Markdeep/LeTextualSnippet.extension.st +++ b/src/MiniDocs/LeTextualSnippet.extension.st @@ -1,11 +1,11 @@ Extension { #name : #LeTextualSnippet } -{ #category : #'*Markdeep' } +{ #category : #'*MiniDocs' } LeTextualSnippet >> markdeepCustomCloser [ ^ '' ] -{ #category : #'*Markdeep' } +{ #category : #'*MiniDocs' } LeTextualSnippet >> markdeepCustomOpener [ ^ '' ] diff --git a/src/MiniDocs/ManifestMiniDocs.class.st b/src/MiniDocs/ManifestMiniDocs.class.st new file mode 100644 index 0000000..b834264 --- /dev/null +++ b/src/MiniDocs/ManifestMiniDocs.class.st @@ -0,0 +1,13 @@ +" +Please describe the package using the class comment of the included manifest class. The manifest class also includes other additional metadata for the package. These meta data are used by other tools such as the SmalllintManifestChecker and the critics Browser +" +Class { + #name : #ManifestMiniDocs, + #superclass : #PackageManifest, + #category : #'MiniDocs-Manifest' +} + +{ #category : #'code-critics' } +ManifestMiniDocs class >> ruleExcessiveVariablesRuleV1FalsePositive [ + ^ #(#(#(#RGClassDefinition #(#Markdeep)) #'2022-07-16T12:24:34.695032-05:00') ) +] diff --git a/src/Markdeep/Markdeep.class.st b/src/MiniDocs/Markdeep.class.st similarity index 99% rename from src/Markdeep/Markdeep.class.st rename to src/MiniDocs/Markdeep.class.st index ce16987..6055494 100644 --- a/src/Markdeep/Markdeep.class.st +++ b/src/MiniDocs/Markdeep.class.st @@ -16,7 +16,7 @@ Class { 'navTop', 'options' ], - #category : #Markdeep + #category : #MiniDocs } { #category : #'as yet unclassified' } diff --git a/src/MiniDocs/Markdown.class.st b/src/MiniDocs/Markdown.class.st new file mode 100644 index 0000000..aea4669 --- /dev/null +++ b/src/MiniDocs/Markdown.class.st @@ -0,0 +1,166 @@ +" +I model a Markdown document. +At some point the idea is to have a full native parser implemented to deal +with my syntax, but meanwhile I will be collaborating with external parsers, +particularly the ones provided by Pandoc and/or Lunamark. +" +Class { + #name : #Markdown, + #superclass : #Object, + #instVars : [ + 'contents', + 'file' + ], + #category : #MiniDocs +} + +{ #category : #'instance creation' } +Markdown class >> fromFile: aFileReference [ + ^ self new fromFile: aFileReference +] + +{ #category : #utilities } +Markdown class >> yamlMetadataDelimiter [ + ^ '---' + +] + +{ #category : #operation } +Markdown >> commentYAMLMetadata [ + | newContents | + self detectYAMLMetadata ifFalse: [ ^ self ]. + newContents := '' writeStream. + newContents nextPutAll: ''; crlf. + (self lines copyFrom: self yamlMetadataClosingLineNumber + 2 to: self lines size) do: [ :line | + newContents nextPutAll: line; crlf ]. + self contents: newContents contents. + ^ self contents +] + +{ #category : #utilities } +Markdown >> containsYAMLMetadataClosing [ + ^ self yamlMetadataClosingLineNumber > 0 +] + +{ #category : #accessing } +Markdown >> contents [ + ^ contents +] + +{ #category : #accessing } +Markdown >> contents: anObject [ + contents := anObject +] + +{ #category : #utilities } +Markdown >> detectYAMLMetadata [ + | lines | + lines := self lines. + ^ self startsWithYAMLMetadataDelimiter + and: [ lines allButFirst + detect: [ :currentLine | currentLine beginsWith: self class yamlMetadataDelimiter ] + ifFound: [ ^ true ] ifNone: [ ^ false ] ] +] + +{ #category : #operation } +Markdown >> exportMetadataAsJson [ + "TBD: Lua scripts should be checked and installed when missing. Maybe a shared location + in '.local/share/Grafoscopio/Scripts' should be developed in the near future." + | output luaScript | + luaScript := FileLocator home / '.local/share/Brea/scripts/meta-to-json.lua'. + Smalltalk platformName = 'unix' ifTrue: [ + OSSUnixSubprocess new + workingDirectory: self file parent fullName; + command: 'pandoc'; + arguments: { '--lua-filter=', luaScript fullName . self file basename }; + redirectStdout; + redirectStdin; + runAndWaitOnExitDo: [ :process :outString :errString | + output := process isSuccess + ifTrue: [ outString ] + ifFalse: [ errString ] + ]]. + ^ output correctAccentedCharacters +] + +{ #category : #operation } +Markdown >> exportMetadataAsYaml [ + | exportedFile | + exportedFile := FileLocator temp / 'metadata.yaml'. + MarkupFile exportAsFileOn: exportedFile containing: self yamlMetadataAsString. + ^ exportedFile +] + +{ #category : #operation } +Markdown >> extractYAMLMetadata [ + | output yamlLines | + self detectYAMLMetadata ifFalse: [ ^ nil ]. + yamlLines := self lines copyFrom: 2 to: (self yamlMetadataClosingLineNumber). + output := '' writeStream. + yamlLines do: [ :line | + output + nextPutAll: line; + nextPut: Character cr. ]. + ^ output contents +] + +{ #category : #accessing } +Markdown >> file [ + ^ file +] + +{ #category : #accessing } +Markdown >> file: aFileReference [ + "I store the origen/destination of the Markdown contents." + file := aFileReference +] + +{ #category : #'instance creation' } +Markdown >> fromFile: aFileReference [ + self contents: aFileReference contents. + self file: aFileReference +] + +{ #category : #utilities } +Markdown >> lines [ + ^ self contents lines. +] + +{ #category : #accessing } +Markdown >> metadata [ + | rawMeta | + rawMeta := PPYAMLGrammar new parse: self extractYAMLMetadata. + rawMeta associationsDo: [ :assoc | + assoc value = 'false' ifTrue: [ assoc value: false ]. + assoc value = 'true' ifTrue: [ assoc value: true ] ]. + ^ rawMeta +] + +{ #category : #utilities } +Markdown >> startsWithYAMLMetadataDelimiter [ + ^ self lines first beginsWith: self class yamlMetadataDelimiter + +] + +{ #category : #utilities } +Markdown >> yamlMetadataAsString [ + | output | + self extractYAMLMetadata ifNil: [ ^ nil ]. + output := String new writeStream. + output nextPutAll: self class yamlMetadataDelimiter; cr. + output nextPutAll: self extractYAMLMetadata. + output nextPutAll: self class yamlMetadataDelimiter; cr. + ^ output contents. +] + +{ #category : #utilities } +Markdown >> yamlMetadataClosingLineNumber [ + "I return the line where the closing of the YAML metadata occurs or 0 if no closing is found." + self startsWithYAMLMetadataDelimiter ifFalse: [ ^ self ]. + self lines allButFirst doWithIndex: [ :currentLine :i | + (currentLine beginsWith: self class yamlMetadataDelimiter) ifTrue: [ ^ i + 1 ]] + +] diff --git a/src/Markdeep/MarkupFile.class.st b/src/MiniDocs/MarkupFile.class.st similarity index 95% rename from src/Markdeep/MarkupFile.class.st rename to src/MiniDocs/MarkupFile.class.st index 4c5c1bc..4e72e08 100644 --- a/src/Markdeep/MarkupFile.class.st +++ b/src/MiniDocs/MarkupFile.class.st @@ -7,7 +7,7 @@ Class { #instVars : [ 'file' ], - #category : #Markdeep + #category : #MiniDocs } { #category : #persistence } diff --git a/src/MiniDocs/package.st b/src/MiniDocs/package.st new file mode 100644 index 0000000..34758ac --- /dev/null +++ b/src/MiniDocs/package.st @@ -0,0 +1 @@ +Package { #name : #MiniDocs }