diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 990b3503..d3417841 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -135,11 +135,18 @@ jobs: run: mv SBE.pdf SBE-${{ matrix.smalltalk }}.pdf env: SQUEAK_VERSION: ${{ matrix.smalltalk }} - - name: 💾 Upload artifact + - name: 💾 Upload PDF uses: actions/upload-artifact@master with: name: book-${{ matrix.smalltalk }} path: SBE-${{ matrix.smalltalk }}.pdf + - name: 💾 Upload figures (for debugging and local builds) + # run even if figures failed but only when it has run + if: steps.figures.outcome == 'success' || steps.figures.outcome == 'failure' + uses: actions/upload-artifact@master + with: + name: figures-${{ matrix.smalltalk }} + path: ./*/**/*.png - if: (steps.figures.outcome == 'failure') name: Check DEBUG_FIGURES run: | diff --git a/.squot b/.squot index ba191ad5..6086a2a0 100644 --- a/.squot +++ b/.squot @@ -8,5 +8,8 @@ OrderedDictionary { 'SmalltalkSources/SBE-Extract.package' : #SquotCypressCodeSerializer, 'SmalltalkSources/BaselineOfSBE.package' : #SquotCypressCodeSerializer, 'SmalltalkSources/SBE-Monticello.package' : #SquotCypressCodeSerializer, - 'SmalltalkSources/SBE-Tests.package' : #SquotCypressCodeSerializer + 'SmalltalkSources/SBE-Tests.package' : #SquotCypressCodeSerializer, + 'SmalltalkSources/SBE-Book.package' : #SquotCypressCodeSerializer, + 'SmalltalkSources/SBE-ExtractBook.package' : #SquotCypressCodeSerializer, + 'SmalltalkSources/SBE-BookCompatibility-Squeak60.package' : #SquotCypressCodeSerializer } \ No newline at end of file diff --git a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/baseline..st b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/baseline..st index 6cbe4592..be1a3019 100644 --- a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/baseline..st +++ b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/baseline..st @@ -5,9 +5,15 @@ baseline: spec spec baseline: 'FileSystem' with: [spec repository: 'github://squeak-smalltalk/squeak-filesystem:master/src'; loads: #('default' 'tests')]. + spec baseline: 'SBTreeSitter' with: [spec + repository: 'github://hpi-swa-lab/sb-tree-sitter:master/packages'; + loads: 'Sandblocks-TreeSitter']. spec + package: #'SBE-Book'; package: #'SBE-Environment'; package: #'SBE-Extract' with: [spec requires: #('FileSystem')]; + package: #'SBE-ExtractBook' with: [ + spec requires: #(#'SBE-Book' 'FileSystem' 'SBTreeSitter')]; package: #'SBE-Monticello'; package: #'SBE-Morphic'; package: #'SBE-Quinto'; @@ -24,4 +30,9 @@ baseline: spec #'SBE-QuickTour' #'SBE-Streams' #'SBE-Testing' - #'SBE-Tests')]. \ No newline at end of file + #'SBE-Tests')]. + + spec for: #(#'squeak6.0.x.release') do: [ + spec package: #'SBE-BookCompatibility-Squeak60'. + spec package: #'SBE-Book' with: [ + spec includes: #'SBE-BookCompatibility-Squeak60']]. \ No newline at end of file diff --git a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/customProjectAttributes.st b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/customProjectAttributes.st new file mode 100644 index 00000000..aa150bbe --- /dev/null +++ b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/customProjectAttributes.st @@ -0,0 +1,12 @@ +accessing +customProjectAttributes + + | attributes | + attributes := super customProjectAttributes. + (Smalltalk classNamed: #SystemVersion) ifNotNil: [:versionClass | + versionClass current isRelease ifTrue: + [attributes := attributes , + (MetacelloPlatform current defaultPlatformAttributes + select: [:ea | ea matchesRegex: 'squeak\d.*'] + thenCollect: [:ea | ea , '.release'])]]. + ^ attributes \ No newline at end of file diff --git a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/projectClass.st b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/projectClass.st new file mode 100644 index 00000000..300076fc --- /dev/null +++ b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/projectClass.st @@ -0,0 +1,4 @@ +accessing +projectClass + + ^ (self environment classNamed: #MetacelloCypressBaselineProject) ifNil: [super projectClass] \ No newline at end of file diff --git a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json index d1bd2318..30c149b7 100644 --- a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json +++ b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json @@ -2,4 +2,6 @@ "class" : { }, "instance" : { - "baseline:" : "ct 4/26/2021 18:32" } } + "baseline:" : "ct 11/21/2023 21:15", + "customProjectAttributes" : "ct 11/7/2023 12:22", + "projectClass" : "ct 11/21/2023 19:54" } } diff --git a/SmalltalkSources/SBE-Book.package/.filetree b/SmalltalkSources/SBE-Book.package/.filetree new file mode 100644 index 00000000..8998102c --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/.filetree @@ -0,0 +1,4 @@ +{ + "noMethodMetaData" : true, + "separateMethodMetaAndSource" : false, + "useCypressPropertiesFile" : true } diff --git a/SmalltalkSources/SBE-Book.package/.squot-contents b/SmalltalkSources/SBE-Book.package/.squot-contents new file mode 100644 index 00000000..3aca9928 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/.squot-contents @@ -0,0 +1,6 @@ +SquotTrackedObjectMetadata { + #objectClassName : #PackageInfo, + #id : UUID [ '6332283563594a83a7e250aeafb5702d' ], + #objectsReplacedByNames : true, + #serializer : #SquotCypressCodeSerializer +} \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/Form.extension/instance/asSbeTextAnchor.st b/SmalltalkSources/SBE-Book.package/Form.extension/instance/asSbeTextAnchor.st new file mode 100644 index 00000000..a2ca3579 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Form.extension/instance/asSbeTextAnchor.st @@ -0,0 +1,5 @@ +*SBE-Book-converting +asSbeTextAnchor + + ^ SBETextAnchor new + copySameFrom: self asTextAnchor \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/Form.extension/instance/asSbeTextAnchorWithExtent..st b/SmalltalkSources/SBE-Book.package/Form.extension/instance/asSbeTextAnchorWithExtent..st new file mode 100644 index 00000000..1cbc347d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Form.extension/instance/asSbeTextAnchorWithExtent..st @@ -0,0 +1,6 @@ +*SBE-Book-converting +asSbeTextAnchorWithExtent: extent + + ^ self asSbeTextAnchor + extent: extent; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/Form.extension/instance/asSbeTextAnchorWithExtent.dyeMode..st b/SmalltalkSources/SBE-Book.package/Form.extension/instance/asSbeTextAnchorWithExtent.dyeMode..st new file mode 100644 index 00000000..a4af5198 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Form.extension/instance/asSbeTextAnchorWithExtent.dyeMode..st @@ -0,0 +1,6 @@ +*SBE-Book-converting +asSbeTextAnchorWithExtent: extent dyeMode: dyeMode + + ^ (self asSbeTextAnchorWithExtent: extent) + dyeMode: dyeMode; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/Form.extension/methodProperties.json b/SmalltalkSources/SBE-Book.package/Form.extension/methodProperties.json new file mode 100644 index 00000000..f71dc4ee --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Form.extension/methodProperties.json @@ -0,0 +1,7 @@ +{ + "class" : { + }, + "instance" : { + "asSbeTextAnchor" : "ct 11/15/2023 19:38", + "asSbeTextAnchorWithExtent:" : "ct 11/21/2023 18:00", + "asSbeTextAnchorWithExtent:dyeMode:" : "ct 11/21/2023 18:16" } } diff --git a/SmalltalkSources/SBE-Book.package/Form.extension/properties.json b/SmalltalkSources/SBE-Book.package/Form.extension/properties.json new file mode 100644 index 00000000..d9aa5a59 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Form.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "Form" } diff --git a/SmalltalkSources/SBE-Book.package/Object.extension/instance/sbeStoreHtmlString.st b/SmalltalkSources/SBE-Book.package/Object.extension/instance/sbeStoreHtmlString.st new file mode 100644 index 00000000..1d2f3541 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Object.extension/instance/sbeStoreHtmlString.st @@ -0,0 +1,4 @@ +*SBE-Book-converting +sbeStoreHtmlString + + ^ self fullPrintString \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/Object.extension/methodProperties.json b/SmalltalkSources/SBE-Book.package/Object.extension/methodProperties.json new file mode 100644 index 00000000..050533cf --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Object.extension/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "sbeStoreHtmlString" : "ct 11/15/2023 20:14" } } diff --git a/SmalltalkSources/SBE-Book.package/Object.extension/properties.json b/SmalltalkSources/SBE-Book.package/Object.extension/properties.json new file mode 100644 index 00000000..3d3b9ec4 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Object.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "Object" } diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/README.md b/SmalltalkSources/SBE-Book.package/SBEBook.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/bookIndex..st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/bookIndex..st new file mode 100644 index 00000000..617e1f92 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/bookIndex..st @@ -0,0 +1,4 @@ +accessing +bookIndex: aBookIndex + + bookIndex := aBookIndex. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/bookIndex.st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/bookIndex.st new file mode 100644 index 00000000..613fb27d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/bookIndex.st @@ -0,0 +1,4 @@ +accessing +bookIndex + + ^ bookIndex \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/canonicalHierarchyOrder.st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/canonicalHierarchyOrder.st new file mode 100644 index 00000000..bdddeb3d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/canonicalHierarchyOrder.st @@ -0,0 +1,4 @@ +accessing +canonicalHierarchyOrder + + ^ 0 \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/fixUpImages.st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/fixUpImages.st new file mode 100644 index 00000000..c0ded9b8 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/fixUpImages.st @@ -0,0 +1,20 @@ +as yet unclassified +fixUpImages + "Reduce memory consumption of the book from 900 MB to 500 MB." + + self flag: #workaround. "Whoah! We should really read, preferably even store this efficiently! Currently, each image is stored twice - 400 MB redundant ..." + self fullText runs withStartStopAndValueDo: [:start :stop :attrs | + attrs do: [:attr | + (attr isKindOf: SBETextOpenImageAction) ifTrue: + [attrs + detect: [:othr | othr isKindOf: SBETextAnchor] + ifFound: [:othr | + "a) Eliminate duplicate images" + self assert: othr image bits = attr image bits. + "othr image becomeForward: attr image" + attr image: nil "see SBETextOpenImageAction>>#imageIn:at:". + + "b) Compress images" + othr compressImage "assumption: every problematically large image is clickable"] + ifNone: [self error]]]. + false]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index..st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index..st new file mode 100644 index 00000000..bebd1a17 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index..st @@ -0,0 +1,4 @@ +accessing +index: anInteger + + self assert: anInteger isNil. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index.st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index.st new file mode 100644 index 00000000..c9e74cd3 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index.st @@ -0,0 +1,4 @@ +accessing +index + + ^ nil \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/pdfUrl..st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/pdfUrl..st new file mode 100644 index 00000000..7c25fdce --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/pdfUrl..st @@ -0,0 +1,4 @@ +accessing +pdfUrl: aUrl + + pdfUrl := aUrl asUrl. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/pdfUrl.st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/pdfUrl.st new file mode 100644 index 00000000..0ad45230 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/pdfUrl.st @@ -0,0 +1,4 @@ +accessing +pdfUrl + + ^ pdfUrl \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/pdfUrlFragment.st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/pdfUrlFragment.st new file mode 100644 index 00000000..7ac2dd33 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/pdfUrlFragment.st @@ -0,0 +1,4 @@ +accessing +pdfUrlFragment + + ^ nil \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/storeOn..st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/storeOn..st new file mode 100644 index 00000000..cd469c45 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/storeOn..st @@ -0,0 +1,11 @@ +converting +storeOn: aStream + + aStream nextPutAll: +('({1} + pdfUrl: {2}; + bookIndex: {3}; + yourself)' format: + {String streamContents: [:stream | super storeOn: stream]. + self pdfUrl storeString. + self bookIndex storeString}) \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/textForHelp.st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/textForHelp.st new file mode 100644 index 00000000..4e113781 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/textForHelp.st @@ -0,0 +1,11 @@ +converting +textForHelp + + | helpText index | + helpText := super textForHelp. + + self flag: #hacked. "There is too much ill-parsed nonsense before the actual title right now." + index := helpText findString: self title. + index = 0 ifTrue: [^ helpText]. + + ^ (helpText allButFirst: index + self title size) withBlanksTrimmed \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/type.st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/type.st new file mode 100644 index 00000000..0bf2cd20 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/type.st @@ -0,0 +1,4 @@ +accessing +type + + ^ #book \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBook.class/methodProperties.json new file mode 100644 index 00000000..2f9de4d9 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/methodProperties.json @@ -0,0 +1,16 @@ +{ + "class" : { + }, + "instance" : { + "bookIndex" : "ct 11/26/2023 18:00", + "bookIndex:" : "ct 11/26/2023 18:00", + "canonicalHierarchyOrder" : "ct 11/8/2023 22:38", + "fixUpImages" : "ct 10/6/2025 00:58", + "index" : "ct 11/25/2023 23:09", + "index:" : "ct 11/25/2023 23:09", + "pdfUrl" : "ct 11/24/2023 18:38", + "pdfUrl:" : "ct 11/24/2023 18:38", + "pdfUrlFragment" : "ct 11/24/2023 18:30", + "storeOn:" : "ct 11/26/2023 18:01", + "textForHelp" : "ct 11/26/2023 18:53", + "type" : "ct 11/25/2023 19:50" } } diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/properties.json b/SmalltalkSources/SBE-Book.package/SBEBook.class/properties.json new file mode 100644 index 00000000..d2c803ec --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/properties.json @@ -0,0 +1,15 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "pdfUrl", + "bookIndex" ], + "name" : "SBEBook", + "pools" : [ + ], + "super" : "SBEBookNode", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/README.md b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/instance/canonicalHierarchyOrder.st b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/instance/canonicalHierarchyOrder.st new file mode 100644 index 00000000..95e56938 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/instance/canonicalHierarchyOrder.st @@ -0,0 +1,4 @@ +accessing +canonicalHierarchyOrder + + ^ 2 \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/instance/pdfUrlFragment.st b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/instance/pdfUrlFragment.st new file mode 100644 index 00000000..c656d37d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/instance/pdfUrlFragment.st @@ -0,0 +1,5 @@ +accessing +pdfUrlFragment + + ^ '{1}.{2}' format: + {self typeName. self index} \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/instance/type.st b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/instance/type.st new file mode 100644 index 00000000..ed60f963 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/instance/type.st @@ -0,0 +1,4 @@ +accessing +type + + ^ #chapter \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/methodProperties.json new file mode 100644 index 00000000..9a61cc9b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/methodProperties.json @@ -0,0 +1,7 @@ +{ + "class" : { + }, + "instance" : { + "canonicalHierarchyOrder" : "ct 11/8/2023 22:38", + "pdfUrlFragment" : "ct 11/25/2023 19:52", + "type" : "ct 11/25/2023 19:50" } } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/properties.json b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/properties.json new file mode 100644 index 00000000..d9f8b926 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + ], + "name" : "SBEBookChapter", + "pools" : [ + ], + "super" : "SBEBookNode", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/README.md b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/class/on..st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/class/on..st new file mode 100644 index 00000000..4fb1c0f0 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/class/on..st @@ -0,0 +1,6 @@ +instance creation +on: aBookNode + + ^ self new + bookNode: aBookNode; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/allInvalidLinks.st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/allInvalidLinks.st new file mode 100644 index 00000000..4cf3379f --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/allInvalidLinks.st @@ -0,0 +1,5 @@ +debugging +allInvalidLinks + + ^ self invalidLinks , + (self subtopics gather: [:topic | topic allInvalidLinks]) \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/book.st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/book.st new file mode 100644 index 00000000..a5911ebb --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/book.st @@ -0,0 +1,4 @@ +accessing +book + + ^ self bookNode book \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/bookNode..st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/bookNode..st new file mode 100644 index 00000000..a80ed728 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/bookNode..st @@ -0,0 +1,4 @@ +accessing +bookNode: aBookNode + + bookNode := aBookNode. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/bookNode.st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/bookNode.st new file mode 100644 index 00000000..b232beff --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/bookNode.st @@ -0,0 +1,4 @@ +accessing +bookNode + + ^ bookNode \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/contents.st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/contents.st new file mode 100644 index 00000000..16cb15ba --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/contents.st @@ -0,0 +1,4 @@ +accessing +contents + + ^ self bookNode fullTextForHelp \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/invalidLinks.st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/invalidLinks.st new file mode 100644 index 00000000..c86257da --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/invalidLinks.st @@ -0,0 +1,8 @@ +debugging +invalidLinks + + ^ ((self bookNode text ifNil: [^ #()]) sbeAllAttributes + select: [:attr | attr isKindOf: SBETextLabelLink] + thenCollect: [:attr | attr label]) + withoutDuplicates + select: [:label | (self book pathToLabel: label) isNil] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/key..st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/key..st new file mode 100644 index 00000000..57fc9c42 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/key..st @@ -0,0 +1,3 @@ +accessing +key: anObject + "ignore - compatibility for subtopics of ClassBasedHelpTopic" \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/key.st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/key.st new file mode 100644 index 00000000..ed85df1c --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/key.st @@ -0,0 +1,4 @@ +accessing +key + + ^ self title \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/openInPDF.st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/openInPDF.st new file mode 100644 index 00000000..cf97de1f --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/openInPDF.st @@ -0,0 +1,4 @@ +tools +openInPDF + + ^ self bookNode openInPDF \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/shouldStyle.st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/shouldStyle.st new file mode 100644 index 00000000..b67c5d20 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/shouldStyle.st @@ -0,0 +1,4 @@ +testing +shouldStyle + + ^ false \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/subtopics.st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/subtopics.st new file mode 100644 index 00000000..d2cb5c7c --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/subtopics.st @@ -0,0 +1,9 @@ +accessing +subtopics + + ^ subtopics ifNil: [subtopics := + self bookNode childrenForHelp + withIndexCollect: [:child :index | + child asHelpTopic + priority: index; + yourself]] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/title.st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/title.st new file mode 100644 index 00000000..5ab4474b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/title.st @@ -0,0 +1,4 @@ +accessing +title + + ^ self bookNode title asString \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/topicMenu.parentTopic..st b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/topicMenu.parentTopic..st new file mode 100644 index 00000000..4be84619 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/topicMenu.parentTopic..st @@ -0,0 +1,7 @@ +menus +topicMenu: aMenu parentTopic: parentTopic + + aMenu add: 'open in PDF' target: self selector: #openInPDF. + aMenu addLine. + + ^ super topicMenu: aMenu parentTopic: parentTopic \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/methodProperties.json new file mode 100644 index 00000000..c1206021 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/methodProperties.json @@ -0,0 +1,17 @@ +{ + "class" : { + "on:" : "ct 11/9/2023 21:39" }, + "instance" : { + "allInvalidLinks" : "ct 11/26/2023 20:14", + "book" : "ct 11/15/2023 19:51", + "bookNode" : "ct 11/9/2023 21:37", + "bookNode:" : "ct 11/9/2023 21:37", + "contents" : "ct 11/9/2023 22:36", + "invalidLinks" : "ct 11/26/2023 20:15", + "key" : "ct 11/9/2023 21:47", + "key:" : "ct 11/15/2023 17:38", + "openInPDF" : "ct 11/24/2023 18:25", + "shouldStyle" : "ct 11/15/2023 17:39", + "subtopics" : "ct 11/10/2023 01:44", + "title" : "ct 11/9/2023 21:47", + "topicMenu:parentTopic:" : "ct 11/24/2023 18:25" } } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/properties.json b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/properties.json new file mode 100644 index 00000000..5f4b1360 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/properties.json @@ -0,0 +1,15 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "bookNode", + "subtopics" ], + "name" : "SBEBookHelpTopic", + "pools" : [ + ], + "super" : "AbstractHelpTopic", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/README.md b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/readFromFile.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/readFromFile.st new file mode 100644 index 00000000..c5b35bbf --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/readFromFile.st @@ -0,0 +1,8 @@ +documentation +readFromFile + + | book | + book := FileStream readOnlyFileNamed: 'sbe.sbebook' do: [:stream | + SBEBook readFrom: stream]. + self assert: book asHelpTopic allInvalidLinks isEmpty. + book inspect. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/storeToFile.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/storeToFile.st new file mode 100644 index 00000000..d8278177 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/storeToFile.st @@ -0,0 +1,9 @@ +documentation +storeToFile + + | original store | + original := SBEHelp book. + store := original storeString. + + (FileSystem disk workingDirectory / 'sbe.sbebook') writeStreamDo: [:stream | + stream nextPutAll: store]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/testStoring.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/testStoring.st new file mode 100644 index 00000000..7e500704 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/testStoring.st @@ -0,0 +1,13 @@ +documentation +testStoring + + | original store restored originalText restoredText | + original := SBEHelp book. + store := original storeString. + restored := SBEBook readFrom: store. + + originalText := original fullText. + restoredText := restored fullText. + + self assert: originalText asString = restoredText asString. + self assert: originalText runs = restoredText runs description: 'known issue'. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/addChild..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/addChild..st new file mode 100644 index 00000000..a2638d12 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/addChild..st @@ -0,0 +1,7 @@ +accessing +addChild: aBookNode + + ^ self children addLast: + (aBookNode + parent: self; + yourself) \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/addChildren..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/addChildren..st new file mode 100644 index 00000000..a21b2a1d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/addChildren..st @@ -0,0 +1,5 @@ +accessing +addChildren: anOrderedCollection + + anOrderedCollection do: [:ea | + self addChild: ea]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/addExtraLabels..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/addExtraLabels..st new file mode 100644 index 00000000..d6ddeb9b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/addExtraLabels..st @@ -0,0 +1,4 @@ +accessing +addExtraLabels: labels + + extraLabels addAll: labels. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/anchorLabels.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/anchorLabels.st new file mode 100644 index 00000000..4c587d95 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/anchorLabels.st @@ -0,0 +1,9 @@ +accessing +anchorLabels + + self text ifNil: [^ #()]. + ^ cachedAnchorLabels ifNil: [cachedAnchorLabels := + (self text sbeAllAttributes + select: [:attr | attr isKindOf: SBETextLabelAnchor] + thenCollect: [:attr | attr label]) + withoutDuplicates] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/asHelpTopic.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/asHelpTopic.st new file mode 100644 index 00000000..ac8b8303 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/asHelpTopic.st @@ -0,0 +1,4 @@ +converting +asHelpTopic + + ^ SBEBookHelpTopic on: self \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/book.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/book.st new file mode 100644 index 00000000..ba5e0ae6 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/book.st @@ -0,0 +1,4 @@ +accessing +book + + ^ (self parent ifNil: [^ self]) book \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/canonicalHierarchyOrder.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/canonicalHierarchyOrder.st new file mode 100644 index 00000000..cb90097e --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/canonicalHierarchyOrder.st @@ -0,0 +1,4 @@ +accessing +canonicalHierarchyOrder + + ^ self subclassResponsibility \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/children..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/children..st new file mode 100644 index 00000000..8bcf8296 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/children..st @@ -0,0 +1,4 @@ +accessing +children: anOrderedCollection + + children := anOrderedCollection. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/children.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/children.st new file mode 100644 index 00000000..a4017eb2 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/children.st @@ -0,0 +1,4 @@ +accessing +children + + ^ children \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/childrenForHelp.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/childrenForHelp.st new file mode 100644 index 00000000..eda5e66c --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/childrenForHelp.st @@ -0,0 +1,5 @@ +converting +childrenForHelp + + self isHelpLeaf ifTrue: [^ #()]. + ^ self children select: [:ea | ea wantsOwnHelpTopic] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/extraLabels..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/extraLabels..st new file mode 100644 index 00000000..899a7225 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/extraLabels..st @@ -0,0 +1,4 @@ +accessing +extraLabels: aCollection + + extraLabels := aCollection. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/extraLabels.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/extraLabels.st new file mode 100644 index 00000000..b4aef5cf --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/extraLabels.st @@ -0,0 +1,4 @@ +accessing +extraLabels + + ^ extraLabels \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/fullText.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/fullText.st new file mode 100644 index 00000000..4e77b7a5 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/fullText.st @@ -0,0 +1,13 @@ +converting +fullText + + ^ Text streamContents: [:stream | + stream withAttribute: TextEmphasis bold do: + [stream nextPutAll: self title]. + self text ifNotNil: [:text | + stream nextPutAll: self titleSeparatorForHelp. + stream nextPutAll: text]. + self children do: [:ea | + ea fullText ifNotNil: [:childText | + stream cr; cr. + stream nextPutAll: childText]]] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/fullTextForHelp.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/fullTextForHelp.st new file mode 100644 index 00000000..258b0451 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/fullTextForHelp.st @@ -0,0 +1,12 @@ +converting +fullTextForHelp + + | helpText | + helpText := self textForHelp. + helpText isEmptyOrNil ifTrue: [^ helpText]. + + ^ Text streamContents: [:stream | + stream withAttribute: TextEmphasis bold do: + [stream nextPutAll: self title]. + stream nextPutAll: self titleSeparatorForHelp. + stream nextPutAll: helpText] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/hasAnyStarIndex.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/hasAnyStarIndex.st new file mode 100644 index 00000000..d38f701b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/hasAnyStarIndex.st @@ -0,0 +1,5 @@ +testing +hasAnyStarIndex + + ^ self hasStarIndex or: + [self parent notNil and: [self parent hasAnyStarIndex]] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/hasStarIndex..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/hasStarIndex..st new file mode 100644 index 00000000..7ea07930 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/hasStarIndex..st @@ -0,0 +1,4 @@ +accessing +hasStarIndex: aBoolean + + hasStarIndex := aBoolean. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/hasStarIndex.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/hasStarIndex.st new file mode 100644 index 00000000..55a03da4 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/hasStarIndex.st @@ -0,0 +1,4 @@ +accessing +hasStarIndex + + ^ hasStarIndex \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/index..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/index..st new file mode 100644 index 00000000..9cb869ff --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/index..st @@ -0,0 +1,4 @@ +accessing +index: anInteger + + index := anInteger. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/index.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/index.st new file mode 100644 index 00000000..8a4e002b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/index.st @@ -0,0 +1,4 @@ +accessing +index + + ^ index \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/initialize.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/initialize.st new file mode 100644 index 00000000..bc34e04b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/initialize.st @@ -0,0 +1,8 @@ +initialize-release +initialize + + super initialize. + + self children: OrderedCollection new. + extraLabels := OrderedCollection new. + hasStarIndex := false. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/isBookChunk.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/isBookChunk.st new file mode 100644 index 00000000..e7e2989c --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/isBookChunk.st @@ -0,0 +1,4 @@ +testing +isBookChunk + + ^ false \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/isHelpLeaf.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/isHelpLeaf.st new file mode 100644 index 00000000..894c0093 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/isHelpLeaf.st @@ -0,0 +1,4 @@ +testing +isHelpLeaf + + ^ false \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/labels.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/labels.st new file mode 100644 index 00000000..e74ac282 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/labels.st @@ -0,0 +1,4 @@ +accessing +labels + + ^ self extraLabels , self anchorLabels \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/mayContain..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/mayContain..st new file mode 100644 index 00000000..52745936 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/mayContain..st @@ -0,0 +1,4 @@ +testing +mayContain: aBookNode + + ^ aBookNode canonicalHierarchyOrder > self canonicalHierarchyOrder \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/openInPDF.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/openInPDF.st new file mode 100644 index 00000000..13a7af83 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/openInPDF.st @@ -0,0 +1,9 @@ +actions +openInPDF + + | url | + url := self pdfUrl asString. + url := url asText + addAttribute: (TextURL url: url); + yourself. + ^ url editWithLabel: ('PDF URL of {1}' format: {self title}) \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parent..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parent..st new file mode 100644 index 00000000..d39fb1cd --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parent..st @@ -0,0 +1,4 @@ +accessing +parent: aBookNode + + parent := aBookNode. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parent.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parent.st new file mode 100644 index 00000000..5f7789b5 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parent.st @@ -0,0 +1,4 @@ +accessing +parent + + ^ parent \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parseNode..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parseNode..st new file mode 100644 index 00000000..23722102 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parseNode..st @@ -0,0 +1,5 @@ +accessing +parseNode: aDCBlock + "For debugging only." + + parseNode := aDCBlock. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parseNode.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parseNode.st new file mode 100644 index 00000000..aac83bdf --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parseNode.st @@ -0,0 +1,5 @@ +accessing +parseNode + "For debugging only." + + ^ parseNode \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/pathToLabel..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/pathToLabel..st new file mode 100644 index 00000000..d43e98d3 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/pathToLabel..st @@ -0,0 +1,8 @@ +accessing +pathToLabel: key + + (self labels includes: key) ifTrue: [^ {self}]. + self children do: [:ea | + (ea pathToLabel: key) ifNotNil: [:path | + ^ path copyWithFirst: self]]. + ^ nil \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/pdfUrl.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/pdfUrl.st new file mode 100644 index 00000000..250eab5a --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/pdfUrl.st @@ -0,0 +1,6 @@ +accessing +pdfUrl + + | fragment | + fragment := self pdfUrlFragment ifNil: [^ self parent pdfUrl]. + ^ self book pdfUrl withFragment: fragment \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/pdfUrlFragment.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/pdfUrlFragment.st new file mode 100644 index 00000000..ffe98ad8 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/pdfUrlFragment.st @@ -0,0 +1,4 @@ +accessing +pdfUrlFragment + + ^ self subclassResponsibility \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/printOn..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/printOn..st new file mode 100644 index 00000000..2e58fe1f --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/printOn..st @@ -0,0 +1,10 @@ +printing +printOn: aStream + + super printOn: aStream. + + self title ifNotNil: + [aStream + nextPut: $<; + nextPutAll: self title; + nextPut: $>]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/storeOn..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/storeOn..st new file mode 100644 index 00000000..e12b007b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/storeOn..st @@ -0,0 +1,21 @@ +converting +storeOn: aStream + + aStream nextPutAll: +('({1} new + title: {2}; + addChildren: {3}; + text: {4}; + index: {5}; + hasStarIndex: {6}; + extraLabels: {7}; + typeName: {8}; + yourself)' format: + {self class name. + self title sbeStoreHtmlString. + self children storeString. + self text sbeStoreHtmlString. + self index storeString. + self hasStarIndex storeString. + self extraLabels storeString. + self typeName storeString}) \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/text..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/text..st new file mode 100644 index 00000000..2b637942 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/text..st @@ -0,0 +1,5 @@ +accessing +text: aStringOrText + + text := aStringOrText. + cachedAnchorLabels := nil. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/text.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/text.st new file mode 100644 index 00000000..c9bb3630 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/text.st @@ -0,0 +1,4 @@ +accessing +text + + ^ text \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/textForHelp.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/textForHelp.st new file mode 100644 index 00000000..165dd49a --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/textForHelp.st @@ -0,0 +1,17 @@ +converting +textForHelp + + | texts | + texts := {self text}. + (self children allSatisfy: [:child | child wantsOwnHelpTopic]) ifFalse: + [texts := texts , + (self children + select: [:child | child isHelpLeaf] + thenCollect: [:child | child fullTextForHelp])]. + texts := texts reject: [:ea | ea isEmptyOrNil]. + texts ifEmpty: [^ nil]. + + ^ Text streamContents: [:stream | + texts + do: [:ea | stream nextPutAll: ea] + separatedBy: [stream cr; cr]] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/title..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/title..st new file mode 100644 index 00000000..2a0534d8 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/title..st @@ -0,0 +1,4 @@ +accessing +title: aStringOrText + + title := aStringOrText. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/title.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/title.st new file mode 100644 index 00000000..3c1da9ab --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/title.st @@ -0,0 +1,4 @@ +accessing +title + + ^ title \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/titleSeparatorForHelp.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/titleSeparatorForHelp.st new file mode 100644 index 00000000..146a2d73 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/titleSeparatorForHelp.st @@ -0,0 +1,4 @@ +converting +titleSeparatorForHelp + + ^ String cr , String cr \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/type.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/type.st new file mode 100644 index 00000000..5d2b41c1 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/type.st @@ -0,0 +1,4 @@ +accessing +type + + ^ self subclassResponsibility \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/typeName..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/typeName..st new file mode 100644 index 00000000..58c4be54 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/typeName..st @@ -0,0 +1,4 @@ +accessing +typeName: aString + + typeName := aString. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/typeName.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/typeName.st new file mode 100644 index 00000000..49183fe0 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/typeName.st @@ -0,0 +1,6 @@ +accessing +typeName + + ^ typeName ifNil: + [self type + , (self hasAnyStarIndex ifTrue: ['*'] ifFalse: [''])] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/updateStarIndexes.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/updateStarIndexes.st new file mode 100644 index 00000000..94771fce --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/updateStarIndexes.st @@ -0,0 +1,8 @@ +accessing +updateStarIndexes + + | highestOrder | + highestOrder := (self children collect: [:child | child canonicalHierarchyOrder]) min. + self children + do: [:child | + child hasStarIndex: child canonicalHierarchyOrder > highestOrder]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/wantsOwnHelpTopic.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/wantsOwnHelpTopic.st new file mode 100644 index 00000000..e80ab363 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/wantsOwnHelpTopic.st @@ -0,0 +1,4 @@ +testing +wantsOwnHelpTopic + + ^ true \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json new file mode 100644 index 00000000..cb332418 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json @@ -0,0 +1,51 @@ +{ + "class" : { + "readFromFile" : "ct 11/26/2023 20:29", + "storeToFile" : "ct 11/21/2023 17:46", + "testStoring" : "ct 11/21/2023 14:54" }, + "instance" : { + "addChild:" : "ct 11/15/2023 19:51", + "addChildren:" : "ct 11/15/2023 20:16", + "addExtraLabels:" : "ct 11/13/2023 21:27", + "anchorLabels" : "ct 11/26/2023 18:42", + "asHelpTopic" : "ct 11/9/2023 21:41", + "book" : "ct 11/15/2023 19:51", + "canonicalHierarchyOrder" : "ct 11/8/2023 22:38", + "children" : "ct 11/8/2023 22:33", + "children:" : "ct 11/8/2023 22:34", + "childrenForHelp" : "ct 11/9/2023 23:04", + "extraLabels" : "ct 11/13/2023 21:27", + "extraLabels:" : "ct 11/15/2023 20:15", + "fullText" : "ct 11/20/2023 19:39", + "fullTextForHelp" : "ct 11/20/2023 19:37", + "hasAnyStarIndex" : "ct 11/25/2023 20:20", + "hasStarIndex" : "ct 11/25/2023 20:19", + "hasStarIndex:" : "ct 11/25/2023 20:19", + "index" : "ct 11/24/2023 18:43", + "index:" : "ct 11/24/2023 18:43", + "initialize" : "ct 11/25/2023 20:19", + "isBookChunk" : "ct 11/9/2023 21:45", + "isHelpLeaf" : "ct 11/9/2023 22:41", + "labels" : "ct 11/13/2023 21:28", + "mayContain:" : "ct 11/8/2023 22:38", + "openInPDF" : "ct 11/24/2023 19:00", + "parent" : "ct 11/15/2023 19:51", + "parent:" : "ct 11/15/2023 19:51", + "parseNode" : "ct 11/24/2023 19:01", + "parseNode:" : "ct 11/25/2023 20:18", + "pathToLabel:" : "ct 11/13/2023 20:37", + "pdfUrl" : "ct 11/25/2023 19:11", + "pdfUrlFragment" : "ct 11/24/2023 18:30", + "printOn:" : "ct 11/8/2023 22:46", + "storeOn:" : "ct 11/25/2023 23:00", + "text" : "ct 11/9/2023 22:47", + "text:" : "ct 11/26/2023 18:42", + "textForHelp" : "ct 11/9/2023 23:05", + "title" : "ct 11/8/2023 22:33", + "title:" : "ct 11/8/2023 22:33", + "titleSeparatorForHelp" : "ct 11/9/2023 23:06", + "type" : "ct 11/25/2023 19:50", + "typeName" : "ct 11/25/2023 20:20", + "typeName:" : "ct 11/25/2023 19:52", + "updateStarIndexes" : "ct 11/25/2023 20:20", + "wantsOwnHelpTopic" : "ct 11/9/2023 23:01" } } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/properties.json b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/properties.json new file mode 100644 index 00000000..dc19dd1c --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/properties.json @@ -0,0 +1,23 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "title", + "parent", + "children", + "text", + "parseNode", + "index", + "hasStarIndex", + "extraLabels", + "typeName", + "cachedAnchorLabels" ], + "name" : "SBEBookNode", + "pools" : [ + ], + "super" : "Object", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/README.md b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/canonicalHierarchyOrder.st b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/canonicalHierarchyOrder.st new file mode 100644 index 00000000..3ca153bb --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/canonicalHierarchyOrder.st @@ -0,0 +1,4 @@ +accessing +canonicalHierarchyOrder + + ^ 100 \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/isHelpLeaf.st b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/isHelpLeaf.st new file mode 100644 index 00000000..5a3d9f6d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/isHelpLeaf.st @@ -0,0 +1,4 @@ +testing +isHelpLeaf + + ^ true \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/pdfUrlFragment.st b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/pdfUrlFragment.st new file mode 100644 index 00000000..7ac2dd33 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/pdfUrlFragment.st @@ -0,0 +1,4 @@ +accessing +pdfUrlFragment + + ^ nil \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/titleSeparatorForHelp.st b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/titleSeparatorForHelp.st new file mode 100644 index 00000000..ff2ebfd9 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/titleSeparatorForHelp.st @@ -0,0 +1,4 @@ +converting +titleSeparatorForHelp + + ^ String space \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/type.st b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/type.st new file mode 100644 index 00000000..41699810 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/type.st @@ -0,0 +1,4 @@ +accessing +type + + ^ #paragraph \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/wantsOwnHelpTopic.st b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/wantsOwnHelpTopic.st new file mode 100644 index 00000000..c0328cac --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/wantsOwnHelpTopic.st @@ -0,0 +1,4 @@ +testing +wantsOwnHelpTopic + + ^ false \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/methodProperties.json new file mode 100644 index 00000000..5df4c831 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/methodProperties.json @@ -0,0 +1,10 @@ +{ + "class" : { + }, + "instance" : { + "canonicalHierarchyOrder" : "ct 11/9/2023 21:13", + "isHelpLeaf" : "ct 11/9/2023 22:42", + "pdfUrlFragment" : "ct 11/25/2023 19:12", + "titleSeparatorForHelp" : "ct 11/9/2023 23:06", + "type" : "ct 11/25/2023 19:50", + "wantsOwnHelpTopic" : "ct 11/9/2023 23:01" } } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/properties.json b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/properties.json new file mode 100644 index 00000000..4bd727af --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + ], + "name" : "SBEBookParagraph", + "pools" : [ + ], + "super" : "SBEBookNode", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookPart.class/README.md b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBEBookPart.class/instance/canonicalHierarchyOrder.st b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/instance/canonicalHierarchyOrder.st new file mode 100644 index 00000000..2ca520ca --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/instance/canonicalHierarchyOrder.st @@ -0,0 +1,4 @@ +accessing +canonicalHierarchyOrder + + ^ 1 \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookPart.class/instance/pdfUrlFragment.st b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/instance/pdfUrlFragment.st new file mode 100644 index 00000000..c656d37d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/instance/pdfUrlFragment.st @@ -0,0 +1,5 @@ +accessing +pdfUrlFragment + + ^ '{1}.{2}' format: + {self typeName. self index} \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookPart.class/instance/type.st b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/instance/type.st new file mode 100644 index 00000000..b4758a18 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/instance/type.st @@ -0,0 +1,4 @@ +accessing +type + + ^ #part \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookPart.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/methodProperties.json new file mode 100644 index 00000000..9a61cc9b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/methodProperties.json @@ -0,0 +1,7 @@ +{ + "class" : { + }, + "instance" : { + "canonicalHierarchyOrder" : "ct 11/8/2023 22:38", + "pdfUrlFragment" : "ct 11/25/2023 19:52", + "type" : "ct 11/25/2023 19:50" } } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookPart.class/properties.json b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/properties.json new file mode 100644 index 00000000..dc57c0fe --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + ], + "name" : "SBEBookPart", + "pools" : [ + ], + "super" : "SBEBookNode", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSection.class/README.md b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/canonicalHierarchyOrder.st b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/canonicalHierarchyOrder.st new file mode 100644 index 00000000..85e01b0d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/canonicalHierarchyOrder.st @@ -0,0 +1,4 @@ +accessing +canonicalHierarchyOrder + + ^ 3 \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/isHelpLeaf.st b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/isHelpLeaf.st new file mode 100644 index 00000000..5a3d9f6d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/isHelpLeaf.st @@ -0,0 +1,4 @@ +testing +isHelpLeaf + + ^ true \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/pdfUrlFragment.st b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/pdfUrlFragment.st new file mode 100644 index 00000000..9146f193 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/pdfUrlFragment.st @@ -0,0 +1,7 @@ +accessing +pdfUrlFragment + + ^ '{1}.{2}.{3}' format: + {self typeName. + self parent index. + self index} \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/type.st b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/type.st new file mode 100644 index 00000000..4185232e --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/type.st @@ -0,0 +1,4 @@ +accessing +type + + ^ #section \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSection.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/methodProperties.json new file mode 100644 index 00000000..2236fd03 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/methodProperties.json @@ -0,0 +1,8 @@ +{ + "class" : { + }, + "instance" : { + "canonicalHierarchyOrder" : "ct 11/8/2023 22:38", + "isHelpLeaf" : "ct 11/9/2023 22:42", + "pdfUrlFragment" : "ct 11/25/2023 19:52", + "type" : "ct 11/25/2023 19:50" } } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSection.class/properties.json b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/properties.json new file mode 100644 index 00000000..b7350386 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + ], + "name" : "SBEBookSection", + "pools" : [ + ], + "super" : "SBEBookNode", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/README.md b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/canonicalHierarchyOrder.st b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/canonicalHierarchyOrder.st new file mode 100644 index 00000000..c20b9581 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/canonicalHierarchyOrder.st @@ -0,0 +1,4 @@ +accessing +canonicalHierarchyOrder + + ^ 3 + self level \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/initialize.st b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/initialize.st new file mode 100644 index 00000000..c0f88974 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/initialize.st @@ -0,0 +1,6 @@ +initialize-release +initialize + + super initialize. + + level := 1. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/isHelpLeaf.st b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/isHelpLeaf.st new file mode 100644 index 00000000..5a3d9f6d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/isHelpLeaf.st @@ -0,0 +1,4 @@ +testing +isHelpLeaf + + ^ true \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/level..st b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/level..st new file mode 100644 index 00000000..2f3993d8 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/level..st @@ -0,0 +1,4 @@ +accessing +level: anInteger + + level := anInteger. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/level.st b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/level.st new file mode 100644 index 00000000..4204504a --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/level.st @@ -0,0 +1,4 @@ +accessing +level + + ^ level \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/pdfUrlFragment.st b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/pdfUrlFragment.st new file mode 100644 index 00000000..b22b63e6 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/pdfUrlFragment.st @@ -0,0 +1,5 @@ +accessing +pdfUrlFragment + + ^ '{1}.{2}' format: + {self parent pdfUrlFragment. self index} \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/storeOn..st b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/storeOn..st new file mode 100644 index 00000000..c44e612d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/storeOn..st @@ -0,0 +1,9 @@ +converting +storeOn: aStream + + aStream nextPutAll: +('({1} + level: {2}; + yourself)' format: + {String streamContents: [:stream | super storeOn: stream]. + self level storeString}) \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/titleSeparatorForHelp.st b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/titleSeparatorForHelp.st new file mode 100644 index 00000000..a47d1196 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/titleSeparatorForHelp.st @@ -0,0 +1,4 @@ +converting +titleSeparatorForHelp + + ^ String cr \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/type.st b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/type.st new file mode 100644 index 00000000..aa973139 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/type.st @@ -0,0 +1,4 @@ +accessing +type + + ^ #subsection \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/wantsOwnHelpTopic.st b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/wantsOwnHelpTopic.st new file mode 100644 index 00000000..c0328cac --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/wantsOwnHelpTopic.st @@ -0,0 +1,4 @@ +testing +wantsOwnHelpTopic + + ^ false \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/methodProperties.json new file mode 100644 index 00000000..852f687d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/methodProperties.json @@ -0,0 +1,14 @@ +{ + "class" : { + }, + "instance" : { + "canonicalHierarchyOrder" : "ct 11/9/2023 21:12", + "initialize" : "ct 11/9/2023 21:12", + "isHelpLeaf" : "ct 11/9/2023 22:42", + "level" : "ct 11/9/2023 21:11", + "level:" : "ct 11/9/2023 21:12", + "pdfUrlFragment" : "ct 11/25/2023 19:52", + "storeOn:" : "ct 11/25/2023 23:01", + "titleSeparatorForHelp" : "ct 11/9/2023 23:07", + "type" : "ct 11/25/2023 19:51", + "wantsOwnHelpTopic" : "ct 11/9/2023 23:01" } } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/properties.json b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/properties.json new file mode 100644 index 00000000..65d5310a --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "level" ], + "name" : "SBEBookSubsection", + "pools" : [ + ], + "super" : "SBEBookNode", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/README.md b/SmalltalkSources/SBE-Book.package/SBEHelp.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/book..st b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/book..st new file mode 100644 index 00000000..fd8a2cb8 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/book..st @@ -0,0 +1,4 @@ +accessing +book: aBook + + Book := aBook. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/book.st b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/book.st new file mode 100644 index 00000000..883dd7f8 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/book.st @@ -0,0 +1,4 @@ +accessing +book + + ^ Book \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/bookBlurb.st b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/bookBlurb.st new file mode 100644 index 00000000..dba137fb --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/bookBlurb.st @@ -0,0 +1,4 @@ +accessing +bookBlurb + + ^ self introduction contents \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/bookName.st b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/bookName.st new file mode 100644 index 00000000..c2e9bd3b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/bookName.st @@ -0,0 +1,4 @@ +accessing +bookName + + ^ 'Squeak by Example' \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/icon.st b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/icon.st new file mode 100644 index 00000000..f120c873 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/icon.st @@ -0,0 +1,5 @@ +accessing +icon + + (self name = #SBEHelp) ifTrue: [^ self squeakBalloonIcon scaleIconToDisplay]. + ^ nil \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/introduction.st b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/introduction.st new file mode 100644 index 00000000..c2987fae --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/introduction.st @@ -0,0 +1,21 @@ +pages +introduction + "This method was automatically generated. Edit it using:" + "SBEHelp edit: #introduction" + + ^(HelpTopic + title: 'Introduction' + contents: +'Squeak by Example + +Squeak by Example is a book, intended for both students and developers, that will guide you through the Smalltalk language and the Squeak environment by means of a series of examples and exercises. The book helps you getting started with an initial tour of the environment before introducing the details of the language, the standard library, the tools, and the Morphic framework. + +About this version of the book + +Squeak by Example is a traditional book intended for PDF/print format in the first place. Nevertheless, we made some efforts to make it available right in Squeak. For this, we wrote our own LaTeX parser that uses Sandblocks'' Tree-sitter integration and a LaTeX grammar for tree-sitter to convert over 10,000 SLOC of text into Squeak objects (don''t try this at home!!). You can read the result in this help structure or search it using the search bar at the top. Note that our parser is meant to be an approximation only and we didn''t get every space right to save our own sanity. However, if you''ve got any questions or feedback, we''re there at our GitHub repo: https://github.com/hpi-swa-lab/SqueakByExample-english + +Enjoy and carpe Squeak!!! +]style[(17 2 17 365 30 55 3 1 5 151 11 1 11 1 11 7 13 393 56 23)b,,Rhttps://github.com/hpi-swa-lab/SqueakByExample-english;,,b,,Rhttps://github.com/hpi-swa-lab/SqueakByExample-english/releases;,,Rhttps://www.lulu.com/shop/patrick-rein-and-christoph-thiede/squeak-by-example-60/paperback/product-8vr2j2.html;,,Rhttps://github.com/hpi-swa/sandblocks;,,Rhttps://tree-sitter.github.io/tree-sitter/;,,Rhttps://github.com/hpi-swa-lab/sb-tree-sitter;,,Rhttps://github.com/latex-lsp/tree-sitter-latex;,,Rhttps://github.com/hpi-swa-lab/SqueakByExample-english;,!' readStream nextChunkText) + key: #introduction; + shouldStyle: false; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/pages.st b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/pages.st new file mode 100644 index 00000000..ef6df9a4 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/pages.st @@ -0,0 +1,4 @@ +accessing +pages + + ^ #("introduction" "<- enable for edits" preface theBook) \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/preface.st b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/preface.st new file mode 100644 index 00000000..69ae378b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/preface.st @@ -0,0 +1,27 @@ +pages +preface + "This method was automatically generated. Edit it using:" + "SBEHelp edit: #preface" + + ^(HelpTopic + title: 'How to use this book' + contents: +'How to use this book + +You can read this book from beginning to end, from end to beginning, look up things in the index, or browse through random sections as your interests take you. Either way, here are some tips on how to get the most out of reading this book right in Squeak: + +Interactive contents. Since Squeak is a super-duper-interactive system, you can also interact directly with the contents of this book. For example, you can select any mentioned message and press Cmd+m to browse its implementors, just like anywhere else in the image. Analogously, Cmd+b is available to browse a class definition, Cmd+p to print an expression, Cmd+D to debug it, and all your other favorite shortcuts. + +Smart search. Did you notice the search bar at the top of this window? You can search the entire book with it!!!!1 More importantly, if you also have installed the SemanticText package, this will even perform a smart search powered by OpenAI. So, instead of "exception handling", you could just search for "catch errors". Note that this is an experimental feature and watch out for artificial stupidity and hallucinations. + +Fallback to PDF. While we managed to parse most of the book in a satisfactory quality, we just could not get some things right (yet). (Imagine parsing a context-sensitive language with a context-free grammar?) So, if you encounter an unreadable artifact, send your thanks to Donald Knuth and yellow-click on the relevant section in the tree to open it in a PDF viewer in the great darkness outside of Squeak.! +]style[(21 92 5 161 22 173 5 15 12 53 5 44 5 4 5 16 5 4 8 42 13 409 16 392)b,,Rcode:// +(SBETextLabelLink to: #index) + openPath: (SBEHelp book pathToLabel: #index) + in: + (SystemWindow + windowsIn: self currentWorld + satisfying: [:window | window model isKindOf: HelpBrowser]) anyOne model;,,b,,i,,i,,i,,i,,i,,i,,i,,b,,b,!' readStream nextChunkText) + key: #preface; + shouldStyle: false; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/squeakBalloonIcon.st b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/squeakBalloonIcon.st new file mode 100644 index 00000000..b7003d7b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/squeakBalloonIcon.st @@ -0,0 +1,2163 @@ +resources +squeakBalloonIcon + + ^ Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes: '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 +sf0Mq5aW4Yv59nJv5sMP8PfHje3boHIs9ybAP0TgAx/4wAc+Hgt1VvSYGiJUkyhUUuqtEoXK +LkpaN6EfL9TUoYH87YUzB1eyAkod2dsmUiFLRTkPlnoiUDZLRftWl3ojVPG91/4mUrI9Jiig +o12mNPK3PMYPrJiXGP+DKNTCY2/an//bhyLkAy04+IcHfOADH/jAxyuhPnTveD0q+rqcX+l7 +6ayJ9k+VhJoYEsALNU6Y3zs3caCkRJoRFSJkpila/nL7Q1YPhVpvv/7np2pcCZSUfavF6wVb +M/j37dDOF+U+PVGSXWbOTpAItf7Dl/9F7w/p3ROLQp0+IYqXcGCX9j/06ekv38IDfzESfOAD +H/jAxyMCRXk8NufeapKhVtuFWvilichUTTPVnCdW2kuhAW19eaH269SWX7gTN7aXRGJrJw0W +S70WkqVa8UuLPS7ziouT0JtrXWeo72xoEK+vvs82sSklcSBOTgiRfC9Fe5+xyxQd32lAn+wx +io/pz3zEC1W8PXvKoBqVY7k3AP4hAh/4wAc+8PGEcaI8nl2YVGeT6T+IRM8UCULlM9Rz77wq +XehzXyhu3UrFZ3Zs/5RG1pRhTf3T7Ln16OWHK1q6fyouTNLtXWNfaCSXaUr0aEl2ij7eVYtO +7ikRHz/3zt6G7Wse5a/36935VuSonhYFocIHPvCBD3zg4xGJojyyl8yuR999VYm/O4NpEKmW +sguT2JW+Azr7/ahyds5UItSC1ffi7Ukj8YLRfXBw5/Y/sI/7+rTiBzjEhPTAqRED8Nr7wvlx +hNwrjzRtn/Ggb0qkWpn94L1OB/RnLUySCBWfeAWjT/bas9D8A7ma4J7dbVtpAto5G004Cv4h +Ah/4wAc+8PEqQ12ZFFeJLpy8KQoVf8fvQbUvTNLlH/NocIK/7JRvngYVbeLQPj9mzYy07E6b +4YlQjWK5NzEmGC2ePVTyennPpMsy1Feu4JN77Y+vTJ3Fj1McOSTItGjWyHon3xf8YfjwgQ98 +4AMfjwgR5TEtfNhNUhYtbhIqn6WaiVTrRakmjAt3kE6be3xuO5OkX5s2ePzo4bfpgH26NUUM +mu1OjxuPw4cOwkHduip+bUhgAD6YkeJUqNzb63FQZ3/+ua9umHyb/T4CO3ZoZLfL8EL9ZPc3 +rFCTJ9m20LT38/0xMba/M9GvgX+IwAc+8IEPfDzBV5RH+IA+VDwc+tuBakaoVeSSI1I1i1K9 +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 +gg==' readStream) \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/theBook.st b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/theBook.st new file mode 100644 index 00000000..46b8cdab --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/theBook.st @@ -0,0 +1,4 @@ +pages +theBook + + ^ self book asHelpTopic \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEHelp.class/methodProperties.json new file mode 100644 index 00000000..a905e893 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/methodProperties.json @@ -0,0 +1,14 @@ +{ + "class" : { + "book" : "ct 11/15/2023 17:37", + "book:" : "ct 11/15/2023 17:38", + "bookBlurb" : "ct 11/15/2023 17:39", + "bookName" : "ct 11/15/2023 17:30", + "icon" : "ct 11/15/2023 21:37", + "introduction" : "ct 11/25/2023 21:11", + "pages" : "ct 11/25/2023 21:11", + "preface" : "ct 11/26/2023 20:37", + "squeakBalloonIcon" : "ct 11/15/2023 17:33", + "theBook" : "ct 11/15/2023 17:37" }, + "instance" : { + } } diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/properties.json b/SmalltalkSources/SBE-Book.package/SBEHelp.class/properties.json new file mode 100644 index 00000000..17411c1b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + "Book" ], + "commentStamp" : "", + "instvars" : [ + ], + "name" : "SBEHelp", + "pools" : [ + ], + "super" : "CustomHelp", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/README.md b/SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/initialize.st b/SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/initialize.st new file mode 100644 index 00000000..7f8203ab --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/initialize.st @@ -0,0 +1,6 @@ +initialize-release +initialize + + super initialize. + + self breakLines: false. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/mapTagToAttribute..st b/SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/mapTagToAttribute..st new file mode 100644 index 00000000..17dd50e8 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/mapTagToAttribute..st @@ -0,0 +1,29 @@ +mapping +mapTagToAttribute: aTag + + (self hasTag: aTag name: ' 1 ifTrue: + [^ (self assureSubindexAt: path first) + atPath: path allButFirst putKey: key label: label]. + + localKey := path first. + ^ entries + at: localKey + ifPresent: [:entry | + entry key: key; label: label] + ifAbsentPut: + [self makeEntryForKey: key label: label] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/entries..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/entries..st new file mode 100644 index 00000000..2d8aeb16 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/entries..st @@ -0,0 +1,4 @@ +initialize-release +entries: aDictionary + + entries := aDictionary. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/entries.st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/entries.st new file mode 100644 index 00000000..b8e89fba --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/entries.st @@ -0,0 +1,4 @@ +accessing +entries + + ^ entries \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/entriesDo..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/entriesDo..st new file mode 100644 index 00000000..72168101 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/entriesDo..st @@ -0,0 +1,5 @@ +accessing +entriesDo: entryAndLabelBlock + + (self entries withKeysSorted: self keySortFunction) + do: entryAndLabelBlock. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/forwardReference..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/forwardReference..st new file mode 100644 index 00000000..2b34053d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/forwardReference..st @@ -0,0 +1,5 @@ +accessing +forwardReference: seeCommandSeeAssocationOrNil + "command -> key association that references to another index entry." + + forwardReference := seeCommandSeeAssocationOrNil. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/forwardReference.st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/forwardReference.st new file mode 100644 index 00000000..d41bcb6c --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/forwardReference.st @@ -0,0 +1,5 @@ +accessing +forwardReference + "command -> key association that references to another index entry." + + ^ forwardReference \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/initialize.st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/initialize.st new file mode 100644 index 00000000..048f05b5 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/initialize.st @@ -0,0 +1,7 @@ +initialize-release +initialize + + super initialize. + + entries := Dictionary new. + referenceKeys := OrderedCollection new. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/key..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/key..st new file mode 100644 index 00000000..82402e06 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/key..st @@ -0,0 +1,4 @@ +accessing +key: anObject + + key := anObject. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/key.st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/key.st new file mode 100644 index 00000000..0daf2216 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/key.st @@ -0,0 +1,4 @@ +accessing +key + + ^ key \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/keySortFunction.st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/keySortFunction.st new file mode 100644 index 00000000..29637cae --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/keySortFunction.st @@ -0,0 +1,5 @@ +private +keySortFunction + + ^ [:key | key first isLetter asBit] ascending "special characters before letters" + , [:key :otherKey | (key compare: otherKey caseSensitive: false) - 2] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/label..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/label..st new file mode 100644 index 00000000..d9906520 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/label..st @@ -0,0 +1,4 @@ +accessing +label: aStringOrText + + label := aStringOrText. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/label.st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/label.st new file mode 100644 index 00000000..020ac3b5 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/label.st @@ -0,0 +1,4 @@ +accessing +label + + ^ label \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/makeEntryForKey.label..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/makeEntryForKey.label..st new file mode 100644 index 00000000..10a2e665 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/makeEntryForKey.label..st @@ -0,0 +1,4 @@ +private +makeEntryForKey: key label: label + + ^ self species key: key label: label \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/makeSubindexForKey..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/makeSubindexForKey..st new file mode 100644 index 00000000..a895b81e --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/makeSubindexForKey..st @@ -0,0 +1,6 @@ +private +makeSubindexForKey: key + + ^ self species new + key: key; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/printOn..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/printOn..st new file mode 100644 index 00000000..7f452527 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/printOn..st @@ -0,0 +1,14 @@ +printing +printOn: aStream + + super printOn: aStream. + + self key ifNotNil: + [aStream + nextPut: $<; + nextPutAll: self key; + nextPut: $>]. + self label ifNotNil: + [aStream + space; + print: self label asString]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/referenceKeys..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/referenceKeys..st new file mode 100644 index 00000000..0788a804 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/referenceKeys..st @@ -0,0 +1,4 @@ +initialize-release +referenceKeys: aCollection + + referenceKeys := aCollection. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/referenceKeys.st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/referenceKeys.st new file mode 100644 index 00000000..e1da6aec --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/referenceKeys.st @@ -0,0 +1,5 @@ +accessing +referenceKeys + "Keys in the book that reference this entry." + + ^ referenceKeys \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/storeOn..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/storeOn..st new file mode 100644 index 00000000..ce459c63 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/storeOn..st @@ -0,0 +1,17 @@ +converting +storeOn: aStream + + aStream nextPutAll: +('({1} new + key: {2}; + label: {3}; + entries: {4}; + referenceKeys: {5}; + forwardReference: {6}; + yourself)' format: + {self class name. + self key storeString. + self label sbeStoreHtmlString. + self entries storeString. + self referenceKeys storeString. + self forwardReference storeString}) \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEIndex.class/methodProperties.json new file mode 100644 index 00000000..ad2abb9d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/methodProperties.json @@ -0,0 +1,24 @@ +{ + "class" : { + "key:label:" : "ct 11/26/2023 03:28" }, + "instance" : { + "addReferenceKey:" : "ct 11/26/2023 18:12", + "assureSubindexAt:" : "ct 11/26/2023 18:14", + "atPath:putKey:label:" : "ct 11/26/2023 03:07", + "entries" : "ct 11/26/2023 02:40", + "entries:" : "ct 11/26/2023 18:18", + "entriesDo:" : "ct 11/26/2023 18:02", + "forwardReference" : "ct 11/26/2023 18:13", + "forwardReference:" : "ct 11/26/2023 18:13", + "initialize" : "ct 11/26/2023 03:23", + "key" : "ct 11/26/2023 00:19", + "key:" : "ct 11/26/2023 00:20", + "keySortFunction" : "ct 11/26/2023 19:40", + "label" : "ct 11/26/2023 00:20", + "label:" : "ct 11/26/2023 00:20", + "makeEntryForKey:label:" : "ct 11/26/2023 18:13", + "makeSubindexForKey:" : "ct 11/26/2023 18:14", + "printOn:" : "ct 11/26/2023 19:15", + "referenceKeys" : "ct 11/26/2023 18:12", + "referenceKeys:" : "ct 11/26/2023 18:18", + "storeOn:" : "ct 11/26/2023 18:16" } } diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/properties.json b/SmalltalkSources/SBE-Book.package/SBEIndex.class/properties.json new file mode 100644 index 00000000..9af42ef1 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/properties.json @@ -0,0 +1,18 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "key", + "label", + "entries", + "referenceKeys", + "forwardReference" ], + "name" : "SBEIndex", + "pools" : [ + ], + "super" : "Object", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/README.md b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/class/themeProperties.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/class/themeProperties.st new file mode 100644 index 00000000..43e7c783 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/class/themeProperties.st @@ -0,0 +1,6 @@ +updating +themeProperties + "Ensure that #applyUserInterfaceTheme is sent." + + ^ super themeProperties + , {{#placeholder. ''. 'Just a placeholder to ensure that this class is sent #applyUserInterfaceTheme updates.'}} \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/^equals.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/^equals.st new file mode 100644 index 00000000..a9a1f46f --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/^equals.st @@ -0,0 +1,9 @@ +comparing += other + + ^ other class == self class + and: [other dyeMode = self dyeMode] + and: [other extent = self extent] + and: + [self flag: #todo. "if other is compressed and we are not, this will mismatch" + other imageBitsOrNil = self imageBitsOrNil] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/anchoredMorph.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/anchoredMorph.st new file mode 100644 index 00000000..32298c93 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/anchoredMorph.st @@ -0,0 +1,6 @@ +accessing +anchoredMorph + "Quickly thrown together - we want to (i) uncompress + (ii) scale images (a) only on demand, (b) not preserve then longer than necessary, and (c) not free the cache between render cycles. SBETextAnchor seems to achieve this quite well, while for non-Morphic projects, we would currently reload the image on every tick." + + Smalltalk isMorphic ifTrue: [^ morph ifNil: [morph := SBETextAnchorMorph newFor: self]]. + ^ self scaledImage \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/applyUserInterfaceTheme.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/applyUserInterfaceTheme.st new file mode 100644 index 00000000..845ca796 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/applyUserInterfaceTheme.st @@ -0,0 +1,9 @@ +updating +applyUserInterfaceTheme + + super applyUserInterfaceTheme. + + scaledImage := nil. + morph ifNotNil: + [self flag: #knownBug. "Resized morphs might appear at the wrong position until their actual anchor position is scrolled into the view. Looks like a Morphic bug??" + morph updateExtent]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/basicImage.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/basicImage.st new file mode 100644 index 00000000..9d3abcbe --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/basicImage.st @@ -0,0 +1,4 @@ +private +basicImage + + ^ anchoredMorph \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/closeHtmlOn..st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/closeHtmlOn..st new file mode 100644 index 00000000..ab72c61a --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/closeHtmlOn..st @@ -0,0 +1,4 @@ +html +closeHtmlOn: aHtmlReadWriter + + aHtmlReadWriter nextPutAll: ''. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/compressImage.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/compressImage.st new file mode 100644 index 00000000..1f1b78e6 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/compressImage.st @@ -0,0 +1,13 @@ +as yet unclassified +compressImage + + self basicImage become: + (ByteArray streamContents: [:stream | PNGReadWriter putForm: self basicImage onStream: stream]). + + "For SBE 6.0: + * uncompressed Forms: ~440 MB + * hibernated Forms: ~60 MB + * PNG ByteArrays: ~45 MB + ... but after uncompressing again from PNG, we are just at ~110 MB? + Anyway, PNG is smallest and compresses fast enough for browsing in the HelpBrowser. SBEHelp book fullText edit takes ~15 seconds. + (don't quote me on those numbers, i only compared rss)" \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/dyeMode..st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/dyeMode..st new file mode 100644 index 00000000..889eb474 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/dyeMode..st @@ -0,0 +1,4 @@ +accessing +dyeMode: aSymbolOrNil + + dyeMode := aSymbolOrNil. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/dyeMode.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/dyeMode.st new file mode 100644 index 00000000..4fdef991 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/dyeMode.st @@ -0,0 +1,4 @@ +accessing +dyeMode + + ^ dyeMode \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/emphasizeScanner..st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/emphasizeScanner..st new file mode 100644 index 00000000..2f7d74ec --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/emphasizeScanner..st @@ -0,0 +1,10 @@ +scanning +emphasizeScanner: scanner + "See comment in #anchoredMorph." + + Smalltalk isMorphic ifFalse: + [self flag: #knownBug. "NB: WeakSet(Set)>>ifAbsentAdd: is currently broken, so resetCache is never triggered..." + ((knownScanners ifNil: [knownScanners := WeakSet new]) ifAbsentAdd: scanner) ifTrue: + [self resetCache]]. + + ^ super emphasizeScanner: scanner \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/extent..st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/extent..st new file mode 100644 index 00000000..1a634536 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/extent..st @@ -0,0 +1,4 @@ +accessing +extent: aPointOrSymbol + + extent := aPointOrSymbol. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/extent.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/extent.st new file mode 100644 index 00000000..98f7288e --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/extent.st @@ -0,0 +1,4 @@ +accessing +extent + + ^ extent \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/hasCompressedImage.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/hasCompressedImage.st new file mode 100644 index 00000000..6173ba7b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/hasCompressedImage.st @@ -0,0 +1,4 @@ +private +hasCompressedImage + + ^ self basicImage isCollection \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/hash.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/hash.st new file mode 100644 index 00000000..78c48aaa --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/hash.st @@ -0,0 +1,6 @@ +comparing +hash + + ^ (self dyeMode hash + bitXor: self extent hash) + bitXor: self imageBitsOrNil hash \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/image.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/image.st new file mode 100644 index 00000000..04ac984b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/image.st @@ -0,0 +1,5 @@ +accessing +image + + self hasCompressedImage ifFalse: [^ self basicImage]. + ^ PNGReadWriter formFromStream: self basicImage readStream \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/imageBitsOrNil.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/imageBitsOrNil.st new file mode 100644 index 00000000..283698c9 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/imageBitsOrNil.st @@ -0,0 +1,5 @@ +private +imageBitsOrNil + + self hasCompressedImage ifTrue: [^ nil]. + ^ self basicImage \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/openHtmlOn..st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/openHtmlOn..st new file mode 100644 index 00000000..fd4a59bc --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/openHtmlOn..st @@ -0,0 +1,11 @@ +html +openHtmlOn: aHtmlReadWriter + + | data | + data := (ByteArray streamContents: [:stream | + PNGReadWriter putForm: self image onStream: stream]) + base64Encoded. + + aHtmlReadWriter nextPutAll: + ('' format: + {data. self extent storeString. self dyeMode storeString}). \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/resetCache.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/resetCache.st new file mode 100644 index 00000000..5904d3af --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/resetCache.st @@ -0,0 +1,4 @@ +updating +resetCache + + scaledImage := nil. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/scaledImage.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/scaledImage.st new file mode 100644 index 00000000..49ba4643 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/scaledImage.st @@ -0,0 +1,20 @@ +accessing +scaledImage + + ^ scaledImage ifNil: + [| image scaledExtent | + image := self image. + + scaledExtent := self extent + caseOf: + {[#inline] -> [image extent * (TextStyle defaultFont height / image height)]. + [nil] -> [image extent * RealEstateAgent scaleFactor]} + otherwise: [:point | point * RealEstateAgent scaleFactor]. + image := image scaledToSize: scaledExtent. + + self dyeMode ifNotNil: + [image := image dyed: + (self dyeMode caseOf: + {[#dockingLogoColor] -> [self userInterfaceTheme theme get: #logoColor for: #TheWorldMainDockingBar]})]. + + scaledImage := image] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/methodProperties.json new file mode 100644 index 00000000..54fed7ca --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/methodProperties.json @@ -0,0 +1,22 @@ +{ + "class" : { + "themeProperties" : "ct 11/21/2023 19:20" }, + "instance" : { + "=" : "ct 10/6/2025 00:51", + "anchoredMorph" : "ct 10/6/2025 01:02", + "applyUserInterfaceTheme" : "ct 10/6/2025 01:46", + "basicImage" : "ct 10/6/2025 00:55", + "closeHtmlOn:" : "ct 11/15/2023 19:36", + "compressImage" : "ct 10/6/2025 01:25", + "dyeMode" : "ct 11/21/2023 18:11", + "dyeMode:" : "ct 11/21/2023 18:11", + "emphasizeScanner:" : "ct 10/6/2025 01:03", + "extent" : "ct 11/21/2023 18:02", + "extent:" : "ct 11/21/2023 18:02", + "hasCompressedImage" : "ct 10/6/2025 00:55", + "hash" : "ct 10/6/2025 00:52", + "image" : "ct 10/6/2025 00:56", + "imageBitsOrNil" : "ct 10/6/2025 00:55", + "openHtmlOn:" : "ct 11/21/2023 18:17", + "resetCache" : "ct 11/21/2023 19:11", + "scaledImage" : "ct 11/21/2023 18:39" } } diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/properties.json b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/properties.json new file mode 100644 index 00000000..f20d5643 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/properties.json @@ -0,0 +1,18 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "extent", + "dyeMode", + "morph", + "scaledImage", + "knownScanners" ], + "name" : "SBETextAnchor", + "pools" : [ + ], + "super" : "TextAnchor", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/README.md b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/class/newFor..st b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/class/newFor..st new file mode 100644 index 00000000..ae2eb734 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/class/newFor..st @@ -0,0 +1,4 @@ +as yet unclassified +newFor: aTextAnchor + + ^ self new initializeWithTextAnchor: aTextAnchor \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/drawOn..st b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/drawOn..st new file mode 100644 index 00000000..6f71c9de --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/drawOn..st @@ -0,0 +1,4 @@ +drawing +drawOn: aCanvas + + aCanvas translucentImage: self textAnchor scaledImage at: self innerBounds origin. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/initializeWithTextAnchor..st b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/initializeWithTextAnchor..st new file mode 100644 index 00000000..80272f69 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/initializeWithTextAnchor..st @@ -0,0 +1,5 @@ +initialize-release +initializeWithTextAnchor: aTextAnchor + + textAnchor := aTextAnchor. + self updateExtent. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/outOfWorld..st b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/outOfWorld..st new file mode 100644 index 00000000..907f59f5 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/outOfWorld..st @@ -0,0 +1,5 @@ +submorphs - callbacks +outOfWorld: world + + super outOfWorld: world. + self textAnchor resetCache. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/textAnchor.st b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/textAnchor.st new file mode 100644 index 00000000..fcabde6d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/textAnchor.st @@ -0,0 +1,4 @@ +initialize-release +textAnchor + + ^ textAnchor \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/updateExtent.st b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/updateExtent.st new file mode 100644 index 00000000..8731643c --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/instance/updateExtent.st @@ -0,0 +1,4 @@ +initialize-release +updateExtent + + self extent: self textAnchor scaledImage extent. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/methodProperties.json new file mode 100644 index 00000000..75c96fcd --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/methodProperties.json @@ -0,0 +1,9 @@ +{ + "class" : { + "newFor:" : "ct 10/6/2025 00:09" }, + "instance" : { + "drawOn:" : "ct 10/6/2025 00:18", + "initializeWithTextAnchor:" : "ct 10/6/2025 01:27", + "outOfWorld:" : "ct 10/6/2025 00:17", + "textAnchor" : "ct 10/6/2025 00:08", + "updateExtent" : "ct 10/6/2025 01:27" } } diff --git a/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/properties.json b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/properties.json new file mode 100644 index 00000000..7748c1e2 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchorMorph.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "textAnchor" ], + "name" : "SBETextAnchorMorph", + "pools" : [ + ], + "super" : "Morph", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/README.md b/SmalltalkSources/SBE-Book.package/SBETextColor.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/class/property..st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/class/property..st new file mode 100644 index 00000000..6a8b8c48 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/class/property..st @@ -0,0 +1,6 @@ +instance creation +property: property + + ^ self new + property: property; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/class/property.scope..st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/class/property.scope..st new file mode 100644 index 00000000..81d65b6f --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/class/property.scope..st @@ -0,0 +1,7 @@ +instance creation +property: property scope: scope + + ^ self new + property: property; + scope: scope; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/class/themeProperties.st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/class/themeProperties.st new file mode 100644 index 00000000..43e7c783 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/class/themeProperties.st @@ -0,0 +1,6 @@ +updating +themeProperties + "Ensure that #applyUserInterfaceTheme is sent." + + ^ super themeProperties + , {{#placeholder. ''. 'Just a placeholder to ensure that this class is sent #applyUserInterfaceTheme updates.'}} \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/^equals.st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/^equals.st new file mode 100644 index 00000000..6c6aeb87 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/^equals.st @@ -0,0 +1,6 @@ +comparing += other + + ^ other class == self class + and: [other property = self property] + and: [other scope = self scope] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/actualColor.st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/actualColor.st new file mode 100644 index 00000000..d4932570 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/actualColor.st @@ -0,0 +1,8 @@ +accessing +actualColor + + ^ actualColor ifNil: + [| color | + color := self userInterfaceTheme theme get: self property for: self scope. + color isArray ifTrue: [color := color first]. + actualColor := color] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/applyUserInterfaceTheme.st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/applyUserInterfaceTheme.st new file mode 100644 index 00000000..aacd9ded --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/applyUserInterfaceTheme.st @@ -0,0 +1,6 @@ +updating +applyUserInterfaceTheme + + super applyUserInterfaceTheme. + + self resetCache. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/closeHtmlOn..st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/closeHtmlOn..st new file mode 100644 index 00000000..8089b55a --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/closeHtmlOn..st @@ -0,0 +1,4 @@ +html +closeHtmlOn: aStream + + aStream nextPutAll: ''. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/dominatedByCmd0.st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/dominatedByCmd0.st new file mode 100644 index 00000000..2bc2e770 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/dominatedByCmd0.st @@ -0,0 +1,4 @@ +testing +dominatedByCmd0 + + ^ true \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/dominates..st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/dominates..st new file mode 100644 index 00000000..71ada562 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/dominates..st @@ -0,0 +1,4 @@ +testing +dominates: other + + ^ other class = self class \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/emphasizeScanner..st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/emphasizeScanner..st new file mode 100644 index 00000000..5f2cde22 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/emphasizeScanner..st @@ -0,0 +1,6 @@ +scanning +emphasizeScanner: scanner + + ((knownScanners ifNil: [knownScanners := WeakSet new]) ifAbsentAdd: scanner) ifTrue: + [self resetCache]. + scanner textColor: self actualColor. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/hash.st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/hash.st new file mode 100644 index 00000000..982665cd --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/hash.st @@ -0,0 +1,4 @@ +comparing +hash + + ^ self property hash bitXor: self scope hash \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/openHtmlOn..st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/openHtmlOn..st new file mode 100644 index 00000000..a7af2be6 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/openHtmlOn..st @@ -0,0 +1,6 @@ +html +openHtmlOn: aStream + + aStream nextPutAll: + ('' format: + {self property storeString. self scope storeString}). \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/property..st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/property..st new file mode 100644 index 00000000..00223435 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/property..st @@ -0,0 +1,4 @@ +accessing +property: aSymbol + + property := aSymbol. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/property.st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/property.st new file mode 100644 index 00000000..bd4aaa30 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/property.st @@ -0,0 +1,4 @@ +accessing +property + + ^ property \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/resetCache.st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/resetCache.st new file mode 100644 index 00000000..f6fe29e9 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/resetCache.st @@ -0,0 +1,4 @@ +updating +resetCache + + actualColor := nil. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/scope..st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/scope..st new file mode 100644 index 00000000..2a4fa63c --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/scope..st @@ -0,0 +1,4 @@ +accessing +scope: classNameOrNil + + scope := classNameOrNil. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/scope.st b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/scope.st new file mode 100644 index 00000000..b0411069 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/scope.st @@ -0,0 +1,4 @@ +accessing +scope + + ^ scope \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBETextColor.class/methodProperties.json new file mode 100644 index 00000000..cc30fd72 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/methodProperties.json @@ -0,0 +1,20 @@ +{ + "class" : { + "property:" : "ct 11/21/2023 18:30", + "property:scope:" : "ct 11/21/2023 18:30", + "themeProperties" : "ct 11/21/2023 19:19" }, + "instance" : { + "=" : "ct 11/21/2023 18:23", + "actualColor" : "ct 11/21/2023 18:36", + "applyUserInterfaceTheme" : "ct 11/21/2023 19:23", + "closeHtmlOn:" : "ct 11/21/2023 18:26", + "dominatedByCmd0" : "ct 11/21/2023 18:30", + "dominates:" : "ct 11/21/2023 18:27", + "emphasizeScanner:" : "ct 11/21/2023 19:11", + "hash" : "ct 11/21/2023 18:24", + "openHtmlOn:" : "ct 11/21/2023 18:52", + "property" : "ct 11/21/2023 18:23", + "property:" : "ct 11/21/2023 18:23", + "resetCache" : "ct 11/21/2023 19:11", + "scope" : "ct 11/21/2023 18:22", + "scope:" : "ct 11/21/2023 18:28" } } diff --git a/SmalltalkSources/SBE-Book.package/SBETextColor.class/properties.json b/SmalltalkSources/SBE-Book.package/SBETextColor.class/properties.json new file mode 100644 index 00000000..809af8f0 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextColor.class/properties.json @@ -0,0 +1,17 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "property", + "scope", + "actualColor", + "knownScanners" ], + "name" : "SBETextColor", + "pools" : [ + ], + "super" : "TextAttribute", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/README.md b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/class/smaller.st b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/class/smaller.st new file mode 100644 index 00000000..d17529cb --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/class/smaller.st @@ -0,0 +1,4 @@ +instance creation +smaller + + ^ self style: #smaller \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/class/style..st b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/class/style..st new file mode 100644 index 00000000..8dc1a757 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/class/style..st @@ -0,0 +1,6 @@ +instance creation +style: style + + ^ self new + style: style; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/class/themeProperties.st b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/class/themeProperties.st new file mode 100644 index 00000000..43e7c783 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/class/themeProperties.st @@ -0,0 +1,6 @@ +updating +themeProperties + "Ensure that #applyUserInterfaceTheme is sent." + + ^ super themeProperties + , {{#placeholder. ''. 'Just a placeholder to ensure that this class is sent #applyUserInterfaceTheme updates.'}} \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/^equals.st b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/^equals.st new file mode 100644 index 00000000..0f38b317 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/^equals.st @@ -0,0 +1,5 @@ +comparing += other + + ^ other class == self class + and: [other style = self style] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/applyUserInterfaceTheme.st b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/applyUserInterfaceTheme.st new file mode 100644 index 00000000..c8dc2086 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/applyUserInterfaceTheme.st @@ -0,0 +1,6 @@ +updating +applyUserInterfaceTheme + + super applyUserInterfaceTheme. + + self updateFont. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/closeHtmlOn..st b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/closeHtmlOn..st new file mode 100644 index 00000000..5a5e1718 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/closeHtmlOn..st @@ -0,0 +1,4 @@ +html +closeHtmlOn: aStream + + aStream nextPutAll: ''. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/fontForStyle..st b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/fontForStyle..st new file mode 100644 index 00000000..6f244123 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/fontForStyle..st @@ -0,0 +1,5 @@ +private +fontForStyle: aSymbol + + ^ aSymbol caseOf: + {[#smaller] -> [Preferences standardButtonFont]} \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/hash.st b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/hash.st new file mode 100644 index 00000000..f046a30e --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/hash.st @@ -0,0 +1,4 @@ +comparing +hash + + ^ self style hash \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/openHtmlOn..st b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/openHtmlOn..st new file mode 100644 index 00000000..e3e63b41 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/openHtmlOn..st @@ -0,0 +1,6 @@ +html +openHtmlOn: aStream + + aStream nextPutAll: + ('' format: + {self style storeString}). \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/style..st b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/style..st new file mode 100644 index 00000000..bd4b31c1 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/style..st @@ -0,0 +1,5 @@ +accessing +style: aSymbol + + style := aSymbol. + self updateFont. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/style.st b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/style.st new file mode 100644 index 00000000..c693fadc --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/style.st @@ -0,0 +1,4 @@ +accessing +style + + ^ style \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/updateFont.st b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/updateFont.st new file mode 100644 index 00000000..3233b976 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/updateFont.st @@ -0,0 +1,4 @@ +updating +updateFont + + font := self fontForStyle: self style. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/methodProperties.json new file mode 100644 index 00000000..3b8be66f --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/methodProperties.json @@ -0,0 +1,15 @@ +{ + "class" : { + "smaller" : "ct 11/21/2023 19:09", + "style:" : "ct 11/21/2023 19:09", + "themeProperties" : "ct 11/21/2023 19:20" }, + "instance" : { + "=" : "ct 11/21/2023 19:07", + "applyUserInterfaceTheme" : "ct 11/21/2023 19:13", + "closeHtmlOn:" : "ct 11/21/2023 19:41", + "fontForStyle:" : "ct 11/21/2023 19:07", + "hash" : "ct 11/21/2023 19:08", + "openHtmlOn:" : "ct 11/21/2023 19:41", + "style" : "ct 11/21/2023 19:06", + "style:" : "ct 11/21/2023 19:12", + "updateFont" : "ct 11/21/2023 19:12" } } diff --git a/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/properties.json b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/properties.json new file mode 100644 index 00000000..ae27a2a7 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextFontReference.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "style" ], + "name" : "SBETextFontReference", + "pools" : [ + ], + "super" : "TextFontReference", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/README.md b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/class/label..st b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/class/label..st new file mode 100644 index 00000000..52bfb6b4 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/class/label..st @@ -0,0 +1,4 @@ +instance creation +label: label + + ^ self new label: label \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/^equals.st b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/^equals.st new file mode 100644 index 00000000..8f281b3b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/^equals.st @@ -0,0 +1,5 @@ +comparing += other + + ^ other class == self class + and: [other label = self label] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/closeHtmlOn..st b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/closeHtmlOn..st new file mode 100644 index 00000000..1fd9f9e1 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/closeHtmlOn..st @@ -0,0 +1,4 @@ +html +closeHtmlOn: aHtmlReadWriter + + aHtmlReadWriter nextPutAll: ''. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/hash.st b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/hash.st new file mode 100644 index 00000000..0ebab93d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/hash.st @@ -0,0 +1,4 @@ +comparing +hash + + ^ self label hash \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/isOblivious.st b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/isOblivious.st new file mode 100644 index 00000000..4fd76e4f --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/isOblivious.st @@ -0,0 +1,4 @@ +testing +isOblivious + + ^ true \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/label..st b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/label..st new file mode 100644 index 00000000..47e61f6f --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/label..st @@ -0,0 +1,4 @@ +accessing +label: anObject + + label := anObject. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/label.st b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/label.st new file mode 100644 index 00000000..020ac3b5 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/label.st @@ -0,0 +1,4 @@ +accessing +label + + ^ label \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/openHtmlOn..st b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/openHtmlOn..st new file mode 100644 index 00000000..9656a1a1 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/openHtmlOn..st @@ -0,0 +1,5 @@ +html +openHtmlOn: aHtmlReadWriter + + aHtmlReadWriter nextPutAll: + ('' format: {self label}). \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/methodProperties.json new file mode 100644 index 00000000..da91ed2b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/methodProperties.json @@ -0,0 +1,11 @@ +{ + "class" : { + "label:" : "ct 11/13/2023 20:28" }, + "instance" : { + "=" : "ct 11/20/2023 21:17", + "closeHtmlOn:" : "ct 11/15/2023 19:33", + "hash" : "ct 11/20/2023 21:23", + "isOblivious" : "ct 11/13/2023 20:27", + "label" : "ct 11/13/2023 20:26", + "label:" : "ct 11/13/2023 20:26", + "openHtmlOn:" : "ct 11/15/2023 19:33" } } diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/properties.json b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/properties.json new file mode 100644 index 00000000..ecca8702 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "label" ], + "name" : "SBETextLabelAnchor", + "pools" : [ + ], + "super" : "TextAttribute", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/README.md b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/class/to..st b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/class/to..st new file mode 100644 index 00000000..83f068b0 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/class/to..st @@ -0,0 +1,6 @@ +instance creation +to: key + + ^ self new + label: key; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/^equals.st b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/^equals.st new file mode 100644 index 00000000..8f281b3b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/^equals.st @@ -0,0 +1,5 @@ +comparing += other + + ^ other class == self class + and: [other label = self label] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/actOnClickFor..st b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/actOnClickFor..st new file mode 100644 index 00000000..3af81fee --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/actOnClickFor..st @@ -0,0 +1,5 @@ +mouse events +actOnClickFor: aHelpBrowser + + self openLabelIn: aHelpBrowser. + ^ true \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/closeHtmlOn..st b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/closeHtmlOn..st new file mode 100644 index 00000000..79997ded --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/closeHtmlOn..st @@ -0,0 +1,4 @@ +html +closeHtmlOn: aHtmlReadWriter + + aHtmlReadWriter nextPutAll: ''. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/hash.st b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/hash.st new file mode 100644 index 00000000..0ebab93d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/hash.st @@ -0,0 +1,4 @@ +comparing +hash + + ^ self label hash \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/label..st b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/label..st new file mode 100644 index 00000000..5939e970 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/label..st @@ -0,0 +1,4 @@ +accessing +label: key + + label := key. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/label.st b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/label.st new file mode 100644 index 00000000..020ac3b5 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/label.st @@ -0,0 +1,4 @@ +accessing +label + + ^ label \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/openHtmlOn..st b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/openHtmlOn..st new file mode 100644 index 00000000..1ac5ee93 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/openHtmlOn..st @@ -0,0 +1,5 @@ +html +openHtmlOn: aHtmlReadWriter + + aHtmlReadWriter nextPutAll: + ('' format: {self label}). \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/openLabelIn..st b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/openLabelIn..st new file mode 100644 index 00000000..9c1ae2a6 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/openLabelIn..st @@ -0,0 +1,9 @@ +mouse events +openLabelIn: aHelpBrowser + + | book path | + book := aHelpBrowser currentTopic book. + path := book pathToLabel: self label. + path ifNil: [^ self inform: ('{1} not found :(' format: {self label})]. + + ^ self openPath: path in: aHelpBrowser \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/openPath.in..st b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/openPath.in..st new file mode 100644 index 00000000..83843ca4 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/openPath.in..st @@ -0,0 +1,17 @@ +mouse events +openPath: path in: aHelpBrowser + + | topicNode topic index textMorph | + topicNode := (path select: [:node | node wantsOwnHelpTopic]) last. + aHelpBrowser showTopicThat: [:ea | + (ea isKindOf: SBEBookHelpTopic) + and: [(topic := ea) bookNode = topicNode]]. + + topic contents ifNil: [^ self]. + index := topic contents runs findFirst: [:attrs | + attrs anySatisfy: [:attr | + (attr isKindOf: SBETextLabelAnchor) and: [attr label = self label]]]. + + textMorph := aHelpBrowser anyTextPaneWithSelector: #topicContents. + textMorph setSelection: (index to: index - 1). + self currentHand future newKeyboardFocus: textMorph. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/methodProperties.json new file mode 100644 index 00000000..58dd5f86 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/methodProperties.json @@ -0,0 +1,13 @@ +{ + "class" : { + "to:" : "ct 11/15/2023 19:48" }, + "instance" : { + "=" : "ct 11/20/2023 21:18", + "actOnClickFor:" : "ct 11/26/2023 18:23", + "closeHtmlOn:" : "ct 11/15/2023 20:01", + "hash" : "ct 11/20/2023 21:23", + "label" : "ct 11/15/2023 19:47", + "label:" : "ct 11/15/2023 19:47", + "openHtmlOn:" : "ct 11/15/2023 20:01", + "openLabelIn:" : "ct 11/26/2023 18:23", + "openPath:in:" : "ct 10/9/2025 00:27" } } diff --git a/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/properties.json b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/properties.json new file mode 100644 index 00000000..d8e37a30 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "label" ], + "name" : "SBETextLabelLink", + "pools" : [ + ], + "super" : "TextAction", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/README.md b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/class/for..st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/class/for..st new file mode 100644 index 00000000..6efccded --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/class/for..st @@ -0,0 +1,6 @@ +instance creation +for: image + + ^ self new + image: image; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/class/for.initialExtent..st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/class/for.initialExtent..st new file mode 100644 index 00000000..470e79c2 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/class/for.initialExtent..st @@ -0,0 +1,7 @@ +instance creation +for: image initialExtent: initialExtent + + ^ self new + image: image; + initialExtent: initialExtent; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/^equals.st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/^equals.st new file mode 100644 index 00000000..ed0ee62b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/^equals.st @@ -0,0 +1,6 @@ +comparing += other + + ^ other class == self class + and: [other initialExtent = self initialExtent] + and: [other imageBitsOrNil = self imageBitsOrNil] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/actOnClickFor.in.at..st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/actOnClickFor.in.at..st new file mode 100644 index 00000000..9916ec7e --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/actOnClickFor.in.at..st @@ -0,0 +1,12 @@ +mouse events +actOnClickFor: anObject in: aParagraph at: clickPoint + + | effectiveImage sketch | + effectiveImage := self image ifNil: + [self imageIn: aParagraph at: clickPoint]. + Smalltalk isMorphic ifFalse: [effectiveImage inspect. ^ true]. + sketch := SketchMorph withForm: effectiveImage. + self initialExtent ifNotNil: [:extent | + sketch extent: extent]. + sketch "openAsTool" openAsMorph. + ^ true \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/closeHtmlOn..st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/closeHtmlOn..st new file mode 100644 index 00000000..46c641c8 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/closeHtmlOn..st @@ -0,0 +1,4 @@ +html +closeHtmlOn: aHtmlReadWriter + + aHtmlReadWriter nextPutAll: ''. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/hash.st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/hash.st new file mode 100644 index 00000000..74a8b8b0 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/hash.st @@ -0,0 +1,5 @@ +comparing +hash + + ^ self initialExtent hash + bitXor: self imageBitsOrNil hash \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/image..st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/image..st new file mode 100644 index 00000000..0db6e47d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/image..st @@ -0,0 +1,4 @@ +accessing +image: aForm + + image := aForm. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/image.st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/image.st new file mode 100644 index 00000000..ebc0c576 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/image.st @@ -0,0 +1,4 @@ +accessing +image + + ^ image \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/imageBitsOrNil.st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/imageBitsOrNil.st new file mode 100644 index 00000000..7cc90814 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/imageBitsOrNil.st @@ -0,0 +1,4 @@ +private +imageBitsOrNil + + ^ (self image ifNil: [^ nil]) bits \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/imageIn.at..st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/imageIn.at..st new file mode 100644 index 00000000..ccc63163 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/imageIn.at..st @@ -0,0 +1,8 @@ +private +imageIn: aParagraph at: aPoint + + | index | + index := (aParagraph characterBlockAtPoint: aPoint) stringIndex. + ^ ((aParagraph text attributesAt: index) + detect: [:attr | attr isKindOf: SBETextAnchor]) + image \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/initialExtent..st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/initialExtent..st new file mode 100644 index 00000000..f1a2f9de --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/initialExtent..st @@ -0,0 +1,4 @@ +accessing +initialExtent: aPoint + + initialExtent := aPoint. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/initialExtent.st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/initialExtent.st new file mode 100644 index 00000000..15b4e0a4 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/initialExtent.st @@ -0,0 +1,4 @@ +accessing +initialExtent + + ^ initialExtent \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/openHtmlOn..st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/openHtmlOn..st new file mode 100644 index 00000000..7233dee7 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/openHtmlOn..st @@ -0,0 +1,11 @@ +html +openHtmlOn: aHtmlReadWriter + + | data | + data := (ByteArray streamContents: [:stream | + PNGReadWriter putForm: self image onStream: stream]) + base64Encoded. + + aHtmlReadWriter nextPutAll: + ('' format: + {data. self initialExtent storeString}). \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/methodProperties.json new file mode 100644 index 00000000..c710b120 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/methodProperties.json @@ -0,0 +1,16 @@ +{ + "class" : { + "for:" : "ct 11/15/2023 19:43", + "for:initialExtent:" : "ct 11/15/2023 19:45" }, + "instance" : { + "=" : "ct 10/6/2025 00:33", + "actOnClickFor:in:at:" : "ct 10/6/2025 01:24", + "closeHtmlOn:" : "ct 11/15/2023 20:01", + "hash" : "ct 10/6/2025 00:33", + "image" : "ct 11/15/2023 19:43", + "image:" : "ct 11/15/2023 19:43", + "imageBitsOrNil" : "ct 10/6/2025 00:33", + "imageIn:at:" : "ct 10/6/2025 00:56", + "initialExtent" : "ct 11/15/2023 19:45", + "initialExtent:" : "ct 11/15/2023 19:45", + "openHtmlOn:" : "ct 11/15/2023 20:00" } } diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/properties.json b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/properties.json new file mode 100644 index 00000000..a5638903 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/properties.json @@ -0,0 +1,15 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "image", + "initialExtent" ], + "name" : "SBETextOpenImageAction", + "pools" : [ + ], + "super" : "TextAction", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-Book.package/Text.extension/instance/sbeAllAttributes.st b/SmalltalkSources/SBE-Book.package/Text.extension/instance/sbeAllAttributes.st new file mode 100644 index 00000000..96f950b5 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Text.extension/instance/sbeAllAttributes.st @@ -0,0 +1,8 @@ +*SBE-Book-emphasis +sbeAllAttributes + + self flag: #moveUpstream. + ^ OrderedCollection streamContents: [:stream | + self runs do: [:attributes | + attributes do: [:attribute | + stream nextPut: attribute]]] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/Text.extension/instance/sbeStoreHtmlString.st b/SmalltalkSources/SBE-Book.package/Text.extension/instance/sbeStoreHtmlString.st new file mode 100644 index 00000000..4ff31eff --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Text.extension/instance/sbeStoreHtmlString.st @@ -0,0 +1,8 @@ +*SBE-Book-converting +sbeStoreHtmlString + + ^ '(SBEHtmlReadWriter on: {1} readStream) nextText' format: + {((String streamContents: [:stream | + (SBEHtmlReadWriter on: stream) nextPutText: self]) + copyReplaceAll: (String value: 1) with: '') + fullPrintString} \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/Text.extension/methodProperties.json b/SmalltalkSources/SBE-Book.package/Text.extension/methodProperties.json new file mode 100644 index 00000000..a30b7ab5 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Text.extension/methodProperties.json @@ -0,0 +1,6 @@ +{ + "class" : { + }, + "instance" : { + "sbeAllAttributes" : "ct 11/21/2023 13:56", + "sbeStoreHtmlString" : "ct 11/20/2023 20:37" } } diff --git a/SmalltalkSources/SBE-Book.package/Text.extension/properties.json b/SmalltalkSources/SBE-Book.package/Text.extension/properties.json new file mode 100644 index 00000000..885994fd --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Text.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "Text" } diff --git a/SmalltalkSources/SBE-Book.package/monticello.meta/categories.st b/SmalltalkSources/SBE-Book.package/monticello.meta/categories.st new file mode 100644 index 00000000..70aec9c2 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/monticello.meta/categories.st @@ -0,0 +1 @@ +SystemOrganization addCategory: #'SBE-Book'! diff --git a/SmalltalkSources/SBE-Book.package/monticello.meta/initializers.st b/SmalltalkSources/SBE-Book.package/monticello.meta/initializers.st new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/properties.json b/SmalltalkSources/SBE-Book.package/properties.json new file mode 100644 index 00000000..f037444a --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/properties.json @@ -0,0 +1,2 @@ +{ + } diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/.filetree b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/.filetree new file mode 100644 index 00000000..8998102c --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/.filetree @@ -0,0 +1,4 @@ +{ + "noMethodMetaData" : true, + "separateMethodMetaAndSource" : false, + "useCypressPropertiesFile" : true } diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/.squot-contents b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/.squot-contents new file mode 100644 index 00000000..cf73afb9 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/.squot-contents @@ -0,0 +1,6 @@ +SquotTrackedObjectMetadata { + #objectClassName : #PackageInfo, + #id : UUID [ '16fa07be5b1e4df7a4ea725e677c5eda' ], + #objectsReplacedByNames : true, + #serializer : #SquotCypressCodeSerializer +} \ No newline at end of file diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/getImage..st b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/getImage..st new file mode 100644 index 00000000..c40bdfd4 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/getImage..st @@ -0,0 +1,29 @@ +*SBE-BookCompatibility-Squeak60-private +getImage: uri + + (uri sbeBeginsWith: 'code://' caseSensitive: false) ifTrue: [ + | expression | + "Same support for Smalltalk expressions as in TextURL >> #actOnClickFor:." + self shallEvaluateResources ifFalse: [^ nil]. + expression := uri allButFirst: 7. + ^ ([Compiler evaluate: expression] ifError: [nil]) + ifNotNil: [:object | object isForm ifTrue: [object] ifFalse: [nil]]]. + + (uri sbeBeginsWith: 'data:' caseSensitive: false) ifTrue: [ | data mediaType separator | + separator := uri indexOf: $, ifAbsent: [^ nil]. + mediaType := uri copyFrom: 6 to: separator - 1. + data := uri allButFirst: separator. + data := (mediaType sbeEndsWith: ';base64' caseSensitive: false) + ifTrue: [ + mediaType := mediaType allButLast: 7. + [Base64MimeConverter mimeDecodeToBytes: data readStream] ifError: [nil]] + ifFalse: [data asByteArray readStream]. + ^ [ImageReadWriter formFromStream: data] ifError: [nil]]. + + self shallDownloadResources ifFalse: [^ nil]. + ^ (Smalltalk classNamed: #WebClient) ifNotNil: [:client | + "Maybe we can have this via an AppRegistry at some point. Maybe extend WebBrowser." + ([client httpGet: uri] ifError: [nil]) ifNotNil: [:response | + response code = 200 ifFalse: [nil] ifTrue: [ + [Form fromBinaryStream: response content asByteArray readStream] + ifError: [nil]]]] \ No newline at end of file diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/hasTag.name..st b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/hasTag.name..st new file mode 100644 index 00000000..ea5de5b0 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/hasTag.name..st @@ -0,0 +1,7 @@ +*SBE-BookCompatibility-Squeak60-private +hasTag: aTag name: tagNameLt + + | after | + (aTag sbeBeginsWith: tagNameLt caseSensitive: false) ifFalse: [^ false]. + after := aTag at: tagNameLt size + 1 ifAbsent: [^ true]. + ^ after = $> or: [after isSeparator] \ No newline at end of file diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/htmlEscape..st b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/htmlEscape..st new file mode 100644 index 00000000..ba2e08b4 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/htmlEscape..st @@ -0,0 +1,9 @@ +*SBE-BookCompatibility-Squeak60-private +htmlEscape: aString + + | escapeSequence | + escapeSequence := aString copyFrom: 2 to: aString size - 1. + escapeSequence first = $# ifTrue: [^ self htmlEscapeNumber: escapeSequence allButFirst]. + (String htmlEntities at: (aString copyFrom: 2 to: aString size - 1) ifAbsent: []) + ifNotNil: [:char | ^ char]. + ^ nil \ No newline at end of file diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/htmlEscapeNumber..st b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/htmlEscapeNumber..st new file mode 100644 index 00000000..48cbb8ee --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/htmlEscapeNumber..st @@ -0,0 +1,9 @@ +*SBE-BookCompatibility-Squeak60-private +htmlEscapeNumber: aString + + | number | + number := aString first = $x + ifTrue: ['16r', aString allButFirst] + ifFalse: [aString]. + ^ number asNumber asCharacter + \ No newline at end of file diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/htmlEscapes..st b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/htmlEscapes..st new file mode 100644 index 00000000..4752c07e --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/htmlEscapes..st @@ -0,0 +1,11 @@ +*SBE-BookCompatibility-Squeak60-private +htmlEscapes: aString + + | lastIndex nextIndex | + nextIndex := aString indexOf: $& startingAt: (lastIndex := 1) ifAbsent: [^ aString]. + ^ String new: aString size * 11 // 10 "+10%" streamContents: [:tmpStream | + [tmpStream next: nextIndex - lastIndex putAll: aString startingAt: lastIndex. + nextIndex := aString indexOf: $; startingAt: (lastIndex := nextIndex) ifAbsent: [^ aString]. + tmpStream nextPut: (self htmlEscape: (aString copyFrom: lastIndex to: nextIndex))] + doWhileTrue: [(nextIndex := aString indexOf: $& startingAt: (lastIndex := nextIndex + 1)) > 0]. + tmpStream next: aString size - lastIndex + 1 putAll: aString startingAt: lastIndex] \ No newline at end of file diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/searchTag.forAttribute..st b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/searchTag.forAttribute..st new file mode 100644 index 00000000..8a20de72 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/searchTag.forAttribute..st @@ -0,0 +1,20 @@ +*SBE-BookCompatibility-Squeak60-private +searchTag: aTag forAttribute: attributeName + + | startIndex stopIndex | + startIndex := aTag findString: attributeName startingAt: 1 caseSensitive: false. + startIndex = 0 ifTrue: [^ nil]. + + startIndex := startIndex + attributeName size - 1. + [(aTag at: (startIndex := startIndex + 1)) isSeparator] whileTrue. + (aTag at: startIndex) = $= ifFalse: [^ nil]. + + [(aTag at: (startIndex := startIndex + 1)) isSeparator] whileTrue. + (aTag at: startIndex) = $" + ifTrue: [ + startIndex := startIndex + 1. + stopIndex := aTag indexOf: $" startingAt: startIndex + 1] + ifFalse: [ + stopIndex := aTag indexOfAnyOf: ' >' startingAt: startIndex + 1]. + stopIndex = 0 ifTrue: [^ nil]. + ^ self htmlEscapes: (aTag copyFrom: startIndex to: stopIndex - 1) \ No newline at end of file diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/methodProperties.json b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/methodProperties.json new file mode 100644 index 00000000..3dda9806 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/methodProperties.json @@ -0,0 +1,10 @@ +{ + "class" : { + }, + "instance" : { + "getImage:" : "ct 11/21/2023 21:52", + "hasTag:name:" : "ct 11/21/2023 21:52", + "htmlEscape:" : "ct 5/20/2023 17:34", + "htmlEscapeNumber:" : "ct 5/20/2023 17:35", + "htmlEscapes:" : "mt 5/22/2023 11:01", + "searchTag:forAttribute:" : "ct 5/19/2023 23:36" } } diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/properties.json b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/properties.json new file mode 100644 index 00000000..4b97b0c0 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "SBEHtmlReadWriter" } diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/instance/sbeBeginsWith.caseSensitive..st b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/instance/sbeBeginsWith.caseSensitive..st new file mode 100644 index 00000000..233a4dfc --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/instance/sbeBeginsWith.caseSensitive..st @@ -0,0 +1,12 @@ +*SBE-BookCompatibility-Squeak60 +sbeBeginsWith: sequence caseSensitive: caseSensitive + "Answer if the receiver starts with the argument collection." + + | index sequenceSize | + caseSensitive ifTrue: [^ self beginsWith: sequence]. + sequenceSize := sequence size. + self size < sequenceSize ifTrue: [ ^false ]. + index := 0. + [ (index := index + 1) <= sequenceSize ] whileTrue: [ + ((sequence at: index) sameAs: (self at: index)) ifFalse: [ ^false ] ]. + ^true \ No newline at end of file diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/instance/sbeEndsWith.caseSensitive..st b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/instance/sbeEndsWith.caseSensitive..st new file mode 100644 index 00000000..73481f75 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/instance/sbeEndsWith.caseSensitive..st @@ -0,0 +1,13 @@ +*SBE-BookCompatibility-Squeak60 +sbeEndsWith: sequence caseSensitive: caseSensitive + "Answer if the receiver ends with the argument collection." + + | index sequenceSize offset | + caseSensitive ifTrue: [^ self endsWith: sequence]. + sequence isString ifFalse: [ ^super endsWith: sequence ]. + sequenceSize := sequence size. + (offset := self size - sequenceSize) < 0 ifTrue: [ ^false ]. + index := 0. + [ (index := index + 1) <= sequenceSize ] whileTrue: [ + ((sequence at: index) sameAs: (self at: index + offset)) ifFalse: [ ^false ] ]. + ^true \ No newline at end of file diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/methodProperties.json b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/methodProperties.json new file mode 100644 index 00000000..40bb18a9 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/methodProperties.json @@ -0,0 +1,6 @@ +{ + "class" : { + }, + "instance" : { + "sbeBeginsWith:caseSensitive:" : "ct 11/21/2023 21:11", + "sbeEndsWith:caseSensitive:" : "ct 11/21/2023 21:11" } } diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/properties.json b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/properties.json new file mode 100644 index 00000000..c2138507 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "String" } diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/Text.extension/instance/findString..st b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/Text.extension/instance/findString..st new file mode 100644 index 00000000..208de446 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/Text.extension/instance/findString..st @@ -0,0 +1,4 @@ +*SBE-BookCompatibility-Squeak60-accessing-pseudo-override +findString: subString + + ^ self asString findString: subString \ No newline at end of file diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/Text.extension/methodProperties.json b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/Text.extension/methodProperties.json new file mode 100644 index 00000000..959628df --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/Text.extension/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "findString:" : "ct 11/21/2023 21:11" } } diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/Text.extension/properties.json b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/Text.extension/properties.json new file mode 100644 index 00000000..885994fd --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/Text.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "Text" } diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/monticello.meta/categories.st b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/monticello.meta/categories.st new file mode 100644 index 00000000..4d61249d --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/monticello.meta/categories.st @@ -0,0 +1 @@ +SystemOrganization addCategory: #'SBE-BookCompatibility-Squeak60'! diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/monticello.meta/initializers.st b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/monticello.meta/initializers.st new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/properties.json b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/properties.json new file mode 100644 index 00000000..f037444a --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/properties.json @@ -0,0 +1,2 @@ +{ + } diff --git a/SmalltalkSources/SBE-ExtractBook.package/.filetree b/SmalltalkSources/SBE-ExtractBook.package/.filetree new file mode 100644 index 00000000..8998102c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/.filetree @@ -0,0 +1,4 @@ +{ + "noMethodMetaData" : true, + "separateMethodMetaAndSource" : false, + "useCypressPropertiesFile" : true } diff --git a/SmalltalkSources/SBE-ExtractBook.package/.squot-contents b/SmalltalkSources/SBE-ExtractBook.package/.squot-contents new file mode 100644 index 00000000..d907733c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/.squot-contents @@ -0,0 +1,6 @@ +SquotTrackedObjectMetadata { + #objectClassName : #PackageInfo, + #id : UUID [ '5898a7ae385b44a6a9abdac22fdb741d' ], + #objectsReplacedByNames : true, + #serializer : #SquotCypressCodeSerializer +} \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/instance/sbeType.st b/SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/instance/sbeType.st new file mode 100644 index 00000000..1b888fbd --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/instance/sbeType.st @@ -0,0 +1,12 @@ +*SBE-ExtractBook +sbeType + + ^ (String streamContents: [:stream | + self type first = $_ ifTrue: + [stream nextPut: 'basic']. + self type findFeatures do: [:ea | + stream nextPutAll: + (stream position > 0 + ifTrue: [ea capitalized] + ifFalse: [ea])]]) + asSymbol \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/instance/sbeVisit..st b/SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/instance/sbeVisit..st new file mode 100644 index 00000000..c4b29a18 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/instance/sbeVisit..st @@ -0,0 +1,11 @@ +*SBE-ExtractBook +sbeVisit: extractor + + | selector | + selector := ('visit{1}:' format: {self sbeType capitalized}) + asSymbol. + (extractor respondsTo: selector) ifFalse: + [selector := #basicVisitAny:]. + ^ extractor + perform: selector + with: self \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/methodProperties.json new file mode 100644 index 00000000..18edb5df --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/methodProperties.json @@ -0,0 +1,6 @@ +{ + "class" : { + }, + "instance" : { + "sbeType" : "ct 10/19/2023 13:03", + "sbeVisit:" : "ct 10/19/2023 11:45" } } diff --git a/SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/properties.json b/SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/properties.json new file mode 100644 index 00000000..8f78f958 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "DCBlock" } diff --git a/SmalltalkSources/SBE-ExtractBook.package/DCLineBreak.extension/instance/sbeVisit..st b/SmalltalkSources/SBE-ExtractBook.package/DCLineBreak.extension/instance/sbeVisit..st new file mode 100644 index 00000000..0627905d --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/DCLineBreak.extension/instance/sbeVisit..st @@ -0,0 +1,4 @@ +*SBE-ExtractBook +sbeVisit: extractor + + ^ extractor basicVisitLineBreak: self \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/DCLineBreak.extension/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/DCLineBreak.extension/methodProperties.json new file mode 100644 index 00000000..3111ae5d --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/DCLineBreak.extension/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "sbeVisit:" : "ct 10/19/2023 11:40" } } diff --git a/SmalltalkSources/SBE-ExtractBook.package/DCLineBreak.extension/properties.json b/SmalltalkSources/SBE-ExtractBook.package/DCLineBreak.extension/properties.json new file mode 100644 index 00000000..269fe893 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/DCLineBreak.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "DCLineBreak" } diff --git a/SmalltalkSources/SBE-ExtractBook.package/DCText.extension/instance/sbeType.st b/SmalltalkSources/SBE-ExtractBook.package/DCText.extension/instance/sbeType.st new file mode 100644 index 00000000..09c7db87 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/DCText.extension/instance/sbeType.st @@ -0,0 +1,4 @@ +*SBE-ExtractBook +sbeType + + ^ nil \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/DCText.extension/instance/sbeVisit..st b/SmalltalkSources/SBE-ExtractBook.package/DCText.extension/instance/sbeVisit..st new file mode 100644 index 00000000..b7756e48 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/DCText.extension/instance/sbeVisit..st @@ -0,0 +1,4 @@ +*SBE-ExtractBook +sbeVisit: extractor + + ^ extractor basicVisitText: self contents \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/DCText.extension/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/DCText.extension/methodProperties.json new file mode 100644 index 00000000..f72cddd3 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/DCText.extension/methodProperties.json @@ -0,0 +1,6 @@ +{ + "class" : { + }, + "instance" : { + "sbeType" : "ct 10/19/2023 12:20", + "sbeVisit:" : "ct 10/19/2023 12:29" } } diff --git a/SmalltalkSources/SBE-ExtractBook.package/DCText.extension/properties.json b/SmalltalkSources/SBE-ExtractBook.package/DCText.extension/properties.json new file mode 100644 index 00000000..31eae5ae --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/DCText.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "DCText" } diff --git a/SmalltalkSources/SBE-ExtractBook.package/Integer.extension/instance/sbePrintStringAlph.st b/SmalltalkSources/SBE-ExtractBook.package/Integer.extension/instance/sbePrintStringAlph.st new file mode 100644 index 00000000..b7fd3478 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/Integer.extension/instance/sbePrintStringAlph.st @@ -0,0 +1,5 @@ +*SBE-ExtractBook-converting +sbePrintStringAlph + + (self between: 1 and: 26) ifTrue: [^ String value: $A asciiValue - 1 + self]. + ^ String empty \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/Integer.extension/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/Integer.extension/methodProperties.json new file mode 100644 index 00000000..b63f0838 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/Integer.extension/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "sbePrintStringAlph" : "ct 11/25/2023 20:12" } } diff --git a/SmalltalkSources/SBE-ExtractBook.package/Integer.extension/properties.json b/SmalltalkSources/SBE-ExtractBook.package/Integer.extension/properties.json new file mode 100644 index 00000000..d27420be --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/Integer.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "Integer" } diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/README.md b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/class/example.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/class/example.st new file mode 100644 index 00000000..1ae4c2ab --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/class/example.st @@ -0,0 +1,13 @@ +documentation +example + + | book dir | + dir := FileSystem disk root resolve: '/path/to/SqueakByExample-english'. + book := SBEBookExtractor new + imageScaleFactor: 2.5; + squeakVersion: (SystemVersion new version: 'Squeak6.0'); + extractFromRootFile: dir / 'SBE.tex'; + book. + book pdfUrl: 'https://github.com/hpi-swa-lab/SqueakByExample-english/releases/download/6.0/SBE-6.0.pdf'. + "SBEHelp book: book." + ^ book asHelpTopic open \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitRoot..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitRoot..st new file mode 100644 index 00000000..93ada17c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitRoot..st @@ -0,0 +1,17 @@ +visiting - nodes +basicVisitRoot: node + + | oldNode result | + result := super basicVisitRoot: node. + + file = rootFile ifTrue: + [self assert: book parseNode isNil. + book parseNode: node. + + oldNode := nodeStack top. + self stream contents withBlanksTrimmed ifNotEmpty: [:text | + self assert: oldNode text isNil. + oldNode text: text]]. + self flag: #todo. "requires SOH to be not a separator!" + + ^ result \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitText..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitText..st new file mode 100644 index 00000000..637100c5 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitText..st @@ -0,0 +1,36 @@ +visiting - nodes +basicVisitText: aStringOrText + + (aStringOrText caseOf: {['\chapter'] -> [#chapter]. ['\section'] -> [#section]} otherwise: []) "work around some other grammar slips ..." + ifNotNil: [:type | + parseStack push: + (Generator on: [:gen | + self assert: gen next isNil. "whyever" + + DCBlock new + type: type; + addMorphBack: + (DCText new contents: aStringOrText asString; yourself); + addMorphBack: + gen peek; + sbeVisit: self]). + ^ self]. + + pendingLabels ifNotEmpty: + [aStringOrText ifNotEmpty: + [| currentLabels | + currentLabels := pendingLabels copy. + pendingLabels removeAll. + self stream + withAttributes: + (aStringOrText isText + ifTrue: [aStringOrText attributesAt: 1] + ifFalse: [#()]) + do: + [self basicVisitText: aStringOrText first asString]. + currentLabels do: [:label | + self emitLabel: label]. + self basicVisitText: aStringOrText allButFirst. + ^ self]]. + + ^ super basicVisitText: aStringOrText \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/book.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/book.st new file mode 100644 index 00000000..1062452f --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/book.st @@ -0,0 +1,4 @@ +accessing +book + + ^ book \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandAppendix..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandAppendix..st new file mode 100644 index 00000000..64a31de5 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandAppendix..st @@ -0,0 +1,5 @@ +visiting - commands +commandAppendix: arguments + + + appendix := true. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandCaption..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandCaption..st new file mode 100644 index 00000000..e3d278ae --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandCaption..st @@ -0,0 +1,8 @@ +visiting - commands +commandCaption: arguments + + + self assert: arguments size = 1. + self basicVisitLineBreak: nil; basicVisitLineBreak: nil. + ^ self emitCaptionDuring: + [self visit: arguments first] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandCompareStringsDo..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandCompareStringsDo..st new file mode 100644 index 00000000..503d0a3c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandCompareStringsDo..st @@ -0,0 +1,13 @@ +visiting - commands +commandCompareStringsDo: arguments + + + | first second | + self assert: arguments size = 4. + + first := self contentsIn: arguments first. + second := self contentsIn: arguments second. + self visit: + (first = second + ifTrue: [arguments third] + ifFalse: [arguments fourth]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandCt..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandCt..st new file mode 100644 index 00000000..93a5c983 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandCt..st @@ -0,0 +1,35 @@ +visiting - commands +commandCt: arguments + + + arguments size >= 1 ifTrue: + [self emitCodeDuring: + [self visit: arguments first]. + + arguments allButFirstDo: [:arg | + self visit: arg]. + ^ self]. + + self assert: arguments isEmpty. + parseStack push: + (Generator on: [:gen | + | content contents end endIndex | + self assert: gen next isNil. "whyever" + + contents := '' writeStream. + content := self contentsIn: gen next. + end := content first. + content := content allButFirst. + endIndex := content indexOf: end. + endIndex > 0 ifFalse: + [contents nextPutAll: content. + [:exit | + [content := self contentsIn: gen peek. + endIndex := content indexOf: end. + endIndex > 0 ifTrue: exit. + contents nextPutAll: content. + gen next] repeat] valueWithExit]. + contents nextPutAll: (content first: endIndex - 1). + self emitCode: contents contents. + + self basicVisitText: (content allButFirst: endIndex)]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandDoThis..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandDoThis..st new file mode 100644 index 00000000..3e636edd --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandDoThis..st @@ -0,0 +1,8 @@ +visiting - commands +commandDoThis: arguments + + + self assert: arguments size = 1. + + self emitDoThisDuring: + [self visit: arguments first]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandEmph..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandEmph..st new file mode 100644 index 00000000..ebc2d608 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandEmph..st @@ -0,0 +1,7 @@ +visiting - commands +commandEmph: arguments + + + self assert: arguments size = 1. + self emitEmphasisDuring: + [self visit: arguments first]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandFootnote..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandFootnote..st new file mode 100644 index 00000000..e53410c0 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandFootnote..st @@ -0,0 +1,10 @@ +visiting - commands +commandFootnote: arguments + + + self assert: arguments size = 1. + + self + basicVisitText: ' ('; + basicVisitText: (self contentsIn: arguments first); + basicVisitText: ')'. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandGo..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandGo..st new file mode 100644 index 00000000..3279da8b --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandGo..st @@ -0,0 +1,5 @@ +visiting - commands +commandGo: arguments + + + self emitGo. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandImportant..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandImportant..st new file mode 100644 index 00000000..bca6dbb9 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandImportant..st @@ -0,0 +1,11 @@ +visiting - commands +commandImportant: arguments + + + self basicVisitLineBreak: arguments; basicVisitLineBreak: arguments. + + self emitImportantDuring: + [arguments do: [:arg | + self visit: arg]]. + + self basicVisitLineBreak: arguments; basicVisitLineBreak: arguments. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLambda..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLambda..st new file mode 100644 index 00000000..1795dfe5 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLambda..st @@ -0,0 +1,6 @@ +visiting - commands - characters and spacing +commandLambda: arguments + + + self assert: arguments isEmpty. + self basicVisitText: 'lambda'. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLstNewEnvironment..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLstNewEnvironment..st new file mode 100644 index 00000000..d310b7d1 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLstNewEnvironment..st @@ -0,0 +1,50 @@ +visiting - commands +commandLstNewEnvironment: arguments + + + | name allArguments allOptions | + self assert: arguments size = 1. + name := (self fullContentsInGroup: arguments first optionalBrackets: true) asString. + + allOptions := OrderedCollection new. + allArguments := OrderedCollection with: arguments first. + + parseStack push: + (Generator on: [:gen | + | handler | + self assert: gen next isNil. "whyever" + + (1 to: 2) allSatisfy: [:i | + (gen peek sbeType isNil and: [gen peek contents = '[']) + ifTrue: + [gen next. + allOptions addLast: gen next. + self assert: gen next contents = ']']; + yourself]. + allOptions ifNotEmpty: + [allArguments addLast: + (DCBlock new + type: #brackGroupArgc; + addMorphBack: + (DCText new contents: '['; yourself); + addMorphBack: allOptions first; + addMorphBack: + (DCText new contents: ']'; yourself); + yourself)]. + + 2 timesRepeat: + [self assert: gen peek sbeType = #curlyGroup. + allArguments addLast: gen next]. + + handler := self commandNewEnvironment: allArguments. + environmentHandlers at: name put: + [:extractor :contentBlock :options | + handler + value: extractor + value: + [extractor + environmentCode: contentBlock + options: #()] + value: options]. + + "todo?"]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLstSet..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLstSet..st new file mode 100644 index 00000000..c454bb47 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLstSet..st @@ -0,0 +1,18 @@ +visiting - commands +commandLstSet: arguments + + + | options | + self assert: arguments size = 1. + options := self mapFromGroup: arguments first. + + options at: 'caption' ifPresent: [:nodes | + self emitCaptionDuring: + [nodes do: [:node | + self visit: node]]. + self basicVisitLineBreak: nil; basicVisitLineBreak: nil]. + options at: 'label' ifPresent: [:nodes | + | key | + self assert: nodes first sbeType = #curlyGroup. + key := (self contentsIn: nodes first) asString. + self emitLabel: key]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandMenu..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandMenu..st new file mode 100644 index 00000000..65c6c628 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandMenu..st @@ -0,0 +1,7 @@ +visiting - commands +commandMenu: arguments + + + self assert: arguments size = 1. + self emitMenuDuring: + [self visit: arguments first]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandNumFileTreeMethodInput..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandNumFileTreeMethodInput..st new file mode 100644 index 00000000..943b400c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandNumFileTreeMethodInput..st @@ -0,0 +1,41 @@ +visiting - commands +commandNumFileTreeMethodInput: arguments + + + | listingFile listingSource | + self flag: #workaround. "we wanted to implement lstinputlisting instead but the grammar stumbles up on this command's definition" + nodeStack size > 1 ifFalse: [^ self]. "yeah due to same hickup" + self assert: arguments isEmpty. + + parseStack push: + (Generator on: [:gen | + | allArguments | + self assert: gen next isNil. "whyever" + + allArguments := OrderedCollection new: 3. + + self assert: (gen peek sbeType isNil and: [gen next contents = '[']). + allArguments addLast: gen next. + self assert: gen next contents = ']'. + + 2 timesRepeat: + [[gen atEnd not and: [(#(linebreak lineComment) includes: gen peek sbeType) or: [gen peek sbeType isNil and: [gen peek contents isAllSeparators]]]] whileTrue: + [gen next]. + allArguments addLast: gen next]. + + self assert: parseStack pop == gen. + + self emitCaptionDuring: + [self emitEmphasisDuring: + [self visit: allArguments second]]. + self basicVisitLineBreak: nil; basicVisitLineBreak: nil. + + self emitLabel: 'mth:' , (self contentsIn: allArguments first) asString. + + listingFile := self tryResolveFile: (self contentsIn: allArguments third) asString. + listingSource := listingFile contents copyReplaceAll: String crlf with: String cr. + self + environmentCode: [self basicVisitText: listingSource] + options: #(). + + parseStack push: gen]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandShort..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandShort..st new file mode 100644 index 00000000..35f0e6b4 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandShort..st @@ -0,0 +1,7 @@ +visiting - commands +commandShort: arguments + "" "disabled!" + + self assert: arguments size = 1. + self emitEmphasisDuring: + [self visit: arguments first]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandSqueakVersion..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandSqueakVersion..st new file mode 100644 index 00000000..8c54827b --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandSqueakVersion..st @@ -0,0 +1,6 @@ +visiting - commands +commandSqueakVersion: arguments + + + self assert: arguments isEmpty. + self basicVisitText: self squeakVersionString. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandSubfigure..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandSubfigure..st new file mode 100644 index 00000000..8d839f2c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandSubfigure..st @@ -0,0 +1,29 @@ +visiting - commands +commandSubfigure: arguments + + + | name | + self assert: arguments isEmpty. + + parseStack push: + (Generator on: [:gen | + | next | + self assert: gen next isNil. "whyever" + + self assert: (gen peek sbeType isNil and: [gen next contents = '[']). + + name := gen next. + self assert: name sbeType = #text. + + self assert: (gen peek sbeType isNil and: [gen next contents = ']']). + + next := gen peek. + self assert: parseStack pop == gen. + + self visit: next. + + self basicVisitLineBreak: nil; basicVisitLineBreak: nil. + self emitCaptionDuring: + [self visit: name]. + + parseStack push: gen]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandTableOfContents..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandTableOfContents..st new file mode 100644 index 00000000..d7fedd8c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandTableOfContents..st @@ -0,0 +1,7 @@ +visiting - commands +commandTableOfContents: arguments + + + counters at: #chapter put: + (counters at: #chapter ifAbsent: [0]) + + 1. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandTextIPA..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandTextIPA..st new file mode 100644 index 00000000..b3d51bd1 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandTextIPA..st @@ -0,0 +1,6 @@ +visiting - commands +commandTextIPA: arguments + + + self flag: #hacked. + self emitImage: self monticelloIPAImage. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandTextbf..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandTextbf..st new file mode 100644 index 00000000..a12cade9 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandTextbf..st @@ -0,0 +1,18 @@ +visiting - commands +commandTextbf: arguments + + + arguments size >= 1 ifTrue: + [self emitBoldDuring: + [self visit: arguments first]. + + arguments allButFirstDo: [:arg | + self visit: arg]. + ^ self]. + + parseStack push: + (Generator on: [:gen | + self assert: gen next isNil. "whyever" + + self emitBoldDuring: + [self visit: gen next]]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandURL..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandURL..st new file mode 100644 index 00000000..f968c3dc --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandURL..st @@ -0,0 +1,9 @@ +visiting - commands +commandURL: arguments + + + | url | + self assert: arguments size = 1. + url := (self contentsIn: arguments first) asString. + self emitURL: url. + \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandVerb..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandVerb..st new file mode 100644 index 00000000..6adf70f9 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandVerb..st @@ -0,0 +1,5 @@ +visiting - commands +commandVerb: arguments + + + ^ self commandCt: arguments \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/copyForContents.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/copyForContents.st new file mode 100644 index 00000000..93ea038d --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/copyForContents.st @@ -0,0 +1,6 @@ +private +copyForContents + + ^ super copyForContents + squeakVersion: squeakVersion; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/defaultImageScaleFactor.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/defaultImageScaleFactor.st new file mode 100644 index 00000000..7433bec9 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/defaultImageScaleFactor.st @@ -0,0 +1,4 @@ +initialize-release +defaultImageScaleFactor + + ^ 1 \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/doThisImage.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/doThisImage.st new file mode 100644 index 00000000..afebfe72 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/doThisImage.st @@ -0,0 +1,4 @@ +private +doThisImage + + ^ MenuIcons squeakLogoIcon \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/doThisImageDyeMode.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/doThisImageDyeMode.st new file mode 100644 index 00000000..72afb6dc --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/doThisImageDyeMode.st @@ -0,0 +1,4 @@ +private +doThisImageDyeMode + + ^ #dockingLogoColor \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitBoldDuring..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitBoldDuring..st new file mode 100644 index 00000000..22c50c54 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitBoldDuring..st @@ -0,0 +1,6 @@ +emitting +emitBoldDuring: aBlock + + ^ self stream + withAttribute: TextEmphasis bold + do: aBlock \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCaptionDuring..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCaptionDuring..st new file mode 100644 index 00000000..cd8026a8 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCaptionDuring..st @@ -0,0 +1,6 @@ +emitting +emitCaptionDuring: aBlock + + ^ self stream + withAttribute: SBETextFontReference smaller + do: aBlock \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCode..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCode..st new file mode 100644 index 00000000..719971dc --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCode..st @@ -0,0 +1,6 @@ +emitting +emitCode: aStringOrText + + ^ self emitCodeDuring: + [self stream nextPutAll: aStringOrText. + previousLineBreaks := 0] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCodeDuring..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCodeDuring..st new file mode 100644 index 00000000..f5b244a2 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCodeDuring..st @@ -0,0 +1,23 @@ +emitting +emitCodeDuring: aBlock + + ^ self stream withAttribute: (SBETextColor property: #integer scope: #SHTextStylerST80) do: + [| oldStream wasVerbatim code | + wasVerbatim := verbatim. + verbatim := true. + [oldStream := self stream. + stream := TextStream on: Text new. + [aBlock value. + + code := self stream contents. + code := (Dictionary new + at: 'BANG' put: '!'; + at: 'UNDERSCORE' put: '_'; + associations) inject: code into: [:oldCode :replacement | + oldCode copyReplaceAll: replacement key with: replacement value]] + ensure: + [stream := oldStream]. + + self basicVisitText: code] + ensure: + [verbatim := wasVerbatim]] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitDoThisDuring..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitDoThisDuring..st new file mode 100644 index 00000000..cee79e0a --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitDoThisDuring..st @@ -0,0 +1,14 @@ +emitting +emitDoThisDuring: aBlock + + "self basicVisitText: 'Do this:\\' withCRs." + | result | + self basicVisitLineBreak: aBlock; basicVisitLineBreak: aBlock. + self stream + withAttributes: {TextIndent tabs: 1. TextEmphasis italic} + do: + [self emitImage: self doThisImage dyeMode: self doThisImageDyeMode. + self stream space. + result := aBlock value]. + self basicVisitLineBreak: aBlock; basicVisitLineBreak: aBlock. + ^ result \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitEmphasis..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitEmphasis..st new file mode 100644 index 00000000..d6376bdd --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitEmphasis..st @@ -0,0 +1,5 @@ +emitting +emitEmphasis: aStringOrText + + ^ self emitEmphasisDuring: + [self stream nextPutAll: aStringOrText] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitEmphasisDuring..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitEmphasisDuring..st new file mode 100644 index 00000000..a27ce628 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitEmphasisDuring..st @@ -0,0 +1,6 @@ +emitting +emitEmphasisDuring: aBlock + + ^ self stream + withAttribute: TextEmphasis italic + do: aBlock \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitGo.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitGo.st new file mode 100644 index 00000000..bce05355 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitGo.st @@ -0,0 +1,4 @@ +emitting +emitGo + + self basicVisitText: '>'. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st new file mode 100644 index 00000000..6e338420 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st @@ -0,0 +1,9 @@ +emitting +emitImage: aForm + + | extent | + extent := (aForm extent / self imageScaleFactor) roundTo: 8. + self stream + withAttribute: (SBETextOpenImageAction for: aForm initialExtent: extent) + do: + [self emitImage: aForm extent: (figure ifNil: [#inline] ifNotNil: [extent])]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImportantDuring..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImportantDuring..st new file mode 100644 index 00000000..948e309d --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImportantDuring..st @@ -0,0 +1,4 @@ +emitting +emitImportantDuring: aBlock + + ^ self stream withAttribute: (TextIndent tabs: 1) do: aBlock \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitIndex.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitIndex.st new file mode 100644 index 00000000..7572637f --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitIndex.st @@ -0,0 +1,9 @@ +visiting - commands +emitIndex + + self + emitStructureElement: nil + forBookNode: SBEBookChapter + type: #chapter + title: 'Index'. + ^ super emitIndex \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitIndexForwardReference..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitIndexForwardReference..st new file mode 100644 index 00000000..468e717c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitIndexForwardReference..st @@ -0,0 +1,6 @@ +visiting - commands +emitIndexForwardReference: forwardReference + + self emitEmphasisDuring: + [self stream nextPutAll: forwardReference key , ' ']. + self emitRefPlaceholder: (self keyForIndexPath: forwardReference value). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitItemLabel..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitItemLabel..st new file mode 100644 index 00000000..c4f3f14c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitItemLabel..st @@ -0,0 +1,5 @@ +emitting +emitItemLabel: aString + + ^ self emitBoldDuring: + [super emitItemLabel: aString] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitLabel..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitLabel..st new file mode 100644 index 00000000..c8053a88 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitLabel..st @@ -0,0 +1,13 @@ +emitting +emitLabel: key + + | lastChar lastAttributes | + super emitLabel: key. + self stream position = 0 ifTrue: [^ pendingLabels addLast: key]. + lastChar := self stream last. + lastChar isSeparator ifTrue: [^ pendingLabels addLast: key]. + lastAttributes := self stream sbeLastAttributes. + self stream skip: -1. + self stream withAttributes: (lastAttributes copyWith: (SBETextLabelAnchor label: key)) do: + [self stream nextPut: lastChar]. + previousLineBreaks := 0. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitLineBreak..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitLineBreak..st new file mode 100644 index 00000000..22c42ffa --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitLineBreak..st @@ -0,0 +1,6 @@ +emitting +emitLineBreak: single + + self stream cr. + single ifFalse: + [self stream cr]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitMenuDuring..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitMenuDuring..st new file mode 100644 index 00000000..65d310fb --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitMenuDuring..st @@ -0,0 +1,6 @@ +emitting +emitMenuDuring: aBlock + + ^ self stream + withAttribute: TextEmphasis italic + do: aBlock \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitRef..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitRef..st new file mode 100644 index 00000000..b48a9230 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitRef..st @@ -0,0 +1,6 @@ +emitting +emitRef: key + + ^ self stream + withAttribute: (SBETextLabelLink to: key) + do: [super emitRef: key] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitStructureElement.forBookNode.type.title..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitStructureElement.forBookNode.type.title..st new file mode 100644 index 00000000..f8a63582 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitStructureElement.forBookNode.type.title..st @@ -0,0 +1,47 @@ +emitting +emitStructureElement: parseNode forBookNode: bookNodeClass type: type title: title + + | bookNode oldNode incrementer | + bookNode := bookNodeClass new. + bookNode title: title. + "bookNode labels: labels." + bookNode parseNode: parseNode. + + oldNode := nodeStack top. + self resolveRefs. + self stream contents withBlanksTrimmed ifNotEmpty: [:text | + self assert: oldNode text isNil. + oldNode text: text]. + pendingLabels ifNotEmpty: + [oldNode addExtraLabels: pendingLabels copy. + pendingLabels removeAll]. + + self resetStream. + + [nodeStack top mayContain: bookNode] whileFalse: + [nodeStack pop]. + nodeStack top + addChild: bookNode; + updateStarIndexes. + nodeStack push: bookNode. + self structureElementOrder + detect: [:eachType | + eachType = type + ifFalse: + [counters at: eachType put: + ((appendix and: [eachType = #chapter]) + ifTrue: ['@'] + ifFalse: [0])]; + yourself]. + + incrementer := [:count | count + 1]. + (appendix and: [type = #chapter]) ifTrue: + [| oldIncrementer | + bookNode typeName: #appendix. + oldIncrementer := incrementer. + incrementer := [:count | (oldIncrementer value: count sbeFromAlph) sbePrintStringAlph]]. + bookNode index: + (counters at: type put: + (incrementer value: (counters at: type ifAbsent: [0]))). + + ^ bookNode \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitURL..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitURL..st new file mode 100644 index 00000000..21930659 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitURL..st @@ -0,0 +1,6 @@ +emitting +emitURL: urlString + + self stream withAttribute: (TextURL url: urlString) do: + [self stream nextPutAll: urlString]. + previousLineBreaks := 0. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentCode.options..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentCode.options..st new file mode 100644 index 00000000..728ce608 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentCode.options..st @@ -0,0 +1,55 @@ +visiting - environments +environmentCode: contentBlock options: options + + + self basicVisitLineBreak: contentBlock; basicVisitLineBreak: contentBlock. + + self emitCodeDuring: + [| oldStream code | + oldStream := self stream. + stream := TextStream on: Text new. + [parseStack push: + (Generator on: [:gen | + self assert: gen next isNil. "whyever" + + [gen peek sbeType = #linebreak or: [gen peek sbeType isNil and: [gen peek contents isAllSeparators]]] whileTrue: + [gen next]. + + "ignore first argument" + self assert: parseStack pop == gen. + self visit: gen peek. + parseStack push: gen]). + + contentBlock value. + code := self stream contents. + + code := code withBlanksTrimmed. "because in #commandLstNewEnvironment: we pass whitespaces to contentBlock inside verbatim mode" + + self flag: #hacked. "yeah ... actually we should parse and visit this separately, but currently this seems to work good enough" + "code := code copyWithRegex: (matcher := '!([^!]+)!' asRegex) matchesTranslatedUsing: [:match | + matcher subexpression: 2]." + code := Text streamContents: [:codeStream | + | index | + index := 0. + [(index := index + 1) <= code size] whileTrue: + [(code at: index) = $! + ifFalse: + [codeStream withAttributes: (code attributesAt: index) do: + [codeStream nextPut: (code at: index)]] + ifTrue: + [| nextIndex match | + (nextIndex := code indexOf: $! startingAt: (index := index + 1)) = 0 + ifFalse: + [match := code copyFrom: index to: nextIndex - 1. + codeStream nextPutAll: match. + index := nextIndex] + ifTrue: + ["single ! is printed literally" + codeStream nextPutAll: + (code copyFrom: index - 1 to: index - 1)]]]].] + ensure: + [stream := oldStream]. + + self basicVisitText: code]. + + self basicVisitLineBreak: contentBlock; basicVisitLineBreak: contentBlock. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentFigure.options..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentFigure.options..st new file mode 100644 index 00000000..51c10aad --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentFigure.options..st @@ -0,0 +1,9 @@ +visiting - environments +environmentFigure: contentBlock options: options + + + | oldFigure | + oldFigure := figure. + figure := true. + ^ contentBlock ensure: + [figure := oldFigure] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentMinipage.options..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentMinipage.options..st new file mode 100644 index 00000000..521e681f --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentMinipage.options..st @@ -0,0 +1,17 @@ +visiting - environments +environmentMinipage: contentBlock options: options + + + parseStack push: + (Generator on: [:gen | + self assert: gen next isNil. "whyever" + + 1 timesRepeat: + [[gen peek sbeType = #linebreak or: [gen peek sbeType isNil and: [gen peek contents isAllSeparators]]] whileTrue: + [gen next]]. + + "ignore first argument" + + self visit: gen peek]). + + ^ self environmentFigure: contentBlock options: #() \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentWrapFigure.options..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentWrapFigure.options..st new file mode 100644 index 00000000..b487a273 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentWrapFigure.options..st @@ -0,0 +1,17 @@ +visiting - environments +environmentWrapFigure: contentBlock options: options + + + parseStack push: + (Generator on: [:gen | + self assert: gen next isNil. "whyever" + + 2 timesRepeat: + [[gen peek sbeType = #linebreak or: [gen peek sbeType isNil and: [gen peek contents isAllSeparators]]] whileTrue: + [gen next]]. + + "ignore first two arguments" + + self visit: gen peek]). + + ^ self environmentFigure: contentBlock options: #() \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/imageScaleFactor..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/imageScaleFactor..st new file mode 100644 index 00000000..0c449a71 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/imageScaleFactor..st @@ -0,0 +1,4 @@ +accessing +imageScaleFactor: aNumber + + imageScaleFactor := aNumber. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/imageScaleFactor.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/imageScaleFactor.st new file mode 100644 index 00000000..99260e57 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/imageScaleFactor.st @@ -0,0 +1,4 @@ +accessing +imageScaleFactor + + ^ imageScaleFactor \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/initialize.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/initialize.st new file mode 100644 index 00000000..8ad17bae --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/initialize.st @@ -0,0 +1,14 @@ +initialize-release +initialize + + super initialize. + + book := SBEBook new + title: 'Squeak by Example'; + bookIndex: index; + yourself. + nodeStack := Stack new. + nodeStack push: book. + pendingLabels := OrderedCollection new. + self imageScaleFactor: self defaultImageScaleFactor. + appendix := false. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/monticelloIPAImage.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/monticelloIPAImage.st new file mode 100644 index 00000000..5e8a0efb --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/monticelloIPAImage.st @@ -0,0 +1,73 @@ +private +monticelloIPAImage + + ^ (Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes: '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' readStream)) \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/nameForKey..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/nameForKey..st new file mode 100644 index 00000000..57bdaddc --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/nameForKey..st @@ -0,0 +1,12 @@ +private +nameForKey: key + + #('cha:' 'sec:' 'app:' 'fig:' 'tab:' 'mth:' 'cls:' 'rule:') do: [:prefix | + ((key beginsWith: prefix) and: [key size > prefix size]) + ifTrue: [^ key allButFirst: prefix size]]. + + (key beginsWith: 'reftoind:') ifTrue: + [(self book pathToLabel: key) ifNotNil: [:path | + ^ (path select: [:node | node wantsOwnHelpTopic]) last title]]. + + ^ super nameForKey: key \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/preprocessedContentsFromFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/preprocessedContentsFromFile..st new file mode 100644 index 00000000..93afa67a --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/preprocessedContentsFromFile..st @@ -0,0 +1,21 @@ +private +preprocessedContentsFromFile: aFSReference + + | contents matcher | + contents := super preprocessedContentsFromFile: aFSReference. + + self flag: #workaround. "too lazy to implement \ifdefined as well" + contents := contents copyWithRegex: (matcher := '\\ifdefined\\SQUEAKVERSION(((?!\\else).)*)\\else((?!\\fi).)*\\fi' asRegex) matchesTranslatedUsing: [:match | + matcher subexpression: 2]. + + self flag: #workaround. "current grammar gets in trouble with common.tex and thus is unable to ignore command \lstdefinelanguage" + contents := contents copyWithRegex: '\\lstdefinelanguage(?:.(?!^\\lstset))*' matchesReplacedWith: ''. + + self flag: #workaround. "Smalltalk code can contain any strings that look like LaTeX ..." + contents := contents copyWithRegex: '\\begin\{ExecuteSmalltalkScript\}(?:(?!\\end\{ExecuteSmalltalkScript\}).)*\\end\{ExecuteSmalltalkScript\}' matchesReplacedWith: ''. + + self flag: #workaround. "current grammar gets in trouble with @ after command name" + contents := contents copyWithRegex: (matcher := '(\\seeindex[^\r\n]*\\text\w+)@(?=\{)' asRegex) matchesTranslatedUsing: [:match | + matcher subexpression: 2]. + + ^ contents \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/squeakVersion..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/squeakVersion..st new file mode 100644 index 00000000..09686d0d --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/squeakVersion..st @@ -0,0 +1,4 @@ +accessing +squeakVersion: aSystemVersion + + squeakVersion := aSystemVersion. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/squeakVersion.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/squeakVersion.st new file mode 100644 index 00000000..ca74b89c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/squeakVersion.st @@ -0,0 +1,4 @@ +accessing +squeakVersion + + ^ squeakVersion ifNil: [SystemVersion current] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/squeakVersionString.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/squeakVersionString.st new file mode 100644 index 00000000..8daa43b2 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/squeakVersionString.st @@ -0,0 +1,7 @@ +accessing +squeakVersionString + + | version | + version := self squeakVersion. + version isAlpha ifTrue: [^ 'Trunk']. + ^ '{1}.{2}' format: {version majorVersionNumber. version minorVersionNumber} \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/structureElementOrder.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/structureElementOrder.st new file mode 100644 index 00000000..669dd55c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/structureElementOrder.st @@ -0,0 +1,4 @@ +private +structureElementOrder + + ^ #(paragraph subsubsection subsection section chapter part) \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitCaption..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitCaption..st new file mode 100644 index 00000000..8a5c6609 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitCaption..st @@ -0,0 +1,4 @@ +visiting - nodes +visitCaption: node + + ^ self visitGenericCommand: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitChapter..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitChapter..st new file mode 100644 index 00000000..cd69ec58 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitChapter..st @@ -0,0 +1,4 @@ +visiting - nodes +visitChapter: node + + ^ self visitStructureElement: node forBookNode: SBEBookChapter \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitInlineFormula..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitInlineFormula..st new file mode 100644 index 00000000..2499a325 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitInlineFormula..st @@ -0,0 +1,7 @@ +visiting - nodes +visitInlineFormula: node + + verbatim ifTrue: [^ super visitInlineFormula: node]. + + ^ self emitEmphasisDuring: + [super visitInlineFormula: node] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitParagraph..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitParagraph..st new file mode 100644 index 00000000..98a1e130 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitParagraph..st @@ -0,0 +1,4 @@ +visiting - nodes +visitParagraph: node + + ^ self visitStructureElement: node forBookNode: SBEBookParagraph \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitPart..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitPart..st new file mode 100644 index 00000000..ca016c63 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitPart..st @@ -0,0 +1,4 @@ +visiting - nodes +visitPart: node + + ^ self visitStructureElement: node forBookNode: SBEBookPart \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitSection..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitSection..st new file mode 100644 index 00000000..5c7a0c32 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitSection..st @@ -0,0 +1,4 @@ +visiting - nodes +visitSection: node + + ^ self visitStructureElement: node forBookNode: SBEBookSection \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitStructureElement.forBookNode..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitStructureElement.forBookNode..st new file mode 100644 index 00000000..adef1508 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitStructureElement.forBookNode..st @@ -0,0 +1,17 @@ +visiting - nodes +visitStructureElement: node forBookNode: bookNodeClass + + | bookNode title | + self assert: node children first sbeType isNil. + title := self contentsIn: node children second. + + bookNode := self + emitStructureElement: node + forBookNode: bookNodeClass + type: node sbeType + title: title. + + (node children allButFirst: 2) do: [:child | + self visit: child]. + + ^ bookNode \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitSubsection..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitSubsection..st new file mode 100644 index 00000000..a222bcd6 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitSubsection..st @@ -0,0 +1,4 @@ +visiting - nodes +visitSubsection: node + + ^ self visitStructureElement: node forBookNode: SBEBookSubsection \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitSubsubsection..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitSubsubsection..st new file mode 100644 index 00000000..d8c1852c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitSubsubsection..st @@ -0,0 +1,6 @@ +visiting - nodes +visitSubsubsection: node + + ^ (self visitStructureElement: node forBookNode: SBEBookSubsection) + level: 2; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json new file mode 100644 index 00000000..577f2ded --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json @@ -0,0 +1,75 @@ +{ + "class" : { + "example" : "ct 11/25/2023 20:23" }, + "instance" : { + "basicVisitRoot:" : "ct 11/26/2023 20:21", + "basicVisitText:" : "ct 11/26/2023 19:48", + "book" : "ct 11/8/2023 23:05", + "commandAppendix:" : "ct 11/25/2023 19:31", + "commandCaption:" : "ct 11/15/2023 21:57", + "commandCompareStringsDo:" : "ct 11/25/2023 16:31", + "commandCt:" : "ct 11/21/2023 14:25", + "commandDoThis:" : "ct 11/8/2023 15:40", + "commandEmph:" : "ct 11/8/2023 15:49", + "commandFootnote:" : "ct 11/14/2023 22:25", + "commandGo:" : "ct 11/8/2023 18:51", + "commandImportant:" : "ct 11/20/2023 20:41", + "commandLambda:" : "ct 11/25/2023 17:01", + "commandLstNewEnvironment:" : "ct 11/16/2023 20:59", + "commandLstSet:" : "ct 11/16/2023 21:12", + "commandMenu:" : "ct 11/8/2023 19:41", + "commandNumFileTreeMethodInput:" : "ct 11/26/2023 20:16", + "commandShort:" : "ct 11/8/2023 20:09", + "commandSqueakVersion:" : "ct 11/8/2023 17:46", + "commandSubfigure:" : "ct 11/15/2023 22:33", + "commandTableOfContents:" : "ct 11/25/2023 19:23", + "commandTextIPA:" : "ct 11/8/2023 20:16", + "commandTextbf:" : "ct 11/8/2023 20:57", + "commandURL:" : "ct 11/20/2023 21:10", + "commandVerb:" : "ct 11/8/2023 19:25", + "copyForContents" : "ct 11/25/2023 16:28", + "defaultImageScaleFactor" : "ct 11/14/2023 21:50", + "doThisImage" : "ct 11/9/2023 23:09", + "doThisImageDyeMode" : "ct 11/21/2023 18:15", + "emitBoldDuring:" : "ct 11/9/2023 21:18", + "emitCaptionDuring:" : "ct 11/21/2023 19:09", + "emitCode:" : "ct 11/15/2023 18:37", + "emitCodeDuring:" : "ct 11/21/2023 18:35", + "emitDoThisDuring:" : "ct 11/21/2023 18:46", + "emitEmphasis:" : "ct 11/9/2023 21:18", + "emitEmphasisDuring:" : "ct 11/9/2023 21:18", + "emitGo" : "ct 11/8/2023 18:51", + "emitImage:" : "ct 11/21/2023 21:00", + "emitImportantDuring:" : "ct 11/12/2023 19:44", + "emitIndex" : "ct 11/26/2023 18:05", + "emitIndexForwardReference:" : "ct 11/26/2023 18:43", + "emitItemLabel:" : "ct 11/15/2023 19:26", + "emitLabel:" : "ct 11/15/2023 18:37", + "emitLineBreak:" : "ct 11/14/2023 23:43", + "emitMenuDuring:" : "ct 11/9/2023 21:19", + "emitRef:" : "ct 11/15/2023 19:48", + "emitStructureElement:forBookNode:type:title:" : "ct 11/26/2023 20:21", + "emitURL:" : "ct 11/15/2023 18:37", + "environmentCode:options:" : "ct 11/20/2023 19:02", + "environmentFigure:options:" : "ct 11/15/2023 21:47", + "environmentMinipage:options:" : "ct 11/15/2023 22:11", + "environmentWrapFigure:options:" : "ct 11/15/2023 22:02", + "imageScaleFactor" : "ct 11/14/2023 21:50", + "imageScaleFactor:" : "ct 11/14/2023 21:50", + "initialize" : "ct 11/26/2023 18:00", + "monticelloIPAImage" : "ct 11/8/2023 20:16", + "nameForKey:" : "ct 11/26/2023 18:40", + "preprocessedContentsFromFile:" : "ct 11/26/2023 01:04", + "squeakVersion" : "ct 11/8/2023 17:45", + "squeakVersion:" : "ct 11/24/2023 18:53", + "squeakVersionString" : "ct 11/8/2023 17:46", + "structureElementOrder" : "ct 11/25/2023 19:03", + "visitCaption:" : "ct 11/15/2023 21:50", + "visitChapter:" : "ct 11/12/2023 19:50", + "visitInlineFormula:" : "ct 11/25/2023 16:56", + "visitParagraph:" : "ct 11/12/2023 19:50", + "visitPart:" : "ct 11/12/2023 19:51", + "visitSection:" : "ct 11/12/2023 19:51", + "visitStructureElement:forBookNode:" : "ct 11/26/2023 03:18", + "visitSubsection:" : "ct 11/12/2023 19:51", + "visitSubsubsection:" : "ct 11/12/2023 19:51" } } diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/properties.json b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/properties.json new file mode 100644 index 00000000..dc9f7c80 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/properties.json @@ -0,0 +1,20 @@ +{ + "category" : "SBE-ExtractBook", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "book", + "squeakVersion", + "imageScaleFactor", + "nodeStack", + "pendingLabels", + "figure", + "appendix" ], + "name" : "SBEBookExtractor", + "pools" : [ + ], + "super" : "SBELatexBookExtractor", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/README.md b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/dependencies.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/dependencies.st new file mode 100644 index 00000000..729e6f7a --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/dependencies.st @@ -0,0 +1,8 @@ +documentation +dependencies + + self flag: #dependencies. + "* SOH must not be a character (https://lists.squeakfoundation.org/archives/list/squeak-dev@lists.squeakfoundation.org/thread/D6FTOBYCYZS5JLM3BTFNTXMO7BKMHOJV/) + * Fix TextStream>>reset (Collections-ct.1055) + * Load DomainCode package from sb-tree-sitter (currently only possible via Squit) + * When running the extractor for the first time, return entered value: nil from #prepareGrammar: and proceed" \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/extractFromFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/extractFromFile..st new file mode 100644 index 00000000..4c27a72e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/extractFromFile..st @@ -0,0 +1,4 @@ +extracting +extractFromFile: aFSReference + + ^ self new extractFromRootFile: aFSReference \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/parseFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/parseFile..st new file mode 100644 index 00000000..6b70bcc4 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/parseFile..st @@ -0,0 +1,4 @@ +extracting +parseFile: aFSReference + + ^ self new parseFile: aFSReference \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/todo.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/todo.st new file mode 100644 index 00000000..d045606a --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/todo.st @@ -0,0 +1,16 @@ +documentation +todo + + self flag: #todo. + "This is all very hacked. Some of the most awkward hacks and issues include: + * Insufficient grammar: It produces a lot of syntax errors. This has not been fully investigated but some known trigger include special characters in verbatim code like \ct{$a inspect}, \ct|{| (ah, why can't LaTeX be context-free). Maybe it would be enough to manually extend the grammar, maybe we would need a C plugin for tree-sitter. + * Handling of syntax errors: Currently requires a LOT of hacks because some commands appear without all of their arguments, some commands appear as plain text, sometimes braces and square brackets appear as plain text nodes, etc. so we need to consume tokens from sibling nodes through the parseStack mechanism in a redundant manner. + * Token consumption: parseStack is a fancy piece of stuff but we seem to be using generators in an unusual way (consume before produce), leading to an underflow/overflow of tokens that we have not fully understood and that prevented us from extracting a common generator logic. Further, there is a loop on the call stack (literally) while these generators are active which crashes the VM when you dare to not catch a single exception from within their block ... happy debugging! + * Eager/lazy evaluation of tokens is not yet waterproof, just works good enough for this book. There are places such as LaTeX-inside-lstlisting + * We could introduce better support for handling optional arguments of commands and environments. + * Improve and refactoring handling of spaces at the beginning/end of lines, after commands, and multiple new lines in a row. + * \makeatletter...\makeatother + * conditional environment begins/ends + * many more hacks i cannot count + + And of course there are many features not (yet) imlpemented, including tables, floatings, index/citations, labels for references, real footnotes, ..." \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisit..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisit..st new file mode 100644 index 00000000..68b7d0b1 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisit..st @@ -0,0 +1,4 @@ +visiting +basicVisit: node + + ^ node sbeVisit: self \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitAny..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitAny..st new file mode 100644 index 00000000..8b2073ad --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitAny..st @@ -0,0 +1,5 @@ +visiting - nodes +basicVisitAny: node + + node children do: [:child | + self visit: child]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitForParsing..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitForParsing..st new file mode 100644 index 00000000..a2c12bae --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitForParsing..st @@ -0,0 +1,24 @@ +visiting - nodes +basicVisitForParsing: node + + | oldParseStack | + oldParseStack := parseStack. + parseStack := Stack new. + ^ [ | result | + + result := self visit: node. + + "Handle pending coroutines from previous visitors." + self flag: #duplicate. + parseStack isEmpty ifFalse: + [| generator | + generator := parseStack top. + generator yield: nil. + generator atEnd ifTrue: [parseStack pop]]. + self assert: parseStack isEmpty. + + self resolveRefs. + + result] + + ensure: [parseStack := oldParseStack] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitGraphicsFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitGraphicsFile..st new file mode 100644 index 00000000..9479c37b --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitGraphicsFile..st @@ -0,0 +1,15 @@ +visiting +basicVisitGraphicsFile: file + + | image | + image := file readStreamDo: [:fileStream | + [ImageReadWriter formFromStream: fileStream] + ifError: + [('' asText + addAttribute: (SBETextColor property: #errorColor scope: #TestRunner); + addAttribute: TextFontChange font4; + asMorph) + imageForm + magnifyBy: self imageScaleFactor]]. + + self emitImage: image. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitLineBreak..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitLineBreak..st new file mode 100644 index 00000000..fbf10456 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitLineBreak..st @@ -0,0 +1,21 @@ +visiting - nodes +basicVisitLineBreak: lineBreak + + verbatim ifTrue: [^ self stream cr]. + + previousLineBreaks ifNil: + [previousLineBreaks := 1. + ^ self]. + previousLineBreaks = 0 + ifTrue: [self stream space] + ifFalse: + [previousLineBreaks = 1 ifTrue: + [| attrs | + attrs := self stream sbeLastAttributes. + self stream position: self stream position - 1. + attrs + ifEmpty: [self emitLineBreak: lineBreak isNil] + ifNotEmpty: + [self stream withAttributes: attrs do: + [self emitLineBreak: lineBreak isNil]]]]. + previousLineBreaks := previousLineBreaks + 1. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitRoot..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitRoot..st new file mode 100644 index 00000000..cf5eba31 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitRoot..st @@ -0,0 +1,7 @@ +visiting - nodes +basicVisitRoot: node + + | result | + result := self basicVisitForParsing: node. + "self resolveRefs." + ^ result \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitText..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitText..st new file mode 100644 index 00000000..c2515db6 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitText..st @@ -0,0 +1,23 @@ +visiting - nodes +basicVisitText: aStringOrText + + | text | + text := (verbatim ifFalse: [self specialCharacters] ifTrue: [self verbatimSpecialCharacters]) associations + inject: aStringOrText + into: [:tmp :assoc | + tmp copyReplaceAll: assoc key with: assoc value]. + + text withIndexDo: [:char :index | + | block | + block := [(char isSeparator and: [verbatim not]) + ifFalse: [self stream nextPut: char] + ifTrue: + [(self stream position > 0 and: [self stream peekLast isSeparator]) ifFalse: + [self stream space]]]. + ((self stream respondsTo: #withAttributes:do:) and: [text isText]) + ifFalse: block + ifTrue: + [self stream + withAttributes: (text attributesAt: index) + do: block]]. + previousLineBreaks := 0. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/buildDate.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/buildDate.st new file mode 100644 index 00000000..1b57a87c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/buildDate.st @@ -0,0 +1,4 @@ +accessing +buildDate + + ^ buildDate ifNil: [DateAndTime now] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandArguments.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandArguments.st new file mode 100644 index 00000000..dbdc990f --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandArguments.st @@ -0,0 +1,4 @@ +accessing +commandArguments + + ^ commandArguments \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandBoolean..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandBoolean..st new file mode 100644 index 00000000..261b5416 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandBoolean..st @@ -0,0 +1,10 @@ +visiting - commands - macros +commandBoolean: arguments + + + | name | + self assert: arguments size = 1. + + name := (self contentsIn: arguments first) asString. + + ifstack push: (booleans at: name) first. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandCopyright..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandCopyright..st new file mode 100644 index 00000000..bf1de445 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandCopyright..st @@ -0,0 +1,6 @@ +visiting - commands - characters and spacing +commandCopyright: arguments + + + self assert: arguments isEmpty. + self basicVisitText: '©'. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandDeclareGraphicsExtensions..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandDeclareGraphicsExtensions..st new file mode 100644 index 00000000..2c23bb08 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandDeclareGraphicsExtensions..st @@ -0,0 +1,6 @@ +visiting - commands +commandDeclareGraphicsExtensions: arguments + + + self assert: arguments size = 1. + graphicsExtensions := self listFromGroup: arguments first. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandDeclareRobustCommand..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandDeclareRobustCommand..st new file mode 100644 index 00000000..da1e472e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandDeclareRobustCommand..st @@ -0,0 +1,5 @@ +visiting - commands +commandDeclareRobustCommand: arguments + + + ^ self commandNewCommand: arguments \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandDef..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandDef..st new file mode 100644 index 00000000..ae5882a8 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandDef..st @@ -0,0 +1,14 @@ +visiting - commands - macros +commandDef: arguments + + + | name value | + self assert: arguments size = 2. + + name := self contentsIn: arguments first. + self assert: (name notEmpty and: [name first = $\]). + name := name allButFirst. + value := self contentsIn: arguments last. + commandHandlers + at: name + put: [:extractor :args | extractor handleCommand: name arguments: args] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandEqual..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandEqual..st new file mode 100644 index 00000000..211882a4 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandEqual..st @@ -0,0 +1,11 @@ +visiting - commands - macros +commandEqual: arguments + + + | first second | + self assert: arguments size = 2. + + first := self contentsIn: arguments first. + second := self contentsIn: arguments second. + + ifstack push: first = second. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandExcludeComment..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandExcludeComment..st new file mode 100644 index 00000000..eb9b2b9f --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandExcludeComment..st @@ -0,0 +1,10 @@ +visiting - commands +commandExcludeComment: arguments + + + | environmentName | + self assert: arguments size = 1. + environmentName := (self contentsIn: arguments first) asString. + environmentHandlers + at: environmentName + put: [:extractor :contentBlock :options |]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandGraphicsPath..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandGraphicsPath..st new file mode 100644 index 00000000..1efce25a --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandGraphicsPath..st @@ -0,0 +1,7 @@ +visiting - commands +commandGraphicsPath: arguments + + + self assert: arguments size = 1. + graphicsPath := (self listFromGroup: arguments first) + collect: [:path | file parent / path]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandHandlerFor..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandHandlerFor..st new file mode 100644 index 00000000..44e3465a --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandHandlerFor..st @@ -0,0 +1,8 @@ +handlers +commandHandlerFor: name + + | handler | + handler := commandHandlers at: name ifAbsent: [^ nil]. + handler isSymbol ifTrue: + [^ [:arguments | self perform: handler with: arguments]]. + ^ [:arguments | handler value: self value: arguments] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandHash..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandHash..st new file mode 100644 index 00000000..2833348f --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandHash..st @@ -0,0 +1,6 @@ +visiting - commands - characters and spacing +commandHash: arguments + + + self assert: arguments isEmpty. + self stream nextPut: $#. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIfThenElse..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIfThenElse..st new file mode 100644 index 00000000..13cfc4d1 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIfThenElse..st @@ -0,0 +1,9 @@ +visiting - commands - macros +commandIfThenElse: arguments + + + self assert: arguments size = 3. + + self visit: arguments first. + + self visit: (ifstack pop ifTrue: [arguments second] ifFalse: [arguments third]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIfx..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIfx..st new file mode 100644 index 00000000..e506d68e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIfx..st @@ -0,0 +1,48 @@ +visiting - commands - macros +commandIfx: arguments + + + | hereArguments log | + log := OrderedCollection new. + self assert: arguments isEmpty. + hereArguments := commandArguments. + parseStack push: + (Generator on: [:gen | + | first second equal else fi next nodes | + self assert: gen next isNil. "whyever" + nodes := Generator on: [:nodeStream | + | node | + node := gen next. + node sbeType = #genericCommand + ifFalse: [nodeStream nextPutAll: node children] + ifTrue: + [nodeStream + nextPut: node; + nextPutAll: gen]]. + + first := nodes next. + second := nodes next. + equal := first sbeType = #genericCommand + & (second sbeType = #genericCommand) + and: [(commandHandlers at: (self nameOfCommand: first) ifAbsent: [nil]) = (commandHandlers at: (self nameOfCommand: second) ifAbsent: [nil])]. + + [(nodes atEnd or: [nodes peek isNil]) or: + [else := nodes peek sbeType = #genericCommand and: + [(self nameOfCommand: nodes peek) = #else]]] + whileFalse: + [next := nodes next. + equal ifTrue: + [self withCommandArguments: hereArguments do: + [self basicVisitForParsing: next]]]. + (nodes atEnd not and: [else]) ifTrue: + [log add: nodes next. + + [(nodes atEnd or: [nodes peek isNil]) or: + [fi := nodes peek sbeType = #genericCommand and: + [(self nameOfCommand: nodes peek) = #fi]]] + whileFalse: + [next := log add: nodes next. + equal ifFalse: + [self withCommandArguments: hereArguments do: + [self basicVisitForParsing: next]]]. + self assert: (nodes atEnd not and: [fi])]]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIncludeGraphics..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIncludeGraphics..st new file mode 100644 index 00000000..eb9a80a3 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIncludeGraphics..st @@ -0,0 +1,20 @@ +visiting - commands +commandIncludeGraphics: arguments + + + | argumentStream graphicsFile path | + argumentStream := (arguments reject: [:arg | arg sbeType = #linebreak or: [arg sbeType isNil and: [arg contents isAllSeparators]]]) readStream. + argumentStream peek sbeType = #brackGroupKeyValue ifTrue: + [argumentStream next. + "maybe handle later"]. + + self assert: argumentStream peek sbeType = #curlyGroupPath. + path := (self fullContentsInGroup: argumentStream next) asString. + + graphicsFile := self tryResolveGraphicsFile: path. + + graphicsFile ifNil: + [self notify: 'Figure does not exist: ' , path. + ^ self basicVisitText: 'Missing figure']. + + ^ self basicVisitGraphicsFile: graphicsFile \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIndex..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIndex..st new file mode 100644 index 00000000..14798412 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIndex..st @@ -0,0 +1,25 @@ +visiting - commands +commandIndex: arguments + + + | full matcher keys label ref | + self assert: arguments size = 1. + full := self contentsIn: arguments first. + + "format: ( parent_entry '!' ) * entry ( '@' label | 'see' '{' ref_list '}' )" + matcher := '((?[^!|@]+)!)*(?[^!|@]+)(\s*@\s*(?