Extension { #name : #LeDatabase } { #category : #'*MiniDocs' } LeDatabase >> addPageFromMarkdeep: markdeepDocTree [ | remoteMetadata divSnippets snippets page | divSnippets := (markdeepDocTree xpath: '//div[@st-class]') asOrderedCollection collect: [ :xmlElement | xmlElement postCopy ]. snippets := divSnippets collect: [ :xmlElement | (xmlElement attributes at: 'st-class') = 'LeTextSnippet' ifTrue: [ LeTextSnippet new contentFrom: xmlElement ] ifFalse: [ (xmlElement attributes at: 'st-class') = 'LePharoSnippet' ifTrue: [ LePharoSnippet new contentFrom: xmlElement ] ] ]. remoteMetadata := Markdeep new metadataFromXML: markdeepDocTree. page := LePage new title: (remoteMetadata at: 'title'); basicUid: (UUID fromString36: (remoteMetadata at: 'id')); createTime: (LeTime new time: ((remoteMetadata at: 'created') asDateAndTime)); editTime: (LeTime new time: ((remoteMetadata at: 'modified') asDateAndTime)); latestEditTime: (LeTime new time: ((remoteMetadata at: 'modified') asDateAndTime)); createEmail: (LeEmail new email:(remoteMetadata at: 'creator')); editEmail: (LeEmail new email:(remoteMetadata at: 'modifier')). snippets do: [ :snippet | page addSnippet: snippet ]. page children collect: [ :snippet | snippet database: self. self registerSnippet: snippet ]. self addPage: page. ^ page ] { #category : #'*MiniDocs' } LeDatabase >> addPageFromMarkdeepUrl: aString [ | page | page := self detectLocalPageForRemote: aString. page ifNotNil: [ :arg | ^ self importErrorMessage: page ]. ^ self addPageFromMarkdeep: (self docTreeForLink: aString) ] { #category : #'*MiniDocs' } LeDatabase >> detectLocalPageForRemote: markdeepDocUrl [ | markdeepHelper id remoteMetadata docTree | markdeepHelper := Markdeep new. docTree := self docTreeForLink: markdeepDocUrl. remoteMetadata := markdeepHelper metadataFromXML: docTree. id := remoteMetadata at: 'id' ifAbsent: [ nil ]. ^ self pageWithID: id ifAbsent: [ ^ nil ]. ] { #category : #'*MiniDocs' } LeDatabase >> docTreeForLink: aString [ ^ (XMLHTMLParser on: aString asUrl retrieveContents) parseDocument ] { #category : #'*MiniDocs' } LeDatabase >> importErrorMessage: page [ ^ String streamContents: [ :stream | stream nextPutAll: 'IMPORTATION ERROR: a page with'; nextPut: Character lf; nextPut: Character lf; nextPutAll: ' id: ' , page uidString; nextPut: Character lf; nextPutAll: ' title: ' , page contentAsString; nextPut: Character lf; nextPut: Character lf; nextPutAll: 'already exists in this database.'; nextPut: Character lf; nextPut: Character lf; nextPutAll: 'Please do one of those before retrying this procedure: 1) Move the existing page files (.lepiter and .bak) to another (sub)folder. 2) Import the page url to another database.' ] ]