Adding rubric to the loop. And pillar
This commit is contained in:
parent
146d54363a
commit
a1820c43a3
@ -44,6 +44,7 @@ GfWorldMenu class >> helpMenuOn: aBuilder [
|
|||||||
{ #category : #'world menu' }
|
{ #category : #'world menu' }
|
||||||
GfWorldMenu class >> launchCompatibilityMenuOn: aBuilder [
|
GfWorldMenu class >> launchCompatibilityMenuOn: aBuilder [
|
||||||
<worldMenu>
|
<worldMenu>
|
||||||
|
|
||||||
(aBuilder item: #'New notebook')
|
(aBuilder item: #'New notebook')
|
||||||
label: 'New notebook';
|
label: 'New notebook';
|
||||||
order: 1;
|
order: 1;
|
||||||
|
122
repository/Grafoscopio/GrafoscopioAbstractText.class.st
Normal file
122
repository/Grafoscopio/GrafoscopioAbstractText.class.st
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
"
|
||||||
|
This abstract class works for defining the basic type required by Rubric
|
||||||
|
"
|
||||||
|
Class {
|
||||||
|
#name : #GrafoscopioAbstractText,
|
||||||
|
#superclass : #Object,
|
||||||
|
#category : 'Grafoscopio-Pillar'
|
||||||
|
}
|
||||||
|
|
||||||
|
{ #category : #converting }
|
||||||
|
GrafoscopioAbstractText >> asText [
|
||||||
|
^ self
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioAbstractText >> at: anIndex [
|
||||||
|
^ self subclassResponsibility
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioAbstractText >> attributesAt: characterIndex [
|
||||||
|
"Answer the code for characters in the run beginning at characterIndex."
|
||||||
|
"NB: no senders any more (supplanted by #attributesAt:forStyle: but retained for the moment in order not to break user code that may exist somewhere that still calls this"
|
||||||
|
| attributes |
|
||||||
|
" self size = 0
|
||||||
|
ifTrue: [^ Array with: (TextFontChange new fontNumber: 1)]."
|
||||||
|
self size = 0 ifTrue: [ ^#()].
|
||||||
|
attributes := self runs at: characterIndex.
|
||||||
|
^ attributes
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioAbstractText >> attributesAt: anInteger forStyle: aTextStyle [
|
||||||
|
|
||||||
|
| attributes |
|
||||||
|
self size = 0
|
||||||
|
ifTrue: [^ Array with: (TextFontChange new fontNumber: aTextStyle defaultFontIndex)]. "null text tolerates access"
|
||||||
|
attributes := self runs at: anInteger.
|
||||||
|
^ attributes
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #copying }
|
||||||
|
GrafoscopioAbstractText >> copy [
|
||||||
|
^ self
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #copying }
|
||||||
|
GrafoscopioAbstractText >> copyFrom: start to: stop [
|
||||||
|
^ self subclassResponsibility
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #testing }
|
||||||
|
GrafoscopioAbstractText >> ifNotEmpty: isNotEmptyBlock ifEmpty: isEmptyBlock [
|
||||||
|
^ self isEmpty
|
||||||
|
ifTrue: [ isEmptyBlock value ]
|
||||||
|
ifFalse: [ isNotEmptyBlock value ]
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #testing }
|
||||||
|
GrafoscopioAbstractText >> isEmpty [
|
||||||
|
^ self size = 0
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #testing }
|
||||||
|
GrafoscopioAbstractText >> isText [
|
||||||
|
^ true
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioAbstractText >> last [
|
||||||
|
^ self at: self size
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #copying }
|
||||||
|
GrafoscopioAbstractText >> notEmpty [
|
||||||
|
^ self isEmpty not
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #removing }
|
||||||
|
GrafoscopioAbstractText >> removeAttribute: anAttr [
|
||||||
|
^ self removeAttribute: anAttr from: 1 to: self size
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #removing }
|
||||||
|
GrafoscopioAbstractText >> removeAttribute: att from: start to: stop [
|
||||||
|
self subclassResponsibility
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #editing }
|
||||||
|
GrafoscopioAbstractText >> replaceFrom: anInteger to: anInteger2 with: aCollection [
|
||||||
|
self subclassResponsibility
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #emphasis }
|
||||||
|
GrafoscopioAbstractText >> runLengthFor: characterIndex [
|
||||||
|
^ self runs runLengthAt: characterIndex
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioAbstractText >> runs [
|
||||||
|
self subclassResponsibility
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioAbstractText >> runs: anArray [
|
||||||
|
self subclassResponsibility "runs := RunArray new: self size withAll: anArray . "
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioAbstractText >> size [
|
||||||
|
^ self string size
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioAbstractText >> string [
|
||||||
|
^ self subclassResponsibility
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioAbstractText >> text: aParam [
|
||||||
|
self subclassResponsibility
|
||||||
|
]
|
5
repository/Grafoscopio/GrafoscopioComposer.class.st
Normal file
5
repository/Grafoscopio/GrafoscopioComposer.class.st
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
Class {
|
||||||
|
#name : #GrafoscopioComposer,
|
||||||
|
#superclass : #Object,
|
||||||
|
#category : 'Grafoscopio-Rub'
|
||||||
|
}
|
20
repository/Grafoscopio/GrafoscopioEditingArea.class.st
Normal file
20
repository/Grafoscopio/GrafoscopioEditingArea.class.st
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
Class {
|
||||||
|
#name : #GrafoscopioEditingArea,
|
||||||
|
#superclass : #RubEditingArea,
|
||||||
|
#category : 'Grafoscopio-Rub'
|
||||||
|
}
|
||||||
|
|
||||||
|
{ #category : #private }
|
||||||
|
GrafoscopioEditingArea >> newParagraph [
|
||||||
|
| newParagraph |
|
||||||
|
newParagraph := self privateInstantiateParagraphObject.
|
||||||
|
newParagraph textArea: self.
|
||||||
|
newParagraph container: self compositionRectangle.
|
||||||
|
^ newParagraph
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #private }
|
||||||
|
GrafoscopioEditingArea >> privateInstantiateParagraphObject [
|
||||||
|
^ RubOpeningClosingDelimiterDecorator next: GrafoscopioParagraph new.
|
||||||
|
|
||||||
|
]
|
10
repository/Grafoscopio/GrafoscopioParagraph.class.st
Normal file
10
repository/Grafoscopio/GrafoscopioParagraph.class.st
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Class {
|
||||||
|
#name : #GrafoscopioParagraph,
|
||||||
|
#superclass : #RubParagraph,
|
||||||
|
#category : 'Grafoscopio-Rub'
|
||||||
|
}
|
||||||
|
|
||||||
|
{ #category : #'accessing composer' }
|
||||||
|
GrafoscopioParagraph >> newComposer [
|
||||||
|
^ GrafoscopioComposer new
|
||||||
|
]
|
162
repository/Grafoscopio/GrafoscopioPillarASText.class.st
Normal file
162
repository/Grafoscopio/GrafoscopioPillarASText.class.st
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
"
|
||||||
|
Pillar ASText delegates the text behavior into a pillar AST .
|
||||||
|
"
|
||||||
|
Class {
|
||||||
|
#name : #GrafoscopioPillarASText,
|
||||||
|
#superclass : #GrafoscopioAbstractText,
|
||||||
|
#instVars : [
|
||||||
|
'ast',
|
||||||
|
'stringDecorator',
|
||||||
|
'lastNode'
|
||||||
|
],
|
||||||
|
#category : 'Grafoscopio-Pillar'
|
||||||
|
}
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarASText class >> openExample [
|
||||||
|
^ self new
|
||||||
|
ast: self pillarExample;
|
||||||
|
yourself
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarASText class >> pillarExample [
|
||||||
|
^ PRPillarParser
|
||||||
|
parse:
|
||||||
|
'!! About Pillar
|
||||||
|
!!
|
||||||
|
Pillar is a system to manage documents (books, presentations, and web sites). From a common format, it is able to generate documents in multiple formats (html, markdown, latex, AsciiDoc).
|
||||||
|
It is composed of several modules such as importers, transformers, document model and outputers.
|
||||||
|
|
||||||
|
This book describes Pillar in its current version 7.0. Pillar is currently developed and masintained by Stéphane Ducasse and Guillermo Polito.
|
||||||
|
The original author of Pillar was Damien Cassou. Many people have also contributed to Pillar: Ben Coman, Guillermo Polito, Lukas Renggli (original author of the PierCMS from which a first version of Pillar has been extracted), Benjamin van Ryseghem, Cyril Ferlicot-Delbecque, Thibault Arloing, Yann Dubois, Quentin Ducasse and Asbathou Sama Biyalou. Special thanks to Asbathou Sama Biyalou!
|
||||||
|
|
||||||
|
This book adapts, extends, and clarifies the chapter explaining Pillar in the ''Enterprise Pharo: a Web Perspective'' book.
|
||||||
|
|
||||||
|
Pillar was sponsored by *ESUG>http://www.esug.org*.
|
||||||
|
|
||||||
|
!!!Introduction
|
||||||
|
Pillar (hosted at *http://github.com/pillar-markup*) is a markup language and associated tools to write and generate documentation, books (such as this one), web sites, and slide-based presentations. The Pillar screenshot in Figure *@voyageDocExample* shows the HTML version of chapter Voyage.
|
||||||
|
|
||||||
|
+An example Pillar output>file://figures/voyageDocExample-small.png|label=voyageDocExample|width=60+
|
||||||
|
|
||||||
|
Pillar has many features, helpful tools, and documentation:
|
||||||
|
- simple markup syntax with references, tables, pictures, captions, syntax-highlighted code blocks;
|
||||||
|
- export documents to HTML, LaTeX, Markdown, AsciiDoc, ePuB and Pillar itself, and presentations to Beamer and Deck.js;
|
||||||
|
%- customization of the export through a dedicated STON configuration file (see chapter Missing Chapter *@cha:ston*) and Mustache templates (see chapter *@templating*).
|
||||||
|
- many tests with good coverage (94% with more than a 2100 executed tests), which are regularly run by a *continuous integration job>https://ci.inria.fr/pharo-contribution/job/Pillar*
|
||||||
|
- a command-line interface and dedicated plugins for several text editors: *Emacs>https://github.com/pillar-markup/pillar-mode*, *Vim>https://github.com/cdlm/vim-pillar*, *TextMate>https://github.com/Uko/Pillar.tmbundle*, and *Atom>https://github.com/Uko/language-pillar*
|
||||||
|
- a cheat sheet (see Chapter *@chacheat*).
|
||||||
|
|
||||||
|
|
||||||
|
!!!Pillar users
|
||||||
|
@pillarUSERS
|
||||||
|
|
||||||
|
This book was written in Pillar itself. If you want to see how Pillar is used, have a look at its source code (*http://github.com/SquareBracketAssociates/Booklet-PublishingAPillarBooklet*), or check the following other real-world projects:
|
||||||
|
|
||||||
|
- the Updated Pharo by Example book (*https://github.com/SquareBracketAssociates/UpdatedPharoByExample*),
|
||||||
|
- the Pharo MOOC - Massive open online course (*https://github.com/SquareBracketAssociates/PharoMooc*,
|
||||||
|
- Any of the Pharo booklets (*https://github.com/SquareBracketAssociates/Booklet-XXXX*,
|
||||||
|
- the PillarHub open-access shared blog (*http://pillarhub.pharocloud.com*).
|
||||||
|
|
||||||
|
|
||||||
|
!!! Pillar future features
|
||||||
|
|
||||||
|
Pillar 70 saw some major refactorings and cleaning: it does not rely on Grease and Magritte anymore.
|
||||||
|
Its architecture is a lot cleaner.
|
||||||
|
|
||||||
|
Still some issues are missing. Here is a little list of features that we are working on or will soon:
|
||||||
|
|
||||||
|
- Incremental recompilation. Since we remove the use of make (so that Windows users can use Pillar) we should introduce a way to avoid to recompile complete book when just one chapter changed.
|
||||||
|
- Markdown syntax.
|
||||||
|
- Release of Ecstatic. Pillar supports the deployment of web sites named Ecstatic and we are working on a second version of Ecstatic.
|
||||||
|
- Better table support.
|
||||||
|
|
||||||
|
!!! Conclusion
|
||||||
|
Pillar is still in active development: maintainers keep improving its implementation. The current version of Pillar is Pillar 70. This booklet only documents Pillar 70. This booklet will be synchronised with future enhancements.'
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarASText >> allRangesOfSubstring: aString [
|
||||||
|
^ { }
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarASText >> ast: aPRDocument [
|
||||||
|
ast := aPRDocument.
|
||||||
|
aPRDocument accept: GrafoscopioPillarTextAnnotator new.
|
||||||
|
ast start: aPRDocument children first start.
|
||||||
|
ast stop: aPRDocument children last stop.
|
||||||
|
stringDecorator := GrafoscopioPillarASTextStringDecorator new
|
||||||
|
text: self;
|
||||||
|
yourself
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioPillarASText >> at: anInteger [
|
||||||
|
|
||||||
|
| node |
|
||||||
|
|
||||||
|
(anInteger > self size or: [ anInteger < 1 ])
|
||||||
|
ifTrue: [ ^ self errorSubscriptBounds: anInteger ].
|
||||||
|
|
||||||
|
node := self detectAstNodeFor: anInteger in: ast.
|
||||||
|
|
||||||
|
^ node text at: anInteger - node textStart +1
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #copying }
|
||||||
|
GrafoscopioPillarASText >> copyFrom: from to: to [
|
||||||
|
^ (ast textStart = from and: [ ast textStop = (to + 1) ])
|
||||||
|
ifTrue: [ self ]
|
||||||
|
ifFalse: [ GrafoscopioPillarASTextStringProjectionDecorator new
|
||||||
|
text: self;
|
||||||
|
|
||||||
|
from: from;
|
||||||
|
to: to;
|
||||||
|
yourself ]
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarASText >> detectAstNodeFor: anInteger in: aNode [
|
||||||
|
(lastNode isNotNil
|
||||||
|
and: [ anInteger between: lastNode textStart and: lastNode textStop ])
|
||||||
|
ifTrue: [ ^ lastNode ].
|
||||||
|
(anInteger between: aNode textStart and: aNode textStop)
|
||||||
|
ifFalse: [ self error: 'Cannot find a node for ' , anInteger asString ].
|
||||||
|
^ aNode hasChildren
|
||||||
|
ifTrue: [ aNode children
|
||||||
|
detect: [ :c | anInteger between: c textStart and: c textStop ]
|
||||||
|
ifFound: [ :n | self detectAstNodeFor: anInteger in: n ]
|
||||||
|
ifNone: [ self error: 'whut?' ] ]
|
||||||
|
ifFalse: [ lastNode := aNode ]
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarASText >> removeAttribute: att from: start to: stop [
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #editing }
|
||||||
|
GrafoscopioPillarASText >> replaceFrom: start to: stop with: aCollection [
|
||||||
|
" Here we should be managing insertion and adding of text. "
|
||||||
|
self assert: aCollection isEmpty.
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioPillarASText >> runs [
|
||||||
|
^ RunArray
|
||||||
|
new: self size
|
||||||
|
withAll: (Array with: (TextFontChange fontNumber: 1))
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioPillarASText >> size [
|
||||||
|
^ ast textSize
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioPillarASText >> string [
|
||||||
|
^ stringDecorator
|
||||||
|
]
|
@ -0,0 +1,43 @@
|
|||||||
|
Class {
|
||||||
|
#name : #GrafoscopioPillarASTextStringDecorator,
|
||||||
|
#superclass : #Object,
|
||||||
|
#instVars : [
|
||||||
|
'text'
|
||||||
|
],
|
||||||
|
#category : 'Grafoscopio-Pillar'
|
||||||
|
}
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioPillarASTextStringDecorator >> at: aNumber [
|
||||||
|
^ text at: aNumber
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioPillarASTextStringDecorator >> at: aNumber put: aChar [
|
||||||
|
self halt
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarASTextStringDecorator >> copyFrom: one to: two [
|
||||||
|
^ text copyFrom: one to: two
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarASTextStringDecorator >> isByteString [
|
||||||
|
^ true
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioPillarASTextStringDecorator >> notEmpty [
|
||||||
|
^ text notEmpty
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioPillarASTextStringDecorator >> size [
|
||||||
|
^ text size
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioPillarASTextStringDecorator >> text: aGFPText [
|
||||||
|
text := aGFPText
|
||||||
|
]
|
@ -0,0 +1,44 @@
|
|||||||
|
Class {
|
||||||
|
#name : #GrafoscopioPillarASTextStringProjectionDecorator,
|
||||||
|
#superclass : #GrafoscopioPillarASTextStringDecorator,
|
||||||
|
#instVars : [
|
||||||
|
'from',
|
||||||
|
'to'
|
||||||
|
],
|
||||||
|
#category : 'Grafoscopio-Pillar'
|
||||||
|
}
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarASTextStringProjectionDecorator >> allRangesOfSubstring: aString [
|
||||||
|
^ { }
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioPillarASTextStringProjectionDecorator >> at: anInteger [
|
||||||
|
from + anInteger > to ifTrue: [ ^ self error: ' out of bounds ' ].
|
||||||
|
^ super at: from + anInteger
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarASTextStringProjectionDecorator >> copyFrom: one to: two [
|
||||||
|
^ self class new
|
||||||
|
text: text;
|
||||||
|
from: from + one;
|
||||||
|
to: from + two;
|
||||||
|
yourself
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarASTextStringProjectionDecorator >> from: anInteger [
|
||||||
|
from := anInteger
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #accessing }
|
||||||
|
GrafoscopioPillarASTextStringProjectionDecorator >> size [
|
||||||
|
^ to - from
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarASTextStringProjectionDecorator >> to: anInteger [
|
||||||
|
to := anInteger
|
||||||
|
]
|
@ -0,0 +1,86 @@
|
|||||||
|
Class {
|
||||||
|
#name : #GrafoscopioPillarTextAnnotator,
|
||||||
|
#superclass : #PRVisitor,
|
||||||
|
#instVars : [
|
||||||
|
'texts',
|
||||||
|
'lastStop',
|
||||||
|
'stack'
|
||||||
|
],
|
||||||
|
#category : 'Grafoscopio-Pillar'
|
||||||
|
}
|
||||||
|
|
||||||
|
{ #category : #'visiting-document' }
|
||||||
|
GrafoscopioPillarTextAnnotator >> initialize [
|
||||||
|
super initialize.
|
||||||
|
texts := OrderedCollection new
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'visiting-document' }
|
||||||
|
GrafoscopioPillarTextAnnotator >> populateParentsOf: aSetOfParents [
|
||||||
|
|
||||||
|
| parents |
|
||||||
|
parents := Set new.
|
||||||
|
aSetOfParents do: [ : n |
|
||||||
|
parents add: n parent.
|
||||||
|
n parent propertyAt: #textStart ifAbsent: [
|
||||||
|
n parent propertyAt: #textStart put: (n parent children first propertyAt: #textStart).
|
||||||
|
n parent propertyAt: #textStop put: (n parent children last propertyAt: #textStop).
|
||||||
|
]
|
||||||
|
].
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'visiting-document' }
|
||||||
|
GrafoscopioPillarTextAnnotator >> visitCodeblock: aTextObject [
|
||||||
|
self visitText: aTextObject
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'visiting-document' }
|
||||||
|
GrafoscopioPillarTextAnnotator >> visitCommentedLine: aTextObject [
|
||||||
|
self visitText: aTextObject
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'visiting-document' }
|
||||||
|
GrafoscopioPillarTextAnnotator >> visitDocument: aDoc [
|
||||||
|
lastStop := 1 .
|
||||||
|
super visitDocument: aDoc.
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'visiting-document' }
|
||||||
|
GrafoscopioPillarTextAnnotator >> visitDocumentGroup: aGroup [
|
||||||
|
super visitDocumentGroup: aGroup.
|
||||||
|
"aGroup
|
||||||
|
propertyAt: #textStart
|
||||||
|
ifAbsent: [
|
||||||
|
aGroup hasChildren
|
||||||
|
ifTrue: [ aGroup
|
||||||
|
propertyAt: #textStart
|
||||||
|
put: (aGroup children first propertyAt: #textStart).
|
||||||
|
aGroup
|
||||||
|
propertyAt: #textStop
|
||||||
|
put: (aGroup children last propertyAt: #textStop) ]
|
||||||
|
ifFalse: [
|
||||||
|
aGroup propertyAt: #textStart put: 0 .
|
||||||
|
aGroup propertyAt: #textStop put: 0
|
||||||
|
]
|
||||||
|
]"
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'visiting-document' }
|
||||||
|
GrafoscopioPillarTextAnnotator >> visitLineBreak: anObject [
|
||||||
|
^ self visitText: anObject
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'visiting-document' }
|
||||||
|
GrafoscopioPillarTextAnnotator >> visitRaw: aTextObject [
|
||||||
|
self visitText: aTextObject
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'visiting-document' }
|
||||||
|
GrafoscopioPillarTextAnnotator >> visitText: aTextObject [
|
||||||
|
texts add: aTextObject.
|
||||||
|
aTextObject propertyAt: #textStart put: lastStop.
|
||||||
|
aTextObject propertyAt: #textStop put: lastStop + aTextObject text size - 1.
|
||||||
|
lastStop := lastStop + aTextObject text size.
|
||||||
|
|
||||||
|
]
|
97
repository/Grafoscopio/GrafoscopioPillarUIBuilder.class.st
Normal file
97
repository/Grafoscopio/GrafoscopioPillarUIBuilder.class.st
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
Class {
|
||||||
|
#name : #GrafoscopioPillarUIBuilder,
|
||||||
|
#superclass : #PRVisitor,
|
||||||
|
#instVars : [
|
||||||
|
'stack',
|
||||||
|
'document'
|
||||||
|
],
|
||||||
|
#category : 'Grafoscopio-Pillar'
|
||||||
|
}
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarUIBuilder class >> openExample [
|
||||||
|
^ self new
|
||||||
|
build: self pillarExample;
|
||||||
|
openWithSpec
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarUIBuilder class >> pillarExample [
|
||||||
|
^ PRPillarParser
|
||||||
|
parse:
|
||||||
|
'!! About Pillar
|
||||||
|
!!
|
||||||
|
Pillar is a system to manage documents (books, presentations, and web sites). From a common format, it is able to generate documents in multiple formats (html, markdown, latex, AsciiDoc).
|
||||||
|
It is composed of several modules such as importers, transformers, document model and outputers.
|
||||||
|
|
||||||
|
This book describes Pillar in its current version 7.0. Pillar is currently developed and masintained by Stéphane Ducasse and Guillermo Polito.
|
||||||
|
The original author of Pillar was Damien Cassou. Many people have also contributed to Pillar: Ben Coman, Guillermo Polito, Lukas Renggli (original author of the PierCMS from which a first version of Pillar has been extracted), Benjamin van Ryseghem, Cyril Ferlicot-Delbecque, Thibault Arloing, Yann Dubois, Quentin Ducasse and Asbathou Sama Biyalou. Special thanks to Asbathou Sama Biyalou!
|
||||||
|
|
||||||
|
This book adapts, extends, and clarifies the chapter explaining Pillar in the ''Enterprise Pharo: a Web Perspective'' book.
|
||||||
|
|
||||||
|
Pillar was sponsored by *ESUG>http://www.esug.org*.
|
||||||
|
|
||||||
|
!!!Introduction
|
||||||
|
Pillar (hosted at *http://github.com/pillar-markup*) is a markup language and associated tools to write and generate documentation, books (such as this one), web sites, and slide-based presentations. The Pillar screenshot in Figure *@voyageDocExample* shows the HTML version of chapter Voyage.
|
||||||
|
|
||||||
|
+An example Pillar output>file://figures/voyageDocExample-small.png|label=voyageDocExample|width=60+
|
||||||
|
|
||||||
|
Pillar has many features, helpful tools, and documentation:
|
||||||
|
- simple markup syntax with references, tables, pictures, captions, syntax-highlighted code blocks;
|
||||||
|
- export documents to HTML, LaTeX, Markdown, AsciiDoc, ePuB and Pillar itself, and presentations to Beamer and Deck.js;
|
||||||
|
%- customization of the export through a dedicated STON configuration file (see chapter Missing Chapter *@cha:ston*) and Mustache templates (see chapter *@templating*).
|
||||||
|
- many tests with good coverage (94% with more than a 2100 executed tests), which are regularly run by a *continuous integration job>https://ci.inria.fr/pharo-contribution/job/Pillar*
|
||||||
|
- a command-line interface and dedicated plugins for several text editors: *Emacs>https://github.com/pillar-markup/pillar-mode*, *Vim>https://github.com/cdlm/vim-pillar*, *TextMate>https://github.com/Uko/Pillar.tmbundle*, and *Atom>https://github.com/Uko/language-pillar*
|
||||||
|
- a cheat sheet (see Chapter *@chacheat*).
|
||||||
|
|
||||||
|
|
||||||
|
!!!Pillar users
|
||||||
|
@pillarUSERS
|
||||||
|
|
||||||
|
This book was written in Pillar itself. If you want to see how Pillar is used, have a look at its source code (*http://github.com/SquareBracketAssociates/Booklet-PublishingAPillarBooklet*), or check the following other real-world projects:
|
||||||
|
|
||||||
|
- the Updated Pharo by Example book (*https://github.com/SquareBracketAssociates/UpdatedPharoByExample*),
|
||||||
|
- the Pharo MOOC - Massive open online course (*https://github.com/SquareBracketAssociates/PharoMooc*,
|
||||||
|
- Any of the Pharo booklets (*https://github.com/SquareBracketAssociates/Booklet-XXXX*,
|
||||||
|
- the PillarHub open-access shared blog (*http://pillarhub.pharocloud.com*).
|
||||||
|
|
||||||
|
|
||||||
|
!!! Pillar future features
|
||||||
|
|
||||||
|
Pillar 70 saw some major refactorings and cleaning: it does not rely on Grease and Magritte anymore.
|
||||||
|
Its architecture is a lot cleaner.
|
||||||
|
|
||||||
|
Still some issues are missing. Here is a little list of features that we are working on or will soon:
|
||||||
|
|
||||||
|
- Incremental recompilation. Since we remove the use of make (so that Windows users can use Pillar) we should introduce a way to avoid to recompile complete book when just one chapter changed.
|
||||||
|
- Markdown syntax.
|
||||||
|
- Release of Ecstatic. Pillar supports the deployment of web sites named Ecstatic and we are working on a second version of Ecstatic.
|
||||||
|
- Better table support.
|
||||||
|
|
||||||
|
!!! Conclusion
|
||||||
|
Pillar is still in active development: maintainers keep improving its implementation. The current version of Pillar is Pillar 70. This booklet only documents Pillar 70. This booklet will be synchronised with future enhancements.'
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarUIBuilder >> build: aPRDocument [
|
||||||
|
stack := Stack new.
|
||||||
|
aPRDocument accept: self.
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarUIBuilder >> openWithSpec [
|
||||||
|
document openWithSpec.
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarUIBuilder >> visitDocument: aDocument [
|
||||||
|
document ifNotNil: [ self error: 'whut?' ].
|
||||||
|
document := SpTextPresenter new.
|
||||||
|
super visitDocument: aDocument
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'as yet unclassified' }
|
||||||
|
GrafoscopioPillarUIBuilder >> visitHeader: aHeader [
|
||||||
|
aHeader level
|
||||||
|
]
|
18
repository/Grafoscopio/GrafoscopioScrolledTextMorph.class.st
Normal file
18
repository/Grafoscopio/GrafoscopioScrolledTextMorph.class.st
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
Class {
|
||||||
|
#name : #GrafoscopioScrolledTextMorph,
|
||||||
|
#superclass : #RubScrolledTextMorph,
|
||||||
|
#instVars : [
|
||||||
|
'textAreaClass'
|
||||||
|
],
|
||||||
|
#category : 'Grafoscopio-Rub'
|
||||||
|
}
|
||||||
|
|
||||||
|
{ #category : #initialization }
|
||||||
|
GrafoscopioScrolledTextMorph >> textAreaClass [
|
||||||
|
^ textAreaClass ifNil: [ GrafoscopioEditingArea ]
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #initialization }
|
||||||
|
GrafoscopioScrolledTextMorph >> textAreaClass: aClass [
|
||||||
|
textAreaClass := aClass.
|
||||||
|
]
|
24
repository/Grafoscopio/PRDocumentItem.extension.st
Normal file
24
repository/Grafoscopio/PRDocumentItem.extension.st
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
Extension { #name : #PRDocumentItem }
|
||||||
|
|
||||||
|
{ #category : #'*Grafoscopio' }
|
||||||
|
PRDocumentItem >> textSize [
|
||||||
|
^ self textStop - self textStart
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'*Grafoscopio' }
|
||||||
|
PRDocumentItem >> textStart [
|
||||||
|
^ self
|
||||||
|
propertyAt: #textStart
|
||||||
|
ifAbsent: [ self hasChildren
|
||||||
|
ifTrue: [ self children first textStart ]
|
||||||
|
ifFalse: [ 0 ] ]
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #'*Grafoscopio' }
|
||||||
|
PRDocumentItem >> textStop [
|
||||||
|
^ self
|
||||||
|
propertyAt: #textStop
|
||||||
|
ifAbsent: [ self hasChildren
|
||||||
|
ifTrue: [ self children last textStop ]
|
||||||
|
ifFalse: [ 0 ] ]
|
||||||
|
]
|
11
repository/Grafoscopio/SpGrafoscopioTextPresenter.class.st
Normal file
11
repository/Grafoscopio/SpGrafoscopioTextPresenter.class.st
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
Class {
|
||||||
|
#name : #SpGrafoscopioTextPresenter,
|
||||||
|
#superclass : #SpTextPresenter,
|
||||||
|
#category : 'Grafoscopio-Rub'
|
||||||
|
}
|
||||||
|
|
||||||
|
{ #category : #specs }
|
||||||
|
SpGrafoscopioTextPresenter class >> adapterName [
|
||||||
|
|
||||||
|
^ #SpMorphicGrafoscopioTextAdapter
|
||||||
|
]
|
@ -0,0 +1,39 @@
|
|||||||
|
Class {
|
||||||
|
#name : #SpMorphicGrafoscopioTextAdapter,
|
||||||
|
#superclass : #SpMorphicTextAdapter,
|
||||||
|
#category : 'Grafoscopio-Rub'
|
||||||
|
}
|
||||||
|
|
||||||
|
{ #category : #factory }
|
||||||
|
SpMorphicGrafoscopioTextAdapter >> buildWidget [
|
||||||
|
| newWidget |
|
||||||
|
newWidget := (self widgetClass on: self)
|
||||||
|
getTextSelector: #getText;
|
||||||
|
setTextSelector: #accept:notifying:;
|
||||||
|
getSelectionSelector: #readSelection;
|
||||||
|
menuProvider: self selector: #codePaneMenu:shifted:;
|
||||||
|
setSelectionSelector: #setSelection:;
|
||||||
|
ghostText: self placeholder;
|
||||||
|
beWrapped;
|
||||||
|
enabled: self enabled;
|
||||||
|
askBeforeDiscardingEdits: self askBeforeDiscardingEdits;
|
||||||
|
autoAccept: self autoAccept;
|
||||||
|
vResizing: #spaceFill;
|
||||||
|
hResizing: #spaceFill;
|
||||||
|
setBalloonText: self help;
|
||||||
|
dragEnabled: self dragEnabled;
|
||||||
|
dropEnabled: self dropEnabled;
|
||||||
|
registerScrollChanges: #scrollValueChanged:;
|
||||||
|
yourself.
|
||||||
|
self setEditingModeFor: newWidget.
|
||||||
|
self presenter
|
||||||
|
whenTextChangedDo: [ :text | self setText: text to: newWidget ].
|
||||||
|
self presenter
|
||||||
|
whenPlaceholderChangedDo: [ :text | self setGhostText: text to: newWidget ].
|
||||||
|
^ newWidget
|
||||||
|
]
|
||||||
|
|
||||||
|
{ #category : #factory }
|
||||||
|
SpMorphicGrafoscopioTextAdapter >> widgetClass [
|
||||||
|
^ GrafoscopioScrolledTextMorph
|
||||||
|
]
|
Loading…
Reference in New Issue
Block a user