241 lines
6.1 KiB
Smalltalk
241 lines
6.1 KiB
Smalltalk
Class {
|
|
#name : #PubPubWork,
|
|
#superclass : #Object,
|
|
#instVars : [
|
|
'address',
|
|
'tableOfContents',
|
|
'titles',
|
|
'folder',
|
|
'currentLanguage',
|
|
'languages'
|
|
],
|
|
#category : #'MiniDocs-Model'
|
|
}
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> addTableOfContents: anOrderedDictionary [
|
|
self tableOfContents
|
|
at: (self currentLanguage) put: anOrderedDictionary;
|
|
yourself
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> addTitle: aString [
|
|
self titles
|
|
at: (self currentLanguage) put: aString
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> address [
|
|
^ address
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> address: anUrl [
|
|
address := anUrl
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> bookishFolder [
|
|
^ { 'en' -> 'book'.
|
|
'es' -> 'libro'} asDictionary
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> currentLanguage [
|
|
^ currentLanguage
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> currentLanguage: twoLettersInISO639_1 [
|
|
currentLanguage := twoLettersInISO639_1
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> defaultOptions [
|
|
^ { 'sourceCodeLink' -> true .
|
|
'commentsProvider' -> 'Hypothesis' } asDictionary
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> defaultTitle [
|
|
^ self titles associations first value
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> downloadContents [
|
|
| workingDirectory |
|
|
workingDirectory := self workingDirectory.
|
|
self tableOfContentsDictionary
|
|
keysAndValuesDo: [ :name :chapterAddress |
|
|
| currentFileName |
|
|
currentFileName := name , '--' , chapterAddress , '.md'.
|
|
(workingDirectory / currentFileName) asFileReference ensureDelete.
|
|
(workingDirectory / 'markdown') asFileReference ensureDelete.
|
|
ZnClient new
|
|
get: self address , 'pub/' , chapterAddress , '/download/markdown';
|
|
downloadTo: workingDirectory.
|
|
workingDirectory / 'markdown' renameTo: currentFileName ].
|
|
^ workingDirectory
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> downloadContents2 [
|
|
| workingDirectory |
|
|
workingDirectory := self folder / self currentLanguage / 'book'.
|
|
self tableOfContentsDictionary keysAndValuesDo: [ :name :chapterAddress | |currentFileName|
|
|
currentFileName := name, '--', chapterAddress, '.md'.
|
|
(workingDirectory / currentFileName) asFileReference ensureDelete.
|
|
(workingDirectory / 'markdown') asFileReference ensureDelete.
|
|
ZnClient new
|
|
get: self address, 'pub/', chapterAddress, '/download/markdown';
|
|
downloadTo: workingDirectory .
|
|
workingDirectory / 'markdown' renameTo: currentFileName
|
|
].
|
|
^ workingDirectory
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> exportToHTML [
|
|
self markdownFiles
|
|
do: [ :file | | doc |
|
|
doc := Markdown new fromFile: file.
|
|
doc exportAsHTML ].
|
|
^ self markdownFiles first parent
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> exportToMarkdeep [
|
|
| markdeepDocs |
|
|
|
|
markdeepDocs := self markdownFiles
|
|
collect: [ :file | Markdeep fromMarkdownFile: file ].
|
|
markdeepDocs do: [ :each | each fromPubPubToMarkdeep exportAsFile ].
|
|
^ self languageFolder
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> extractAllContentsRaw [
|
|
^ self frontPage xpath: '//div[@class="layout-pubs-block"]'
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> extractRawTableOfContents [
|
|
^ self extractAllContentsRaw first xpath: '//div[contains(concat(" ",normalize-space(@class)," "), " pub-preview-component ")]'
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> folder [
|
|
^ folder ensureCreateDirectory
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> folder: localDirectory [
|
|
folder := localDirectory
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> frontPage [
|
|
"This should scrap contents of the book's front-page and translate them into Markdeep,
|
|
according to our templates."
|
|
^ (XMLHTMLParser on: (self address asUrl retrieveContents)) parseDocument
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> languageFolder [
|
|
^ self folder / self currentLanguage
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> markdeepFrontPage [
|
|
| frontPage markdeepIndex |
|
|
frontPage := Markdeep new.
|
|
frontPage
|
|
title: self defaultTitle;
|
|
file: self languageFolder / 'frontPage.md.html'.
|
|
markdeepIndex := '' writeStream.
|
|
self tableOfContents do: [:pubPubContent|
|
|
markdeepIndex
|
|
nextPutAll: pubPubContent asMarkdeepFrontPageElement
|
|
].
|
|
frontPage body: markdeepIndex contents.
|
|
^ frontPage
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> markdownFiles [
|
|
^ self languageFolder allChildren
|
|
select: [ :file | file basename endsWith: '.md' ]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> populateContents [
|
|
self tableOfContents isEmptyOrNil
|
|
ifTrue: [ self populateTableOfContents ].
|
|
self workingDirectory children ifEmpty: [self downloadContents].
|
|
self tableOfContents do: [:pubPubContent | | contentFile|
|
|
contentFile := self workingDirectory / pubPubContent fileName.
|
|
contentFile exists
|
|
ifTrue: [ pubPubContent contents: (Markdown new fromFile: contentFile) ]
|
|
]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> populateTableOfContents [
|
|
| contentsCollection |
|
|
contentsCollection := self extractRawTableOfContents collect: [:each |
|
|
(PubPubContent fromXML: each)
|
|
language: self currentLanguage;
|
|
work: self
|
|
].
|
|
self addTableOfContents: contentsCollection asOrderedCollection
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> printOn: aStream [
|
|
super printOn: aStream.
|
|
aStream
|
|
nextPutAll: '(',self defaultTitle, ' | ', self address, ' )'
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> tableOfContents [
|
|
tableOfContents ifNil: [ ^ tableOfContents := Dictionary new].
|
|
^ tableOfContents at: self currentLanguage
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> tableOfContents: anObject [
|
|
tableOfContents := anObject
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> tableOfContentsDictionary [
|
|
| response |
|
|
response := OrderedDictionary new.
|
|
self tableOfContents do: [:content |
|
|
response
|
|
at: content shortName put: content id
|
|
].
|
|
^ response
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> titles [
|
|
^ titles ifNil: [titles := OrderedDictionary new]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> viewContentsFor: aView [
|
|
<gtView>
|
|
^ aView list
|
|
title: 'Contents';
|
|
priority: 10;
|
|
items: [ self tableOfContents ]
|
|
]
|
|
|
|
{ #category : #accessing }
|
|
PubPubWork >> workingDirectory [
|
|
^ self folder / self currentLanguage / (self bookishFolder at: self currentLanguage)
|
|
]
|