343 lines
7.7 KiB
Smalltalk
343 lines
7.7 KiB
Smalltalk
Class {
|
|
#name : #GrafoscopioNode,
|
|
#superclass : #Object,
|
|
#instVars : [
|
|
'header',
|
|
'body',
|
|
'tags',
|
|
'children',
|
|
'parent',
|
|
'links',
|
|
'level',
|
|
'created',
|
|
'nodesInPreorder',
|
|
'selected',
|
|
'edited',
|
|
'headers',
|
|
'key',
|
|
'output',
|
|
'remoteLocations'
|
|
],
|
|
#category : #'MiniDocs-Legacy'
|
|
}
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode class >> fromFile: aFileReference [
|
|
|
|
^ (STON fromString: aFileReference contents) first parent
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode class >> fromLink: aStonLink [
|
|
| notebook |
|
|
notebook := (STON fromString: aStonLink asUrl retrieveContents utf8Decoded) first parent.
|
|
notebook addRemoteLocation: aStonLink.
|
|
^ notebook
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> addRemoteLocation: anURL [
|
|
self remoteLocations add: anURL
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> ancestors [
|
|
"I return a collection of all the nodes wich are ancestors of the receiver node"
|
|
| currentNode ancestors |
|
|
|
|
currentNode := self.
|
|
ancestors := OrderedCollection new.
|
|
[ currentNode parent notNil and: [ currentNode level > 0 ] ]
|
|
whileTrue: [
|
|
ancestors add: currentNode parent.
|
|
currentNode := currentNode parent].
|
|
ancestors := ancestors reversed.
|
|
^ ancestors
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> asLePage [
|
|
| page |
|
|
self root populateTimestamps.
|
|
page := LePage new
|
|
initializeTitle: 'Grafoscopio Notebook (imported)'.
|
|
self nodesInPreorder allButFirst
|
|
do: [:node | page addSnippet: node asSnippet ].
|
|
page latestEditTime: self root latestEditionDate.
|
|
page createTime: self root earliestCreationDate.
|
|
page optionAt: 'remoteLocations' put: self remoteLocations.
|
|
^ page.
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> asSnippet [
|
|
| snippet child |
|
|
snippet := LeTextSnippet new
|
|
string: self header;
|
|
createTime: (LeTime new
|
|
time: self created);
|
|
uid: LeUID new.
|
|
(self tags includes: 'código')
|
|
ifFalse: [
|
|
child := LeTextSnippet new;
|
|
string: self body. ]
|
|
ifTrue: [
|
|
child := LePharoSnippet new;
|
|
code: self body ].
|
|
child
|
|
createTime: (LeTime new
|
|
time: self created);
|
|
uid: LeUID new.
|
|
snippet addFirstSnippet: child.
|
|
snippet optionAt: 'tags' put: self tags.
|
|
^ snippet
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> body [
|
|
^ body
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> body: anObject [
|
|
body := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> children [
|
|
^ children
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> children: anObject [
|
|
children := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> created [
|
|
created ifNotNil: [^created asDateAndTime].
|
|
^ created
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> created: anObject [
|
|
created := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> earliestCreationDate [
|
|
| earliest |
|
|
|
|
self nodesWithCreationDates ifNotEmpty: [
|
|
earliest := self nodesWithCreationDates first created]
|
|
ifEmpty: [ earliest := self earliestRepositoryTimestamp - 3 hours].
|
|
self nodesWithCreationDates do: [:node |
|
|
node created <= earliest ifTrue: [ earliest := node created ] ].
|
|
^ earliest
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> earliestRepositoryTimestamp [
|
|
| remote fossilHost docSegments repo checkinInfo |
|
|
remote := self remoteLocations first asUrl.
|
|
fossilHost := 'https://mutabit.com/repos.fossil'.
|
|
(remote asString includesSubstring: fossilHost) ifFalse: [ ^ false ].
|
|
docSegments := remote segments copyFrom: 5 to: remote segments size.
|
|
repo := FossilRepo new
|
|
remote: (remote scheme, '://', remote host, '/', remote segments first, '/', remote segments second).
|
|
checkinInfo := repo firstCheckinFor: ('/' join: docSegments).
|
|
^ DateAndTime fromUnixTime: (checkinInfo at: 'timestamp')
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> edited [
|
|
^ edited ifNotNil: [^ edited asDateAndTime ]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> edited: anObject [
|
|
edited := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> gtTextFor: aView [
|
|
<gtView>
|
|
^ aView textEditor
|
|
title: 'Body';
|
|
text: [ body ]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> header [
|
|
^ header
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> header: anObject [
|
|
header := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> latestEditionDate [
|
|
| latest |
|
|
|
|
latest := self nodesWithEditionDates first edited.
|
|
self nodesWithEditionDates do: [:node |
|
|
node edited >= latest ifTrue: [ latest := node edited ] ].
|
|
^ latest
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> level [
|
|
^ level
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> level: anObject [
|
|
level := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> links [
|
|
^ links
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> links: anObject [
|
|
links := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> nodesInPreorder [
|
|
^ nodesInPreorder
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> nodesInPreorder: anObject [
|
|
nodesInPreorder := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> nodesWithCreationDates [
|
|
^ self nodesInPreorder select: [ :each | each created isNotNil ]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> nodesWithEditionDates [
|
|
^ self nodesInPreorder select: [ :each | each edited isNotNil ]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> parent [
|
|
^ parent
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> parent: anObject [
|
|
parent := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> populateTimestamps [
|
|
| adhocCreationMarker adhocEditionMarker |
|
|
adhocCreationMarker := 'adhoc creation timestamp'.
|
|
adhocEditionMarker := 'adhoc edition timestamp'.
|
|
(self nodesInPreorder size = self nodesWithCreationDates size
|
|
and: [ self nodesInPreorder size = self nodesWithEditionDates size ])
|
|
ifTrue: [ ^ self nodesInPreorder ].
|
|
self nodesInPreorder allButFirst doWithIndex: [:node :i |
|
|
node created ifNil: [
|
|
node created: self earliestCreationDate + i.
|
|
node tags add: adhocCreationMarker.
|
|
].
|
|
node edited ifNil: [
|
|
node edited: self earliestCreationDate + i + 1.
|
|
node tags add: 'adhoc edition timestamp'
|
|
].
|
|
].
|
|
self root created ifNil: [
|
|
self root created: self earliestCreationDate - 1.
|
|
self root tags add: adhocCreationMarker.
|
|
].
|
|
self root edited ifNil: [
|
|
self root edited: self latestEditionDate.
|
|
self root tags add: adhocEditionMarker.
|
|
].
|
|
^ self nodesInPreorder
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> printOn: aStream [
|
|
super printOn: aStream.
|
|
aStream
|
|
nextPutAll: '( ', self header, ' )'
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> remoteLocations [
|
|
^ remoteLocations ifNil: [ remoteLocations := OrderedCollection new]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> root [
|
|
self level = 0 ifTrue: [ ^ self ].
|
|
^ self ancestors first.
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> selected [
|
|
^ selected
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> selected: anObject [
|
|
selected := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> tags [
|
|
^ tags
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> tags: anObject [
|
|
tags := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> viewBody [
|
|
|
|
| aText |
|
|
aText := self header asRopedText.
|
|
|
|
self children do: [ :child |
|
|
aText append: ' ' asRopedText.
|
|
aText append: (child header asRopedText foreground:
|
|
BrGlamorousColors disabledButtonTextColor).
|
|
aText append: ('= "' asRopedText foreground:
|
|
BrGlamorousColors disabledButtonTextColor).
|
|
aText append: (child body asRopedText foreground:
|
|
BrGlamorousColors disabledButtonTextColor).
|
|
aText append:
|
|
('"' asRopedText foreground:
|
|
BrGlamorousColors disabledButtonTextColor) ].
|
|
|
|
|
|
^ aText
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
GrafoscopioNode >> viewChildrenFor: aView [
|
|
<gtView>
|
|
|
|
children ifNil: [ ^ aView empty ].
|
|
|
|
^ aView columnedTree
|
|
title: 'Children';
|
|
priority: 1;
|
|
items: [ { self } ];
|
|
children: #children;
|
|
column: 'Name' text: #viewBody;
|
|
expandUpTo: 2
|
|
]
|