193 lines
4.4 KiB
Smalltalk
193 lines
4.4 KiB
Smalltalk
"
|
|
I model the interface between a CodiMD (https://demo.codimd.org) documentation
|
|
server and Grafoscopio.
|
|
I enable the interaction between Grafoscopio notebooks and CodiMD documents,
|
|
so one document can start online (as a CodiMD pad) and continue as a Grafoscopio
|
|
notebook or viceversa.
|
|
"
|
|
Class {
|
|
#name : #HedgeDoc,
|
|
#superclass : #Markdown,
|
|
#instVars : [
|
|
'server',
|
|
'pad',
|
|
'url'
|
|
],
|
|
#category : #'MiniDocs-Core'
|
|
}
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc class >> fromLink: aUrl [
|
|
^ self new fromLink: aUrl
|
|
]
|
|
|
|
{ #category : #'as yet unclassified' }
|
|
HedgeDoc class >> newDefault [
|
|
^ self new
|
|
defaultServer.
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> asLePage [
|
|
| newPage snippet |
|
|
snippet := LeTextSnippet new
|
|
string: self bodyWithoutTitleHeader promoteMarkdownHeaders.
|
|
newPage := LePage new
|
|
initializeTitle: self title;
|
|
addSnippet: snippet;
|
|
yourself.
|
|
newPage incomingLinks.
|
|
newPage metadata addAll: self metadata.
|
|
^ newPage
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> asMarkdeep [
|
|
^ Markdeep new
|
|
metadata: self metadata;
|
|
body: self contents;
|
|
file: self file, 'html'
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> asMarkdownTiddler [
|
|
self url ifNil: [ ^ self ].
|
|
^ Tiddler new
|
|
title: self url segments first;
|
|
text: (self contents ifNil: [ self retrieveContents]);
|
|
type: 'text/x-markdown';
|
|
created: Tiddler nowLocal.
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> bodyWithoutTitleHeader [
|
|
| headerIndex |
|
|
headerIndex := self body lines
|
|
detectIndex: [ :line | line includesSubstring: self headerAsTitle ]
|
|
ifNone: [ ^ self body].
|
|
^ (self body lines copyWithoutIndex: headerIndex) asStringWithCr
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> contents [
|
|
^ super contents
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> contents: anObject [
|
|
body := anObject
|
|
]
|
|
|
|
{ #category : #'as yet unclassified' }
|
|
HedgeDoc >> defaultServer [
|
|
self server: 'https://docutopia.tupale.co'.
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> fromLink: aString [
|
|
self url: aString.
|
|
self retrieveContents
|
|
]
|
|
|
|
{ #category : #'as yet unclassified' }
|
|
HedgeDoc >> htmlUrl [
|
|
| link |
|
|
link := self url copy.
|
|
link segments insert: 's' before: 1.
|
|
^ link
|
|
]
|
|
|
|
{ #category : #'as yet unclassified' }
|
|
HedgeDoc >> importContents [
|
|
self contents: self retrieveContents
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> pad [
|
|
^ pad
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> pad: anObject [
|
|
pad := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> retrieveContents [
|
|
self url ifNil: [ ^ self ].
|
|
self fromString: (self url addPathSegment: 'download') retrieveContents.
|
|
^ self.
|
|
]
|
|
|
|
{ #category : #'as yet unclassified' }
|
|
HedgeDoc >> retrieveHtmlContents [
|
|
| htmlContents |
|
|
self url ifNil: [ ^ self ].
|
|
htmlContents := self htmlUrl.
|
|
^ htmlContents retrieveContents
|
|
]
|
|
|
|
{ #category : #'as yet unclassified' }
|
|
HedgeDoc >> saveContentsToFile: aFileLocator [
|
|
self url ifNil: [ ^ self ].
|
|
^ (self url addPathSegment: 'download') saveContentsToFile: aFileLocator
|
|
]
|
|
|
|
{ #category : #'as yet unclassified' }
|
|
HedgeDoc >> saveHtmlContentsToFile: aFileLocator [
|
|
self url ifNil: [ ^ self ].
|
|
^ self htmlUrl saveContentsToFile: aFileLocator
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> server [
|
|
^ server
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> server: aUrlString [
|
|
server := aUrlString
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> url [
|
|
^ url asUrl
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
HedgeDoc >> url: anObject [
|
|
| tempUrl html |
|
|
tempUrl := anObject asZnUrl.
|
|
html := XMLHTMLParser parse: tempUrl retrieveContents.
|
|
(html xpath: '//head/meta[@name="application-name"][@content = "HedgeDoc - Ideas grow better together"]') isEmpty
|
|
ifTrue: [ self inform: 'Not a hedgedoc url'.
|
|
url := nil ].
|
|
self metadata at: 'title' put: tempUrl firstPathSegment.
|
|
server := tempUrl host.
|
|
url := anObject
|
|
]
|
|
|
|
{ #category : #visiting }
|
|
HedgeDoc >> visit [
|
|
WebBrowser openOn: self server, '/', self pad.
|
|
]
|
|
|
|
{ #category : #transformation }
|
|
HedgeDoc >> youtubeEmbeddedLinksToMarkdeepFormat [
|
|
"I replace the youtube embedded links from hedgedoc format to markdeep format."
|
|
| linkDataCollection |
|
|
linkDataCollection := (HedgeDocGrammar new youtubeEmbeddedLink parse: self contents)
|
|
collect: [ :each | | parsedLink |
|
|
parsedLink := OrderedCollection new.
|
|
parsedLink
|
|
add: ('' join:( each collect: [ :s | s value]));
|
|
add: '![](https://youtu.be/',
|
|
each second value trimmed , ')';
|
|
add: (each first start to: each third stop);
|
|
yourself ].
|
|
linkDataCollection do: [ :each |
|
|
self contents: (self contents
|
|
copyReplaceAll: each first with: each second) ].
|
|
^ self
|
|
]
|