149 lines
3.1 KiB
Smalltalk
149 lines
3.1 KiB
Smalltalk
Class {
|
||
#name : #PubPubContent,
|
||
#superclass : #Object,
|
||
#instVars : [
|
||
'title',
|
||
'language',
|
||
'url',
|
||
'thumbnail',
|
||
'work',
|
||
'contents'
|
||
],
|
||
#category : #'MiniDocs-Model'
|
||
}
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent class >> fromXML: anXMLElement [
|
||
^ self new fromXML: anXMLElement
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> asMarkdeepFrontPageElement [
|
||
| response anchorName anchorLink markdeepFile |
|
||
response := '' writeStream.
|
||
anchorName := '[', self title,']'.
|
||
markdeepFile := './book/', self shortName,'--',self id,'.md.html'.
|
||
anchorLink := '(', markdeepFile,')'.
|
||
response
|
||
nextPutAll: '<big>', anchorName, anchorLink,'</big><br><br>';
|
||
nextPutAll: String lf.
|
||
self thumbnail ifNotNil: [ |image|
|
||
image := '
|
||
<img
|
||
src=', self thumbnail,
|
||
' width="55%"
|
||
style="width: 400px; height: 220px; object-fit: cover;"
|
||
/>'.
|
||
response nextPutAll: '<a href="',markdeepFile,'">', image, '</a>'
|
||
].
|
||
response
|
||
nextPutAll: String lf, String lf.
|
||
^ response contents
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> contents: anObject [
|
||
contents := anObject
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> fileName [
|
||
^ self shortName,'--', self id, '.md'
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> fromXML: aXMLElement [
|
||
| image anchor|
|
||
image := aXMLElement contentNodes first xpath: './a/div'.
|
||
image
|
||
ifNotEmpty: [|style rawUrl|
|
||
style := (image first attributeAt: 'style').
|
||
rawUrl := (style splitOn: 'url') second.
|
||
self
|
||
thumbnail:(rawUrl copyFrom: 3 to: rawUrl size - 2)
|
||
].
|
||
anchor := (aXMLElement contentNodes second contentNodes first xpath: './div[@class="title-wrapper"]/a') first.
|
||
self
|
||
title: (anchor attributeAt: 'title');
|
||
url: (anchor attributeAt: 'href').
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> id [
|
||
^ (self url splitOn: $/) last
|
||
]
|
||
|
||
{ #category : #'as yet unclassified' }
|
||
PubPubContent >> language: aString [
|
||
language := aString
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> next [
|
||
^ self nextInstance
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> previous [
|
||
| index |
|
||
index := self work tableOfContents detectIndex: [:pubContent | pubContent = self ] ifNone: [ ^ nil ].
|
||
^ self work tableOfContents at: index - 1.
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> printOn: aStream [
|
||
super printOn: aStream.
|
||
aStream
|
||
nextPutAll: '( ', self title,' | ', self id, ' )'
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> shortName [
|
||
| sanitized |
|
||
sanitized := (self title splitOn: $:) first.
|
||
sanitized := sanitized copyReplaceAll: '’' with: ''.
|
||
sanitized := sanitized asCamelCase.
|
||
sanitized at: 1 put: sanitized first asLowercase.
|
||
^ sanitized
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> thumbnail [
|
||
^ thumbnail
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> thumbnail: anURL [
|
||
thumbnail := anURL
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> title [
|
||
^ title
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> title: anObject [
|
||
title := anObject
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> url [
|
||
^url
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> url: anObject [
|
||
url := anObject
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> work [
|
||
^ work
|
||
]
|
||
|
||
{ #category : #accessing }
|
||
PubPubContent >> work: aPubPubWork [
|
||
work := aPubPubWork
|
||
]
|