" 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 : #'as yet unclassified' } HedgeDoc class >> newDefault [ ^ self new defaultServer. ] { #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 >> contents [ ^ body ] { #category : #accessing } HedgeDoc >> contents: anObject [ body := anObject ] { #category : #'as yet unclassified' } HedgeDoc >> defaultServer [ self server: 'https://docutopia.tupale.co'. ] { #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 contents: (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 ]