diff --git a/src/Grafoscopio/GfWorldMenu.class.st b/src/Grafoscopio/GfWorldMenu.class.st index d726954..28ee670 100644 --- a/src/Grafoscopio/GfWorldMenu.class.st +++ b/src/Grafoscopio/GfWorldMenu.class.st @@ -44,6 +44,7 @@ GfWorldMenu class >> helpMenuOn: aBuilder [ { #category : #'world menu' } GfWorldMenu class >> launchCompatibilityMenuOn: aBuilder [ + (aBuilder item: #'New notebook') label: 'New notebook'; order: 1; diff --git a/src/Grafoscopio/GrafoscopioAbstractText.class.st b/src/Grafoscopio/GrafoscopioAbstractText.class.st new file mode 100644 index 0000000..74c601b --- /dev/null +++ b/src/Grafoscopio/GrafoscopioAbstractText.class.st @@ -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 +] diff --git a/src/Grafoscopio/GrafoscopioComposer.class.st b/src/Grafoscopio/GrafoscopioComposer.class.st new file mode 100644 index 0000000..3f3be76 --- /dev/null +++ b/src/Grafoscopio/GrafoscopioComposer.class.st @@ -0,0 +1,5 @@ +Class { + #name : #GrafoscopioComposer, + #superclass : #Object, + #category : #'Grafoscopio-Rub' +} diff --git a/src/Grafoscopio/GrafoscopioEditingArea.class.st b/src/Grafoscopio/GrafoscopioEditingArea.class.st new file mode 100644 index 0000000..97975db --- /dev/null +++ b/src/Grafoscopio/GrafoscopioEditingArea.class.st @@ -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. + +] diff --git a/src/Grafoscopio/GrafoscopioParagraph.class.st b/src/Grafoscopio/GrafoscopioParagraph.class.st new file mode 100644 index 0000000..3184763 --- /dev/null +++ b/src/Grafoscopio/GrafoscopioParagraph.class.st @@ -0,0 +1,10 @@ +Class { + #name : #GrafoscopioParagraph, + #superclass : #RubParagraph, + #category : #'Grafoscopio-Rub' +} + +{ #category : #'accessing composer' } +GrafoscopioParagraph >> newComposer [ + ^ GrafoscopioComposer new +] diff --git a/src/Grafoscopio/GrafoscopioPillarASText.class.st b/src/Grafoscopio/GrafoscopioPillarASText.class.st new file mode 100644 index 0000000..36f315f --- /dev/null +++ b/src/Grafoscopio/GrafoscopioPillarASText.class.st @@ -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 +] diff --git a/src/Grafoscopio/GrafoscopioPillarASTextStringDecorator.class.st b/src/Grafoscopio/GrafoscopioPillarASTextStringDecorator.class.st new file mode 100644 index 0000000..63d8b2d --- /dev/null +++ b/src/Grafoscopio/GrafoscopioPillarASTextStringDecorator.class.st @@ -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 +] diff --git a/src/Grafoscopio/GrafoscopioPillarASTextStringProjectionDecorator.class.st b/src/Grafoscopio/GrafoscopioPillarASTextStringProjectionDecorator.class.st new file mode 100644 index 0000000..d7bf8e7 --- /dev/null +++ b/src/Grafoscopio/GrafoscopioPillarASTextStringProjectionDecorator.class.st @@ -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 +] diff --git a/src/Grafoscopio/GrafoscopioPillarTextAnnotator.class.st b/src/Grafoscopio/GrafoscopioPillarTextAnnotator.class.st new file mode 100644 index 0000000..49a1dcb --- /dev/null +++ b/src/Grafoscopio/GrafoscopioPillarTextAnnotator.class.st @@ -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. + +] diff --git a/src/Grafoscopio/GrafoscopioPillarUIBuilder.class.st b/src/Grafoscopio/GrafoscopioPillarUIBuilder.class.st new file mode 100644 index 0000000..d1ab183 --- /dev/null +++ b/src/Grafoscopio/GrafoscopioPillarUIBuilder.class.st @@ -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 +] diff --git a/src/Grafoscopio/GrafoscopioScrolledTextMorph.class.st b/src/Grafoscopio/GrafoscopioScrolledTextMorph.class.st new file mode 100644 index 0000000..dbee073 --- /dev/null +++ b/src/Grafoscopio/GrafoscopioScrolledTextMorph.class.st @@ -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. +] diff --git a/src/Grafoscopio/PRDocumentItem.extension.st b/src/Grafoscopio/PRDocumentItem.extension.st new file mode 100644 index 0000000..88947b4 --- /dev/null +++ b/src/Grafoscopio/PRDocumentItem.extension.st @@ -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 ] ] +] diff --git a/src/Grafoscopio/SpGrafoscopioTextPresenter.class.st b/src/Grafoscopio/SpGrafoscopioTextPresenter.class.st new file mode 100644 index 0000000..51c7ecf --- /dev/null +++ b/src/Grafoscopio/SpGrafoscopioTextPresenter.class.st @@ -0,0 +1,11 @@ +Class { + #name : #SpGrafoscopioTextPresenter, + #superclass : #SpTextPresenter, + #category : #'Grafoscopio-Rub' +} + +{ #category : #specs } +SpGrafoscopioTextPresenter class >> adapterName [ + + ^ #SpMorphicGrafoscopioTextAdapter +] diff --git a/src/Grafoscopio/SpMorphicGrafoscopioTextAdapter.class.st b/src/Grafoscopio/SpMorphicGrafoscopioTextAdapter.class.st new file mode 100644 index 0000000..e71a2dd --- /dev/null +++ b/src/Grafoscopio/SpMorphicGrafoscopioTextAdapter.class.st @@ -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 +]