TiddlyWikiPharo/repository/TiddlyWiki/TiddlyWiki.class.st

380 lines
9.6 KiB
Smalltalk
Raw Normal View History

2021-02-23 17:01:54 +00:00
"
I model a TiddlyWiki.
More information:
https://tiddlywiki.com/
"
Class {
#name : #TiddlyWiki,
#superclass : #Object,
2021-02-23 17:01:54 +00:00
#instVars : [
'name',
'file',
'remote',
'jsonFile',
'tiddlers'
2021-02-23 17:01:54 +00:00
],
#category : #'TiddlyWiki-Model'
2021-02-23 17:01:54 +00:00
}
{ #category : #accessing }
TiddlyWiki class >> fromJSONUrl: anUrlString [
| rawContents contentsString |
rawContents := anUrlString asUrl retrieveContents.
rawContents class = ByteArray
ifTrue: [ contentsString := rawContents utf8Decoded ]
ifFalse: [ contentsString := rawContents ].
^ self new
fromDictionary: (STONJSON fromString: contentsString);
remote: anUrlString;
name: anUrlString
]
{ #category : #accessing }
2021-09-16 00:21:53 +00:00
TiddlyWiki >> addToConfigFile [
| cleaned newConfig |
2021-09-16 00:21:53 +00:00
cleaned := self copy.
cleaned tiddlers: nil.
newConfig := self configDictonary
2021-09-16 00:21:53 +00:00
at: cleaned name put: cleaned;
yourself.
^ MarkupFile exportAsFileOn: self configFile containing:(STON toStringPretty: newConfig)
2021-09-16 00:37:57 +00:00
]
2022-02-04 16:47:53 +00:00
{ #category : #accessing }
2022-02-11 20:43:43 +00:00
TiddlyWiki >> changesAfter: aDateString [
2022-02-04 16:47:53 +00:00
2022-02-11 20:43:43 +00:00
| recent created modified wiki aDate |
aDate := aDateString asZTimestamp.
2022-02-04 16:47:53 +00:00
wiki := self withoutImages withoutPDFs contentTiddlers.
created := wiki select: [ :tiddler | tiddler created > aDate ].
modified := wiki select: [ :tiddler | tiddler modified isNotNil
and: [ tiddler modified > aDate ] ].
recent := OrderedCollection new.
recent
addAll: created;
addAll: modified.
^ recent asSet.
2022-02-04 16:47:53 +00:00
]
{ #category : #accessing }
2021-09-16 00:37:57 +00:00
TiddlyWiki >> configDictonary [
^ STONJSON fromString: self configFile contents.
2021-09-16 00:21:53 +00:00
]
{ #category : #accessing }
2021-09-16 00:21:53 +00:00
TiddlyWiki >> configFile [
| tempFile |
tempFile := FileLocator home / '.config' / 'TiddlyWikiPharo' / 'tiddlywiki.conf.ston'.
tempFile ensureCreateFile.
tempFile contents isEmpty ifTrue: [
MarkupFile exportAsFileOn: tempFile containing: ( STON toStringPretty: Dictionary new)
].
^ tempFile
]
{ #category : #accessing }
TiddlyWiki >> contentTiddlers [
^ self tiddlers copyWithoutAll: self shadow
]
{ #category : #accessing }
TiddlyWiki >> exportContentType: aMimeType [
| filteredTiddlers tempWiki |
filteredTiddlers := self selectContentType: aMimeType.
filteredTiddlers do: [ :each | each exportSTONFileInto: self largeTiddlersFolderName ].
^ self largeTiddlersFolder
]
{ #category : #accessing }
TiddlyWiki >> exportJSONFile [
| docTree rawJsonTiddlers |
self htmlFileExists.
docTree := XMLHTMLParser parse: self file contents.
rawJsonTiddlers := (docTree xpath: '//script[@class="tiddlywiki-tiddler-store"]') stringValue.
^ MarkupFile exportAsFileOn: self jsonFile containing: rawJsonTiddlers
]
{ #category : #accessing }
2021-10-06 00:26:17 +00:00
TiddlyWiki >> exportJSONSubtiddlers: subtiddlersCollection [
^ self exportJSONSubtiddlers: subtiddlersCollection as: 'subtiddlers'
]
{ #category : #accessing }
TiddlyWiki >> exportJSONSubtiddlers: subtiddlersCollection as: aName [
^ MarkupFile exportAsFileOn: self file parent / aName, 'json' containing: (self jsonSubtiddlers: subtiddlersCollection)
2021-10-06 00:26:17 +00:00
]
{ #category : #accessing }
TiddlyWiki >> exportSTONFiles [
| stonFile wikiTemp shadowFile |
self tiddlersJSONFile
ifNil: [
self inform:
'No JSON Tiddlers file found. If you have one, please provide its location'.
stonFile := FileLocator temp / 'tiddlers.ston' ]
ifNotNil: [
stonFile := self tiddlersJSONFile withoutExtension , 'ston' ].
shadowFile := self largeTiddlersFolder / '_shadow.ston'.
wikiTemp := self copy.
wikiTemp tiddlers: self contentTiddlers.
wikiTemp := wikiTemp withoutImages.
wikiTemp := wikiTemp withoutPDFs.
GrafoscopioUtils exportAsSton: self shadow on: shadowFile.
^ GrafoscopioUtils exportAsSton: wikiTemp on: stonFile
]
{ #category : #accessing }
TiddlyWiki >> exportSTONTiddlers: aCollection [
aCollection do: [:each | each exportSTONFile ]
2021-09-01 23:58:15 +00:00
]
{ #category : #accessing }
2021-07-15 22:45:53 +00:00
TiddlyWiki >> file [
^ file
]
{ #category : #accessing }
2021-07-15 22:45:53 +00:00
TiddlyWiki >> file: anObject [
file := anObject
]
{ #category : #accessing }
TiddlyWiki >> fromDictionary: tiddlersDict [
self tiddlers: (tiddlersDict collect: [ :each |
Tiddler new
fromDictionary: each;
wiki: self ])
]
{ #category : #accessing }
TiddlyWiki >> fromUrl: anUrlString [
| docTree rawJsonTiddlers tiddlersDictionary |
self remote: anUrlString.
docTree := XMLHTMLParser parse: (self remote retrieveContents).
rawJsonTiddlers := (docTree xpath: '//script[@class="tiddlywiki-tiddler-store"]') stringValue.
tiddlersDictionary := STONJSON fromString: rawJsonTiddlers.
self fromDictionary: tiddlersDictionary
]
{ #category : #accessing }
TiddlyWiki >> htmlFileExists [
self file ifNil: [
self inform: 'No TiddlyWiki HTML file found. If you have one, please provide its location.'.
^ nil
].
]
{ #category : #accessing }
TiddlyWiki >> importJSONFile [
"I import a JSON representation of my tiddlers data, that has been previosly exported
by the TiddlyWiki HTML self contained file.
Such file is called, by convention, 'tiddlers.json' and stored in the same folder where
the HTML file is located."
2021-08-11 17:10:53 +00:00
| tiddlersDict |
self tiddlersJSONFile ifNil: [ ^ self ].
tiddlersDict := STONJSON fromString: self tiddlersJSONFile contents.
self fromDictionary: tiddlersDict
2021-08-11 17:10:53 +00:00
]
2021-02-23 17:01:54 +00:00
{ #category : #accessing }
TiddlyWiki >> jsonFile [
^ jsonFile ifNil: [
self htmlFileExists.
jsonFile := file parent / 'tiddlers.json'.]
]
{ #category : #accessing }
TiddlyWiki >> jsonFile: aFileLocator [
"I contain the tiddlers representation of the wiki data in JSON format."
jsonFile := aFileLocator
]
{ #category : #accessing }
2021-10-06 00:26:17 +00:00
TiddlyWiki >> jsonSubtiddlers: subtiddlersCollection [
| subtiddlersDict |
subtiddlersDict := subtiddlersCollection collect: [:tiddler | tiddler asDictionary ].
^ STONJSON toStringPretty: subtiddlersDict
]
{ #category : #accessing }
TiddlyWiki >> largeTiddlersFolder [
"I store all shadow tiddlers, i.e. tiddlers that provide functionality to TiddlyWiki,
for example the ones that come in the plugins or in system tiddlers.
For more information about shadow tiddlers, see #shadow method."
| folder |
folder := self file parent / self largeTiddlersFolderName.
folder ensureCreateDirectory.
^ folder
]
{ #category : #accessing }
TiddlyWiki >> largeTiddlersFolderName [
^ 'largeTiddlers'
]
{ #category : #accessing }
2021-09-16 00:37:57 +00:00
TiddlyWiki >> loadFromConfig: wikiname [
2021-11-10 15:28:42 +00:00
^ (self configDictonary at: wikiname) importJSONFile.
2021-09-16 00:37:57 +00:00
]
{ #category : #accessing }
TiddlyWiki >> local [
^ self file
]
{ #category : #accessing }
TiddlyWiki >> local: aFileRefence [
^ self file:aFileRefence
]
{ #category : #accessing }
TiddlyWiki >> name [
| tempName suffix |
name ifNotNil: [ ^ name ].
self file ifNotNil: [ ^ name := self file basenameWithoutExtension ].
self remote ifNil: [ ^ name := nil ].
tempName := self remote file.
(tempName endsWithAnyOf: #('.html' '.htm')) ifTrue: [
suffix := (tempName splitOn: '.') last.
tempName := tempName removeSuffix: '.', suffix.
].
name := tempName
]
{ #category : #accessing }
TiddlyWiki >> name: aString [
name := aString
]
{ #category : #accessing }
2021-08-17 18:24:00 +00:00
TiddlyWiki >> networkView [
| view |
view := GtMondrian new.
view nodes
with: self tiddlers.
view edges
connectFromAll: #linkedTiddlers.
view layout force.
^ view
]
{ #category : #accessing }
2021-08-11 17:10:53 +00:00
TiddlyWiki >> printOn: aStream [
super printOn: aStream.
aStream
nextPutAll: '( ', self name ,' )'
2021-02-23 17:01:54 +00:00
]
{ #category : #accessing }
TiddlyWiki >> rebuildTiddlersJSON [
| stonTiddlers stonTiddlerFiles |
stonTiddlerFiles := self tiddlersFolder asFileReference children
select: [ :each | each fullName endsWith: 'ston' ].
stonTiddlers := stonTiddlerFiles collect: [ :each | STON fromString: each contents ].
self tiddlers: stonTiddlers.
^ self exportJSONSubtiddlers: self tiddlers as: 'rebuildedTiddlers'.
]
{ #category : #accessing }
TiddlyWiki >> remote [
^ remote
]
{ #category : #accessing }
TiddlyWiki >> remote: aUrlString [
remote := aUrlString asZnUrl
]
{ #category : #accessing }
TiddlyWiki >> selectContentType: mimeType [
^ self tiddlers select: [ :tiddler | tiddler type isNotNil and: [tiddler type beginsWith: mimeType ]]
]
{ #category : #accessing }
TiddlyWiki >> shadow [
"Shadow tiddlers are tiddlers that are loaded from plugins.
For more information about them, see:
- https://tiddlywiki.com/static/ShadowTiddlers.html
- https://groups.google.com/g/TiddlyWiki/c/HuyZmaRJTxI"
^ self tiddlers select: [:tiddler | tiddler title beginsWith: '$:/']
]
{ #category : #accessing }
TiddlyWiki >> taggedWith: aTag [
^ self tiddlers select: [:tiddler |
tiddler tags isNotNil and: [tiddler tags includesSubstring: aTag ]
]
]
{ #category : #accessing }
2021-02-23 17:01:54 +00:00
TiddlyWiki >> tiddlers [
^ tiddlers ifNil: [ tiddlers := OrderedCollection new ]
]
{ #category : #accessing }
2021-02-23 17:01:54 +00:00
TiddlyWiki >> tiddlers: anOrderedCollection [
tiddlers := anOrderedCollection
]
2021-07-15 22:45:53 +00:00
2022-02-04 16:47:53 +00:00
{ #category : #accessing }
TiddlyWiki >> tiddlersFolder [
^ self file parent / 'tiddlers'
]
{ #category : #accessing }
2021-07-15 22:45:53 +00:00
TiddlyWiki >> tiddlersJSONFile [
self jsonFile exists ifFalse: [
self inform: 'You need to export tiddlers as JSON from TiddlyWiki and locate it in the same folder as the HTML file'.
^ nil
].
^ jsonFile
2021-07-15 22:45:53 +00:00
]
{ #category : #accessing }
TiddlyWiki >> tiddlersJSONUrl [
self remote ifNil: [^ nil].
]
{ #category : #accessing }
TiddlyWiki >> withoutContentType: application [
| filteredTiddlers tempWiki |
filteredTiddlers := self tiddlers reject: [:tiddler | tiddler type isNotNil and: [tiddler type beginsWith: application ]].
tempWiki := self copy
tiddlers: filteredTiddlers.
tempWiki tiddlers do: [:tiddler | tiddler wiki: tempWiki ].
^ tempWiki
]
2021-11-30 19:39:25 +00:00
{ #category : #accessing }
TiddlyWiki >> withoutImages [
^ self withoutContentType: 'image/'
2021-11-30 19:39:25 +00:00
]
{ #category : #accessing }
TiddlyWiki >> withoutPDFs [
^ self withoutContentType: 'application/pdf'
2021-11-30 19:39:25 +00:00
]