From e571a68a742568ed86c37dd70e1fbb7767c96d71 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Tue, 21 Nov 2023 15:11:43 +0100 Subject: [PATCH 01/35] add first version of BookExtract --- .squot | 4 +- .../BaselineOfSBE.class/instance/baseline..st | 6 + .../BaselineOfSBE.class/methodProperties.json | 2 +- SmalltalkSources/SBE-Book.package/.filetree | 4 + .../SBE-Book.package/.squot-contents | 6 + .../instance/asSbeTextAnchor.st | 5 + .../Form.extension/methodProperties.json | 5 + .../Form.extension/properties.json | 2 + .../instance/sbeStoreHtmlString.st | 4 + .../Object.extension/methodProperties.json | 5 + .../Object.extension/properties.json | 2 + .../SBE-Book.package/SBEBook.class/README.md | 0 .../instance/canonicalHierarchyOrder.st | 4 + .../SBEBook.class/instance/textForHelp.st | 10 + .../SBEBook.class/methodProperties.json | 6 + .../SBEBook.class/properties.json | 14 + .../SBEBookChapter.class/README.md | 0 .../instance/canonicalHierarchyOrder.st | 4 + .../methodProperties.json | 5 + .../SBEBookChapter.class/properties.json | 14 + .../SBEBookHelpTopic.class/README.md | 0 .../SBEBookHelpTopic.class/class/on..st | 6 + .../SBEBookHelpTopic.class/instance/book.st | 4 + .../instance/bookNode..st | 4 + .../instance/bookNode.st | 4 + .../instance/contents.st | 4 + .../SBEBookHelpTopic.class/instance/key..st | 3 + .../SBEBookHelpTopic.class/instance/key.st | 4 + .../instance/shouldStyle.st | 4 + .../instance/subtopics.st | 9 + .../SBEBookHelpTopic.class/instance/title.st | 4 + .../methodProperties.json | 13 + .../SBEBookHelpTopic.class/properties.json | 15 + .../SBEBookNode.class/README.md | 0 .../SBEBookNode.class/class/testStoring.st | 13 + .../SBEBookNode.class/instance/addChild..st | 7 + .../instance/addChildren..st | 5 + .../instance/addExtraLabels..st | 4 + .../instance/anchorLabels.st | 8 + .../SBEBookNode.class/instance/asHelpTopic.st | 4 + .../SBEBookNode.class/instance/book.st | 4 + .../instance/canonicalHierarchyOrder.st | 4 + .../SBEBookNode.class/instance/children..st | 4 + .../SBEBookNode.class/instance/children.st | 4 + .../instance/childrenForHelp.st | 5 + .../instance/extraLabels..st | 4 + .../SBEBookNode.class/instance/extraLabels.st | 4 + .../SBEBookNode.class/instance/fullText.st | 13 + .../instance/fullTextForHelp.st | 12 + .../SBEBookNode.class/instance/initialize.st | 7 + .../SBEBookNode.class/instance/isBookChunk.st | 4 + .../SBEBookNode.class/instance/isHelpLeaf.st | 4 + .../SBEBookNode.class/instance/labels.st | 4 + .../SBEBookNode.class/instance/mayContain..st | 4 + .../instance/openLabel.in..st | 16 + .../SBEBookNode.class/instance/parent..st | 4 + .../SBEBookNode.class/instance/parent.st | 4 + .../instance/pathToLabel..st | 8 + .../SBEBookNode.class/instance/printOn..st | 10 + .../SBEBookNode.class/instance/storeOn..st | 15 + .../SBEBookNode.class/instance/text..st | 4 + .../SBEBookNode.class/instance/text.st | 4 + .../SBEBookNode.class/instance/textForHelp.st | 17 + .../SBEBookNode.class/instance/title..st | 4 + .../SBEBookNode.class/instance/title.st | 4 + .../instance/titleSeparatorForHelp.st | 4 + .../instance/wantsOwnHelpTopic.st | 4 + .../SBEBookNode.class/methodProperties.json | 36 + .../SBEBookNode.class/properties.json | 18 + .../SBEBookParagraph.class/README.md | 0 .../instance/canonicalHierarchyOrder.st | 4 + .../instance/isHelpLeaf.st | 4 + .../instance/titleSeparatorForHelp.st | 4 + .../instance/wantsOwnHelpTopic.st | 4 + .../methodProperties.json | 8 + .../SBEBookParagraph.class/properties.json | 14 + .../SBEBookPart.class/README.md | 0 .../instance/canonicalHierarchyOrder.st | 4 + .../SBEBookPart.class/methodProperties.json | 5 + .../SBEBookPart.class/properties.json | 14 + .../SBEBookSection.class/README.md | 0 .../instance/canonicalHierarchyOrder.st | 4 + .../instance/isHelpLeaf.st | 4 + .../methodProperties.json | 6 + .../SBEBookSection.class/properties.json | 14 + .../SBEBookSubsection.class/README.md | 0 .../instance/canonicalHierarchyOrder.st | 4 + .../instance/initialize.st | 6 + .../instance/isHelpLeaf.st | 4 + .../instance/level..st | 4 + .../SBEBookSubsection.class/instance/level.st | 4 + .../instance/storeOn..st | 9 + .../instance/titleSeparatorForHelp.st | 4 + .../instance/wantsOwnHelpTopic.st | 4 + .../methodProperties.json | 12 + .../SBEBookSubsection.class/properties.json | 14 + .../SBE-Book.package/SBEHelp.class/README.md | 0 .../SBEHelp.class/class/book..st | 4 + .../SBEHelp.class/class/book.st | 4 + .../SBEHelp.class/class/bookBlurb.st | 4 + .../SBEHelp.class/class/bookName.st | 4 + .../SBEHelp.class/class/icon.st | 5 + .../SBEHelp.class/class/introduction.st | 21 + .../SBEHelp.class/class/pages.st | 4 + .../SBEHelp.class/class/squeakBalloonIcon.st | 2163 ++++++ .../SBEHelp.class/class/theBook.st | 4 + .../SBEHelp.class/methodProperties.json | 13 + .../SBEHelp.class/properties.json | 14 + .../SBEHtmlReadWriter.class/README.md | 0 .../instance/initialize.st | 6 + .../instance/mapTagToAttribute..st | 18 + .../instance/nextText.st | 7 + .../methodProperties.json | 7 + .../SBEHtmlReadWriter.class/properties.json | 14 + .../SBETextAnchor.class/README.md | 0 .../SBETextAnchor.class/instance/^equals.st | 5 + .../instance/closeHtmlOn..st | 4 + .../SBETextAnchor.class/instance/hash.st | 5 + .../SBETextAnchor.class/instance/image.st | 4 + .../instance/openHtmlOn..st | 10 + .../SBETextAnchor.class/methodProperties.json | 9 + .../SBETextAnchor.class/properties.json | 14 + .../SBETextLabelAnchor.class/README.md | 0 .../SBETextLabelAnchor.class/class/label..st | 4 + .../instance/^equals.st | 5 + .../instance/closeHtmlOn..st | 4 + .../SBETextLabelAnchor.class/instance/hash.st | 4 + .../instance/isOblivious.st | 4 + .../instance/label..st | 4 + .../instance/label.st | 4 + .../instance/openHtmlOn..st | 5 + .../methodProperties.json | 11 + .../SBETextLabelAnchor.class/properties.json | 14 + .../SBETextLabelLink.class/README.md | 0 .../SBETextLabelLink.class/class/to..st | 6 + .../instance/^equals.st | 5 + .../instance/actOnClickFor..st | 7 + .../instance/closeHtmlOn..st | 4 + .../SBETextLabelLink.class/instance/hash.st | 4 + .../SBETextLabelLink.class/instance/label..st | 4 + .../SBETextLabelLink.class/instance/label.st | 4 + .../instance/openHtmlOn..st | 5 + .../methodProperties.json | 11 + .../SBETextLabelLink.class/properties.json | 14 + .../SBETextOpenImageAction.class/README.md | 0 .../class/for..st | 6 + .../class/for.initialExtent..st | 7 + .../instance/^equals.st | 6 + .../instance/actOnClickFor..st | 9 + .../instance/closeHtmlOn..st | 4 + .../instance/hash.st | 5 + .../instance/image..st | 4 + .../instance/image.st | 4 + .../instance/initialExtent..st | 4 + .../instance/initialExtent.st | 4 + .../instance/openHtmlOn..st | 11 + .../methodProperties.json | 14 + .../properties.json | 15 + .../instance/sbeStoreHtmlString.st | 8 + .../instance/semanticAllAttributes.st | 8 + .../Text.extension/methodProperties.json | 6 + .../Text.extension/properties.json | 2 + .../monticello.meta/categories.st | 1 + .../monticello.meta/initializers.st | 0 .../SBE-Book.package/properties.json | 2 + .../SBE-ExtractBook.package/.filetree | 4 + .../SBE-ExtractBook.package/.squot-contents | 6 + .../DCBlock.extension/instance/sbeType.st | 12 + .../DCBlock.extension/instance/sbeVisit..st | 11 + .../DCBlock.extension/methodProperties.json | 6 + .../DCBlock.extension/properties.json | 2 + .../instance/sbeVisit..st | 4 + .../methodProperties.json | 5 + .../DCLineBreak.extension/properties.json | 2 + .../DCText.extension/instance/sbeType.st | 4 + .../DCText.extension/instance/sbeVisit..st | 4 + .../DCText.extension/methodProperties.json | 6 + .../DCText.extension/properties.json | 2 + .../SBEBookExtractor.class/README.md | 0 .../SBEBookExtractor.class/class/example.st | 11 + .../instance/basicEmitImage..st | 4 + .../instance/basicVisitRoot..st | 14 + .../instance/basicVisitText..st | 30 + .../SBEBookExtractor.class/instance/book.st | 4 + .../instance/commandCaption..st | 8 + .../instance/commandCt..st | 35 + .../instance/commandDoThis..st | 8 + .../instance/commandEmph..st | 7 + .../instance/commandFootnote..st | 10 + .../instance/commandGo..st | 5 + .../instance/commandImportant..st | 11 + .../instance/commandLstNewEnvironment..st | 50 + .../instance/commandLstSet..st | 18 + .../instance/commandMenu..st | 7 + .../commandNumFileTreeMethodInput..st | 41 + .../instance/commandShort..st | 7 + .../instance/commandSqueakVersion..st | 6 + .../instance/commandSubfigure..st | 29 + .../instance/commandTextIPA..st | 6 + .../instance/commandTextbf..st | 18 + .../instance/commandURL..st | 9 + .../instance/commandVerb..st | 5 + .../instance/defaultImageScaleFactor.st | 4 + .../instance/doThisImage.st | 4 + .../instance/emitBoldDuring..st | 6 + .../instance/emitCaptionDuring..st | 6 + .../instance/emitCode..st | 6 + .../instance/emitCodeDuring..st | 23 + .../instance/emitDoThisDuring..st | 14 + .../instance/emitEmphasis..st | 5 + .../instance/emitEmphasisDuring..st | 6 + .../SBEBookExtractor.class/instance/emitGo.st | 4 + .../instance/emitImage..st | 11 + .../instance/emitImportantDuring..st | 4 + .../instance/emitItemLabel..st | 5 + .../instance/emitLabel..st | 13 + .../instance/emitLineBreak..st | 6 + .../instance/emitMenuDuring..st | 6 + .../instance/emitRef..st | 6 + .../instance/emitURL..st | 6 + .../instance/environmentCode.options..st | 55 + .../instance/environmentFigure.options..st | 9 + .../instance/environmentMinipage.options..st | 17 + .../environmentWrapFigure.options..st | 17 + .../instance/imageScaleFactor..st | 4 + .../instance/imageScaleFactor.st | 4 + .../instance/initialize.st | 12 + .../instance/monticelloIPAImage.st | 73 + .../instance/nameForKey..st | 7 + .../instance/preprocessedContentsFromFile..st | 13 + .../instance/squeakVersion.st | 4 + .../instance/squeakVersionString.st | 7 + .../instance/visitCaption..st | 4 + .../instance/visitChapter..st | 4 + .../instance/visitParagraph..st | 4 + .../instance/visitPart..st | 4 + .../instance/visitSection..st | 4 + .../visitStructureElement.forBookNode..st | 30 + .../instance/visitSubsection..st | 4 + .../instance/visitSubsubsection..st | 6 + .../methodProperties.json | 64 + .../SBEBookExtractor.class/properties.json | 19 + .../SBELatexBookExtractor.class/README.md | 0 .../class/extractFromFile..st | 4 + .../class/parseFile..st | 4 + .../SBELatexBookExtractor.class/class/todo.st | 16 + .../instance/basicVisit..st | 4 + .../instance/basicVisitAny..st | 5 + .../instance/basicVisitForParsing..st | 24 + .../instance/basicVisitGraphicsFile..st | 13 + .../instance/basicVisitLineBreak..st | 18 + .../instance/basicVisitRoot..st | 7 + .../instance/basicVisitText..st | 23 + .../instance/buildDate.st | 4 + .../instance/commandArguments.st | 4 + .../instance/commandBoolean..st | 10 + .../instance/commandCopyright..st | 6 + .../commandDeclareGraphicsExtensions..st | 6 + .../instance/commandDeclareRobustCommand..st | 5 + .../instance/commandDef..st | 14 + .../instance/commandEqual..st | 11 + .../instance/commandExcludeComment..st | 10 + .../instance/commandGraphicsPath..st | 7 + .../instance/commandHandlerFor..st | 8 + .../instance/commandIfThenElse..st | 9 + .../instance/commandIfx..st | 48 + .../instance/commandIncludeGraphics..st | 20 + .../instance/commandIndex..st | 4 + .../instance/commandInput..st | 10 + .../instance/commandItem..st | 46 + .../instance/commandLabel..st | 10 + .../instance/commandLdots..st | 6 + .../instance/commandLet..st | 13 + .../instance/commandLineBreak..st | 24 + .../instance/commandNewBoolean..st | 13 + .../instance/commandNewCommand..st | 38 + .../instance/commandNewEnvironment..st | 76 + .../instance/commandNewTheorem..st | 10 + .../instance/commandParBox..st | 6 + .../instance/commandParskip..st | 13 + .../instance/commandPdfMinorVersion..st | 27 + .../instance/commandProvidesPackage..st | 4 + .../instance/commandRaiseBox..st | 23 + .../instance/commandRef..st | 9 + .../instance/commandRenewCommand..st | 32 + .../instance/commandSetBoolean..st | 13 + .../instance/commandSetCounter..st | 8 + .../instance/commandSpace..st | 6 + .../instance/commandTimes..st | 6 + .../instance/commandToday..st | 6 + .../instance/contents.st | 4 + .../instance/contentsIn..st | 13 + .../instance/contentsInGroup..st | 4 + .../instance/contentsInGroup.brackets..st | 7 + .../contentsInGroup.brackets.optional..st | 8 + ...contentsInGroup.full.brackets.optional..st | 12 + .../contentsInGroup.full.optionalBrackets..st | 8 + .../contentsInGroup.optionalBrackets..st | 7 + .../instance/emitImage..st | 6 + .../instance/emitItemLabel..st | 4 + .../instance/emitLabel..st | 4 + .../instance/emitLineBreak..st | 4 + .../instance/emitRef..st | 4 + .../instance/emitRefPlaceholder..st | 8 + .../instance/environmentComment.options..st | 5 + .../environmentDescription.options..st | 9 + .../instance/environmentEnumerate.options..st | 10 + .../environmentEnumerateStar.options..st | 10 + .../instance/environmentHandlerFor..st | 8 + .../instance/environmentItemize.options..st | 9 + .../instance/extractFromFile..st | 9 + .../instance/extractFromRootFile..st | 5 + .../instance/extractFromString..st | 9 + .../instance/fullContentsInGroup..st | 4 + .../instance/fullContentsInGroup.brackets..st | 7 + .../fullContentsInGroup.brackets.optional..st | 8 + .../fullContentsInGroup.optionalBrackets..st | 7 + .../instance/handleCommand.arguments..st | 13 + .../handleEnvironment.options.during..st | 9 + .../instance/ignoredCommands.st | 11 + .../instance/initialize.st | 15 + .../instance/initializeCommandHandlers.st | 6 + .../instance/initializeEnvironmentHandlers.st | 6 + .../instance/listFromGroup..st | 6 + .../instance/mapFromGroup..st | 29 + .../instance/nameForKey..st | 4 + .../instance/nameOfCommand..st | 7 + .../instance/notify..st | 4 + .../instance/parseFile..st | 6 + .../instance/parseString..st | 4 + .../instance/preprocessedContentsFromFile..st | 16 + .../instance/refPlaceholderStart.st | 4 + .../instance/refPlaceholderStop.st | 4 + .../instance/resetStream.st | 6 + .../instance/resolveRefs.st | 27 + .../instance/rootFile..st | 4 + .../instance/rootFile.st | 4 + ...setCommandHandlers.environmentHandlers..st | 5 + .../instance/specialCharacters.st | 10 + .../instance/stream.st | 4 + .../instance/tryResolveFile..st | 6 + .../instance/tryResolveFile.extensions..st | 7 + .../tryResolveFile.extensions.paths..st | 14 + .../instance/tryResolveGraphicsFile..st | 7 + .../instance/tryResolveSourceFile..st | 4 + .../instance/verbatimSpecialCharacters.st | 6 + .../instance/visit..st | 13 + .../instance/visitClassInclude..st | 3 + .../instance/visitColorDefinition..st | 4 + .../instance/visitCommentEnvironment..st | 4 + .../instance/visitCurlyGroup..st | 8 + .../instance/visitEnumItem..st | 4 + .../instance/visitEnvironmentDefinition..st | 4 + .../instance/visitGenericCommand..st | 19 + .../instance/visitGenericEnvironment..st | 25 + .../instance/visitGraphicsInclude..st | 4 + .../instance/visitLabelDefinition..st | 4 + .../instance/visitLabelReference..st | 4 + .../instance/visitLatexInclude..st | 4 + .../instance/visitLetCommandDefinition..st | 4 + .../instance/visitLineComment..st | 3 + .../instance/visitNewCommandDefinition..st | 4 + .../instance/visitPackageInclude..st | 18 + .../instance/visitPath..st | 5 + .../instance/visitPlaceholder..st | 18 + .../instance/visitTheoremDefinition..st | 4 + .../instance/withCommandArguments.do..st | 8 + .../methodProperties.json | 127 + .../properties.json | 31 + .../SBESBLatex.class/README.md | 0 .../SBESBLatex.class/class/fileSuffix.st | 4 + .../SBESBLatex.class/class/grammarJson.st | 5775 +++++++++++++++++ .../SBESBLatex.class/class/language.st | 4 + .../SBESBLatex.class/class/rootRuleName.st | 4 + .../SBESBLatex.class/methodProperties.json | 8 + .../SBESBLatex.class/properties.json | 14 + .../instance/sbeLatex.st | 5 + .../methodProperties.json | 5 + .../SBTreeSitter.extension/properties.json | 2 + .../instance/sbeLastAttributes.st | 4 + .../methodProperties.json | 5 + .../TextStream.extension/properties.json | 2 + .../instance/sbeLastAttributes.st | 5 + .../methodProperties.json | 5 + .../WriteStream.extension/properties.json | 2 + .../monticello.meta/categories.st | 1 + .../monticello.meta/initializers.st | 0 .../SBE-ExtractBook.package/properties.json | 2 + 388 files changed, 11388 insertions(+), 2 deletions(-) create mode 100644 SmalltalkSources/SBE-Book.package/.filetree create mode 100644 SmalltalkSources/SBE-Book.package/.squot-contents create mode 100644 SmalltalkSources/SBE-Book.package/Form.extension/instance/asSbeTextAnchor.st create mode 100644 SmalltalkSources/SBE-Book.package/Form.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/Form.extension/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/Object.extension/instance/sbeStoreHtmlString.st create mode 100644 SmalltalkSources/SBE-Book.package/Object.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/Object.extension/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/instance/canonicalHierarchyOrder.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/instance/textForHelp.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookChapter.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookChapter.class/instance/canonicalHierarchyOrder.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookChapter.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookChapter.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/class/on..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/book.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/bookNode..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/bookNode.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/contents.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/key..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/key.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/shouldStyle.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/subtopics.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/title.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/testStoring.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/addChild..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/addChildren..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/addExtraLabels..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/anchorLabels.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/asHelpTopic.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/book.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/canonicalHierarchyOrder.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/children..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/children.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/childrenForHelp.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/extraLabels..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/extraLabels.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/fullText.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/fullTextForHelp.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/initialize.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/isBookChunk.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/isHelpLeaf.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/labels.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/mayContain..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/openLabel.in..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parent..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parent.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/pathToLabel..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/printOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/storeOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/text..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/text.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/textForHelp.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/title..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/title.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/titleSeparatorForHelp.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/wantsOwnHelpTopic.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/canonicalHierarchyOrder.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/isHelpLeaf.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/titleSeparatorForHelp.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/wantsOwnHelpTopic.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookPart.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookPart.class/instance/canonicalHierarchyOrder.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookPart.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookPart.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSection.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/canonicalHierarchyOrder.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/isHelpLeaf.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSection.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSection.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/canonicalHierarchyOrder.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/initialize.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/isHelpLeaf.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/level..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/level.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/storeOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/titleSeparatorForHelp.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/wantsOwnHelpTopic.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/class/book..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/class/book.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/class/bookBlurb.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/class/bookName.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/class/icon.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/class/introduction.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/class/pages.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/class/squeakBalloonIcon.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/class/theBook.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/initialize.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/mapTagToAttribute..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/nextText.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/^equals.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/closeHtmlOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/hash.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/image.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/openHtmlOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/class/label..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/^equals.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/closeHtmlOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/hash.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/isOblivious.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/label..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/label.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/instance/openHtmlOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelAnchor.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/class/to..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/^equals.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/actOnClickFor..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/closeHtmlOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/hash.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/label..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/label.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/openHtmlOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/class/for..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/class/for.initialExtent..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/^equals.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/actOnClickFor..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/closeHtmlOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/hash.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/image..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/image.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/initialExtent..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/initialExtent.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/openHtmlOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/Text.extension/instance/sbeStoreHtmlString.st create mode 100644 SmalltalkSources/SBE-Book.package/Text.extension/instance/semanticAllAttributes.st create mode 100644 SmalltalkSources/SBE-Book.package/Text.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/Text.extension/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/monticello.meta/categories.st create mode 100644 SmalltalkSources/SBE-Book.package/monticello.meta/initializers.st create mode 100644 SmalltalkSources/SBE-Book.package/properties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/.filetree create mode 100644 SmalltalkSources/SBE-ExtractBook.package/.squot-contents create mode 100644 SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/instance/sbeType.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/instance/sbeVisit..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/DCBlock.extension/properties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/DCLineBreak.extension/instance/sbeVisit..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/DCLineBreak.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/DCLineBreak.extension/properties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/DCText.extension/instance/sbeType.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/DCText.extension/instance/sbeVisit..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/DCText.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/DCText.extension/properties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/README.md create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/class/example.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicEmitImage..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitRoot..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitText..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/book.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandCaption..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandCt..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandDoThis..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandEmph..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandFootnote..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandGo..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandImportant..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLstNewEnvironment..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLstSet..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandMenu..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandNumFileTreeMethodInput..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandShort..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandSqueakVersion..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandSubfigure..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandTextIPA..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandTextbf..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandURL..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandVerb..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/defaultImageScaleFactor.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/doThisImage.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitBoldDuring..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCaptionDuring..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCode..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCodeDuring..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitDoThisDuring..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitEmphasis..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitEmphasisDuring..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitGo.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImportantDuring..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitItemLabel..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitLabel..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitLineBreak..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitMenuDuring..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitRef..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitURL..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentCode.options..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentFigure.options..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentMinipage.options..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/environmentWrapFigure.options..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/imageScaleFactor..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/imageScaleFactor.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/initialize.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/monticelloIPAImage.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/nameForKey..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/preprocessedContentsFromFile..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/squeakVersion.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/squeakVersionString.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitCaption..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitChapter..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitParagraph..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitPart..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitSection..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitStructureElement.forBookNode..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitSubsection..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitSubsubsection..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/properties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/README.md create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/extractFromFile..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/parseFile..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/todo.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisit..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitAny..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitForParsing..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitGraphicsFile..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitLineBreak..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitRoot..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitText..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/buildDate.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandArguments.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandBoolean..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandCopyright..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandDeclareGraphicsExtensions..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandDeclareRobustCommand..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandDef..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandEqual..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandExcludeComment..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandGraphicsPath..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandHandlerFor..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIfThenElse..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIfx..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIncludeGraphics..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIndex..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandInput..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandItem..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLabel..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLdots..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLet..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLineBreak..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewBoolean..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewCommand..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewEnvironment..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewTheorem..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandParBox..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandParskip..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandPdfMinorVersion..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandProvidesPackage..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRaiseBox..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRef..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRenewCommand..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandSetBoolean..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandSetCounter..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandSpace..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTimes..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandToday..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contents.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsIn..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.brackets..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.brackets.optional..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.full.brackets.optional..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.full.optionalBrackets..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.optionalBrackets..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitItemLabel..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitLabel..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitLineBreak..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitRef..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitRefPlaceholder..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentComment.options..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentDescription.options..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentEnumerate.options..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentEnumerateStar.options..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentHandlerFor..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentItemize.options..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/extractFromFile..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/extractFromRootFile..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/extractFromString..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup.brackets..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup.brackets.optional..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup.optionalBrackets..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/handleCommand.arguments..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/handleEnvironment.options.during..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/ignoredCommands.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/initialize.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/initializeCommandHandlers.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/initializeEnvironmentHandlers.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/listFromGroup..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/mapFromGroup..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/nameForKey..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/nameOfCommand..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/notify..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/parseFile..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/parseString..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/preprocessedContentsFromFile..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/refPlaceholderStart.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/refPlaceholderStop.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/resetStream.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/resolveRefs.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/rootFile..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/rootFile.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/setCommandHandlers.environmentHandlers..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/specialCharacters.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/stream.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveFile..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveFile.extensions..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveFile.extensions.paths..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveGraphicsFile..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveSourceFile..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/verbatimSpecialCharacters.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visit..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitClassInclude..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitColorDefinition..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitCommentEnvironment..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitCurlyGroup..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitEnumItem..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitEnvironmentDefinition..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitGenericCommand..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitGenericEnvironment..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitGraphicsInclude..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLabelDefinition..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLabelReference..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLatexInclude..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLetCommandDefinition..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLineComment..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitNewCommandDefinition..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPackageInclude..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPath..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPlaceholder..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitTheoremDefinition..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/withCommandArguments.do..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/properties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/README.md create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/fileSuffix.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/grammarJson.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/language.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/rootRuleName.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/properties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBTreeSitter.extension/instance/sbeLatex.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBTreeSitter.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBTreeSitter.extension/properties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/TextStream.extension/instance/sbeLastAttributes.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/TextStream.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/TextStream.extension/properties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/WriteStream.extension/instance/sbeLastAttributes.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/WriteStream.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/WriteStream.extension/properties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/monticello.meta/categories.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/monticello.meta/initializers.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/properties.json diff --git a/.squot b/.squot index ba191ad5..78717cb5 100644 --- a/.squot +++ b/.squot @@ -8,5 +8,7 @@ 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 } \ 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..a6dbc908 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: 'Sandblocks-TreeSitter' 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' 'Sandblocks-TreeSitter')]; package: #'SBE-Monticello'; package: #'SBE-Morphic'; package: #'SBE-Quinto'; diff --git a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json index d1bd2318..cbb48a47 100644 --- a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json +++ b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json @@ -2,4 +2,4 @@ "class" : { }, "instance" : { - "baseline:" : "ct 4/26/2021 18:32" } } + "baseline:" : "ct 11/21/2023 15:11" } } 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/methodProperties.json b/SmalltalkSources/SBE-Book.package/Form.extension/methodProperties.json new file mode 100644 index 00000000..93c64046 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Form.extension/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "asSbeTextAnchor" : "ct 11/15/2023 19:38" } } 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/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/textForHelp.st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/textForHelp.st new file mode 100644 index 00000000..807b7ab4 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/textForHelp.st @@ -0,0 +1,10 @@ +converting +textForHelp + + | helpText index | + helpText := super textForHelp. + + 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/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBook.class/methodProperties.json new file mode 100644 index 00000000..59e94d22 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/methodProperties.json @@ -0,0 +1,6 @@ +{ + "class" : { + }, + "instance" : { + "canonicalHierarchyOrder" : "ct 11/8/2023 22:38", + "textForHelp" : "ct 11/15/2023 18:02" } } 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..507005fc --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + ], + "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/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/methodProperties.json new file mode 100644 index 00000000..104e26c9 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "canonicalHierarchyOrder" : "ct 11/8/2023 22:38" } } 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/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/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/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/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/methodProperties.json new file mode 100644 index 00000000..7874c261 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/methodProperties.json @@ -0,0 +1,13 @@ +{ + "class" : { + "on:" : "ct 11/9/2023 21:39" }, + "instance" : { + "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", + "key" : "ct 11/9/2023 21:47", + "key:" : "ct 11/15/2023 17:38", + "shouldStyle" : "ct 11/15/2023 17:39", + "subtopics" : "ct 11/10/2023 01:44", + "title" : "ct 11/9/2023 21:47" } } 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/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..dab4a636 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/anchorLabels.st @@ -0,0 +1,8 @@ +accessing +anchorLabels + + self text ifNil: [^ #()]. + ^ (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/initialize.st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/initialize.st new file mode 100644 index 00000000..8294b57c --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/initialize.st @@ -0,0 +1,7 @@ +initialize-release +initialize + + super initialize. + + self children: OrderedCollection new. + extraLabels := OrderedCollection new. \ 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/openLabel.in..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/openLabel.in..st new file mode 100644 index 00000000..5a3c3ae0 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/openLabel.in..st @@ -0,0 +1,16 @@ +actions +openLabel: key in: aHelpBrowser + + | path topicNode topic index | + path := self pathToLabel: key. + path ifNil: [^ self inform: ('{1} not found :(' format: {key})]. + + topicNode := (path select: [:node | node wantsOwnHelpTopic]) last. + aHelpBrowser showTopicThat: [:ea | + (ea isKindOf: SBEBookHelpTopic) + and: [(topic := ea) bookNode = topicNode]]. + + index := topic contents runs findFirst: [:attrs | + attrs anySatisfy: [:attr | + (attr isKindOf: SBETextLabelAnchor) and: [attr label = key]]]. + (aHelpBrowser anyTextPaneWithSelector: #topicContents) selectionInterval: (index to: index - 1). \ 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/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/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..a3a705e0 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/storeOn..st @@ -0,0 +1,15 @@ +converting +storeOn: aStream + + aStream nextPutAll: +('({1} new + title: {2}; + addChildren: {3}; + text: {4}; + extraLabels: {5}; + yourself)' format: + {self class name. + self title sbeStoreHtmlString. + self children storeString. + self text sbeStoreHtmlString. + self extraLabels 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..59fa3e21 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/text..st @@ -0,0 +1,4 @@ +accessing +text: aStringOrText + + text := aStringOrText. \ 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/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..884a552d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json @@ -0,0 +1,36 @@ +{ + "class" : { + "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/21/2023 13:56", + "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", + "initialize" : "ct 11/13/2023 21:28", + "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", + "openLabel:in:" : "ct 11/21/2023 13:57", + "parent" : "ct 11/15/2023 19:51", + "parent:" : "ct 11/15/2023 19:51", + "pathToLabel:" : "ct 11/13/2023 20:37", + "printOn:" : "ct 11/8/2023 22:46", + "storeOn:" : "ct 11/15/2023 20:16", + "text" : "ct 11/9/2023 22:47", + "text:" : "ct 11/9/2023 22:47", + "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", + "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..bd892b9d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/properties.json @@ -0,0 +1,18 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "title", + "parent", + "children", + "text", + "extraLabels" ], + "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/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/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..9f9a28ad --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/methodProperties.json @@ -0,0 +1,8 @@ +{ + "class" : { + }, + "instance" : { + "canonicalHierarchyOrder" : "ct 11/9/2023 21:13", + "isHelpLeaf" : "ct 11/9/2023 22:42", + "titleSeparatorForHelp" : "ct 11/9/2023 23:06", + "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/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/methodProperties.json new file mode 100644 index 00000000..104e26c9 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "canonicalHierarchyOrder" : "ct 11/8/2023 22:38" } } 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/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/methodProperties.json new file mode 100644 index 00000000..527c8a0c --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/methodProperties.json @@ -0,0 +1,6 @@ +{ + "class" : { + }, + "instance" : { + "canonicalHierarchyOrder" : "ct 11/8/2023 22:38", + "isHelpLeaf" : "ct 11/9/2023 22:42" } } 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/storeOn..st b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/storeOn..st new file mode 100644 index 00000000..dbac5c65 --- /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}) \ 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/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..22cc5a30 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/methodProperties.json @@ -0,0 +1,12 @@ +{ + "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", + "storeOn:" : "ct 11/15/2023 19:57", + "titleSeparatorForHelp" : "ct 11/9/2023 23:07", + "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..018feeb6 --- /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 classical 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 this parser is meant to be an approximation only and we didn''t get every space right to save our own sanity. Nevertheless, 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 53 3 1 5 151 11 1 11 1 11 7 13 399 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..cd11088b --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/pages.st @@ -0,0 +1,4 @@ +accessing +pages + + ^ #("introduction" "<- enable for edits" theBook) \ 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..e0d1f5be --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/methodProperties.json @@ -0,0 +1,13 @@ +{ + "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/15/2023 18:03", + "pages" : "ct 11/21/2023 13:58", + "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..06867a77 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/mapTagToAttribute..st @@ -0,0 +1,18 @@ +mapping +mapTagToAttribute: aTag + + (self hasTag: aTag name: ''. \ 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..c1a46463 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/hash.st @@ -0,0 +1,5 @@ +comparing +hash + + ^ self class hash + bitXor: self image bits 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..de2ee003 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/image.st @@ -0,0 +1,4 @@ +accessing +image + + ^ self anchoredMorph \ 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..257e1456 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/openHtmlOn..st @@ -0,0 +1,10 @@ +html +openHtmlOn: aHtmlReadWriter + + | data | + data := (ByteArray streamContents: [:stream | + PNGReadWriter putForm: self image onStream: stream]) + base64Encoded. + + aHtmlReadWriter nextPutAll: + ('' format: {data}). \ 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..9eea9291 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/methodProperties.json @@ -0,0 +1,9 @@ +{ + "class" : { + }, + "instance" : { + "=" : "ct 11/20/2023 21:14", + "closeHtmlOn:" : "ct 11/15/2023 19:36", + "hash" : "ct 11/20/2023 21:16", + "image" : "ct 11/20/2023 21:14", + "openHtmlOn:" : "ct 11/20/2023 21:14" } } 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..e9d26717 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-Book", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + ], + "name" : "SBETextAnchor", + "pools" : [ + ], + "super" : "TextAnchor", + "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..23a04aaa --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/instance/actOnClickFor..st @@ -0,0 +1,7 @@ +mouse events +actOnClickFor: anObject + + | book | + book := anObject currentTopic book. + book openLabel: self label in: anObject. + ^ 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/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/methodProperties.json new file mode 100644 index 00000000..90cd57a5 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextLabelLink.class/methodProperties.json @@ -0,0 +1,11 @@ +{ + "class" : { + "to:" : "ct 11/15/2023 19:48" }, + "instance" : { + "=" : "ct 11/20/2023 21:18", + "actOnClickFor:" : "ct 11/15/2023 19:51", + "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" } } 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..32bb7397 --- /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 image bits = self image bits] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/actOnClickFor..st b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/actOnClickFor..st new file mode 100644 index 00000000..678f84e1 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/actOnClickFor..st @@ -0,0 +1,9 @@ +mouse events +actOnClickFor: anObject + + | sketch | + sketch := SketchMorph withForm: self image. + 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..1074fdeb --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/instance/hash.st @@ -0,0 +1,5 @@ +comparing +hash + + ^ self initialExtent hash + bitXor: self image bits 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/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..0feee10e --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextOpenImageAction.class/methodProperties.json @@ -0,0 +1,14 @@ +{ + "class" : { + "for:" : "ct 11/15/2023 19:43", + "for:initialExtent:" : "ct 11/15/2023 19:45" }, + "instance" : { + "=" : "ct 11/20/2023 21:14", + "actOnClickFor:" : "ct 11/15/2023 19:49", + "closeHtmlOn:" : "ct 11/15/2023 20:01", + "hash" : "ct 11/20/2023 21:23", + "image" : "ct 11/15/2023 19:43", + "image:" : "ct 11/15/2023 19:43", + "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/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/instance/semanticAllAttributes.st b/SmalltalkSources/SBE-Book.package/Text.extension/instance/semanticAllAttributes.st new file mode 100644 index 00000000..b146a86e --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Text.extension/instance/semanticAllAttributes.st @@ -0,0 +1,8 @@ +*SBE-Book-emphasis +semanticAllAttributes + + 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/methodProperties.json b/SmalltalkSources/SBE-Book.package/Text.extension/methodProperties.json new file mode 100644 index 00000000..9a86422c --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/Text.extension/methodProperties.json @@ -0,0 +1,6 @@ +{ + "class" : { + }, + "instance" : { + "sbeStoreHtmlString" : "ct 11/20/2023 20:37", + "semanticAllAttributes" : "ct 8/18/2023 00:07" } } 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-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/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..cc21d4bd --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/class/example.st @@ -0,0 +1,11 @@ +documentation +example + + | book dir | + dir := FileSystem disk root resolve: '/path/to/SqueakByExample-english'. + book := SBEBookExtractor new + imageScaleFactor: 2.5; + extractFromRootFile: dir / 'SBE.tex'; + book. + "SBEHelp book: book." + ^ book asHelpTopic open \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicEmitImage..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicEmitImage..st new file mode 100644 index 00000000..5ed4b41d --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicEmitImage..st @@ -0,0 +1,4 @@ +emitting +basicEmitImage: aForm + + ^ super emitImage: aForm \ 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..cee6bcfc --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitRoot..st @@ -0,0 +1,14 @@ +visiting - nodes +basicVisitRoot: node + + | oldNode result | + result := super basicVisitRoot: node. + + file = rootFile ifTrue: + [oldNode := nodeStack top. + self stream contents withBlanksTrimmed ifNotEmpty: [:text | + self assert: oldNode text isNil. + oldNode text: text withBlanksTrimmed]]. + 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..ceddf0f6 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitText..st @@ -0,0 +1,30 @@ +visiting - nodes +basicVisitText: aString + + (aString 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: aString; yourself); + addMorphBack: + gen peek; + sbeVisit: self]). + ^ self]. + + pendingLabels ifNotEmpty: + [aString ifNotEmpty: + [| currentLabels | + currentLabels := pendingLabels copy. + pendingLabels removeAll. + self basicVisitText: aString first asString. + currentLabels do: [:label | + self emitLabel: label]. + self basicVisitText: aString allButFirst. + ^ self]]. + + ^ super basicVisitText: aString \ 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/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/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/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..e9f94fc7 --- /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: (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/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/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/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..ee128681 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCaptionDuring..st @@ -0,0 +1,6 @@ +emitting +emitCaptionDuring: aBlock + + ^ self stream + withAttribute: TextFontChange font1 + 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..65d45e07 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCodeDuring..st @@ -0,0 +1,23 @@ +emitting +emitCodeDuring: aBlock + + ^ self stream withAttribute: TextColor blue 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..1ff44082 --- /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 basicEmitImage: self doThisImage. + 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..3ae7bc55 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st @@ -0,0 +1,11 @@ +emitting +emitImage: aForm + + | scaledForm | + scaledForm := figure + ifNotNil: [aForm scaledToSize: ((aForm extent / self imageScaleFactor) roundTo: 8)] + ifNil: [aForm scaledToHeight: TextStyle defaultFont height]. + self stream + withAttribute: (SBETextOpenImageAction for: aForm initialExtent: scaledForm extent) + do: + [super emitImage: scaledForm]. \ 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/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/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..9931df44 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/initialize.st @@ -0,0 +1,12 @@ +initialize-release +initialize + + super initialize. + + book := SBEBook new + title: 'Squeak by Example'; + yourself. + nodeStack := Stack new. + nodeStack push: book. + pendingLabels := OrderedCollection new. + self imageScaleFactor: self defaultImageScaleFactor. \ 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..39d96023 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/nameForKey..st @@ -0,0 +1,7 @@ +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]]. + ^ 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..041b8563 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/preprocessedContentsFromFile..st @@ -0,0 +1,13 @@ +private +preprocessedContentsFromFile: aFSReference + + | contents | + contents := super preprocessedContentsFromFile: aFSReference. + + 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: ''. + + ^ 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..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/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/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..b0ccf38a --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitStructureElement.forBookNode..st @@ -0,0 +1,30 @@ +visiting - nodes +visitStructureElement: node forBookNode: bookNodeClass + + | bookNode title oldNode | + self assert: node children first sbeType isNil. + title := self contentsIn: node children second. + bookNode := bookNodeClass new. + bookNode title: title. + "bookNode labels: labels." + + oldNode := nodeStack top. + self resolveRefs. + self stream contents withBlanksTrimmed ifNotEmpty: [:text | + self assert: oldNode text isNil. + oldNode text: text withBlanksTrimmed]. + pendingLabels ifNotEmpty: + [oldNode addExtraLabels: pendingLabels copy. + pendingLabels removeAll]. + + self resetStream. + + [nodeStack top mayContain: bookNode] whileFalse: + [nodeStack pop]. + nodeStack push: + (nodeStack top addChild: bookNode). + + (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..70d88b21 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json @@ -0,0 +1,64 @@ +{ + "class" : { + "example" : "ct 11/21/2023 14:49" }, + "instance" : { + "basicEmitImage:" : "ct 11/13/2023 21:57", + "basicVisitRoot:" : "ct 11/21/2023 14:27", + "basicVisitText:" : "ct 11/21/2023 14:27", + "book" : "ct 11/8/2023 23:05", + "commandCaption:" : "ct 11/15/2023 21:57", + "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", + "commandLstNewEnvironment:" : "ct 11/16/2023 20:59", + "commandLstSet:" : "ct 11/16/2023 21:12", + "commandMenu:" : "ct 11/8/2023 19:41", + "commandNumFileTreeMethodInput:" : "ct 11/20/2023 20:16", + "commandShort:" : "ct 11/8/2023 20:09", + "commandSqueakVersion:" : "ct 11/8/2023 17:46", + "commandSubfigure:" : "ct 11/15/2023 22:33", + "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", + "defaultImageScaleFactor" : "ct 11/14/2023 21:50", + "doThisImage" : "ct 11/9/2023 23:09", + "emitBoldDuring:" : "ct 11/9/2023 21:18", + "emitCaptionDuring:" : "ct 11/15/2023 21:53", + "emitCode:" : "ct 11/15/2023 18:37", + "emitCodeDuring:" : "ct 11/20/2023 18:58", + "emitDoThisDuring:" : "ct 11/20/2023 15:45", + "emitEmphasis:" : "ct 11/9/2023 21:18", + "emitEmphasisDuring:" : "ct 11/9/2023 21:18", + "emitGo" : "ct 11/8/2023 18:51", + "emitImage:" : "ct 11/15/2023 23:09", + "emitImportantDuring:" : "ct 11/12/2023 19:44", + "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", + "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/21/2023 14:24", + "monticelloIPAImage" : "ct 11/8/2023 20:16", + "nameForKey:" : "ct 11/14/2023 22:13", + "preprocessedContentsFromFile:" : "ct 11/21/2023 14:24", + "squeakVersion" : "ct 11/8/2023 17:45", + "squeakVersionString" : "ct 11/8/2023 17:46", + "visitCaption:" : "ct 11/15/2023 21:50", + "visitChapter:" : "ct 11/12/2023 19:50", + "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/21/2023 14:28", + "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..8d79b0fe --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/properties.json @@ -0,0 +1,19 @@ +{ + "category" : "SBE-ExtractBook", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "book", + "squeakVersion", + "imageScaleFactor", + "nodeStack", + "pendingLabels", + "figure" ], + "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/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..f6bd35c1 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/todo.st @@ -0,0 +1,16 @@ +as yet unclassified +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..b8d1c0b9 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitGraphicsFile..st @@ -0,0 +1,13 @@ +visiting +basicVisitGraphicsFile: file + + | image | + image := file readStreamDo: [:fileStream | + [ImageReadWriter formFromStream: fileStream] + ifError: + [('' asText + addAttribute: TextColor red; + asMorph) + imageForm]]. + + 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..4ebafb66 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitLineBreak..st @@ -0,0 +1,18 @@ +visiting - nodes +basicVisitLineBreak: lineBreak + + verbatim ifTrue: [^ self stream cr]. + + 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..fe363524 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandEqual..st @@ -0,0 +1,11 @@ +visiting - commands - macros +commandEqual: arguments + + + self assert: arguments size = 2. + + self + visit: arguments first; + visit: arguments second. + + ifstack push: ifstack pop = ifstack pop. \ 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/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..f1797747 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIndex..st @@ -0,0 +1,4 @@ +visiting - commands +commandIndex: arguments + + "ignore" \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandInput..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandInput..st new file mode 100644 index 00000000..3481fdc8 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandInput..st @@ -0,0 +1,10 @@ +visiting - commands +commandInput: arguments + + + | inputFile inputFileName | + self assert: arguments size = 1. + + inputFileName := self contentsInGroup: arguments first. + inputFile := self tryResolveSourceFile: inputFileName. + ^ self extractFromFile: inputFile \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandItem..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandItem..st new file mode 100644 index 00000000..d85b2ba0 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandItem..st @@ -0,0 +1,46 @@ +visiting - commands +commandItem: arguments + + + | argumentStream listMode label indent | + argumentStream := arguments readStream. + listMode := listModeStack isEmpty ifFalse: [listModeStack top]. + ((#(description nil) includes: listMode) and: [argumentStream peek sbeType = #brackGroupText]) ifTrue: + [label := self fullContentsInGroup: argumentStream next brackets: '[]'. + listMode := #description]. + + listMode = #enumerateStar + ifFalse: [self emitLineBreak: true]. + + indent := (listModeStack size - 1 timesCollect: [String tab]) join. + true caseOf: + {[listMode = #description and: [label notNil]] -> + [self stream nextPutAll: indent. + self emitItemLabel: label; basicVisitText: String space]. + [listMode isNil or: [listMode = #itemize]] -> + [self stream nextPutAll: indent. + self basicVisitText: '* ']. + [listMode = #enumerate] -> + [| count | + count := enumerateStack pop + 1. + enumerateStack push: count. + self stream nextPutAll: indent. + self basicVisitText: ('{1}. ' format: {count})]. + [listMode = #enumerateStar] -> + [| count | + count := enumerateStack pop + 1. + enumerateStack push: count. + self basicVisitText: (' ({1}) ' format: {count})]}. + argumentStream do: [:arg | + self visit: arg]. + + parseStack push: + (Generator on: [:gen | + self assert: gen next isNil. "whyever" + + [gen peek notNil and: [gen peek sbeType = #linebreak or: [gen peek sbeType isNil and: [gen peek contents isAllSeparators]]]] whileTrue: + [gen next]. + + self assert: parseStack pop == gen. + gen peek ifNotNil: [self visit: gen peek]. + parseStack push: gen]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLabel..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLabel..st new file mode 100644 index 00000000..fa2f141c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLabel..st @@ -0,0 +1,10 @@ +visiting - commands +commandLabel: arguments + + + | key | + self assert: arguments size = 1. + + self assert: arguments first sbeType = #curlyGroupText. + key := (self contentsIn: arguments first) asString allButFirst allButLast. + self emitLabel: key. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLdots..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLdots..st new file mode 100644 index 00000000..af9f0757 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLdots..st @@ -0,0 +1,6 @@ +visiting - commands - characters and spacing +commandLdots: arguments + + + self assert: (arguments isEmpty or: [arguments size = 1 and: (arguments first sbeType = #curlyGroup and: [arguments first children size = 2])]). "empty" + self basicVisitText: '...'. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLet..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLet..st new file mode 100644 index 00000000..27375c1d --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLet..st @@ -0,0 +1,13 @@ +visiting - commands - macros +commandLet: arguments + + + | handler name value | + self assert: (arguments size = 2 or: [arguments size = 3 and: [arguments second contents = '=']]). + + name := self contentsIn: arguments first. + self assert: (name notEmpty and: [name first = $\]). + name := name allButFirst. + value := self contentsIn: arguments last. + handler := self commandHandlerFor: value. + commandHandlers at: name put: handler. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLineBreak..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLineBreak..st new file mode 100644 index 00000000..e6fb60fd --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLineBreak..st @@ -0,0 +1,24 @@ +visiting - commands - characters and spacing +commandLineBreak: arguments + + + self assert: arguments isEmpty. + parseStack push: + (Generator on: [:gen | + | unit | + self assert: gen next isNil. "whyever" + + gen peek contents = '[' + ifTrue: + [gen next. + unit := gen next. + self assert: gen peek contents = ']'. + + self stream cr] + ifFalse: + [self stream cr. + + #back. + parseStack pop. + self basicVisit: gen peek. + gen next]]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewBoolean..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewBoolean..st new file mode 100644 index 00000000..18dea2b4 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewBoolean..st @@ -0,0 +1,13 @@ +visiting - commands +commandNewBoolean: arguments + + + | name | + self assert: arguments size = 1. + + name := (self contentsIn: arguments first) asString. + + booleans + at: name + ifPresent: [self notify: 'boolean already exists: ' , name]; + at: name put: {false}. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewCommand..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewCommand..st new file mode 100644 index 00000000..6f7dd86e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewCommand..st @@ -0,0 +1,38 @@ +visiting - commands +commandNewCommand: arguments + + + | argsStream name count value | + argsStream := arguments readStream. + self assert: argsStream atEnd not. + + name := argsStream next. + self assert: name sbeType = #curlyGroupCommandName. + name := self contentsInGroup: name optionalBrackets: true. + self assert: (name size > 1 and: [name first = $\]). + name := name allButFirst. + + self assert: argsStream atEnd not. + count := argsStream next. + count := count sbeType = #brackGroupArgc + ifTrue: + [(self contentsInGroup: count brackets: '[]') asNumber] + ifFalse: + [argsStream back. + 0]. + + self assert: argsStream atEnd not. + value := argsStream next. + + self assert: argsStream atEnd. + + self flag: #todo. "resolve arguments" + commandHandlers + at: name + ifPresent: [:handler | self notify: ('command already defined: {1}' format: {name})] + ifAbsentPut: + [[:extractor :args | extractor + withCommandArguments: + (args collect: [:arg | {arg. extractor commandArguments}]) + do: + [extractor visit: value]]]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewEnvironment..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewEnvironment..st new file mode 100644 index 00000000..c882f533 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewEnvironment..st @@ -0,0 +1,76 @@ +visiting - commands - macros +commandNewEnvironment: arguments + + + | argsStream name count begin end | + argsStream := (arguments reject: [:arg | arg sbeType = #linebreak or: [arg sbeType isNil and: [arg contents isAllSeparators]]]) readStream. + self assert: argsStream atEnd not. + + name := argsStream next. + name := (self fullContentsInGroup: name optionalBrackets: true) asString. + self assert: name notEmpty. + + self assert: argsStream atEnd not. + count := argsStream next. + count := count sbeType = #brackGroupArgc + ifTrue: + [(self fullContentsInGroup: count brackets: '[]') asNumber] + ifFalse: + [argsStream back. + 0]. + + self assert: argsStream atEnd not. + begin := argsStream next. + self assert: (#(curlyGroup curlyGroupImpl) includes: begin sbeType). + self assert: begin children size >= 2. + self assert: (begin children first sbeType isNil and: [begin children first contents = '{']). + self assert: (begin children last sbeType isNil and: [begin children last contents = '}']). + + self assert: argsStream atEnd not. + end := argsStream next. + self assert: (#(curlyGroup curlyGroupImpl) includes: end sbeType). + self assert: end children size >= 2. + self assert: (end children first sbeType isNil and: [end children first contents = '{']). + self assert: (end children last sbeType isNil and: [end children last contents = '}']). + + self assert: argsStream atEnd. + + self flag: #todo. "resolve arguments" + environmentHandlers + at: name + ifPresent: [:handler | self notify: ('environment already defined: {1}' format: {name})]. + ^ environmentHandlers + at: name + put: [:extractor :contentBlock :options | | generator | + (extractor instVarNamed: 'parseStack') push: + (generator := Generator on: [:gen | + | allOptions | + allOptions := OrderedCollection withAll: options. + + self assert: gen next isNil. "whyever" + [allOptions size < count] whileTrue: + [[gen atEnd not and: [(#(linebreak lineComment) includes: gen peek sbeType) or: [gen peek sbeType isNil and: [gen peek contents isAllSeparators]]]] whileTrue: + [gen next]. + allOptions addLast: gen next]. + + extractor + withCommandArguments: + (allOptions collect: [:option | {option. extractor commandArguments}]) + do: + [begin children allButFirst allButLast do: [:child | + self assert: (extractor instVarNamed: 'parseStack') pop == gen. + extractor visit: child. + (extractor instVarNamed: 'parseStack') push: gen]]. + self assert: (extractor instVarNamed: 'parseStack') pop == gen. + [gen peek] whileNotNil: + [extractor visit: gen next]. + extractor + withCommandArguments: + (allOptions collect: [:option | {option. extractor commandArguments}]) + do: + [end children allButFirst allButLast do: [:child | + extractor visit: child]]. + + "todo?"]). + contentBlock value. + generator yield: nil] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewTheorem..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewTheorem..st new file mode 100644 index 00000000..afd6a36b --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandNewTheorem..st @@ -0,0 +1,10 @@ +visiting - commands +commandNewTheorem: arguments + + + | environmentName | + self assert: arguments size = 2. + environmentName := self contentsIn: arguments first. + environmentHandlers + at: environmentName + put: [:extractor :contentBlock :options | contentBlock value]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandParBox..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandParBox..st new file mode 100644 index 00000000..0ce10d58 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandParBox..st @@ -0,0 +1,6 @@ +visiting - commands +commandParBox: arguments + + + self assert: arguments size = 2. + ^ self visit: arguments second \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandParskip..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandParskip..st new file mode 100644 index 00000000..c48b242f --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandParskip..st @@ -0,0 +1,13 @@ +visiting - commands +commandParskip: arguments + + + self assert: arguments isEmpty. + parseStack push: + (Generator on: [:gen | + self assert: gen next isNil. "whyever" + + [gen peek sbeType isNil and: [gen peek contents isAllSeparators]] whileTrue: + [gen next]. + + self assert: gen peek notNil "ignore"]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandPdfMinorVersion..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandPdfMinorVersion..st new file mode 100644 index 00000000..03e6f089 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandPdfMinorVersion..st @@ -0,0 +1,27 @@ +visiting - commands +commandPdfMinorVersion: arguments + + + self assert: arguments isEmpty. + parseStack push: + (Generator on: [:gen | + | nodes | + self assert: gen next isNil. "whyever" + self assert: gen next contents = '='. + nodes := Generator on: [:nodeStream | + | node | + node := gen next. + node sbeType = #genericCommand + ifFalse: [nodeStream nextPutAll: node children] + ifTrue: + [nodeStream + nextPut: node; + nextPutAll: gen]]. + + self assert: nodes next sbeType = #word. + + #back. + nodes := nodes upToEnd. + parseStack pop. + nodes do: [:ea | self visit: ea]. + gen next]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandProvidesPackage..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandProvidesPackage..st new file mode 100644 index 00000000..673e67b1 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandProvidesPackage..st @@ -0,0 +1,4 @@ +visiting - commands +commandProvidesPackage: arguments + + "ignore for now" \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRaiseBox..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRaiseBox..st new file mode 100644 index 00000000..16f75afe --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRaiseBox..st @@ -0,0 +1,23 @@ +visiting - commands +commandRaiseBox: arguments + + + arguments size = 2 ifTrue: + [^ self visit: arguments second]. + + parseStack push: + (Generator on: [:gen | + | unit | + self assert: gen next isNil. "whyever" + + "ignore" + (1 to: 2) allSatisfy: [:i | + gen peek contents = '[' + ifTrue: + [gen next. + unit := gen next. + self assert: gen next contents = ']']; + yourself]. + self assert: gen peek sbeType = #curlyGroup. + + self visit: gen next]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRef..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRef..st new file mode 100644 index 00000000..521db314 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRef..st @@ -0,0 +1,9 @@ +visiting - commands +commandRef: arguments + + + | key | + self assert: arguments size = 1. + + key := (self fullContentsInGroup: arguments first) asString. + self emitRefPlaceholder: key. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRenewCommand..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRenewCommand..st new file mode 100644 index 00000000..4b62fa90 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRenewCommand..st @@ -0,0 +1,32 @@ +visiting - commands - macros +commandRenewCommand: arguments + + + | argsStream name count value | + argsStream := arguments readStream. + self assert: argsStream atEnd not. + + name := argsStream next. + self assert: name sbeType = #curlyGroupCommandName. + name := self contentsInGroup: name optionalBrackets: true. + self assert: (name size > 1 and: [name first = $\]). + name := name allButFirst. + + self assert: argsStream atEnd not. + count := argsStream next. + count := count sbeType = #brackGroupArgc + ifTrue: + [(self contentsInGroup: count brackets: '[]') asNumber] + ifFalse: + [argsStream back. + 0]. + + self assert: argsStream atEnd not. + value := argsStream next. + + self assert: argsStream atEnd. + + self flag: #todo. "resolve arguments" + commandHandlers + at: name + put: [:extractor :args | extractor visit: value]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandSetBoolean..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandSetBoolean..st new file mode 100644 index 00000000..91b7a500 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandSetBoolean..st @@ -0,0 +1,13 @@ +visiting - commands +commandSetBoolean: arguments + + + | name value | + self assert: arguments size = 2. + + name := (self contentsIn: arguments first) asString. + value := (self contentsIn: arguments second) asString + caseOf: {['true'] -> [true]. ['false'] -> [false]}. + + (booleans at: name) + at: 1 put: value. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandSetCounter..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandSetCounter..st new file mode 100644 index 00000000..90eca8b9 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandSetCounter..st @@ -0,0 +1,8 @@ +visiting - commands +commandSetCounter: arguments + + + self assert: arguments size = 2. + counters + at: (self contentsIn: arguments first) asString + put: (self contentsIn: arguments second). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandSpace..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandSpace..st new file mode 100644 index 00000000..122738f6 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandSpace..st @@ -0,0 +1,6 @@ +visiting - commands - characters and spacing +commandSpace: arguments + + + self assert: (arguments isEmpty or: [arguments size = 1 and: (arguments first sbeType = #curlyGroup and: [arguments first children size = 2])]). "empty" + self basicVisitText: ' '. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTimes..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTimes..st new file mode 100644 index 00000000..3d44c91d --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTimes..st @@ -0,0 +1,6 @@ +visiting - commands - characters and spacing +commandTimes: arguments + + + self assert: arguments isEmpty. + self basicVisitText: 'x'. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandToday..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandToday..st new file mode 100644 index 00000000..41c35dbb --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandToday..st @@ -0,0 +1,6 @@ +visiting - commands +commandToday: arguments + + + self assert: arguments isEmpty. + self basicVisitText: self buildDate asDate yyyymmdd. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contents.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contents.st new file mode 100644 index 00000000..caaebf1e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contents.st @@ -0,0 +1,4 @@ +accessing +contents + + ^ self stream contents \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsIn..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsIn..st new file mode 100644 index 00000000..9bc80c56 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsIn..st @@ -0,0 +1,13 @@ +private +contentsIn: node + + | extractor | + extractor := self class new. + extractor + rootFile: rootFile; + setCommandHandlers: commandHandlers + environmentHandlers: environmentHandlers. + "yeah ... in theory we would have to copy way more here ..." + extractor withCommandArguments: commandArguments do: + [extractor visit: node]. + ^ extractor contents \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup..st new file mode 100644 index 00000000..17f6858d --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup..st @@ -0,0 +1,4 @@ +private +contentsInGroup: node + + ^ self contentsInGroup: node optionalBrackets: false \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.brackets..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.brackets..st new file mode 100644 index 00000000..b20c94ed --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.brackets..st @@ -0,0 +1,7 @@ +private +contentsInGroup: node brackets: brackets + + ^ self + contentsInGroup: node + brackets: brackets + optional: false \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.brackets.optional..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.brackets.optional..st new file mode 100644 index 00000000..0aa7212b --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.brackets.optional..st @@ -0,0 +1,8 @@ +private +contentsInGroup: node brackets: brackets optional: optionalBrackets + + ^ self + contentsInGroup: node + full: false + brackets: brackets + optional: optionalBrackets \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.full.brackets.optional..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.full.brackets.optional..st new file mode 100644 index 00000000..58545fe1 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.full.brackets.optional..st @@ -0,0 +1,12 @@ +private +contentsInGroup: node full: full brackets: brackets optional: optionalBrackets + + (optionalBrackets and: [node children size = 1]) ifTrue: + [^ node children first contents]. + + self assert: node children size = 3. + self assert: (node children first sbeType isNil and: [node children first contents = brackets first asString]). + self assert: (node children last sbeType isNil and: [node children last contents = brackets second asString]). + ^ full + ifTrue: [self contentsIn: node children second] + ifFalse: [node children second contents] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.full.optionalBrackets..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.full.optionalBrackets..st new file mode 100644 index 00000000..86acb929 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.full.optionalBrackets..st @@ -0,0 +1,8 @@ +private +contentsInGroup: node full: full optionalBrackets: optionalBrackets + + ^ self + contentsInGroup: node + full: full + brackets: '{}' + optional: optionalBrackets \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.optionalBrackets..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.optionalBrackets..st new file mode 100644 index 00000000..2ab6ee1f --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsInGroup.optionalBrackets..st @@ -0,0 +1,7 @@ +private +contentsInGroup: node optionalBrackets: optionalBrackets + + ^ self + contentsInGroup: node + brackets: '{}' + optional: optionalBrackets \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage..st new file mode 100644 index 00000000..282dfd11 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage..st @@ -0,0 +1,6 @@ +emitting +emitImage: aForm + + self stream withAttribute: aForm asSbeTextAnchor do: + [self stream nextPut: Character home]. + previousLineBreaks := 0. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitItemLabel..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitItemLabel..st new file mode 100644 index 00000000..64fbb07e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitItemLabel..st @@ -0,0 +1,4 @@ +emitting +emitItemLabel: aString + + self basicVisitText: aString. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitLabel..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitLabel..st new file mode 100644 index 00000000..033b7a37 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitLabel..st @@ -0,0 +1,4 @@ +emitting +emitLabel: key + + labels at: key put: self stream position. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitLineBreak..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitLineBreak..st new file mode 100644 index 00000000..f5bb4d50 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitLineBreak..st @@ -0,0 +1,4 @@ +emitting +emitLineBreak: single + + self stream cr. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitRef..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitRef..st new file mode 100644 index 00000000..859b1d7e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitRef..st @@ -0,0 +1,4 @@ +emitting +emitRef: key + + self basicVisitText: (self nameForKey: key). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitRefPlaceholder..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitRefPlaceholder..st new file mode 100644 index 00000000..28a42d87 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitRefPlaceholder..st @@ -0,0 +1,8 @@ +emitting +emitRefPlaceholder: key + + self stream + nextPut: self refPlaceholderStart; + nextPutAll: key; + nextPut: self refPlaceholderStop. + previousLineBreaks := 0. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentComment.options..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentComment.options..st new file mode 100644 index 00000000..2ed77248 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentComment.options..st @@ -0,0 +1,5 @@ +visiting - environments +environmentComment: contentBlock options: options + + + "ignore" \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentDescription.options..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentDescription.options..st new file mode 100644 index 00000000..943ef997 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentDescription.options..st @@ -0,0 +1,9 @@ +visiting - environments +environmentDescription: contentBlock options: options + + + | result | + listModeStack push: #description. + result := contentBlock value. + listModeStack pop. + ^ result \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentEnumerate.options..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentEnumerate.options..st new file mode 100644 index 00000000..42cc5f57 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentEnumerate.options..st @@ -0,0 +1,10 @@ +visiting - environments +environmentEnumerate: contentBlock options: options + + + | result | + listModeStack push: #enumerate. + enumerateStack push: 0. + result := contentBlock value. + listModeStack pop. + ^ result \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentEnumerateStar.options..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentEnumerateStar.options..st new file mode 100644 index 00000000..1e652b91 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentEnumerateStar.options..st @@ -0,0 +1,10 @@ +visiting - environments +environmentEnumerateStar: contentBlock options: options + + + | result | + listModeStack push: #enumerateStar. + enumerateStack push: 0. + result := contentBlock value. + listModeStack pop. + ^ result \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentHandlerFor..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentHandlerFor..st new file mode 100644 index 00000000..88c03dec --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentHandlerFor..st @@ -0,0 +1,8 @@ +handlers +environmentHandlerFor: name + + | handler | + handler := environmentHandlers at: name ifAbsent: [^ nil]. + handler isSymbol ifTrue: + [^ [:contentBlock :options | self perform: handler with: contentBlock with: options]]. + ^ [:contentBlock :options | handler value: self value: contentBlock value: options] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentItemize.options..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentItemize.options..st new file mode 100644 index 00000000..25fdad20 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/environmentItemize.options..st @@ -0,0 +1,9 @@ +visiting - environments +environmentItemize: contentBlock options: options + + + | result | + listModeStack push: #itemize. + result := contentBlock value. + listModeStack pop. + ^ result \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/extractFromFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/extractFromFile..st new file mode 100644 index 00000000..9b7f4658 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/extractFromFile..st @@ -0,0 +1,9 @@ +extracting +extractFromFile: aFSReference + + | root previousFile | + root := self parseFile: aFSReference. + previousFile := file. + file := aFSReference. + ^ [self basicVisitRoot: root] + ensure: [file := previousFile] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/extractFromRootFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/extractFromRootFile..st new file mode 100644 index 00000000..ef301776 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/extractFromRootFile..st @@ -0,0 +1,5 @@ +extracting +extractFromRootFile: aFSReference + + rootFile := aFSReference. + ^ self extractFromFile: aFSReference \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/extractFromString..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/extractFromString..st new file mode 100644 index 00000000..5cae08c3 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/extractFromString..st @@ -0,0 +1,9 @@ +extracting +extractFromString: aString + + | root previousFile | + root := self parseString: aString. + previousFile := file. + file := nil. + ^ [self basicVisitRoot: root] + ensure: [file := previousFile] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup..st new file mode 100644 index 00000000..76c84f93 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup..st @@ -0,0 +1,4 @@ +private +fullContentsInGroup: node + + ^ self fullContentsInGroup: node optionalBrackets: false \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup.brackets..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup.brackets..st new file mode 100644 index 00000000..81b826db --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup.brackets..st @@ -0,0 +1,7 @@ +private +fullContentsInGroup: node brackets: brackets + + ^ self + fullContentsInGroup: node + brackets: brackets + optional: false \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup.brackets.optional..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup.brackets.optional..st new file mode 100644 index 00000000..6b639f61 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup.brackets.optional..st @@ -0,0 +1,8 @@ +private +fullContentsInGroup: node brackets: brackets optional: optionalBrackets + + ^ self + contentsInGroup: node + full: true + brackets: brackets + optional: optionalBrackets \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup.optionalBrackets..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup.optionalBrackets..st new file mode 100644 index 00000000..cf319d20 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/fullContentsInGroup.optionalBrackets..st @@ -0,0 +1,7 @@ +private +fullContentsInGroup: node optionalBrackets: optionalBrackets + + ^ self + contentsInGroup: node + full: true + optionalBrackets: optionalBrackets \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/handleCommand.arguments..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/handleCommand.arguments..st new file mode 100644 index 00000000..b67157ba --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/handleCommand.arguments..st @@ -0,0 +1,13 @@ +private - handling +handleCommand: name arguments: arguments + + | handler | + (self ignoredCommands includes: name) ifTrue: [^ self]. + + handler := self commandHandlerFor: name. + handler ifNil: + [self notify: ('unknown command: {1}' format: {name}). + arguments do: [:child | + self visit: child]. + ^ self]. + ^ handler value: arguments \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/handleEnvironment.options.during..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/handleEnvironment.options.during..st new file mode 100644 index 00000000..0ee08834 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/handleEnvironment.options.during..st @@ -0,0 +1,9 @@ +private - handling +handleEnvironment: name options: options during: contentBlock + + | handler | + handler := self environmentHandlerFor: name. + handler ifNil: + [self notify: ('unknown environment: {1}' format: {name}). + ^ contentBlock value]. + ^ handler value: contentBlock value: options \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/ignoredCommands.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/ignoredCommands.st new file mode 100644 index 00000000..d26c4951 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/ignoredCommands.st @@ -0,0 +1,11 @@ +visiting - commands +ignoredCommands + + self flag: #todo. "do we need colors?" + ^ #('pagestyle' 'renewpagestyle' 'includepdf' 'labelformat' 'soulregister' 'hypersetup' 'urlstyle' 'bibliographystyle' 'titleformat' + 'definecolor' + 'lstdefinelanguage lstset' "!" + 'setlist' 'renewlist' 'setlistdepth' + 'newlength' 'setlength' 'addtolength' + 'hspace' 'hspace*' 'vspace' 'vspace*' + 'needlines' 'needspace') \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/initialize.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/initialize.st new file mode 100644 index 00000000..f92179d8 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/initialize.st @@ -0,0 +1,15 @@ +initialize-release +initialize + + super initialize. + + booleans := Dictionary new. + counters := Dictionary new. + self resetStream. + self initializeCommandHandlers. + self initializeEnvironmentHandlers. + parseStack := Stack new. "generators for consuming tokens from previous visitors" + ifstack := Stack new. "values and booleans for computations" + verbatim := false. + listModeStack := Stack new. + enumerateStack := Stack new. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/initializeCommandHandlers.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/initializeCommandHandlers.st new file mode 100644 index 00000000..4832d975 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/initializeCommandHandlers.st @@ -0,0 +1,6 @@ +initialize-release +initializeCommandHandlers + + commandHandlers := (Pragma allNamed: #command: from: self class to: thisContext method methodClass) + collect: [:pragma | pragma arguments first -> pragma selector] + as: Dictionary. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/initializeEnvironmentHandlers.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/initializeEnvironmentHandlers.st new file mode 100644 index 00000000..8a041500 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/initializeEnvironmentHandlers.st @@ -0,0 +1,6 @@ +initialize-release +initializeEnvironmentHandlers + + environmentHandlers := (Pragma allNamed: #environment: from: self class to: thisContext method methodClass) + collect: [:pragma | pragma arguments first -> pragma selector] + as: Dictionary. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/listFromGroup..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/listFromGroup..st new file mode 100644 index 00000000..278f58bb --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/listFromGroup..st @@ -0,0 +1,6 @@ +private - parsing +listFromGroup: node + + ^ (node children + reject: [:ea | ea sbeType isNil]) + collect: [:ea | (self contentsIn: ea) asString] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/mapFromGroup..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/mapFromGroup..st new file mode 100644 index 00000000..4a2a039f --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/mapFromGroup..st @@ -0,0 +1,29 @@ +private - parsing +mapFromGroup: node + + | map tokens skipSeparators | + self assert: node sbeType = #curlyGroup. + self assert: (node children first sbeType isNil and: [node children first contents = '{']). + self assert: (node children last sbeType isNil and: [node children last contents = '}']). + tokens := node children allButFirst allButLast readStream. + + skipSeparators := + [[tokens atEnd not and: [(#(linebreak lineComment) includes: tokens peek sbeType) or: [tokens peek sbeType isNil and: [tokens peek contents isAllSeparators]]]] + whileTrue: [tokens next]]. + + map := OrderedDictionary new. + [| key value | + tokens atEnd ifTrue: [^ map]. + skipSeparators value. + key := (self contentsIn: tokens next) asString. + skipSeparators value. + self assert: (tokens peek sbeType isNil and: [tokens next contents = '=']). + skipSeparators value. + value := Array streamContents: [:values | + [tokens atEnd or: [tokens peek sbeType isNil and: [tokens peek contents = ',']]] + whileFalse: + [values nextPut: tokens next. + skipSeparators value]. + tokens atEnd ifFalse: [tokens next]]. + map at: key put: value] repeat. + ^ map \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/nameForKey..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/nameForKey..st new file mode 100644 index 00000000..28a7f493 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/nameForKey..st @@ -0,0 +1,4 @@ +emitting +nameForKey: key + + ^ key \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/nameOfCommand..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/nameOfCommand..st new file mode 100644 index 00000000..e5507b60 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/nameOfCommand..st @@ -0,0 +1,7 @@ +private - parsing +nameOfCommand: node + + | commandName | + commandName := node children first contents. + self assert: commandName first = $\. + ^ commandName allButFirst \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/notify..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/notify..st new file mode 100644 index 00000000..0c61099e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/notify..st @@ -0,0 +1,4 @@ +error handling +notify: aString + + "Transcript showln: aString." "was too much" \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/parseFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/parseFile..st new file mode 100644 index 00000000..cf4f0d3e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/parseFile..st @@ -0,0 +1,6 @@ +extracting +parseFile: aFSReference + + | source | + source := self preprocessedContentsFromFile: aFSReference. + ^ self parseString: source \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/parseString..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/parseString..st new file mode 100644 index 00000000..b4210692 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/parseString..st @@ -0,0 +1,4 @@ +extracting +parseString: aString + + ^ DCBlock parse: aString language: SBESBLatex \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/preprocessedContentsFromFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/preprocessedContentsFromFile..st new file mode 100644 index 00000000..c67a1da6 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/preprocessedContentsFromFile..st @@ -0,0 +1,16 @@ +private +preprocessedContentsFromFile: aFSReference + + | contents | + contents := aFSReference contents copyReplaceAll: String crlf with: String cr. + + "ignore \makeatletter...\makeatother for now" + contents := contents copyWithRegex: '\\makeatletter((?!\\makeatother).)*\\makeatother' matchesReplacedWith: ''. + + self flag: #workaround. "current grammar cannot handle conditional environment begins or ends" + file = aFSReference ifFalse: + [contents := #('\begin{document}' '\end{document}') + inject: contents + into: [:newContents :string | newContents copyReplaceAll: string with: '']]. + + ^ contents \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/refPlaceholderStart.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/refPlaceholderStart.st new file mode 100644 index 00000000..5e019cad --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/refPlaceholderStart.st @@ -0,0 +1,4 @@ +private +refPlaceholderStart + + ^ Character value: 16re \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/refPlaceholderStop.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/refPlaceholderStop.st new file mode 100644 index 00000000..0ae1c8d4 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/refPlaceholderStop.st @@ -0,0 +1,4 @@ +private +refPlaceholderStop + + ^ Character value: 16rf \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/resetStream.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/resetStream.st new file mode 100644 index 00000000..2f766f4e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/resetStream.st @@ -0,0 +1,6 @@ +private +resetStream + + stream := TextStream on: Text new. + previousLineBreaks := 0. + labels := Dictionary new. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/resolveRefs.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/resolveRefs.st new file mode 100644 index 00000000..c9c718f4 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/resolveRefs.st @@ -0,0 +1,27 @@ +private +resolveRefs + "Replace all ref placeholders in the stream with a full ref. This makes it possible to provide information for the ref label/appearance after the reference has been defined. #nameForKey: does not use this at the moment, though." + + | text index key nextIndex | + text := stream contents. + stream reset. + index := 1. + [index <= text size] whileTrue: + [(text at: index) + caseOf: + {[self refPlaceholderStart] -> + [nextIndex := text indexOf: self refPlaceholderStop startingAt: index + 1. + key := text copyFrom: index + 1 to: nextIndex - 1. + text isText + ifTrue: + [| attributes | + attributes := text attributesAt: index + 1. + stream withAttributes: attributes do: + [self emitRef: key asString]] + ifFalse: + [self emitRef: key asString]. + index := nextIndex]} + otherwise: [:character | + stream withAttributes: (text runs at: index) do: + [stream nextPut: character]]. + index := index + 1]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/rootFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/rootFile..st new file mode 100644 index 00000000..a067b5db --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/rootFile..st @@ -0,0 +1,4 @@ +accessing +rootFile: aFSReference + + rootFile := aFSReference. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/rootFile.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/rootFile.st new file mode 100644 index 00000000..84408438 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/rootFile.st @@ -0,0 +1,4 @@ +accessing +rootFile + + ^ rootFile \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/setCommandHandlers.environmentHandlers..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/setCommandHandlers.environmentHandlers..st new file mode 100644 index 00000000..8bed483d --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/setCommandHandlers.environmentHandlers..st @@ -0,0 +1,5 @@ +initialize-release +setCommandHandlers: aDictionary environmentHandlers: anotherDictionary + + commandHandlers := aDictionary. + environmentHandlers := anotherDictionary. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/specialCharacters.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/specialCharacters.st new file mode 100644 index 00000000..d116d4b1 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/specialCharacters.st @@ -0,0 +1,10 @@ +private +specialCharacters + + ^ OrderedDictionary new + at: '~' put: (String value: 16rA0); + at: '``' put: '"'; + at: '''''' put: '"'; + at: '`' put: ''''; + at: '>>>' put: '»'; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/stream.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/stream.st new file mode 100644 index 00000000..80c70fdb --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/stream.st @@ -0,0 +1,4 @@ +accessing +stream + + ^ stream \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveFile..st new file mode 100644 index 00000000..9c46b5ed --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveFile..st @@ -0,0 +1,6 @@ +resolving +tryResolveFile: fileName + + ^ self + tryResolveFile: fileName + extensions: #() \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveFile.extensions..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveFile.extensions..st new file mode 100644 index 00000000..66147956 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveFile.extensions..st @@ -0,0 +1,7 @@ +resolving +tryResolveFile: fileName extensions: extensions + + ^ self + tryResolveFile: fileName + extensions: extensions + paths: #() \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveFile.extensions.paths..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveFile.extensions.paths..st new file mode 100644 index 00000000..1e2110fc --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveFile.extensions.paths..st @@ -0,0 +1,14 @@ +resolving +tryResolveFile: fileName extensions: extensions paths: paths + + | names resolvers | + file ifNil: [^ nil]. + resolvers := {file parent. rootFile parent} withoutDuplicates , paths. + names := {[fileName]} + , (extensions collect: [:ext | + [fileName , ext]]). + resolvers do: [:resolver | + names do: [:name | | reference | + reference := resolver resolve: name value. + reference exists ifTrue: [^ reference]]]. + ^ nil \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveGraphicsFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveGraphicsFile..st new file mode 100644 index 00000000..18a6bea3 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveGraphicsFile..st @@ -0,0 +1,7 @@ +resolving +tryResolveGraphicsFile: fileName + + ^ self + tryResolveFile: fileName + extensions: graphicsExtensions + paths: graphicsPath \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveSourceFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveSourceFile..st new file mode 100644 index 00000000..a3db4f3e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/tryResolveSourceFile..st @@ -0,0 +1,4 @@ +resolving +tryResolveSourceFile: fileName + + ^ self tryResolveFile: fileName extensions: #('.tex') \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/verbatimSpecialCharacters.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/verbatimSpecialCharacters.st new file mode 100644 index 00000000..279edc2b --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/verbatimSpecialCharacters.st @@ -0,0 +1,6 @@ +private +verbatimSpecialCharacters + + ^ OrderedDictionary new + at: '>>>' put: '»'; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visit..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visit..st new file mode 100644 index 00000000..80d6a3fc --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visit..st @@ -0,0 +1,13 @@ +visiting +visit: node + + "Handle pending coroutines from previous visitors first." + parseStack isEmpty ifFalse: + [| generator result | + generator := parseStack top. + result := generator yield: node. + generator atEnd ifTrue: [parseStack pop]. + result = #back ifFalse: [^ result]. + self isThisEverCalled]. + + ^ self basicVisit: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitClassInclude..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitClassInclude..st new file mode 100644 index 00000000..8dd8d971 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitClassInclude..st @@ -0,0 +1,3 @@ +visiting - nodes +visitClassInclude: node + "ignore" \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitColorDefinition..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitColorDefinition..st new file mode 100644 index 00000000..134782d9 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitColorDefinition..st @@ -0,0 +1,4 @@ +visiting - nodes - generic +visitColorDefinition: node + + ^ self visitGenericCommand: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitCommentEnvironment..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitCommentEnvironment..st new file mode 100644 index 00000000..60e62dac --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitCommentEnvironment..st @@ -0,0 +1,4 @@ +visiting - nodes - generic +visitCommentEnvironment: node + + ^ self visitGenericEnvironment: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitCurlyGroup..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitCurlyGroup..st new file mode 100644 index 00000000..bd981409 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitCurlyGroup..st @@ -0,0 +1,8 @@ +visiting - nodes +visitCurlyGroup: node + + self assert: node children size >= 2. + self assert: node children first contents = '{'. + self assert: node children last contents = '}'. + 2 to: node children size - 1 do: [:index | + self visit: (node children at: index)]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitEnumItem..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitEnumItem..st new file mode 100644 index 00000000..634c07b8 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitEnumItem..st @@ -0,0 +1,4 @@ +visiting - nodes - generic +visitEnumItem: node + + ^ self visitGenericCommand: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitEnvironmentDefinition..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitEnvironmentDefinition..st new file mode 100644 index 00000000..65be618d --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitEnvironmentDefinition..st @@ -0,0 +1,4 @@ +visiting - nodes - generic +visitEnvironmentDefinition: node + + ^ self visitGenericCommand: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitGenericCommand..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitGenericCommand..st new file mode 100644 index 00000000..4c9de5bc --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitGenericCommand..st @@ -0,0 +1,19 @@ +visiting - nodes +visitGenericCommand: node + + | commandName afterArgsStream argsStream result | + commandName := self nameOfCommand: node. + argsStream := #() writeStream. + afterArgsStream := #() writeStream.. + node children allButFirst do: [:arg | + ((#(linebreak lineComment) includes: arg sbeType) or: [arg sbeType isNil and: [arg contents isAllSeparators]]) + ifFalse: + [argsStream nextPut: arg. + afterArgsStream reset] + ifTrue: + [afterArgsStream nextPut: arg]]. + + result := self handleCommand: commandName arguments: argsStream contents. + + afterArgsStream contents do: [:ea | + self visit: ea]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitGenericEnvironment..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitGenericEnvironment..st new file mode 100644 index 00000000..b2bd0e62 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitGenericEnvironment..st @@ -0,0 +1,25 @@ +visiting - nodes +visitGenericEnvironment: node + + | begin name options | + self assert: node children size >= 2. + begin := node children first. + self assert: begin sbeType = #begin. + self assert: begin children size >= 2. + self assert: begin children second sbeType = #curlyGroupText. + name := self fullContentsInGroup: begin children second. + options := #(). + begin children size > 2 ifTrue: + [| brackGroup | + brackGroup := begin children detect: [:ea | ea sbeType = #brackGroup]. + options := brackGroup children select: [:ea | ea sbeType = #text]]. + + self assert: + (node children last sbeType = #end + and: [node children last children size >= 2] + and: [node children last children second sbeType = #curlyGroupText] + and: [(self fullContentsInGroup: node children last children second) = name]). + + ^ self handleEnvironment: name options: options during: + [2 to: node children size - 1 do: [:i | + self visit: (node children at: i)]] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitGraphicsInclude..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitGraphicsInclude..st new file mode 100644 index 00000000..ba2d8eb3 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitGraphicsInclude..st @@ -0,0 +1,4 @@ +visiting - nodes - generic +visitGraphicsInclude: node + + ^ self visitGenericCommand: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLabelDefinition..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLabelDefinition..st new file mode 100644 index 00000000..3570ab79 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLabelDefinition..st @@ -0,0 +1,4 @@ +visiting - nodes - generic +visitLabelDefinition: node + + ^ self visitGenericCommand: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLabelReference..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLabelReference..st new file mode 100644 index 00000000..8c7b7f6f --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLabelReference..st @@ -0,0 +1,4 @@ +visiting - nodes - generic +visitLabelReference: node + + ^ self visitGenericCommand: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLatexInclude..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLatexInclude..st new file mode 100644 index 00000000..05c4d9b4 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLatexInclude..st @@ -0,0 +1,4 @@ +visiting - nodes - generic +visitLatexInclude: node + + ^ self visitGenericCommand: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLetCommandDefinition..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLetCommandDefinition..st new file mode 100644 index 00000000..479ed382 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLetCommandDefinition..st @@ -0,0 +1,4 @@ +visiting - nodes - generic +visitLetCommandDefinition: node + + ^ self visitGenericCommand: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLineComment..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLineComment..st new file mode 100644 index 00000000..5360cff3 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitLineComment..st @@ -0,0 +1,3 @@ +visiting - nodes +visitLineComment: node + "ignore" \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitNewCommandDefinition..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitNewCommandDefinition..st new file mode 100644 index 00000000..865bc8b8 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitNewCommandDefinition..st @@ -0,0 +1,4 @@ +visiting - nodes - generic +visitNewCommandDefinition: node + + ^ self visitGenericCommand: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPackageInclude..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPackageInclude..st new file mode 100644 index 00000000..5a3c4e5c --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPackageInclude..st @@ -0,0 +1,18 @@ +visiting - nodes +visitPackageInclude: node + + | names | + self assert: node children size >= 2. + self flag: #todo. "arguments" + names := node children last. + names := names sbeType caseOf: + {[#curlyGroupPathList] -> + [names children + select: [:ea | ea sbeType = #path] + thenCollect: [:ea | ea contents]]}. + + names do: [:name | + (self tryResolveFile: name extensions: #('.sty')) ifNotNil: + [:file | ^ self extractFromFile: file]. + + "skip default packages..."]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPath..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPath..st new file mode 100644 index 00000000..a3cdd1d3 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPath..st @@ -0,0 +1,5 @@ +visiting - nodes +visitPath: node + + (node contents beginsWith: '#') ifTrue: [^ self visitPlaceholder: node]. + ^ self basicVisitAny: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPlaceholder..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPlaceholder..st new file mode 100644 index 00000000..23a83d14 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPlaceholder..st @@ -0,0 +1,18 @@ +visiting - nodes +visitPlaceholder: node + + | index ref valueAndHereArgs value hereArgs | + self assert: node children size = 1. + ref := node children first contents. + self assert: ref first = $#. + index := ref allButFirst asNumber. + commandArguments ifNil: + [self notify: 'access to parameter outside of command'. + ^ self basicVisitText: ref]. + valueAndHereArgs := commandArguments at: index ifAbsent: + [self notify: 'illegal parameter number'. + ^ self basicVisitText: ref allButFirst]. + value := valueAndHereArgs first. + hereArgs := valueAndHereArgs second. + ^ self withCommandArguments: hereArgs do: + [self visit: value] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitTheoremDefinition..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitTheoremDefinition..st new file mode 100644 index 00000000..ca42ceab --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitTheoremDefinition..st @@ -0,0 +1,4 @@ +visiting - nodes - generic +visitTheoremDefinition: node + + ^ self visitGenericCommand: node \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/withCommandArguments.do..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/withCommandArguments.do..st new file mode 100644 index 00000000..31ab9d51 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/withCommandArguments.do..st @@ -0,0 +1,8 @@ +private +withCommandArguments: arguments do: aBlock + + | previousArguments | + previousArguments := commandArguments. + commandArguments := arguments. + ^ aBlock ensure: + [commandArguments := previousArguments] \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json new file mode 100644 index 00000000..61df9fef --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json @@ -0,0 +1,127 @@ +{ + "class" : { + "extractFromFile:" : "ct 11/9/2023 23:16", + "parseFile:" : "ct 10/19/2023 13:22", + "todo" : "ct 11/21/2023 14:45" }, + "instance" : { + "basicVisit:" : "ct 10/19/2023 14:41", + "basicVisitAny:" : "ct 10/19/2023 11:40", + "basicVisitForParsing:" : "ct 11/21/2023 14:16", + "basicVisitGraphicsFile:" : "ct 11/8/2023 15:06", + "basicVisitLineBreak:" : "ct 11/14/2023 23:43", + "basicVisitRoot:" : "ct 11/21/2023 14:19", + "basicVisitText:" : "ct 11/21/2023 14:19", + "buildDate" : "ct 11/8/2023 17:39", + "commandArguments" : "ct 11/8/2023 23:00", + "commandBoolean:" : "ct 11/8/2023 19:19", + "commandCopyright:" : "ct 11/8/2023 17:47", + "commandDeclareGraphicsExtensions:" : "ct 11/8/2023 11:01", + "commandDeclareRobustCommand:" : "ct 11/8/2023 19:12", + "commandDef:" : "ct 11/8/2023 22:55", + "commandEqual:" : "ct 11/8/2023 19:05", + "commandExcludeComment:" : "ct 11/8/2023 22:58", + "commandGraphicsPath:" : "ct 11/8/2023 14:44", + "commandHandlerFor:" : "ct 11/8/2023 22:56", + "commandIfThenElse:" : "ct 11/8/2023 19:04", + "commandIfx:" : "ct 11/9/2023 23:11", + "commandIncludeGraphics:" : "ct 11/15/2023 22:11", + "commandIndex:" : "ct 10/20/2023 00:27", + "commandInput:" : "ct 10/20/2023 00:56", + "commandItem:" : "ct 11/21/2023 14:10", + "commandLabel:" : "ct 11/12/2023 21:39", + "commandLdots:" : "ct 11/8/2023 20:00", + "commandLet:" : "ct 10/19/2023 15:16", + "commandLineBreak:" : "ct 11/9/2023 21:19", + "commandNewBoolean:" : "ct 11/8/2023 19:19", + "commandNewCommand:" : "ct 11/8/2023 22:59", + "commandNewEnvironment:" : "ct 11/21/2023 14:40", + "commandNewTheorem:" : "ct 11/8/2023 22:58", + "commandParBox:" : "ct 11/8/2023 12:35", + "commandParskip:" : "ct 11/8/2023 12:11", + "commandPdfMinorVersion:" : "ct 11/8/2023 19:16", + "commandProvidesPackage:" : "ct 10/20/2023 01:17", + "commandRaiseBox:" : "ct 11/8/2023 12:56", + "commandRef:" : "ct 11/12/2023 21:19", + "commandRenewCommand:" : "ct 11/8/2023 22:57", + "commandSetBoolean:" : "ct 11/8/2023 19:22", + "commandSetCounter:" : "ct 11/8/2023 22:52", + "commandSpace:" : "ct 11/8/2023 20:00", + "commandTimes:" : "ct 11/8/2023 18:46", + "commandToday:" : "ct 11/8/2023 17:39", + "contents" : "ct 11/9/2023 21:19", + "contentsIn:" : "ct 11/9/2023 23:17", + "contentsInGroup:" : "ct 11/8/2023 15:11", + "contentsInGroup:brackets:" : "ct 11/8/2023 15:14", + "contentsInGroup:brackets:optional:" : "ct 11/8/2023 15:12", + "contentsInGroup:full:brackets:optional:" : "ct 11/8/2023 15:12", + "contentsInGroup:full:optionalBrackets:" : "ct 11/8/2023 15:16", + "contentsInGroup:optionalBrackets:" : "ct 11/8/2023 15:11", + "emitImage:" : "ct 11/15/2023 19:37", + "emitItemLabel:" : "ct 11/15/2023 19:26", + "emitLabel:" : "ct 11/12/2023 20:53", + "emitLineBreak:" : "ct 11/14/2023 23:43", + "emitRef:" : "ct 11/12/2023 21:41", + "emitRefPlaceholder:" : "ct 11/21/2023 14:01", + "environmentComment:options:" : "ct 11/8/2023 13:58", + "environmentDescription:options:" : "ct 11/20/2023 19:24", + "environmentEnumerate:options:" : "ct 11/20/2023 19:24", + "environmentEnumerateStar:options:" : "ct 11/20/2023 19:24", + "environmentHandlerFor:" : "ct 11/8/2023 23:00", + "environmentItemize:options:" : "ct 11/20/2023 19:24", + "extractFromFile:" : "ct 10/21/2023 21:23", + "extractFromRootFile:" : "ct 11/9/2023 23:16", + "extractFromString:" : "ct 10/21/2023 21:23", + "fullContentsInGroup:" : "ct 11/8/2023 15:13", + "fullContentsInGroup:brackets:" : "ct 11/15/2023 19:23", + "fullContentsInGroup:brackets:optional:" : "ct 11/15/2023 19:23", + "fullContentsInGroup:optionalBrackets:" : "ct 11/8/2023 15:13", + "handleCommand:arguments:" : "ct 11/21/2023 14:04", + "handleEnvironment:options:during:" : "ct 11/21/2023 14:04", + "ignoredCommands" : "ct 11/20/2023 19:22", + "initialize" : "ct 11/21/2023 14:03", + "initializeCommandHandlers" : "ct 10/19/2023 12:31", + "initializeEnvironmentHandlers" : "ct 10/20/2023 00:53", + "listFromGroup:" : "ct 11/8/2023 14:44", + "mapFromGroup:" : "ct 11/16/2023 14:05", + "nameForKey:" : "ct 11/12/2023 20:58", + "nameOfCommand:" : "ct 10/19/2023 14:55", + "notify:" : "ct 11/21/2023 14:02", + "parseFile:" : "ct 11/21/2023 14:02", + "parseString:" : "ct 11/20/2023 22:10", + "preprocessedContentsFromFile:" : "ct 11/20/2023 20:21", + "refPlaceholderStart" : "ct 11/21/2023 14:01", + "refPlaceholderStop" : "ct 11/21/2023 14:01", + "resetStream" : "ct 11/12/2023 19:52", + "resolveRefs" : "ct 11/21/2023 14:07", + "rootFile" : "ct 11/9/2023 23:17", + "rootFile:" : "ct 11/9/2023 23:17", + "setCommandHandlers:environmentHandlers:" : "ct 11/8/2023 22:53", + "specialCharacters" : "ct 11/17/2023 15:52", + "stream" : "ct 11/9/2023 21:18", + "tryResolveFile:" : "ct 11/16/2023 21:14", + "tryResolveFile:extensions:" : "ct 11/8/2023 14:21", + "tryResolveFile:extensions:paths:" : "ct 11/17/2023 15:28", + "tryResolveGraphicsFile:" : "ct 11/8/2023 14:22", + "tryResolveSourceFile:" : "ct 11/8/2023 14:15", + "verbatimSpecialCharacters" : "ct 11/17/2023 15:55", + "visit:" : "ct 11/21/2023 14:09", + "visitClassInclude:" : "ct 10/19/2023 11:37", + "visitColorDefinition:" : "ct 11/8/2023 12:08", + "visitCommentEnvironment:" : "ct 11/8/2023 14:00", + "visitCurlyGroup:" : "ct 10/19/2023 11:42", + "visitEnumItem:" : "ct 11/8/2023 12:34", + "visitEnvironmentDefinition:" : "ct 11/8/2023 10:44", + "visitGenericCommand:" : "ct 11/15/2023 18:17", + "visitGenericEnvironment:" : "ct 11/21/2023 14:19", + "visitGraphicsInclude:" : "ct 11/8/2023 14:10", + "visitLabelDefinition:" : "ct 11/12/2023 21:17", + "visitLabelReference:" : "ct 11/12/2023 21:18", + "visitLatexInclude:" : "ct 10/19/2023 13:42", + "visitLetCommandDefinition:" : "ct 10/19/2023 12:42", + "visitLineComment:" : "ct 10/19/2023 11:25", + "visitNewCommandDefinition:" : "ct 10/19/2023 13:01", + "visitPackageInclude:" : "ct 11/8/2023 14:15", + "visitPath:" : "ct 11/8/2023 14:42", + "visitPlaceholder:" : "ct 10/21/2023 21:45", + "visitTheoremDefinition:" : "ct 11/8/2023 12:09", + "withCommandArguments:do:" : "ct 10/20/2023 00:31" } } diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/properties.json b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/properties.json new file mode 100644 index 00000000..dc837e3e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/properties.json @@ -0,0 +1,31 @@ +{ + "category" : "SBE-ExtractBook", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "stream", + "rootFile", + "file", + "buildDate", + "parseStack", + "ifstack", + "verbatim", + "commandHandlers", + "commandArguments", + "environmentHandlers", + "booleans", + "counters", + "labels", + "listModeStack", + "enumerateStack", + "previousLineBreaks", + "graphicsPath", + "graphicsExtensions" ], + "name" : "SBELatexBookExtractor", + "pools" : [ + ], + "super" : "Object", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/README.md b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/fileSuffix.st b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/fileSuffix.st new file mode 100644 index 00000000..83b0e5e2 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/fileSuffix.st @@ -0,0 +1,4 @@ +configuration +fileSuffix + + ^ 'tex' \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/grammarJson.st b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/grammarJson.st new file mode 100644 index 00000000..65b7d53b --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/grammarJson.st @@ -0,0 +1,5775 @@ +configuration +grammarJson + + " https://github.com/latex-lsp/tree-sitter-latex/blob/master/src/grammar.json (MIT license) " + ^ '{ + "name": "latex", + "word": "command_name", + "rules": { + "source_file": { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_root_content" + } + }, + "_whitespace": { + "type": "PATTERN", + "value": "\\s+" + }, + "line_comment": { + "type": "PATTERN", + "value": "%[^\\r\\n]*" + }, + "block_comment": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "begin", + "content": { + "type": "STRING", + "value": "\\iffalse" + } + }, + { + "type": "FIELD", + "name": "comment", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_trivia_raw_fi" + }, + "named": true, + "value": "comment" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "end", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\fi" + }, + { + "type": "BLANK" + } + ] + } + } + ] + }, + "_root_content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_section" + }, + { + "type": "SYMBOL", + "name": "_paragraph" + }, + { + "type": "SYMBOL", + "name": "_flat_content" + } + ] + }, + "_flat_content": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_text_with_env_content" + }, + { + "type": "STRING", + "value": "[" + }, + { + "type": "STRING", + "value": "]" + } + ] + } + }, + "_text_with_env_content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "," + }, + { + "type": "STRING", + "value": "=" + }, + { + "type": "SYMBOL", + "name": "comment_environment" + }, + { + "type": "SYMBOL", + "name": "verbatim_environment" + }, + { + "type": "SYMBOL", + "name": "listing_environment" + }, + { + "type": "SYMBOL", + "name": "minted_environment" + }, + { + "type": "SYMBOL", + "name": "pycode_environment" + }, + { + "type": "SYMBOL", + "name": "sagesilent_environment" + }, + { + "type": "SYMBOL", + "name": "sageblock_environment" + }, + { + "type": "SYMBOL", + "name": "generic_environment" + }, + { + "type": "SYMBOL", + "name": "math_environment" + }, + { + "type": "SYMBOL", + "name": "_text_content" + } + ] + }, + "_text_content": { + "type": "PREC_RIGHT", + "value": 1, + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "curly_group" + }, + { + "type": "SYMBOL", + "name": "block_comment" + }, + { + "type": "SYMBOL", + "name": "_command" + }, + { + "type": "SYMBOL", + "name": "text" + }, + { + "type": "SYMBOL", + "name": "displayed_equation" + }, + { + "type": "SYMBOL", + "name": "inline_formula" + }, + { + "type": "SYMBOL", + "name": "math_delimiter" + }, + { + "type": "SYMBOL", + "name": "text_mode" + }, + { + "type": "STRING", + "value": "(" + }, + { + "type": "STRING", + "value": ")" + } + ] + } + }, + "_section": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "CHOICE", + "members": [ + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "part" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "chapter" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "section" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "subsection" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "subsubsection" + } + } + ] + } + }, + "_paragraph": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "CHOICE", + "members": [ + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "paragraph" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "subparagraph" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "enum_item" + } + } + ] + } + }, + "_section_part": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "toc", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + } + ] + }, + "_part_declaration": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\part" + }, + { + "type": "STRING", + "value": "\\part*" + }, + { + "type": "STRING", + "value": "\\addpart" + }, + { + "type": "STRING", + "value": "\\addpart*" + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_section_part" + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "part": { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_part_declaration" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_flat_content" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SYMBOL", + "name": "_paragraph" + } + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "CHOICE", + "members": [ + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "chapter" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "section" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "subsection" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "subsubsection" + } + } + ] + } + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "_chapter_declaration": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\chapter" + }, + { + "type": "STRING", + "value": "\\chapter*" + }, + { + "type": "STRING", + "value": "\\addchap" + }, + { + "type": "STRING", + "value": "\\addchap*" + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_section_part" + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "chapter": { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_chapter_declaration" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_flat_content" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SYMBOL", + "name": "_paragraph" + } + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "CHOICE", + "members": [ + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "section" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "subsection" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "subsubsection" + } + } + ] + } + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "_section_declaration": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\section" + }, + { + "type": "STRING", + "value": "\\section*" + }, + { + "type": "STRING", + "value": "\\addsec" + }, + { + "type": "STRING", + "value": "\\addsec*" + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_section_part" + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "section": { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_section_declaration" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_flat_content" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SYMBOL", + "name": "_paragraph" + } + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "CHOICE", + "members": [ + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "subsection" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "subsubsection" + } + } + ] + } + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "_subsection_declaration": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\subsection" + }, + { + "type": "STRING", + "value": "\\subsection*" + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_section_part" + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "subsection": { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_subsection_declaration" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_flat_content" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SYMBOL", + "name": "_paragraph" + } + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "subsubsection" + } + } + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "_subsubsection_declaration": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\subsubsection" + }, + { + "type": "STRING", + "value": "\\subsubsection*" + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_section_part" + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "subsubsection": { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_subsubsection_declaration" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_flat_content" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SYMBOL", + "name": "_paragraph" + } + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "_paragraph_declaration": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\paragraph" + }, + { + "type": "STRING", + "value": "\\paragraph*" + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_section_part" + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "paragraph": { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_paragraph_declaration" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_flat_content" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "CHOICE", + "members": [ + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "subparagraph" + } + }, + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "enum_item" + } + } + ] + } + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "_subparagraph_declaration": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\subparagraph" + }, + { + "type": "STRING", + "value": "\\subparagraph*" + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_section_part" + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "subparagraph": { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_subparagraph_declaration" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_flat_content" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "CHOICE", + "members": [ + { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "enum_item" + } + } + ] + } + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "_enum_itemdeclaration": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\item" + }, + { + "type": "STRING", + "value": "\\item*" + } + ] + } + }, + { + "type": "FIELD", + "name": "label", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_text" + }, + { + "type": "BLANK" + } + ] + } + } + ] + } + }, + "enum_item": { + "type": "PREC_RIGHT", + "value": -1, + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_enum_itemdeclaration" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_flat_content" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "CHOICE", + "members": [] + } + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "curly_group": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_root_content" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "curly_group_text": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "SYMBOL", + "name": "text" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "curly_group_text_list": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "text", + "content": { + "type": "SYMBOL", + "name": "text" + } + }, + { + "type": "REPEAT", + "content": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "," + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "SYMBOL", + "name": "text" + } + } + ] + } + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "curly_group_path": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "path", + "content": { + "type": "SYMBOL", + "name": "path" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "curly_group_path_list": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "path", + "content": { + "type": "SYMBOL", + "name": "path" + } + }, + { + "type": "REPEAT", + "content": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "," + }, + { + "type": "FIELD", + "name": "path", + "content": { + "type": "SYMBOL", + "name": "path" + } + } + ] + } + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "curly_group_command_name": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "command", + "content": { + "type": "SYMBOL", + "name": "command_name" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "curly_group_key_value": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "pair", + "content": { + "type": "SYMBOL", + "name": "key_value_pair" + } + }, + { + "type": "REPEAT", + "content": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "," + }, + { + "type": "FIELD", + "name": "pair", + "content": { + "type": "SYMBOL", + "name": "key_value_pair" + } + } + ] + } + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "curly_group_glob_pattern": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "pattern", + "content": { + "type": "SYMBOL", + "name": "glob_pattern" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "curly_group_impl": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "REPEAT", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_text_content" + }, + { + "type": "STRING", + "value": "[" + }, + { + "type": "STRING", + "value": "]" + }, + { + "type": "STRING", + "value": "," + }, + { + "type": "STRING", + "value": "=" + } + ] + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "curly_group_author_list": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "_text_content" + } + }, + "named": true, + "value": "author" + }, + { + "type": "REPEAT", + "content": { + "type": "SEQ", + "members": [ + { + "type": "ALIAS", + "content": { + "type": "STRING", + "value": "\\and" + }, + "named": true, + "value": "command_name" + }, + { + "type": "ALIAS", + "content": { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "_text_content" + } + }, + "named": true, + "value": "author" + } + ] + } + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "brack_group": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "[" + }, + { + "type": "REPEAT", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_text_with_env_content" + }, + { + "type": "SYMBOL", + "name": "brack_group" + } + ] + } + }, + { + "type": "STRING", + "value": "]" + } + ] + }, + "brack_group_text": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "[" + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "SYMBOL", + "name": "text" + } + }, + { + "type": "STRING", + "value": "]" + } + ] + }, + "brack_group_argc": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "[" + }, + { + "type": "FIELD", + "name": "value", + "content": { + "type": "SYMBOL", + "name": "argc" + } + }, + { + "type": "STRING", + "value": "]" + } + ] + }, + "brack_group_key_value": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "[" + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "pair", + "content": { + "type": "SYMBOL", + "name": "key_value_pair" + } + }, + { + "type": "REPEAT", + "content": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "," + }, + { + "type": "FIELD", + "name": "pair", + "content": { + "type": "SYMBOL", + "name": "key_value_pair" + } + } + ] + } + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "STRING", + "value": "]" + } + ] + }, + "text": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "REPEAT1", + "content": { + "type": "FIELD", + "name": "word", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "operator" + }, + { + "type": "SYMBOL", + "name": "word" + }, + { + "type": "SYMBOL", + "name": "placeholder" + }, + { + "type": "SYMBOL", + "name": "block_comment" + }, + { + "type": "SYMBOL", + "name": "_command" + }, + { + "type": "SYMBOL", + "name": "superscript" + }, + { + "type": "SYMBOL", + "name": "subscript" + } + ] + } + } + } + }, + "word": { + "type": "PATTERN", + "value": "[^\\s\\\\%\\{\\},\\$\\[\\]\\(\\)=\\#_\\^\\-\\+\\/\\*]+" + }, + "placeholder": { + "type": "PATTERN", + "value": "#\\d" + }, + "path": { + "type": "PATTERN", + "value": "[^\\*\\\"\\[\\]:;,\\|\\{\\}<>]+" + }, + "argc": { + "type": "PATTERN", + "value": "\\d" + }, + "glob_pattern": { + "type": "REPEAT1", + "content": { + "type": "SYMBOL", + "name": "_glob_pattern_fragment" + } + }, + "_glob_pattern_fragment": { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_glob_pattern_fragment" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + { + "type": "PATTERN", + "value": "[^\\\"\\[\\]:;\\|\\{\\}<>]+" + } + ] + }, + "operator": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "+" + }, + { + "type": "STRING", + "value": "-" + }, + { + "type": "STRING", + "value": "*" + }, + { + "type": "STRING", + "value": "/" + }, + { + "type": "STRING", + "value": "<" + }, + { + "type": "STRING", + "value": ">" + }, + { + "type": "STRING", + "value": "!" + }, + { + "type": "STRING", + "value": "|" + }, + { + "type": "STRING", + "value": ":" + }, + { + "type": "STRING", + "value": "''" + } + ] + }, + "subscript": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "_" + }, + { + "type": "FIELD", + "name": "subscript", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "curly_group" + }, + { + "type": "SYMBOL", + "name": "word" + }, + { + "type": "SYMBOL", + "name": "generic_command" + } + ] + } + } + ] + }, + "superscript": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "^" + }, + { + "type": "FIELD", + "name": "superscript", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "curly_group" + }, + { + "type": "SYMBOL", + "name": "word" + }, + { + "type": "SYMBOL", + "name": "generic_command" + } + ] + } + } + ] + }, + "key_value_pair": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "key", + "content": { + "type": "SYMBOL", + "name": "text" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "=" + }, + { + "type": "FIELD", + "name": "value", + "content": { + "type": "SYMBOL", + "name": "value" + } + } + ] + }, + { + "type": "BLANK" + } + ] + } + ] + }, + "value": { + "type": "REPEAT1", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "_text_content" + }, + { + "type": "SYMBOL", + "name": "brack_group" + } + ] + } + }, + "displayed_equation": { + "type": "PREC_LEFT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "$$" + }, + { + "type": "STRING", + "value": "\\[" + } + ] + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_root_content" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "$$" + }, + { + "type": "STRING", + "value": "\\]" + } + ] + } + ] + } + }, + "inline_formula": { + "type": "PREC_LEFT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "$" + }, + { + "type": "STRING", + "value": "\\(" + } + ] + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_root_content" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "$" + }, + { + "type": "STRING", + "value": "\\)" + } + ] + } + ] + } + }, + "begin": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\begin" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + }, + { + "type": "FIELD", + "name": "options", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group" + }, + { + "type": "BLANK" + } + ] + } + } + ] + } + }, + "end": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\end" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + } + ] + } + }, + "generic_environment": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "begin", + "content": { + "type": "SYMBOL", + "name": "begin" + } + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_root_content" + } + }, + { + "type": "FIELD", + "name": "end", + "content": { + "type": "SYMBOL", + "name": "end" + } + } + ] + }, + "comment_environment": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "begin", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_comment_environment_begin" + }, + "named": true, + "value": "begin" + } + }, + { + "type": "FIELD", + "name": "comment", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_trivia_raw_env_comment" + }, + "named": true, + "value": "comment" + } + }, + { + "type": "FIELD", + "name": "end", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_comment_environment_end" + }, + "named": true, + "value": "end" + } + } + ] + }, + "_comment_environment_begin": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\begin" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_comment_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + }, + { + "type": "SEQ", + "members": [] + } + ] + }, + "_comment_environment_end": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\end" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_comment_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + } + ] + }, + "_comment_environment_group": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_comment_environment_name" + }, + "named": true, + "value": "text" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_comment_environment_name": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "word", + "content": { + "type": "ALIAS", + "content": { + "type": "STRING", + "value": "comment" + }, + "named": true, + "value": "word" + } + } + ] + }, + "verbatim_environment": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "begin", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_verbatim_environment_begin" + }, + "named": true, + "value": "begin" + } + }, + { + "type": "FIELD", + "name": "verbatim", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_trivia_raw_env_verbatim" + }, + "named": true, + "value": "comment" + } + }, + { + "type": "FIELD", + "name": "end", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_verbatim_environment_end" + }, + "named": true, + "value": "end" + } + } + ] + }, + "_verbatim_environment_begin": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\begin" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_verbatim_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + }, + { + "type": "SEQ", + "members": [] + } + ] + }, + "_verbatim_environment_end": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\end" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_verbatim_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + } + ] + }, + "_verbatim_environment_group": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_verbatim_environment_name" + }, + "named": true, + "value": "text" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_verbatim_environment_name": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "word", + "content": { + "type": "ALIAS", + "content": { + "type": "STRING", + "value": "verbatim" + }, + "named": true, + "value": "word" + } + } + ] + }, + "listing_environment": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "begin", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_listing_environment_begin" + }, + "named": true, + "value": "begin" + } + }, + { + "type": "FIELD", + "name": "code", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_trivia_raw_env_listing" + }, + "named": true, + "value": "source_code" + } + }, + { + "type": "FIELD", + "name": "end", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_listing_environment_end" + }, + "named": true, + "value": "end" + } + } + ] + }, + "_listing_environment_begin": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\begin" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_listing_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + }, + { + "type": "SEQ", + "members": [] + } + ] + }, + "_listing_environment_end": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\end" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_listing_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + } + ] + }, + "_listing_environment_group": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_listing_environment_name" + }, + "named": true, + "value": "text" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_listing_environment_name": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "word", + "content": { + "type": "ALIAS", + "content": { + "type": "STRING", + "value": "lstlisting" + }, + "named": true, + "value": "word" + } + } + ] + }, + "minted_environment": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "begin", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_minted_environment_begin" + }, + "named": true, + "value": "begin" + } + }, + { + "type": "FIELD", + "name": "code", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_trivia_raw_env_minted" + }, + "named": true, + "value": "source_code" + } + }, + { + "type": "FIELD", + "name": "end", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_minted_environment_end" + }, + "named": true, + "value": "end" + } + } + ] + }, + "_minted_environment_begin": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\begin" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_minted_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + }, + { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "options", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_key_value" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "language", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + } + ] + } + ] + }, + "_minted_environment_end": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\end" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_minted_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + } + ] + }, + "_minted_environment_group": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_minted_environment_name" + }, + "named": true, + "value": "text" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_minted_environment_name": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "word", + "content": { + "type": "ALIAS", + "content": { + "type": "STRING", + "value": "minted" + }, + "named": true, + "value": "word" + } + } + ] + }, + "pycode_environment": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "begin", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_pycode_environment_begin" + }, + "named": true, + "value": "begin" + } + }, + { + "type": "FIELD", + "name": "code", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_trivia_raw_env_pycode" + }, + "named": true, + "value": "source_code" + } + }, + { + "type": "FIELD", + "name": "end", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_pycode_environment_end" + }, + "named": true, + "value": "end" + } + } + ] + }, + "_pycode_environment_begin": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\begin" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_pycode_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + }, + { + "type": "SEQ", + "members": [] + } + ] + }, + "_pycode_environment_end": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\end" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_pycode_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + } + ] + }, + "_pycode_environment_group": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_pycode_environment_name" + }, + "named": true, + "value": "text" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_pycode_environment_name": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "word", + "content": { + "type": "ALIAS", + "content": { + "type": "STRING", + "value": "pycode" + }, + "named": true, + "value": "word" + } + } + ] + }, + "sagesilent_environment": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "begin", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_sagesilent_environment_begin" + }, + "named": true, + "value": "begin" + } + }, + { + "type": "FIELD", + "name": "code", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_trivia_raw_env_sagesilent" + }, + "named": true, + "value": "source_code" + } + }, + { + "type": "FIELD", + "name": "end", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_sagesilent_environment_end" + }, + "named": true, + "value": "end" + } + } + ] + }, + "_sagesilent_environment_begin": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\begin" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_sagesilent_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + }, + { + "type": "SEQ", + "members": [] + } + ] + }, + "_sagesilent_environment_end": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\end" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_sagesilent_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + } + ] + }, + "_sagesilent_environment_group": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_sagesilent_environment_name" + }, + "named": true, + "value": "text" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_sagesilent_environment_name": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "word", + "content": { + "type": "ALIAS", + "content": { + "type": "STRING", + "value": "sagesilent" + }, + "named": true, + "value": "word" + } + } + ] + }, + "sageblock_environment": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "begin", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_sageblock_environment_begin" + }, + "named": true, + "value": "begin" + } + }, + { + "type": "FIELD", + "name": "code", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_trivia_raw_env_sageblock" + }, + "named": true, + "value": "source_code" + } + }, + { + "type": "FIELD", + "name": "end", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_sageblock_environment_end" + }, + "named": true, + "value": "end" + } + } + ] + }, + "_sageblock_environment_begin": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\begin" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_sageblock_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + }, + { + "type": "SEQ", + "members": [] + } + ] + }, + "_sageblock_environment_end": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\end" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_sageblock_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + } + ] + }, + "_sageblock_environment_group": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_sageblock_environment_name" + }, + "named": true, + "value": "text" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_sageblock_environment_name": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "word", + "content": { + "type": "ALIAS", + "content": { + "type": "STRING", + "value": "sageblock" + }, + "named": true, + "value": "word" + } + } + ] + }, + "math_environment": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "begin", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_math_environment_begin" + }, + "named": true, + "value": "begin" + } + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_flat_content" + } + }, + { + "type": "FIELD", + "name": "end", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_math_environment_end" + }, + "named": true, + "value": "end" + } + } + ] + }, + "_math_environment_begin": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\begin" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_math_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + }, + { + "type": "SEQ", + "members": [] + } + ] + }, + "_math_environment_end": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\end" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_math_environment_group" + }, + "named": true, + "value": "curly_group_text" + } + } + ] + }, + "_math_environment_group": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "{" + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "ALIAS", + "content": { + "type": "SYMBOL", + "name": "_math_environment_name" + }, + "named": true, + "value": "text" + } + }, + { + "type": "STRING", + "value": "}" + } + ] + }, + "_math_environment_name": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "word", + "content": { + "type": "ALIAS", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "displaymath" + }, + { + "type": "STRING", + "value": "displaymath*" + }, + { + "type": "STRING", + "value": "equation" + }, + { + "type": "STRING", + "value": "equation*" + }, + { + "type": "STRING", + "value": "multline" + }, + { + "type": "STRING", + "value": "multline*" + }, + { + "type": "STRING", + "value": "eqnarray" + }, + { + "type": "STRING", + "value": "eqnarray*" + }, + { + "type": "STRING", + "value": "align" + }, + { + "type": "STRING", + "value": "align*" + }, + { + "type": "STRING", + "value": "array" + }, + { + "type": "STRING", + "value": "array*" + }, + { + "type": "STRING", + "value": "split" + }, + { + "type": "STRING", + "value": "split*" + }, + { + "type": "STRING", + "value": "alignat" + }, + { + "type": "STRING", + "value": "alignat*" + }, + { + "type": "STRING", + "value": "gather" + }, + { + "type": "STRING", + "value": "gather*" + }, + { + "type": "STRING", + "value": "flalign" + }, + { + "type": "STRING", + "value": "flalign*" + } + ] + }, + "named": true, + "value": "word" + } + } + ] + }, + "_command": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "title_declaration" + }, + { + "type": "SYMBOL", + "name": "author_declaration" + }, + { + "type": "SYMBOL", + "name": "package_include" + }, + { + "type": "SYMBOL", + "name": "class_include" + }, + { + "type": "SYMBOL", + "name": "latex_include" + }, + { + "type": "SYMBOL", + "name": "biblatex_include" + }, + { + "type": "SYMBOL", + "name": "bibtex_include" + }, + { + "type": "SYMBOL", + "name": "graphics_include" + }, + { + "type": "SYMBOL", + "name": "svg_include" + }, + { + "type": "SYMBOL", + "name": "inkscape_include" + }, + { + "type": "SYMBOL", + "name": "verbatim_include" + }, + { + "type": "SYMBOL", + "name": "import_include" + }, + { + "type": "SYMBOL", + "name": "caption" + }, + { + "type": "SYMBOL", + "name": "citation" + }, + { + "type": "SYMBOL", + "name": "label_definition" + }, + { + "type": "SYMBOL", + "name": "label_reference" + }, + { + "type": "SYMBOL", + "name": "label_reference_range" + }, + { + "type": "SYMBOL", + "name": "label_number" + }, + { + "type": "SYMBOL", + "name": "new_command_definition" + }, + { + "type": "SYMBOL", + "name": "old_command_definition" + }, + { + "type": "SYMBOL", + "name": "let_command_definition" + }, + { + "type": "SYMBOL", + "name": "paired_delimiter_definition" + }, + { + "type": "SYMBOL", + "name": "environment_definition" + }, + { + "type": "SYMBOL", + "name": "glossary_entry_definition" + }, + { + "type": "SYMBOL", + "name": "glossary_entry_reference" + }, + { + "type": "SYMBOL", + "name": "acronym_definition" + }, + { + "type": "SYMBOL", + "name": "acronym_reference" + }, + { + "type": "SYMBOL", + "name": "theorem_definition" + }, + { + "type": "SYMBOL", + "name": "color_definition" + }, + { + "type": "SYMBOL", + "name": "color_set_definition" + }, + { + "type": "SYMBOL", + "name": "color_reference" + }, + { + "type": "SYMBOL", + "name": "tikz_library_import" + }, + { + "type": "SYMBOL", + "name": "generic_command" + } + ] + }, + "generic_command": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "SYMBOL", + "name": "command_name" + } + }, + { + "type": "REPEAT", + "content": { + "type": "FIELD", + "name": "arg", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + } + } + ] + } + }, + "command_name": { + "type": "PATTERN", + "value": "\\\\([^\\r\\n]|[@a-zA-Z]+\\*?)?" + }, + "title_declaration": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\title" + } + }, + { + "type": "FIELD", + "name": "options", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "text", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + } + ] + }, + "author_declaration": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\author" + } + }, + { + "type": "FIELD", + "name": "authors", + "content": { + "type": "SYMBOL", + "name": "curly_group_author_list" + } + } + ] + }, + "package_include": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\usepackage" + }, + { + "type": "STRING", + "value": "\\RequirePackage" + } + ] + } + }, + { + "type": "FIELD", + "name": "options", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_key_value" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "paths", + "content": { + "type": "SYMBOL", + "name": "curly_group_path_list" + } + } + ] + }, + "class_include": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\documentclass" + } + }, + { + "type": "FIELD", + "name": "options", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_key_value" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "path", + "content": { + "type": "SYMBOL", + "name": "curly_group_path" + } + } + ] + }, + "latex_include": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\include" + }, + { + "type": "STRING", + "value": "\\subfileinclude" + }, + { + "type": "STRING", + "value": "\\input" + }, + { + "type": "STRING", + "value": "\\subfile" + } + ] + } + }, + { + "type": "FIELD", + "name": "path", + "content": { + "type": "SYMBOL", + "name": "curly_group_path" + } + } + ] + }, + "biblatex_include": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "\\addbibresource" + }, + { + "type": "FIELD", + "name": "options", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_key_value" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "glob", + "content": { + "type": "SYMBOL", + "name": "curly_group_glob_pattern" + } + } + ] + }, + "bibtex_include": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\bibliography" + } + }, + { + "type": "FIELD", + "name": "path", + "content": { + "type": "SYMBOL", + "name": "curly_group_path" + } + } + ] + }, + "graphics_include": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\includegraphics" + } + }, + { + "type": "FIELD", + "name": "options", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_key_value" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "path", + "content": { + "type": "SYMBOL", + "name": "curly_group_path" + } + } + ] + }, + "svg_include": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\includesvg" + } + }, + { + "type": "FIELD", + "name": "options", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_key_value" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "path", + "content": { + "type": "SYMBOL", + "name": "curly_group_path" + } + } + ] + }, + "inkscape_include": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\includeinkscape" + } + }, + { + "type": "FIELD", + "name": "options", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_key_value" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "path", + "content": { + "type": "SYMBOL", + "name": "curly_group_path" + } + } + ] + }, + "verbatim_include": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\verbatiminput" + }, + { + "type": "STRING", + "value": "\\VerbatimInput" + } + ] + } + }, + { + "type": "FIELD", + "name": "path", + "content": { + "type": "SYMBOL", + "name": "curly_group_path" + } + } + ] + }, + "import_include": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\import" + }, + { + "type": "STRING", + "value": "\\subimport" + }, + { + "type": "STRING", + "value": "\\inputfrom" + }, + { + "type": "STRING", + "value": "\\subimportfrom" + }, + { + "type": "STRING", + "value": "\\includefrom" + }, + { + "type": "STRING", + "value": "\\subincludefrom" + } + ] + } + }, + { + "type": "FIELD", + "name": "directory", + "content": { + "type": "SYMBOL", + "name": "curly_group_path" + } + }, + { + "type": "FIELD", + "name": "file", + "content": { + "type": "SYMBOL", + "name": "curly_group_path" + } + } + ] + }, + "caption": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\caption" + } + }, + { + "type": "FIELD", + "name": "short", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "long", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + } + ] + }, + "citation": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\cite" + }, + { + "type": "STRING", + "value": "\\cite*" + }, + { + "type": "STRING", + "value": "\\Cite" + }, + { + "type": "STRING", + "value": "\\nocite" + }, + { + "type": "STRING", + "value": "\\citet" + }, + { + "type": "STRING", + "value": "\\citep" + }, + { + "type": "STRING", + "value": "\\citet*" + }, + { + "type": "STRING", + "value": "\\citep*" + }, + { + "type": "STRING", + "value": "\\citeauthor" + }, + { + "type": "STRING", + "value": "\\citeauthor*" + }, + { + "type": "STRING", + "value": "\\Citeauthor" + }, + { + "type": "STRING", + "value": "\\Citeauthor*" + }, + { + "type": "STRING", + "value": "\\citetitle" + }, + { + "type": "STRING", + "value": "\\citetitle*" + }, + { + "type": "STRING", + "value": "\\citeyear" + }, + { + "type": "STRING", + "value": "\\citeyear*" + }, + { + "type": "STRING", + "value": "\\citedate" + }, + { + "type": "STRING", + "value": "\\citedate*" + }, + { + "type": "STRING", + "value": "\\citeurl" + }, + { + "type": "STRING", + "value": "\\fullcite" + }, + { + "type": "STRING", + "value": "\\citeyearpar" + }, + { + "type": "STRING", + "value": "\\citealt" + }, + { + "type": "STRING", + "value": "\\citealp" + }, + { + "type": "STRING", + "value": "\\citetext" + }, + { + "type": "STRING", + "value": "\\parencite" + }, + { + "type": "STRING", + "value": "\\parencite*" + }, + { + "type": "STRING", + "value": "\\Parencite" + }, + { + "type": "STRING", + "value": "\\footcite" + }, + { + "type": "STRING", + "value": "\\footfullcite" + }, + { + "type": "STRING", + "value": "\\footcitetext" + }, + { + "type": "STRING", + "value": "\\textcite" + }, + { + "type": "STRING", + "value": "\\Textcite" + }, + { + "type": "STRING", + "value": "\\smartcite" + }, + { + "type": "STRING", + "value": "\\Smartcite" + }, + { + "type": "STRING", + "value": "\\supercite" + }, + { + "type": "STRING", + "value": "\\autocite" + }, + { + "type": "STRING", + "value": "\\Autocite" + }, + { + "type": "STRING", + "value": "\\autocite*" + }, + { + "type": "STRING", + "value": "\\Autocite*" + }, + { + "type": "STRING", + "value": "\\volcite" + }, + { + "type": "STRING", + "value": "\\Volcite" + }, + { + "type": "STRING", + "value": "\\pvolcite" + }, + { + "type": "STRING", + "value": "\\Pvolcite" + }, + { + "type": "STRING", + "value": "\\fvolcite" + }, + { + "type": "STRING", + "value": "\\ftvolcite" + }, + { + "type": "STRING", + "value": "\\svolcite" + }, + { + "type": "STRING", + "value": "\\Svolcite" + }, + { + "type": "STRING", + "value": "\\tvolcite" + }, + { + "type": "STRING", + "value": "\\Tvolcite" + }, + { + "type": "STRING", + "value": "\\avolcite" + }, + { + "type": "STRING", + "value": "\\Avolcite" + }, + { + "type": "STRING", + "value": "\\notecite" + }, + { + "type": "STRING", + "value": "\\Notecite" + }, + { + "type": "STRING", + "value": "\\pnotecite" + }, + { + "type": "STRING", + "value": "\\Pnotecite" + }, + { + "type": "STRING", + "value": "\\fnotecite" + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "prenote", + "content": { + "type": "SYMBOL", + "name": "brack_group" + } + }, + { + "type": "FIELD", + "name": "postnote", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group" + }, + { + "type": "BLANK" + } + ] + } + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "FIELD", + "name": "keys", + "content": { + "type": "SYMBOL", + "name": "curly_group_text_list" + } + } + ] + }, + "label_definition": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\label" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + } + ] + }, + "label_reference": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\ref" + }, + { + "type": "STRING", + "value": "\\eqref" + }, + { + "type": "STRING", + "value": "\\vref" + }, + { + "type": "STRING", + "value": "\\Vref" + }, + { + "type": "STRING", + "value": "\\autoref" + }, + { + "type": "STRING", + "value": "\\pageref" + }, + { + "type": "STRING", + "value": "\\cref" + }, + { + "type": "STRING", + "value": "\\Cref" + }, + { + "type": "STRING", + "value": "\\cref*" + }, + { + "type": "STRING", + "value": "\\Cref*" + }, + { + "type": "STRING", + "value": "\\namecref" + }, + { + "type": "STRING", + "value": "\\nameCref" + }, + { + "type": "STRING", + "value": "\\lcnamecref" + }, + { + "type": "STRING", + "value": "\\namecrefs" + }, + { + "type": "STRING", + "value": "\\nameCrefs" + }, + { + "type": "STRING", + "value": "\\lcnamecrefs" + }, + { + "type": "STRING", + "value": "\\labelcref" + }, + { + "type": "STRING", + "value": "\\labelcpageref" + } + ] + } + }, + { + "type": "FIELD", + "name": "names", + "content": { + "type": "SYMBOL", + "name": "curly_group_text_list" + } + } + ] + }, + "label_reference_range": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\crefrange" + }, + { + "type": "STRING", + "value": "\\crefrange*" + }, + { + "type": "STRING", + "value": "\\Crefrange" + }, + { + "type": "STRING", + "value": "\\Crefrange*" + } + ] + } + }, + { + "type": "FIELD", + "name": "from", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + }, + { + "type": "FIELD", + "name": "to", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + } + ] + }, + "label_number": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\newlabel" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + }, + { + "type": "FIELD", + "name": "number", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + } + ] + }, + "new_command_definition": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\newcommand" + }, + { + "type": "STRING", + "value": "\\newcommand*" + }, + { + "type": "STRING", + "value": "\\renewcommand" + }, + { + "type": "STRING", + "value": "\\renewcommand*" + }, + { + "type": "STRING", + "value": "\\DeclareRobustCommand" + }, + { + "type": "STRING", + "value": "\\DeclareRobustCommand*" + }, + { + "type": "STRING", + "value": "\\DeclareMathOperator" + }, + { + "type": "STRING", + "value": "\\DeclareMathOperator*" + }, + { + "type": "STRING", + "value": "\\NewDocumentCommand" + }, + { + "type": "STRING", + "value": "\\RenewDocumentCommand" + }, + { + "type": "STRING", + "value": "\\ProvideDocumentCommand" + }, + { + "type": "STRING", + "value": "\\DeclareDocumentCommand" + }, + { + "type": "STRING", + "value": "\\NewExpandableDocumentCommand" + }, + { + "type": "STRING", + "value": "\\RenewExpandableDocumentCommand" + }, + { + "type": "STRING", + "value": "\\ProvideExpandableDocumentCommand" + }, + { + "type": "STRING", + "value": "\\DeclareExpandableDocumentCommand" + } + ] + } + }, + { + "type": "FIELD", + "name": "declaration", + "content": { + "type": "SYMBOL", + "name": "curly_group_command_name" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "argc", + "content": { + "type": "SYMBOL", + "name": "brack_group_argc" + } + }, + { + "type": "FIELD", + "name": "default", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group" + }, + { + "type": "BLANK" + } + ] + } + } + ] + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "FIELD", + "name": "implementation", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + } + ] + }, + "old_command_definition": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\def" + } + }, + { + "type": "FIELD", + "name": "declaration", + "content": { + "type": "SYMBOL", + "name": "command_name" + } + } + ] + }, + "let_command_definition": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\let" + } + }, + { + "type": "FIELD", + "name": "declaration", + "content": { + "type": "SYMBOL", + "name": "command_name" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "=" + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "FIELD", + "name": "implementation", + "content": { + "type": "SYMBOL", + "name": "command_name" + } + } + ] + }, + "_math_delimiter_part": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "word" + }, + { + "type": "SYMBOL", + "name": "command_name" + }, + { + "type": "STRING", + "value": "[" + }, + { + "type": "STRING", + "value": "]" + }, + { + "type": "STRING", + "value": "(" + }, + { + "type": "STRING", + "value": ")" + }, + { + "type": "STRING", + "value": "|" + } + ] + }, + "math_delimiter": { + "type": "PREC_LEFT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "left_command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\left" + }, + { + "type": "STRING", + "value": "\\bigl" + }, + { + "type": "STRING", + "value": "\\Bigl" + }, + { + "type": "STRING", + "value": "\\biggl" + }, + { + "type": "STRING", + "value": "\\Biggl" + } + ] + } + }, + { + "type": "FIELD", + "name": "left_delimiter", + "content": { + "type": "SYMBOL", + "name": "_math_delimiter_part" + } + }, + { + "type": "REPEAT", + "content": { + "type": "SYMBOL", + "name": "_root_content" + } + }, + { + "type": "FIELD", + "name": "right_command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\right" + }, + { + "type": "STRING", + "value": "\\bigr" + }, + { + "type": "STRING", + "value": "\\Bigr" + }, + { + "type": "STRING", + "value": "\\biggr" + }, + { + "type": "STRING", + "value": "\\Biggr" + } + ] + } + }, + { + "type": "FIELD", + "name": "right_delimiter", + "content": { + "type": "SYMBOL", + "name": "_math_delimiter_part" + } + } + ] + } + }, + "paired_delimiter_definition": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\DeclarePairedDelimiter" + }, + { + "type": "STRING", + "value": "\\DeclarePairedDelimiterX" + } + ] + } + }, + { + "type": "FIELD", + "name": "declaration", + "content": { + "type": "SYMBOL", + "name": "curly_group_command_name" + } + }, + { + "type": "FIELD", + "name": "argc", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_argc" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "left", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "curly_group_impl" + }, + { + "type": "SYMBOL", + "name": "command_name" + } + ] + } + }, + { + "type": "FIELD", + "name": "right", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "curly_group_impl" + }, + { + "type": "SYMBOL", + "name": "command_name" + } + ] + } + }, + { + "type": "FIELD", + "name": "body", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "curly_group" + }, + { + "type": "BLANK" + } + ] + } + } + ] + } + }, + "environment_definition": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\newenvironment" + }, + { + "type": "STRING", + "value": "\\renewenvironment" + }, + { + "type": "STRING", + "value": "\\NewDocumentEnvironment" + }, + { + "type": "STRING", + "value": "\\RenewDocumentEnvironment" + }, + { + "type": "STRING", + "value": "\\ProvideDocumentEnvironment" + }, + { + "type": "STRING", + "value": "\\DeclareDocumentEnvironment" + } + ] + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + }, + { + "type": "FIELD", + "name": "argc", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_argc" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "begin", + "content": { + "type": "SYMBOL", + "name": "curly_group_impl" + } + }, + { + "type": "FIELD", + "name": "end", + "content": { + "type": "SYMBOL", + "name": "curly_group_impl" + } + } + ] + }, + "glossary_entry_definition": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\newglossaryentry" + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + }, + { + "type": "FIELD", + "name": "options", + "content": { + "type": "SYMBOL", + "name": "curly_group_key_value" + } + } + ] + }, + "glossary_entry_reference": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\gls" + }, + { + "type": "STRING", + "value": "\\Gls" + }, + { + "type": "STRING", + "value": "\\GLS" + }, + { + "type": "STRING", + "value": "\\glspl" + }, + { + "type": "STRING", + "value": "\\Glspl" + }, + { + "type": "STRING", + "value": "\\GLSpl" + }, + { + "type": "STRING", + "value": "\\glsdisp" + }, + { + "type": "STRING", + "value": "\\glslink" + }, + { + "type": "STRING", + "value": "\\glstext" + }, + { + "type": "STRING", + "value": "\\Glstext" + }, + { + "type": "STRING", + "value": "\\GLStext" + }, + { + "type": "STRING", + "value": "\\glsfirst" + }, + { + "type": "STRING", + "value": "\\Glsfirst" + }, + { + "type": "STRING", + "value": "\\GLSfirst" + }, + { + "type": "STRING", + "value": "\\glsplural" + }, + { + "type": "STRING", + "value": "\\Glsplural" + }, + { + "type": "STRING", + "value": "\\GLSplural" + }, + { + "type": "STRING", + "value": "\\glsfirstplural" + }, + { + "type": "STRING", + "value": "\\Glsfirstplural" + }, + { + "type": "STRING", + "value": "\\GLSfirstplural" + }, + { + "type": "STRING", + "value": "\\glsname" + }, + { + "type": "STRING", + "value": "\\Glsname" + }, + { + "type": "STRING", + "value": "\\GLSname" + }, + { + "type": "STRING", + "value": "\\glssymbol" + }, + { + "type": "STRING", + "value": "\\Glssymbol" + }, + { + "type": "STRING", + "value": "\\glsdesc" + }, + { + "type": "STRING", + "value": "\\Glsdesc" + }, + { + "type": "STRING", + "value": "\\GLSdesc" + }, + { + "type": "STRING", + "value": "\\glsuseri" + }, + { + "type": "STRING", + "value": "\\Glsuseri" + }, + { + "type": "STRING", + "value": "\\GLSuseri" + }, + { + "type": "STRING", + "value": "\\glsuserii" + }, + { + "type": "STRING", + "value": "\\Glsuserii" + }, + { + "type": "STRING", + "value": "\\GLSuserii" + }, + { + "type": "STRING", + "value": "\\glsuseriii" + }, + { + "type": "STRING", + "value": "\\Glsuseriii" + }, + { + "type": "STRING", + "value": "\\GLSuseriii" + }, + { + "type": "STRING", + "value": "\\glsuseriv" + }, + { + "type": "STRING", + "value": "\\Glsuseriv" + }, + { + "type": "STRING", + "value": "\\GLSuseriv" + }, + { + "type": "STRING", + "value": "\\glsuserv" + }, + { + "type": "STRING", + "value": "\\Glsuserv" + }, + { + "type": "STRING", + "value": "\\GLSuserv" + }, + { + "type": "STRING", + "value": "\\glsuservi" + }, + { + "type": "STRING", + "value": "\\Glsuservi" + }, + { + "type": "STRING", + "value": "\\GLSuservi" + } + ] + } + }, + { + "type": "FIELD", + "name": "options", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_key_value" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + } + ] + }, + "acronym_definition": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\newacronym" + } + }, + { + "type": "FIELD", + "name": "options", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_key_value" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + }, + { + "type": "FIELD", + "name": "short", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + }, + { + "type": "FIELD", + "name": "long", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + } + ] + }, + "acronym_reference": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\acrshort" + }, + { + "type": "STRING", + "value": "\\Acrshort" + }, + { + "type": "STRING", + "value": "\\ACRshort" + }, + { + "type": "STRING", + "value": "\\acrshortpl" + }, + { + "type": "STRING", + "value": "\\Acrshortpl" + }, + { + "type": "STRING", + "value": "\\ACRshortpl" + }, + { + "type": "STRING", + "value": "\\acrlong" + }, + { + "type": "STRING", + "value": "\\Acrlong" + }, + { + "type": "STRING", + "value": "\\ACRlong" + }, + { + "type": "STRING", + "value": "\\acrlongpl" + }, + { + "type": "STRING", + "value": "\\Acrlongpl" + }, + { + "type": "STRING", + "value": "\\ACRlongpl" + }, + { + "type": "STRING", + "value": "\\acrfull" + }, + { + "type": "STRING", + "value": "\\Acrfull" + }, + { + "type": "STRING", + "value": "\\ACRfull" + }, + { + "type": "STRING", + "value": "\\acrfullpl" + }, + { + "type": "STRING", + "value": "\\Acrfullpl" + }, + { + "type": "STRING", + "value": "\\ACRfullpl" + }, + { + "type": "STRING", + "value": "\\acs" + }, + { + "type": "STRING", + "value": "\\Acs" + }, + { + "type": "STRING", + "value": "\\acsp" + }, + { + "type": "STRING", + "value": "\\Acsp" + }, + { + "type": "STRING", + "value": "\\acl" + }, + { + "type": "STRING", + "value": "\\Acl" + }, + { + "type": "STRING", + "value": "\\aclp" + }, + { + "type": "STRING", + "value": "\\Aclp" + }, + { + "type": "STRING", + "value": "\\acf" + }, + { + "type": "STRING", + "value": "\\Acf" + }, + { + "type": "STRING", + "value": "\\acfp" + }, + { + "type": "STRING", + "value": "\\Acfp" + }, + { + "type": "STRING", + "value": "\\ac" + }, + { + "type": "STRING", + "value": "\\Ac" + }, + { + "type": "STRING", + "value": "\\acp" + }, + { + "type": "STRING", + "value": "\\glsentrylong" + }, + { + "type": "STRING", + "value": "\\Glsentrylong" + }, + { + "type": "STRING", + "value": "\\glsentrylongpl" + }, + { + "type": "STRING", + "value": "\\Glsentrylongpl" + }, + { + "type": "STRING", + "value": "\\glsentryshort" + }, + { + "type": "STRING", + "value": "\\Glsentryshort" + }, + { + "type": "STRING", + "value": "\\glsentryshortpl" + }, + { + "type": "STRING", + "value": "\\Glsentryshortpl" + }, + { + "type": "STRING", + "value": "\\glsentryfullpl" + }, + { + "type": "STRING", + "value": "\\Glsentryfullpl" + } + ] + } + }, + { + "type": "FIELD", + "name": "options", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_key_value" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + } + ] + }, + "theorem_definition": { + "type": "PREC_RIGHT", + "value": 0, + "content": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\newtheorem" + }, + { + "type": "STRING", + "value": "\\newtheorem*" + }, + { + "type": "STRING", + "value": "\\declaretheorem" + }, + { + "type": "STRING", + "value": "\\declaretheorem*" + } + ] + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "FIELD", + "name": "options", + "content": { + "type": "SYMBOL", + "name": "brack_group_key_value" + } + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "title", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + }, + { + "type": "FIELD", + "name": "counter", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_text" + }, + { + "type": "BLANK" + } + ] + } + } + ] + }, + { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "counter", + "content": { + "type": "SYMBOL", + "name": "brack_group_text" + } + }, + { + "type": "FIELD", + "name": "title", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + } + ] + } + ] + }, + { + "type": "BLANK" + } + ] + } + ] + } + }, + "color_definition": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\definecolor" + } + }, + { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_text" + }, + { + "type": "BLANK" + } + ] + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + }, + { + "type": "FIELD", + "name": "model", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + }, + { + "type": "FIELD", + "name": "spec", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + } + ] + }, + "color_set_definition": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "STRING", + "value": "\\definecolorset" + } + }, + { + "type": "FIELD", + "name": "ty", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SYMBOL", + "name": "brack_group_text" + }, + { + "type": "BLANK" + } + ] + } + }, + { + "type": "FIELD", + "name": "model", + "content": { + "type": "SYMBOL", + "name": "curly_group_text_list" + } + }, + { + "type": "FIELD", + "name": "head", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + }, + { + "type": "FIELD", + "name": "tail", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + }, + { + "type": "FIELD", + "name": "spec", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + } + ] + }, + "color_reference": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\color" + }, + { + "type": "STRING", + "value": "\\colorbox" + }, + { + "type": "STRING", + "value": "\\textcolor" + }, + { + "type": "STRING", + "value": "\\pagecolor" + } + ] + } + }, + { + "type": "FIELD", + "name": "name", + "content": { + "type": "SYMBOL", + "name": "curly_group_text" + } + } + ] + }, + "tikz_library_import": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\usepgflibrary" + }, + { + "type": "STRING", + "value": "\\usetikzlibrary" + } + ] + } + }, + { + "type": "FIELD", + "name": "paths", + "content": { + "type": "SYMBOL", + "name": "curly_group_path_list" + } + } + ] + }, + "text_mode": { + "type": "SEQ", + "members": [ + { + "type": "FIELD", + "name": "command", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "STRING", + "value": "\\text" + }, + { + "type": "STRING", + "value": "\\intertext" + }, + { + "type": "STRING", + "value": "shortintertext" + } + ] + } + }, + { + "type": "FIELD", + "name": "content", + "content": { + "type": "SYMBOL", + "name": "curly_group" + } + } + ] + } + }, + "extras": [ + { + "type": "SYMBOL", + "name": "_whitespace" + }, + { + "type": "SYMBOL", + "name": "line_comment" + } + ], + "conflicts": [], + "precedences": [], + "externals": [ + { + "type": "SYMBOL", + "name": "_trivia_raw_fi" + }, + { + "type": "SYMBOL", + "name": "_trivia_raw_env_comment" + }, + { + "type": "SYMBOL", + "name": "_trivia_raw_env_verbatim" + }, + { + "type": "SYMBOL", + "name": "_trivia_raw_env_listing" + }, + { + "type": "SYMBOL", + "name": "_trivia_raw_env_minted" + }, + { + "type": "SYMBOL", + "name": "_trivia_raw_env_pycode" + }, + { + "type": "SYMBOL", + "name": "_trivia_raw_env_sagesilent" + }, + { + "type": "SYMBOL", + "name": "_trivia_raw_env_sageblock" + } + ], + "inline": [], + "supertypes": [] +} +' \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/language.st b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/language.st new file mode 100644 index 00000000..f21b96ca --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/language.st @@ -0,0 +1,4 @@ +configuration +language + + ^ #sbeLatex \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/rootRuleName.st b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/rootRuleName.st new file mode 100644 index 00000000..e9de80c2 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/class/rootRuleName.st @@ -0,0 +1,4 @@ +configuration +rootRuleName + + ^ 'source_file' \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/methodProperties.json new file mode 100644 index 00000000..6b28a758 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/methodProperties.json @@ -0,0 +1,8 @@ +{ + "class" : { + "fileSuffix" : "", + "grammarJson" : "", + "language" : "ct 11/21/2023 13:44", + "rootRuleName" : "" }, + "instance" : { + } } diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/properties.json b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/properties.json new file mode 100644 index 00000000..4fe7906b --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBESBLatex.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SBE-ExtractBook", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + ], + "name" : "SBESBLatex", + "pools" : [ + ], + "super" : "SBTSLanguage", + "type" : "normal" } diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBTreeSitter.extension/instance/sbeLatex.st b/SmalltalkSources/SBE-ExtractBook.package/SBTreeSitter.extension/instance/sbeLatex.st new file mode 100644 index 00000000..677d42e9 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBTreeSitter.extension/instance/sbeLatex.st @@ -0,0 +1,5 @@ +*SBE-ExtractBook-ffi languages +sbeLatex + + + ^ SBTSLanguage tryPatchLibrary: 'latex-lsp/tree-sitter-latex' name: 'latex' context: thisContext branch: 'master' subpath: '' \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBTreeSitter.extension/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBTreeSitter.extension/methodProperties.json new file mode 100644 index 00000000..75b0f2c0 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBTreeSitter.extension/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "sbeLatex" : "ct 11/21/2023 13:44" } } diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBTreeSitter.extension/properties.json b/SmalltalkSources/SBE-ExtractBook.package/SBTreeSitter.extension/properties.json new file mode 100644 index 00000000..31069831 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBTreeSitter.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "SBTreeSitter" } diff --git a/SmalltalkSources/SBE-ExtractBook.package/TextStream.extension/instance/sbeLastAttributes.st b/SmalltalkSources/SBE-ExtractBook.package/TextStream.extension/instance/sbeLastAttributes.st new file mode 100644 index 00000000..7bc22d4d --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/TextStream.extension/instance/sbeLastAttributes.st @@ -0,0 +1,4 @@ +*SBE-ExtractBook-accessing +sbeLastAttributes + + ^ collection attributesAt: position \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/TextStream.extension/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/TextStream.extension/methodProperties.json new file mode 100644 index 00000000..5d996cb2 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/TextStream.extension/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "sbeLastAttributes" : "ct 11/13/2023 21:17" } } diff --git a/SmalltalkSources/SBE-ExtractBook.package/TextStream.extension/properties.json b/SmalltalkSources/SBE-ExtractBook.package/TextStream.extension/properties.json new file mode 100644 index 00000000..5027f06e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/TextStream.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "TextStream" } diff --git a/SmalltalkSources/SBE-ExtractBook.package/WriteStream.extension/instance/sbeLastAttributes.st b/SmalltalkSources/SBE-ExtractBook.package/WriteStream.extension/instance/sbeLastAttributes.st new file mode 100644 index 00000000..82c439a2 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/WriteStream.extension/instance/sbeLastAttributes.st @@ -0,0 +1,5 @@ +*SBE-ExtractBook-accessing +sbeLastAttributes + "Compatibility." + + ^ #() \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/WriteStream.extension/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/WriteStream.extension/methodProperties.json new file mode 100644 index 00000000..871f7212 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/WriteStream.extension/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "sbeLastAttributes" : "ct 11/13/2023 21:22" } } diff --git a/SmalltalkSources/SBE-ExtractBook.package/WriteStream.extension/properties.json b/SmalltalkSources/SBE-ExtractBook.package/WriteStream.extension/properties.json new file mode 100644 index 00000000..239b3632 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/WriteStream.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "WriteStream" } diff --git a/SmalltalkSources/SBE-ExtractBook.package/monticello.meta/categories.st b/SmalltalkSources/SBE-ExtractBook.package/monticello.meta/categories.st new file mode 100644 index 00000000..8f7a8f9b --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/monticello.meta/categories.st @@ -0,0 +1 @@ +SystemOrganization addCategory: #'SBE-ExtractBook'! diff --git a/SmalltalkSources/SBE-ExtractBook.package/monticello.meta/initializers.st b/SmalltalkSources/SBE-ExtractBook.package/monticello.meta/initializers.st new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-ExtractBook.package/properties.json b/SmalltalkSources/SBE-ExtractBook.package/properties.json new file mode 100644 index 00000000..f037444a --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/properties.json @@ -0,0 +1,2 @@ +{ + } From fa6d126cfda6ea8c924f85736e8dc1f4e26bba6d Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Tue, 21 Nov 2023 17:14:14 +0100 Subject: [PATCH 02/35] book-extract: fix baseline for sb-tree-sitter --- .../BaselineOfSBE.class/instance/baseline..st | 4 ++-- .../BaselineOfSBE.class/methodProperties.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/baseline..st b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/baseline..st index a6dbc908..03d78332 100644 --- a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/baseline..st +++ b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/baseline..st @@ -5,7 +5,7 @@ baseline: spec spec baseline: 'FileSystem' with: [spec repository: 'github://squeak-smalltalk/squeak-filesystem:master/src'; loads: #('default' 'tests')]. - spec baseline: 'Sandblocks-TreeSitter' with: [spec + spec baseline: 'SBTreeSitter' with: [spec repository: 'github://hpi-swa-lab/sb-tree-sitter:master/packages'; loads: 'Sandblocks-TreeSitter']. spec @@ -13,7 +13,7 @@ baseline: spec package: #'SBE-Environment'; package: #'SBE-Extract' with: [spec requires: #('FileSystem')]; package: #'SBE-ExtractBook' with: [ - spec requires: #(#'SBE-Book' 'FileSystem' 'Sandblocks-TreeSitter')]; + spec requires: #(#'SBE-Book' 'FileSystem' 'SBTreeSitter')]; package: #'SBE-Monticello'; package: #'SBE-Morphic'; package: #'SBE-Quinto'; diff --git a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json index cbb48a47..6a6d45ef 100644 --- a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json +++ b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json @@ -2,4 +2,4 @@ "class" : { }, "instance" : { - "baseline:" : "ct 11/21/2023 15:11" } } + "baseline:" : "ct 11/21/2023 17:10" } } From 964aab8d5c35bf17b9187f947a37e813a3df8804 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Tue, 21 Nov 2023 17:41:25 +0100 Subject: [PATCH 03/35] update todos for extract-book --- .../SBELatexBookExtractor.class/class/dependencies.st | 8 ++++++++ .../SBELatexBookExtractor.class/class/todo.st | 2 +- .../SBELatexBookExtractor.class/methodProperties.json | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/dependencies.st 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/todo.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/todo.st index f6bd35c1..d045606a 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/todo.st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/class/todo.st @@ -1,4 +1,4 @@ -as yet unclassified +documentation todo self flag: #todo. diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json index 61df9fef..cfebaa69 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json @@ -1,5 +1,6 @@ { "class" : { + "dependencies" : "ct 11/21/2023 17:35", "extractFromFile:" : "ct 11/9/2023 23:16", "parseFile:" : "ct 10/19/2023 13:22", "todo" : "ct 11/21/2023 14:45" }, From bf876b31565f92ff6b489a4e6a3be17fae311ee4 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Tue, 21 Nov 2023 19:50:51 +0100 Subject: [PATCH 04/35] extract-book: make texts and images aware of UI theme and scale factor (dynamic updates!) --- .../instance/asSbeTextAnchorWithExtent..st | 6 ++++++ .../asSbeTextAnchorWithExtent.dyeMode..st | 6 ++++++ .../Form.extension/methodProperties.json | 4 +++- .../instance/mapTagToAttribute..st | 13 +++++++++++- .../methodProperties.json | 2 +- .../class/themeProperties.st | 6 ++++++ .../SBETextAnchor.class/instance/^equals.st | 2 ++ .../instance/anchoredMorph.st | 4 ++++ .../instance/applyUserInterfaceTheme.st | 6 ++++++ .../SBETextAnchor.class/instance/dyeMode..st | 4 ++++ .../SBETextAnchor.class/instance/dyeMode.st | 4 ++++ .../instance/emphasizeScanner..st | 7 +++++++ .../SBETextAnchor.class/instance/extent..st | 4 ++++ .../SBETextAnchor.class/instance/extent.st | 4 ++++ .../SBETextAnchor.class/instance/hash.st | 3 ++- .../SBETextAnchor.class/instance/image.st | 2 +- .../instance/openHtmlOn..st | 3 ++- .../instance/resetCache.st | 4 ++++ .../instance/scaledImage.st | 20 +++++++++++++++++++ .../SBETextAnchor.class/methodProperties.json | 19 +++++++++++++----- .../SBETextAnchor.class/properties.json | 5 ++++- .../SBETextColor.class/README.md | 0 .../SBETextColor.class/class/property..st | 6 ++++++ .../class/property.scope..st | 7 +++++++ .../class/themeProperties.st | 6 ++++++ .../SBETextColor.class/instance/^equals.st | 6 ++++++ .../instance/actualColor.st | 8 ++++++++ .../instance/applyUserInterfaceTheme.st | 6 ++++++ .../instance/closeHtmlOn..st | 4 ++++ .../instance/dominatedByCmd0.st | 4 ++++ .../SBETextColor.class/instance/dominates..st | 4 ++++ .../instance/emphasizeScanner..st | 6 ++++++ .../SBETextColor.class/instance/hash.st | 4 ++++ .../instance/openHtmlOn..st | 6 ++++++ .../SBETextColor.class/instance/property..st | 4 ++++ .../SBETextColor.class/instance/property.st | 4 ++++ .../SBETextColor.class/instance/resetCache.st | 4 ++++ .../SBETextColor.class/instance/scope..st | 4 ++++ .../SBETextColor.class/instance/scope.st | 4 ++++ .../SBETextColor.class/methodProperties.json | 20 +++++++++++++++++++ .../SBETextColor.class/properties.json | 17 ++++++++++++++++ .../SBETextFontReference.class/README.md | 0 .../class/smaller.st | 4 ++++ .../class/style..st | 6 ++++++ .../class/themeProperties.st | 6 ++++++ .../instance/^equals.st | 5 +++++ .../instance/applyUserInterfaceTheme.st | 6 ++++++ .../instance/closeHtmlOn..st | 4 ++++ .../instance/fontForStyle..st | 5 +++++ .../instance/hash.st | 4 ++++ .../instance/openHtmlOn..st | 6 ++++++ .../instance/style..st | 5 +++++ .../instance/style.st | 4 ++++ .../instance/updateFont.st | 4 ++++ .../methodProperties.json | 15 ++++++++++++++ .../properties.json | 14 +++++++++++++ .../instance/basicEmitImage..st | 4 ---- .../instance/doThisImageDyeMode.st | 4 ++++ .../instance/emitCaptionDuring..st | 2 +- .../instance/emitCodeDuring..st | 2 +- .../instance/emitDoThisDuring..st | 2 +- .../instance/emitImage..st | 12 +++++------ .../methodProperties.json | 10 +++++----- .../instance/basicVisitGraphicsFile..st | 6 ++++-- .../instance/emitImage..st | 6 +++--- .../instance/emitImage.dyeMode..st | 7 +++++++ .../instance/emitImage.extent..st | 7 +++++++ .../instance/emitImage.extent.dyeMode..st | 6 ++++++ .../methodProperties.json | 7 +++++-- 69 files changed, 378 insertions(+), 37 deletions(-) create mode 100644 SmalltalkSources/SBE-Book.package/Form.extension/instance/asSbeTextAnchorWithExtent..st create mode 100644 SmalltalkSources/SBE-Book.package/Form.extension/instance/asSbeTextAnchorWithExtent.dyeMode..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/class/themeProperties.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/anchoredMorph.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/applyUserInterfaceTheme.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/dyeMode..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/dyeMode.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/emphasizeScanner..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/extent..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/extent.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/resetCache.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/scaledImage.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/class/property..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/class/property.scope..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/class/themeProperties.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/^equals.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/actualColor.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/applyUserInterfaceTheme.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/closeHtmlOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/dominatedByCmd0.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/dominates..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/emphasizeScanner..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/hash.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/openHtmlOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/property..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/property.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/resetCache.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/scope..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/instance/scope.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBETextColor.class/properties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/class/smaller.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/class/style..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/class/themeProperties.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/^equals.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/applyUserInterfaceTheme.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/closeHtmlOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/fontForStyle..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/hash.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/openHtmlOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/style..st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/style.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/instance/updateFont.st create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBETextFontReference.class/properties.json delete mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicEmitImage..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/doThisImageDyeMode.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage.dyeMode..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage.extent..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage.extent.dyeMode..st 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 index 93c64046..f71dc4ee 100644 --- a/SmalltalkSources/SBE-Book.package/Form.extension/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/Form.extension/methodProperties.json @@ -2,4 +2,6 @@ "class" : { }, "instance" : { - "asSbeTextAnchor" : "ct 11/15/2023 19:38" } } + "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/SBEHtmlReadWriter.class/instance/mapTagToAttribute..st b/SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/mapTagToAttribute..st index 06867a77..17dd50e8 100644 --- a/SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/mapTagToAttribute..st +++ b/SmalltalkSources/SBE-Book.package/SBEHtmlReadWriter.class/instance/mapTagToAttribute..st @@ -2,7 +2,18 @@ mapping mapTagToAttribute: aTag (self hasTag: aTag name: ''. '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 index c7f9f512..a3924012 100644 --- a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/^equals.st +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/^equals.st @@ -2,4 +2,6 @@ comparing = other ^ other class == self class + and: [other dyeMode = self dyeMode] + and: [other extent = self extent] and: [other image bits = self image bits] \ 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..ebe36787 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/anchoredMorph.st @@ -0,0 +1,4 @@ +accessing +anchoredMorph + + ^ 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..aacd9ded --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.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/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..103e7e59 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/emphasizeScanner..st @@ -0,0 +1,7 @@ +scanning +emphasizeScanner: scanner + + ((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/hash.st b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/hash.st index c1a46463..63f58f40 100644 --- a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/hash.st +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/hash.st @@ -1,5 +1,6 @@ comparing hash - ^ self class hash + ^ (self dyeMode hash + bitXor: self extent hash) bitXor: self image bits 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 index de2ee003..a9695559 100644 --- a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/image.st +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/image.st @@ -1,4 +1,4 @@ accessing image - ^ self anchoredMorph \ No newline at end of file + ^ anchoredMorph \ 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 index 257e1456..fd4a59bc 100644 --- a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/openHtmlOn..st +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/instance/openHtmlOn..st @@ -7,4 +7,5 @@ openHtmlOn: aHtmlReadWriter base64Encoded. aHtmlReadWriter nextPutAll: - ('' format: {data}). \ No newline at end of file + ('' 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 index 9eea9291..fcc7c247 100644 --- a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/methodProperties.json @@ -1,9 +1,18 @@ { "class" : { - }, + "themeProperties" : "ct 11/21/2023 19:20" }, "instance" : { - "=" : "ct 11/20/2023 21:14", + "=" : "ct 11/21/2023 18:24", + "anchoredMorph" : "ct 11/21/2023 17:57", + "applyUserInterfaceTheme" : "ct 11/21/2023 19:12", "closeHtmlOn:" : "ct 11/15/2023 19:36", - "hash" : "ct 11/20/2023 21:16", - "image" : "ct 11/20/2023 21:14", - "openHtmlOn:" : "ct 11/20/2023 21:14" } } + "dyeMode" : "ct 11/21/2023 18:11", + "dyeMode:" : "ct 11/21/2023 18:11", + "emphasizeScanner:" : "ct 11/21/2023 19:11", + "extent" : "ct 11/21/2023 18:02", + "extent:" : "ct 11/21/2023 18:02", + "hash" : "ct 11/21/2023 18:24", + "image" : "ct 11/21/2023 17: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 index e9d26717..6d45eee1 100644 --- a/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/properties.json +++ b/SmalltalkSources/SBE-Book.package/SBETextAnchor.class/properties.json @@ -6,7 +6,10 @@ ], "commentStamp" : "", "instvars" : [ - ], + "extent", + "dyeMode", + "scaledImage", + "knownScanners" ], "name" : "SBETextAnchor", "pools" : [ ], 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-ExtractBook.package/SBEBookExtractor.class/instance/basicEmitImage..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicEmitImage..st deleted file mode 100644 index 5ed4b41d..00000000 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicEmitImage..st +++ /dev/null @@ -1,4 +0,0 @@ -emitting -basicEmitImage: aForm - - ^ super emitImage: aForm \ 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/emitCaptionDuring..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCaptionDuring..st index ee128681..cd8026a8 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCaptionDuring..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCaptionDuring..st @@ -2,5 +2,5 @@ emitting emitCaptionDuring: aBlock ^ self stream - withAttribute: TextFontChange font1 + withAttribute: SBETextFontReference smaller do: aBlock \ 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 index 65d45e07..f5b244a2 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCodeDuring..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitCodeDuring..st @@ -1,7 +1,7 @@ emitting emitCodeDuring: aBlock - ^ self stream withAttribute: TextColor blue do: + ^ self stream withAttribute: (SBETextColor property: #integer scope: #SHTextStylerST80) do: [| oldStream wasVerbatim code | wasVerbatim := verbatim. verbatim := true. diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitDoThisDuring..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitDoThisDuring..st index 1ff44082..cee79e0a 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitDoThisDuring..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitDoThisDuring..st @@ -7,7 +7,7 @@ emitDoThisDuring: aBlock self stream withAttributes: {TextIndent tabs: 1. TextEmphasis italic} do: - [self basicEmitImage: self doThisImage. + [self emitImage: self doThisImage dyeMode: self doThisImageDyeMode. self stream space. result := aBlock value]. self basicVisitLineBreak: aBlock; basicVisitLineBreak: aBlock. diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st index 3ae7bc55..0c6973e1 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st @@ -1,11 +1,11 @@ emitting emitImage: aForm - | scaledForm | - scaledForm := figure - ifNotNil: [aForm scaledToSize: ((aForm extent / self imageScaleFactor) roundTo: 8)] - ifNil: [aForm scaledToHeight: TextStyle defaultFont height]. + | extent | + extent := figure + ifNotNil: [(aForm extent / self imageScaleFactor) roundTo: 8] + ifNil: [#inline]. self stream - withAttribute: (SBETextOpenImageAction for: aForm initialExtent: scaledForm extent) + withAttribute: (SBETextOpenImageAction for: aForm initialExtent: extent) do: - [super emitImage: scaledForm]. \ No newline at end of file + [self emitImage: aForm extent: extent]. \ 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 index 70d88b21..355f2b0a 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json @@ -2,7 +2,6 @@ "class" : { "example" : "ct 11/21/2023 14:49" }, "instance" : { - "basicEmitImage:" : "ct 11/13/2023 21:57", "basicVisitRoot:" : "ct 11/21/2023 14:27", "basicVisitText:" : "ct 11/21/2023 14:27", "book" : "ct 11/8/2023 23:05", @@ -26,15 +25,16 @@ "commandVerb:" : "ct 11/8/2023 19:25", "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/15/2023 21:53", + "emitCaptionDuring:" : "ct 11/21/2023 19:09", "emitCode:" : "ct 11/15/2023 18:37", - "emitCodeDuring:" : "ct 11/20/2023 18:58", - "emitDoThisDuring:" : "ct 11/20/2023 15:45", + "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/15/2023 23:09", + "emitImage:" : "ct 11/21/2023 18:47", "emitImportantDuring:" : "ct 11/12/2023 19:44", "emitItemLabel:" : "ct 11/15/2023 19:26", "emitLabel:" : "ct 11/15/2023 18:37", diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitGraphicsFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitGraphicsFile..st index b8d1c0b9..9479c37b 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitGraphicsFile..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitGraphicsFile..st @@ -6,8 +6,10 @@ basicVisitGraphicsFile: file [ImageReadWriter formFromStream: fileStream] ifError: [('' asText - addAttribute: TextColor red; + addAttribute: (SBETextColor property: #errorColor scope: #TestRunner); + addAttribute: TextFontChange font4; asMorph) - imageForm]]. + imageForm + magnifyBy: self imageScaleFactor]]. self emitImage: image. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage..st index 282dfd11..5a99d97e 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage..st @@ -1,6 +1,6 @@ emitting emitImage: aForm - self stream withAttribute: aForm asSbeTextAnchor do: - [self stream nextPut: Character home]. - previousLineBreaks := 0. \ No newline at end of file + ^ self + emitImage: aForm + extent: nil \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage.dyeMode..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage.dyeMode..st new file mode 100644 index 00000000..8ca90520 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage.dyeMode..st @@ -0,0 +1,7 @@ +emitting +emitImage: aForm dyeMode: dyeMode + + ^ self + emitImage: aForm + extent: nil + dyeMode: dyeMode \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage.extent..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage.extent..st new file mode 100644 index 00000000..20533e20 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage.extent..st @@ -0,0 +1,7 @@ +emitting +emitImage: aForm extent: extent + + ^ self + emitImage: aForm + extent: extent + dyeMode: nil \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage.extent.dyeMode..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage.extent.dyeMode..st new file mode 100644 index 00000000..6b5a51e8 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitImage.extent.dyeMode..st @@ -0,0 +1,6 @@ +emitting +emitImage: aForm extent: extent dyeMode: dyeMode + + self stream withAttribute: (aForm asSbeTextAnchorWithExtent: extent dyeMode: dyeMode) do: + [self stream nextPut: Character home]. + previousLineBreaks := 0. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json index cfebaa69..fe0c8c85 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json @@ -8,7 +8,7 @@ "basicVisit:" : "ct 10/19/2023 14:41", "basicVisitAny:" : "ct 10/19/2023 11:40", "basicVisitForParsing:" : "ct 11/21/2023 14:16", - "basicVisitGraphicsFile:" : "ct 11/8/2023 15:06", + "basicVisitGraphicsFile:" : "ct 11/21/2023 19:33", "basicVisitLineBreak:" : "ct 11/14/2023 23:43", "basicVisitRoot:" : "ct 11/21/2023 14:19", "basicVisitText:" : "ct 11/21/2023 14:19", @@ -57,7 +57,10 @@ "contentsInGroup:full:brackets:optional:" : "ct 11/8/2023 15:12", "contentsInGroup:full:optionalBrackets:" : "ct 11/8/2023 15:16", "contentsInGroup:optionalBrackets:" : "ct 11/8/2023 15:11", - "emitImage:" : "ct 11/15/2023 19:37", + "emitImage:" : "ct 11/21/2023 18:47", + "emitImage:dyeMode:" : "ct 11/21/2023 18:46", + "emitImage:extent:" : "ct 11/21/2023 18:47", + "emitImage:extent:dyeMode:" : "ct 11/21/2023 18:41", "emitItemLabel:" : "ct 11/15/2023 19:26", "emitLabel:" : "ct 11/12/2023 20:53", "emitLineBreak:" : "ct 11/14/2023 23:43", From 151639777145e7dbe05a57d4d59dbb8c4183100d Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Tue, 21 Nov 2023 19:51:18 +0100 Subject: [PATCH 05/35] document storing and reading of books --- .../SBEBookNode.class/class/readFromFile.st | 7 +++++++ .../SBEBookNode.class/class/storeToFile.st | 9 +++++++++ .../SBEBookNode.class/methodProperties.json | 2 ++ 3 files changed, 18 insertions(+) create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/readFromFile.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/storeToFile.st 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..62ed1f49 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/class/readFromFile.st @@ -0,0 +1,7 @@ +documentation +readFromFile + + | book | + book := FileStream readOnlyFileNamed: 'sbe.sbebook' do: [:stream | + SBEBook readFrom: stream]. + 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/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json index 884a552d..2df9b991 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json @@ -1,5 +1,7 @@ { "class" : { + "readFromFile" : "ct 11/21/2023 17:47", + "storeToFile" : "ct 11/21/2023 17:46", "testStoring" : "ct 11/21/2023 14:54" }, "instance" : { "addChild:" : "ct 11/15/2023 19:51", From 974043cf051912168cec230f7da322fd68940ccf Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Tue, 21 Nov 2023 19:55:06 +0100 Subject: [PATCH 06/35] allow updates via metacello --- .../BaselineOfSBE.class/instance/projectClass.st | 4 ++++ .../BaselineOfSBE.class/methodProperties.json | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/projectClass.st 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 6a6d45ef..19eef0cb 100644 --- a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json +++ b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json @@ -2,4 +2,5 @@ "class" : { }, "instance" : { - "baseline:" : "ct 11/21/2023 17:10" } } + "baseline:" : "ct 11/21/2023 17:10", + "projectClass" : "ct 11/21/2023 19:54" } } From 955817fd6cbd62c810bd6f6b3bb995cf6d1d1b3e Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Tue, 21 Nov 2023 21:08:29 +0100 Subject: [PATCH 07/35] fix text selection for squeak60 --- .../SBEBookNode.class/instance/openLabel.in..st | 2 +- .../SBE-Book.package/SBEBookNode.class/methodProperties.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/openLabel.in..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/openLabel.in..st index 5a3c3ae0..d6560525 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/openLabel.in..st +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/openLabel.in..st @@ -13,4 +13,4 @@ openLabel: key in: aHelpBrowser index := topic contents runs findFirst: [:attrs | attrs anySatisfy: [:attr | (attr isKindOf: SBETextLabelAnchor) and: [attr label = key]]]. - (aHelpBrowser anyTextPaneWithSelector: #topicContents) selectionInterval: (index to: index - 1). \ No newline at end of file + (aHelpBrowser anyTextPaneWithSelector: #topicContents) setSelection: (index to: index - 1). \ 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 index 2df9b991..a4d1d7be 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json @@ -23,7 +23,7 @@ "isHelpLeaf" : "ct 11/9/2023 22:41", "labels" : "ct 11/13/2023 21:28", "mayContain:" : "ct 11/8/2023 22:38", - "openLabel:in:" : "ct 11/21/2023 13:57", + "openLabel:in:" : "ct 11/21/2023 20:56", "parent" : "ct 11/15/2023 19:51", "parent:" : "ct 11/15/2023 19:51", "pathToLabel:" : "ct 11/13/2023 20:37", From eeb02e1fc18d6380e5480379c07732ac45fb35a0 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Tue, 21 Nov 2023 21:08:57 +0100 Subject: [PATCH 08/35] fix extension method prefix --- .../{semanticAllAttributes.st => sbeAllAttributes.st} | 2 +- .../SBE-Book.package/Text.extension/methodProperties.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename SmalltalkSources/SBE-Book.package/Text.extension/instance/{semanticAllAttributes.st => sbeAllAttributes.st} (89%) diff --git a/SmalltalkSources/SBE-Book.package/Text.extension/instance/semanticAllAttributes.st b/SmalltalkSources/SBE-Book.package/Text.extension/instance/sbeAllAttributes.st similarity index 89% rename from SmalltalkSources/SBE-Book.package/Text.extension/instance/semanticAllAttributes.st rename to SmalltalkSources/SBE-Book.package/Text.extension/instance/sbeAllAttributes.st index b146a86e..96f950b5 100644 --- a/SmalltalkSources/SBE-Book.package/Text.extension/instance/semanticAllAttributes.st +++ b/SmalltalkSources/SBE-Book.package/Text.extension/instance/sbeAllAttributes.st @@ -1,5 +1,5 @@ *SBE-Book-emphasis -semanticAllAttributes +sbeAllAttributes self flag: #moveUpstream. ^ OrderedCollection streamContents: [:stream | diff --git a/SmalltalkSources/SBE-Book.package/Text.extension/methodProperties.json b/SmalltalkSources/SBE-Book.package/Text.extension/methodProperties.json index 9a86422c..a30b7ab5 100644 --- a/SmalltalkSources/SBE-Book.package/Text.extension/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/Text.extension/methodProperties.json @@ -2,5 +2,5 @@ "class" : { }, "instance" : { - "sbeStoreHtmlString" : "ct 11/20/2023 20:37", - "semanticAllAttributes" : "ct 8/18/2023 00:07" } } + "sbeAllAttributes" : "ct 11/21/2023 13:56", + "sbeStoreHtmlString" : "ct 11/20/2023 20:37" } } From 0d72c8b6c8f4594c4c47b5cc276cf277c838ab12 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Tue, 21 Nov 2023 21:09:30 +0100 Subject: [PATCH 09/35] fix inline clickable images --- .../SBEBookExtractor.class/instance/emitImage..st | 6 ++---- .../SBEBookExtractor.class/methodProperties.json | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st index 0c6973e1..6e338420 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitImage..st @@ -2,10 +2,8 @@ emitting emitImage: aForm | extent | - extent := figure - ifNotNil: [(aForm extent / self imageScaleFactor) roundTo: 8] - ifNil: [#inline]. + extent := (aForm extent / self imageScaleFactor) roundTo: 8. self stream withAttribute: (SBETextOpenImageAction for: aForm initialExtent: extent) do: - [self emitImage: aForm extent: extent]. \ No newline at end of file + [self emitImage: aForm extent: (figure ifNil: [#inline] ifNotNil: [extent])]. \ 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 index 355f2b0a..cec42628 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json @@ -34,7 +34,7 @@ "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 18:47", + "emitImage:" : "ct 11/21/2023 21:00", "emitImportantDuring:" : "ct 11/12/2023 19:44", "emitItemLabel:" : "ct 11/15/2023 19:26", "emitLabel:" : "ct 11/15/2023 18:37", From 6aa4d21abfab5e4e3ca53e52511f4edd49ace9f9 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Tue, 21 Nov 2023 21:10:10 +0100 Subject: [PATCH 10/35] handle math mode --- .../instance/visitInlineFormula..st | 9 +++++++++ .../SBELatexBookExtractor.class/methodProperties.json | 1 + 2 files changed, 10 insertions(+) create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitInlineFormula..st diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitInlineFormula..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitInlineFormula..st new file mode 100644 index 00000000..7686e566 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitInlineFormula..st @@ -0,0 +1,9 @@ +visiting - nodes +visitInlineFormula: node + + self assert: node children size > 2. + self assert: node children first contents = '$'. + self assert: node children last contents = '$'. + + node children from: 2 to: node children size - 1 do: [:ea | + self visit: ea]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json index fe0c8c85..95262a31 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json @@ -118,6 +118,7 @@ "visitGenericCommand:" : "ct 11/15/2023 18:17", "visitGenericEnvironment:" : "ct 11/21/2023 14:19", "visitGraphicsInclude:" : "ct 11/8/2023 14:10", + "visitInlineFormula:" : "ct 11/8/2023 19:59", "visitLabelDefinition:" : "ct 11/12/2023 21:17", "visitLabelReference:" : "ct 11/12/2023 21:18", "visitLatexInclude:" : "ct 10/19/2023 13:42", From e1842b6684aea89b541222ff28686600a4d22517 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Tue, 21 Nov 2023 21:20:40 +0100 Subject: [PATCH 11/35] book: add compatibility patches for squeak60 --- .squot | 3 +- .../BaselineOfSBE.class/instance/baseline..st | 7 +++- .../instance/customProjectAttributes.st | 12 ++++++ .../BaselineOfSBE.class/methodProperties.json | 3 +- .../.filetree | 4 ++ .../.squot-contents | 6 +++ .../instance/getImage..st | 38 +++++++++++++++++++ .../instance/hasTag.name..st | 7 ++++ .../instance/htmlEscape..st | 9 +++++ .../instance/htmlEscapeNumber..st | 9 +++++ .../instance/htmlEscapes..st | 11 ++++++ .../instance/searchTag.forAttribute..st | 20 ++++++++++ .../methodProperties.json | 10 +++++ .../properties.json | 2 + .../instance/sbeBeginsWith.caseSensitive..st | 12 ++++++ .../instance/sbeEndsWith.caseSensitive..st | 13 +++++++ .../String.extension/methodProperties.json | 6 +++ .../String.extension/properties.json | 2 + .../Text.extension/instance/findString..st | 4 ++ .../Text.extension/methodProperties.json | 5 +++ .../Text.extension/properties.json | 2 + .../monticello.meta/categories.st | 1 + .../monticello.meta/initializers.st | 0 .../properties.json | 2 + 24 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/customProjectAttributes.st create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/.filetree create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/.squot-contents create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/getImage..st create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/hasTag.name..st create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/htmlEscape..st create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/htmlEscapeNumber..st create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/htmlEscapes..st create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/searchTag.forAttribute..st create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/properties.json create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/instance/sbeBeginsWith.caseSensitive..st create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/instance/sbeEndsWith.caseSensitive..st create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/String.extension/properties.json create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/Text.extension/instance/findString..st create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/Text.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/Text.extension/properties.json create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/monticello.meta/categories.st create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/monticello.meta/initializers.st create mode 100644 SmalltalkSources/SBE-BookCompatibility-Squeak60.package/properties.json diff --git a/.squot b/.squot index 78717cb5..6086a2a0 100644 --- a/.squot +++ b/.squot @@ -10,5 +10,6 @@ OrderedDictionary { 'SmalltalkSources/SBE-Monticello.package' : #SquotCypressCodeSerializer, 'SmalltalkSources/SBE-Tests.package' : #SquotCypressCodeSerializer, 'SmalltalkSources/SBE-Book.package' : #SquotCypressCodeSerializer, - 'SmalltalkSources/SBE-ExtractBook.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 03d78332..be1a3019 100644 --- a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/baseline..st +++ b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/instance/baseline..st @@ -30,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/methodProperties.json b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json index 19eef0cb..30c149b7 100644 --- a/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json +++ b/SmalltalkSources/BaselineOfSBE.package/BaselineOfSBE.class/methodProperties.json @@ -2,5 +2,6 @@ "class" : { }, "instance" : { - "baseline:" : "ct 11/21/2023 17:10", + "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-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..f357c739 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/getImage..st @@ -0,0 +1,38 @@ +*SBE-BookCompatibility-Squeak60-private +getImage: uri + + (uri beginsWith: 'cid:' caseSensitive: false) ifTrue: [ + "Content-ID, used in nested MIMEDocuments, e.g., for emails with inline images" + (Smalltalk classNamed: #MIMEContentRequest) ifNotNil: [:class | + | cid | + cid := uri allButFirst: 4. + (class signal: cid) ifNotNil: [:document | + ^ [document image] ifError: [nil]]]. + ^ nil]. + + (uri beginsWith: '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 beginsWith: '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 endsWith: ';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..cc9754dc --- /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 beginsWith: 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..f6f70795 --- /dev/null +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/methodProperties.json @@ -0,0 +1,10 @@ +{ + "class" : { + }, + "instance" : { + "getImage:" : "ct 5/20/2023 18:10", + "hasTag:name:" : "ct 5/20/2023 14:20", + "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 @@ +{ + } From d1547e3ad35502f5c3ac92668488409d6e9c1cf7 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Tue, 21 Nov 2023 21:53:18 +0100 Subject: [PATCH 12/35] fix use of compatibility methods --- .../instance/getImage..st | 15 +++------------ .../instance/hasTag.name..st | 2 +- .../methodProperties.json | 4 ++-- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/getImage..st b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/getImage..st index f357c739..c40bdfd4 100644 --- a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/getImage..st +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/getImage..st @@ -1,16 +1,7 @@ *SBE-BookCompatibility-Squeak60-private getImage: uri - (uri beginsWith: 'cid:' caseSensitive: false) ifTrue: [ - "Content-ID, used in nested MIMEDocuments, e.g., for emails with inline images" - (Smalltalk classNamed: #MIMEContentRequest) ifNotNil: [:class | - | cid | - cid := uri allButFirst: 4. - (class signal: cid) ifNotNil: [:document | - ^ [document image] ifError: [nil]]]. - ^ nil]. - - (uri beginsWith: 'code://' caseSensitive: false) ifTrue: [ + (uri sbeBeginsWith: 'code://' caseSensitive: false) ifTrue: [ | expression | "Same support for Smalltalk expressions as in TextURL >> #actOnClickFor:." self shallEvaluateResources ifFalse: [^ nil]. @@ -18,11 +9,11 @@ getImage: uri ^ ([Compiler evaluate: expression] ifError: [nil]) ifNotNil: [:object | object isForm ifTrue: [object] ifFalse: [nil]]]. - (uri beginsWith: 'data:' caseSensitive: false) ifTrue: [ | data mediaType separator | + (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 endsWith: ';base64' caseSensitive: false) + data := (mediaType sbeEndsWith: ';base64' caseSensitive: false) ifTrue: [ mediaType := mediaType allButLast: 7. [Base64MimeConverter mimeDecodeToBytes: data readStream] ifError: [nil]] 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 index cc9754dc..ea5de5b0 100644 --- a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/hasTag.name..st +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/instance/hasTag.name..st @@ -2,6 +2,6 @@ hasTag: aTag name: tagNameLt | after | - (aTag beginsWith: tagNameLt caseSensitive: false) ifFalse: [^ false]. + (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/methodProperties.json b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/methodProperties.json index f6f70795..3dda9806 100644 --- a/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/methodProperties.json +++ b/SmalltalkSources/SBE-BookCompatibility-Squeak60.package/SBEHtmlReadWriter.extension/methodProperties.json @@ -2,8 +2,8 @@ "class" : { }, "instance" : { - "getImage:" : "ct 5/20/2023 18:10", - "hasTag:name:" : "ct 5/20/2023 14:20", + "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", From 38c902463d42a7e1cdaee47fb838fbd64734a2d1 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sat, 25 Nov 2023 17:15:45 +0100 Subject: [PATCH 13/35] fix handling of \SQUEAKVERSION and \SqVersionSwitch --- .../instance/commandCompareStringsDo..st | 13 +++++++++++++ .../instance/copyForContents.st | 6 ++++++ .../instance/preprocessedContentsFromFile..st | 6 +++++- .../instance/squeakVersion..st | 4 ++++ .../methodProperties.json | 5 ++++- .../instance/commandEqual..st | 8 ++++---- .../instance/commandParskip..st | 17 ++++++++++++++--- .../instance/contentsIn..st | 6 +----- .../instance/copyForContents.st | 10 ++++++++++ .../instance/visitPlaceholder..st | 6 ++++-- .../methodProperties.json | 9 +++++---- 11 files changed, 70 insertions(+), 20 deletions(-) create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandCompareStringsDo..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/copyForContents.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/squeakVersion..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/copyForContents.st 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/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/preprocessedContentsFromFile..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/preprocessedContentsFromFile..st index 041b8563..26602b50 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/preprocessedContentsFromFile..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/preprocessedContentsFromFile..st @@ -1,9 +1,13 @@ private preprocessedContentsFromFile: aFSReference - | contents | + | 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: ''. 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/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json index cec42628..3daf4b69 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json @@ -6,6 +6,7 @@ "basicVisitText:" : "ct 11/21/2023 14:27", "book" : "ct 11/8/2023 23:05", "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", @@ -23,6 +24,7 @@ "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", @@ -51,8 +53,9 @@ "initialize" : "ct 11/21/2023 14:24", "monticelloIPAImage" : "ct 11/8/2023 20:16", "nameForKey:" : "ct 11/14/2023 22:13", - "preprocessedContentsFromFile:" : "ct 11/21/2023 14:24", + "preprocessedContentsFromFile:" : "ct 11/24/2023 19:33", "squeakVersion" : "ct 11/8/2023 17:45", + "squeakVersion:" : "ct 11/24/2023 18:53", "squeakVersionString" : "ct 11/8/2023 17:46", "visitCaption:" : "ct 11/15/2023 21:50", "visitChapter:" : "ct 11/12/2023 19:50", diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandEqual..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandEqual..st index fe363524..211882a4 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandEqual..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandEqual..st @@ -2,10 +2,10 @@ visiting - commands - macros commandEqual: arguments + | first second | self assert: arguments size = 2. - self - visit: arguments first; - visit: arguments second. + first := self contentsIn: arguments first. + second := self contentsIn: arguments second. - ifstack push: ifstack pop = ifstack pop. \ No newline at end of file + ifstack push: first = second. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandParskip..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandParskip..st index c48b242f..4ea636d2 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandParskip..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandParskip..st @@ -5,9 +5,20 @@ commandParskip: arguments self assert: arguments isEmpty. parseStack push: (Generator on: [:gen | + | nodes | self assert: gen next isNil. "whyever" - [gen peek sbeType isNil and: [gen peek contents isAllSeparators]] whileTrue: - [gen next]. + nodes := Generator on: [:nodeStream | + nodeStream + nextPut: gen next; + nextPutAll: gen next children]. - self assert: gen peek notNil "ignore"]). \ No newline at end of file + [nodes peek sbeType isNil and: [nodes peek contents isAllSeparators]] whileTrue: + [nodes next]. + + self assert: nodes next type = #word "ignore". + + nodes := nodes upToEnd. + parseStack pop. + nodes do: [:ea | self visit: ea]. + gen next]). \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsIn..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsIn..st index 9bc80c56..a52ca706 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsIn..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/contentsIn..st @@ -2,11 +2,7 @@ private contentsIn: node | extractor | - extractor := self class new. - extractor - rootFile: rootFile; - setCommandHandlers: commandHandlers - environmentHandlers: environmentHandlers. + extractor := self copyForContents. "yeah ... in theory we would have to copy way more here ..." extractor withCommandArguments: commandArguments do: [extractor visit: node]. diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/copyForContents.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/copyForContents.st new file mode 100644 index 00000000..adbce266 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/copyForContents.st @@ -0,0 +1,10 @@ +private +copyForContents + + | copy | + copy := self class new. + copy + rootFile: rootFile; + setCommandHandlers: commandHandlers + environmentHandlers: environmentHandlers. + ^ copy \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPlaceholder..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPlaceholder..st index 23a83d14..2a00deb0 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPlaceholder..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitPlaceholder..st @@ -10,8 +10,10 @@ visitPlaceholder: node [self notify: 'access to parameter outside of command'. ^ self basicVisitText: ref]. valueAndHereArgs := commandArguments at: index ifAbsent: - [self notify: 'illegal parameter number'. - ^ self basicVisitText: ref allButFirst]. + ["self notify: 'illegal parameter number'. + ^ self basicVisitText: ref allButFirst" + self flag: #todo. "assert that index <= argc" + ^ self]. value := valueAndHereArgs first. hereArgs := valueAndHereArgs second. ^ self withCommandArguments: hereArgs do: diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json index 95262a31..ee930bb6 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json @@ -19,7 +19,7 @@ "commandDeclareGraphicsExtensions:" : "ct 11/8/2023 11:01", "commandDeclareRobustCommand:" : "ct 11/8/2023 19:12", "commandDef:" : "ct 11/8/2023 22:55", - "commandEqual:" : "ct 11/8/2023 19:05", + "commandEqual:" : "ct 11/25/2023 16:25", "commandExcludeComment:" : "ct 11/8/2023 22:58", "commandGraphicsPath:" : "ct 11/8/2023 14:44", "commandHandlerFor:" : "ct 11/8/2023 22:56", @@ -38,7 +38,7 @@ "commandNewEnvironment:" : "ct 11/21/2023 14:40", "commandNewTheorem:" : "ct 11/8/2023 22:58", "commandParBox:" : "ct 11/8/2023 12:35", - "commandParskip:" : "ct 11/8/2023 12:11", + "commandParskip:" : "ct 11/25/2023 16:33", "commandPdfMinorVersion:" : "ct 11/8/2023 19:16", "commandProvidesPackage:" : "ct 10/20/2023 01:17", "commandRaiseBox:" : "ct 11/8/2023 12:56", @@ -50,13 +50,14 @@ "commandTimes:" : "ct 11/8/2023 18:46", "commandToday:" : "ct 11/8/2023 17:39", "contents" : "ct 11/9/2023 21:19", - "contentsIn:" : "ct 11/9/2023 23:17", + "contentsIn:" : "ct 11/25/2023 16:27", "contentsInGroup:" : "ct 11/8/2023 15:11", "contentsInGroup:brackets:" : "ct 11/8/2023 15:14", "contentsInGroup:brackets:optional:" : "ct 11/8/2023 15:12", "contentsInGroup:full:brackets:optional:" : "ct 11/8/2023 15:12", "contentsInGroup:full:optionalBrackets:" : "ct 11/8/2023 15:16", "contentsInGroup:optionalBrackets:" : "ct 11/8/2023 15:11", + "copyForContents" : "ct 11/25/2023 16:28", "emitImage:" : "ct 11/21/2023 18:47", "emitImage:dyeMode:" : "ct 11/21/2023 18:46", "emitImage:extent:" : "ct 11/21/2023 18:47", @@ -127,6 +128,6 @@ "visitNewCommandDefinition:" : "ct 10/19/2023 13:01", "visitPackageInclude:" : "ct 11/8/2023 14:15", "visitPath:" : "ct 11/8/2023 14:42", - "visitPlaceholder:" : "ct 10/21/2023 21:45", + "visitPlaceholder:" : "ct 11/25/2023 16:40", "visitTheoremDefinition:" : "ct 11/8/2023 12:09", "withCommandArguments:do:" : "ct 10/20/2023 00:31" } } From 0784c92add51883dc0fea411398abb6d8c3c4ef0 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sat, 25 Nov 2023 17:16:40 +0100 Subject: [PATCH 14/35] improve parsing of math --- .../SBEBookExtractor.class/instance/commandLambda..st | 6 ++++++ .../SBEBookExtractor.class/instance/visitInlineFormula..st | 7 +++++++ .../SBEBookExtractor.class/methodProperties.json | 2 ++ .../SBELatexBookExtractor.class/instance/commandLangle..st | 6 ++++++ .../SBELatexBookExtractor.class/instance/commandRangle..st | 6 ++++++ .../instance/visitInlineFormula..st | 2 ++ .../SBELatexBookExtractor.class/methodProperties.json | 4 +++- 7 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLambda..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitInlineFormula..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLangle..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRangle..st 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..09c70c25 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLambda..st @@ -0,0 +1,6 @@ +as yet unclassified +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/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/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json index 3daf4b69..00089928 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json @@ -13,6 +13,7 @@ "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", @@ -59,6 +60,7 @@ "squeakVersionString" : "ct 11/8/2023 17:46", "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", diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLangle..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLangle..st new file mode 100644 index 00000000..b0be188e --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLangle..st @@ -0,0 +1,6 @@ +visiting - commands - characters and spacing +commandLangle: arguments + + + self assert: arguments isEmpty. + self basicVisitText: '<'. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRangle..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRangle..st new file mode 100644 index 00000000..e86165ac --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandRangle..st @@ -0,0 +1,6 @@ +visiting - commands - characters and spacing +commandRangle: arguments + + + self assert: arguments isEmpty. + self basicVisitText: '>'. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitInlineFormula..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitInlineFormula..st index 7686e566..4a700b69 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitInlineFormula..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/visitInlineFormula..st @@ -1,6 +1,8 @@ visiting - nodes visitInlineFormula: node + verbatim ifTrue: [^ self basicVisitAny: node]. + self assert: node children size > 2. self assert: node children first contents = '$'. self assert: node children last contents = '$'. diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json index ee930bb6..ec4716ae 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json @@ -30,6 +30,7 @@ "commandInput:" : "ct 10/20/2023 00:56", "commandItem:" : "ct 11/21/2023 14:10", "commandLabel:" : "ct 11/12/2023 21:39", + "commandLangle:" : "ct 11/25/2023 16:59", "commandLdots:" : "ct 11/8/2023 20:00", "commandLet:" : "ct 10/19/2023 15:16", "commandLineBreak:" : "ct 11/9/2023 21:19", @@ -42,6 +43,7 @@ "commandPdfMinorVersion:" : "ct 11/8/2023 19:16", "commandProvidesPackage:" : "ct 10/20/2023 01:17", "commandRaiseBox:" : "ct 11/8/2023 12:56", + "commandRangle:" : "ct 11/25/2023 16:59", "commandRef:" : "ct 11/12/2023 21:19", "commandRenewCommand:" : "ct 11/8/2023 22:57", "commandSetBoolean:" : "ct 11/8/2023 19:22", @@ -119,7 +121,7 @@ "visitGenericCommand:" : "ct 11/15/2023 18:17", "visitGenericEnvironment:" : "ct 11/21/2023 14:19", "visitGraphicsInclude:" : "ct 11/8/2023 14:10", - "visitInlineFormula:" : "ct 11/8/2023 19:59", + "visitInlineFormula:" : "ct 11/25/2023 16:52", "visitLabelDefinition:" : "ct 11/12/2023 21:17", "visitLabelReference:" : "ct 11/12/2023 21:18", "visitLatexInclude:" : "ct 10/19/2023 13:42", From 6ff042727e0125fdc8ff90eb05f786b7b6ec09dc Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sat, 25 Nov 2023 17:43:32 +0100 Subject: [PATCH 15/35] fix linebreaks after \\ --- .../instance/basicVisitLineBreak..st | 3 +++ .../SBELatexBookExtractor.class/instance/commandLineBreak..st | 4 +++- .../SBELatexBookExtractor.class/methodProperties.json | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitLineBreak..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitLineBreak..st index 4ebafb66..fbf10456 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitLineBreak..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/basicVisitLineBreak..st @@ -3,6 +3,9 @@ basicVisitLineBreak: lineBreak verbatim ifTrue: [^ self stream cr]. + previousLineBreaks ifNil: + [previousLineBreaks := 1. + ^ self]. previousLineBreaks = 0 ifTrue: [self stream space] ifFalse: diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLineBreak..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLineBreak..st index e6fb60fd..6af0ea4d 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLineBreak..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandLineBreak..st @@ -14,9 +14,11 @@ commandLineBreak: arguments unit := gen next. self assert: gen peek contents = ']'. - self stream cr] + self stream cr. + previousLineBreaks := nil] ifFalse: [self stream cr. + previousLineBreaks := nil. #back. parseStack pop. diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json index ec4716ae..5415086e 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json @@ -9,7 +9,7 @@ "basicVisitAny:" : "ct 10/19/2023 11:40", "basicVisitForParsing:" : "ct 11/21/2023 14:16", "basicVisitGraphicsFile:" : "ct 11/21/2023 19:33", - "basicVisitLineBreak:" : "ct 11/14/2023 23:43", + "basicVisitLineBreak:" : "ct 11/25/2023 17:38", "basicVisitRoot:" : "ct 11/21/2023 14:19", "basicVisitText:" : "ct 11/21/2023 14:19", "buildDate" : "ct 11/8/2023 17:39", @@ -33,7 +33,7 @@ "commandLangle:" : "ct 11/25/2023 16:59", "commandLdots:" : "ct 11/8/2023 20:00", "commandLet:" : "ct 10/19/2023 15:16", - "commandLineBreak:" : "ct 11/9/2023 21:19", + "commandLineBreak:" : "ct 11/25/2023 17:37", "commandNewBoolean:" : "ct 11/8/2023 19:19", "commandNewCommand:" : "ct 11/8/2023 22:59", "commandNewEnvironment:" : "ct 11/21/2023 14:40", From d2b7fc7c4bbe9a975663198d77ad4c34aef7f982 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sat, 25 Nov 2023 17:49:18 +0100 Subject: [PATCH 16/35] parse \~ correctly --- .../SBELatexBookExtractor.class/instance/commandTilde..st | 6 ++++++ .../SBELatexBookExtractor.class/methodProperties.json | 1 + 2 files changed, 7 insertions(+) create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTilde..st diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTilde..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTilde..st new file mode 100644 index 00000000..6f19a72f --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTilde..st @@ -0,0 +1,6 @@ +visiting - commands - characters and spacing +commandTilde: arguments + + + self assert: arguments isEmpty. + self stream nextPut: $~. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json index 5415086e..30bd17d1 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json @@ -49,6 +49,7 @@ "commandSetBoolean:" : "ct 11/8/2023 19:22", "commandSetCounter:" : "ct 11/8/2023 22:52", "commandSpace:" : "ct 11/8/2023 20:00", + "commandTilde:" : "ct 11/25/2023 17:48", "commandTimes:" : "ct 11/8/2023 18:46", "commandToday:" : "ct 11/8/2023 17:39", "contents" : "ct 11/9/2023 21:19", From eae9b2e9c3a90d4fa497cf49ba238f27a01ca81d Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sat, 25 Nov 2023 20:23:23 +0100 Subject: [PATCH 17/35] add pdf urls --- .../SBEBook.class/instance/index..st | 4 +++ .../SBEBook.class/instance/index.st | 4 +++ .../SBEBook.class/instance/pdfUrl..st | 4 +++ .../SBEBook.class/instance/pdfUrl.st | 4 +++ .../SBEBook.class/instance/pdfUrlFragment.st | 4 +++ .../SBEBook.class/instance/type.st | 4 +++ .../SBEBook.class/methodProperties.json | 8 ++++- .../SBEBook.class/properties.json | 2 +- .../instance/pdfUrlFragment.st | 5 ++++ .../SBEBookChapter.class/instance/type.st | 4 +++ .../methodProperties.json | 4 ++- .../instance/openInPDF.st | 4 +++ .../instance/topicMenu.parentTopic..st | 7 +++++ .../methodProperties.json | 4 ++- .../instance/hasAnyStarIndex.st | 5 ++++ .../instance/hasStarIndex..st | 4 +++ .../instance/hasStarIndex.st | 4 +++ .../SBEBookNode.class/instance/index..st | 4 +++ .../SBEBookNode.class/instance/index.st | 4 +++ .../SBEBookNode.class/instance/initialize.st | 3 +- .../SBEBookNode.class/instance/openInPDF.st | 9 ++++++ .../SBEBookNode.class/instance/parseNode..st | 5 ++++ .../SBEBookNode.class/instance/parseNode.st | 5 ++++ .../SBEBookNode.class/instance/pdfUrl.st | 6 ++++ .../instance/pdfUrlFragment.st | 4 +++ .../SBEBookNode.class/instance/type.st | 4 +++ .../SBEBookNode.class/instance/typeName..st | 4 +++ .../SBEBookNode.class/instance/typeName.st | 6 ++++ .../instance/updateStarIndexes.st | 8 +++++ .../SBEBookNode.class/methodProperties.json | 16 +++++++++- .../SBEBookNode.class/properties.json | 6 +++- .../instance/pdfUrlFragment.st | 4 +++ .../SBEBookParagraph.class/instance/type.st | 4 +++ .../methodProperties.json | 2 ++ .../instance/pdfUrlFragment.st | 5 ++++ .../SBEBookPart.class/instance/type.st | 4 +++ .../SBEBookPart.class/methodProperties.json | 4 ++- .../instance/pdfUrlFragment.st | 7 +++++ .../SBEBookSection.class/instance/type.st | 4 +++ .../methodProperties.json | 4 ++- .../instance/pdfUrlFragment.st | 5 ++++ .../SBEBookSubsection.class/instance/type.st | 4 +++ .../methodProperties.json | 2 ++ .../instance/sbePrintStringAlph.st | 5 ++++ .../Integer.extension/methodProperties.json | 5 ++++ .../Integer.extension/properties.json | 2 ++ .../instance/basicVisitRoot..st | 5 +++- .../instance/commandAppendix..st | 5 ++++ .../instance/commandTableOfContents..st | 7 +++++ .../instance/initialize.st | 3 +- .../instance/structureElementOrder.st | 4 +++ .../visitStructureElement.forBookNode..st | 30 ++++++++++++++++--- .../methodProperties.json | 9 ++++-- .../SBEBookExtractor.class/properties.json | 3 +- .../String.extension/instance/sbeFromAlph.st | 9 ++++++ .../String.extension/methodProperties.json | 5 ++++ .../String.extension/properties.json | 2 ++ 57 files changed, 283 insertions(+), 19 deletions(-) create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/instance/pdfUrl..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/instance/pdfUrl.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/instance/pdfUrlFragment.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/instance/type.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookChapter.class/instance/pdfUrlFragment.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookChapter.class/instance/type.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/openInPDF.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/instance/topicMenu.parentTopic..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/hasAnyStarIndex.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/hasStarIndex..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/hasStarIndex.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/index..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/index.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/openInPDF.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parseNode..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/parseNode.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/pdfUrl.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/pdfUrlFragment.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/type.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/typeName..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/typeName.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/updateStarIndexes.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/pdfUrlFragment.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/instance/type.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookPart.class/instance/pdfUrlFragment.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookPart.class/instance/type.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/pdfUrlFragment.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSection.class/instance/type.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/pdfUrlFragment.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/type.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/Integer.extension/instance/sbePrintStringAlph.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/Integer.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/Integer.extension/properties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandAppendix..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandTableOfContents..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/structureElementOrder.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/String.extension/instance/sbeFromAlph.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/String.extension/methodProperties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/String.extension/properties.json 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..0a2e3d3d --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index..st @@ -0,0 +1,4 @@ +accessing +index: anInteger + + self shouldNotImplement \ 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..4f7ab9aa --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index.st @@ -0,0 +1,4 @@ +accessing +index + + ^ self shouldNotImplement \ 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/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 index 59e94d22..b943b52a 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBook.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/methodProperties.json @@ -3,4 +3,10 @@ }, "instance" : { "canonicalHierarchyOrder" : "ct 11/8/2023 22:38", - "textForHelp" : "ct 11/15/2023 18:02" } } + "index" : "ct 11/24/2023 18:43", + "index:" : "ct 11/24/2023 18:43", + "pdfUrl" : "ct 11/24/2023 18:38", + "pdfUrl:" : "ct 11/24/2023 18:38", + "pdfUrlFragment" : "ct 11/24/2023 18:30", + "textForHelp" : "ct 11/15/2023 18:02", + "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 index 507005fc..8d22c217 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBook.class/properties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/properties.json @@ -6,7 +6,7 @@ ], "commentStamp" : "", "instvars" : [ - ], + "pdfUrl" ], "name" : "SBEBook", "pools" : [ ], 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 index 104e26c9..9a61cc9b 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBookChapter.class/methodProperties.json @@ -2,4 +2,6 @@ "class" : { }, "instance" : { - "canonicalHierarchyOrder" : "ct 11/8/2023 22:38" } } + "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/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/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 index 7874c261..e52859d5 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBookHelpTopic.class/methodProperties.json @@ -8,6 +8,8 @@ "contents" : "ct 11/9/2023 22:36", "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" } } + "title" : "ct 11/9/2023 21:47", + "topicMenu:parentTopic:" : "ct 11/24/2023 18:25" } } 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 index 8294b57c..bc34e04b 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/initialize.st +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/initialize.st @@ -4,4 +4,5 @@ initialize super initialize. self children: OrderedCollection new. - extraLabels := OrderedCollection new. \ No newline at end of file + extraLabels := OrderedCollection new. + hasStarIndex := false. \ 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/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/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/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/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json index a4d1d7be..f3142be3 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json @@ -18,15 +18,25 @@ "extraLabels:" : "ct 11/15/2023 20:15", "fullText" : "ct 11/20/2023 19:39", "fullTextForHelp" : "ct 11/20/2023 19:37", - "initialize" : "ct 11/13/2023 21:28", + "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", "openLabel:in:" : "ct 11/21/2023 20:56", "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/15/2023 20:16", "text" : "ct 11/9/2023 22:47", @@ -35,4 +45,8 @@ "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 index bd892b9d..b6a0c050 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/properties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/properties.json @@ -10,7 +10,11 @@ "parent", "children", "text", - "extraLabels" ], + "parseNode", + "index", + "hasStarIndex", + "extraLabels", + "typeName" ], "name" : "SBEBookNode", "pools" : [ ], 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/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/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/methodProperties.json index 9f9a28ad..5df4c831 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBookParagraph.class/methodProperties.json @@ -4,5 +4,7 @@ "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/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 index 104e26c9..9a61cc9b 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookPart.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBookPart.class/methodProperties.json @@ -2,4 +2,6 @@ "class" : { }, "instance" : { - "canonicalHierarchyOrder" : "ct 11/8/2023 22:38" } } + "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/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 index 527c8a0c..2236fd03 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookSection.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBookSection.class/methodProperties.json @@ -3,4 +3,6 @@ }, "instance" : { "canonicalHierarchyOrder" : "ct 11/8/2023 22:38", - "isHelpLeaf" : "ct 11/9/2023 22:42" } } + "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/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/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/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/methodProperties.json index 22cc5a30..c98d80d3 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/methodProperties.json @@ -7,6 +7,8 @@ "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/15/2023 19:57", "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-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/instance/basicVisitRoot..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitRoot..st index cee6bcfc..5cb06f4c 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitRoot..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/basicVisitRoot..st @@ -5,7 +5,10 @@ basicVisitRoot: node result := super basicVisitRoot: node. file = rootFile ifTrue: - [oldNode := nodeStack top. + [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 withBlanksTrimmed]]. 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/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/initialize.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/initialize.st index 9931df44..f23a5e34 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/initialize.st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/initialize.st @@ -9,4 +9,5 @@ initialize nodeStack := Stack new. nodeStack push: book. pendingLabels := OrderedCollection new. - self imageScaleFactor: self defaultImageScaleFactor. \ No newline at end of file + self imageScaleFactor: self defaultImageScaleFactor. + appendix := false. \ 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/visitStructureElement.forBookNode..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitStructureElement.forBookNode..st index b0ccf38a..127c7e6a 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitStructureElement.forBookNode..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitStructureElement.forBookNode..st @@ -1,12 +1,13 @@ visiting - nodes visitStructureElement: node forBookNode: bookNodeClass - | bookNode title oldNode | + | bookNode title oldNode incrementer | self assert: node children first sbeType isNil. title := self contentsIn: node children second. bookNode := bookNodeClass new. bookNode title: title. "bookNode labels: labels." + bookNode parseNode: node. oldNode := nodeStack top. self resolveRefs. @@ -16,13 +17,34 @@ visitStructureElement: node forBookNode: bookNodeClass pendingLabels ifNotEmpty: [oldNode addExtraLabels: pendingLabels copy. pendingLabels removeAll]. - + self resetStream. [nodeStack top mayContain: bookNode] whileFalse: [nodeStack pop]. - nodeStack push: - (nodeStack top addChild: bookNode). + nodeStack top + addChild: bookNode; + updateStarIndexes. + nodeStack push: bookNode. + self structureElementOrder + detect: [:type | + type = node type + ifFalse: + [counters at: type put: + ((appendix and: [type = #chapter]) + ifTrue: ['@'] + ifFalse: [0])]; + yourself]. + + incrementer := [:count | count + 1]. + (appendix and: [node sbeType = #chapter]) ifTrue: + [| oldIncrementer | + bookNode typeName: #appendix. + oldIncrementer := incrementer. + incrementer := [:count | (oldIncrementer value: count sbeFromAlph) sbePrintStringAlph]]. + bookNode index: + (counters at: node sbeType put: + (incrementer value: (counters at: node sbeType ifAbsent: [0]))). (node children allButFirst: 2) do: [:child | self visit: child]. diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json index 00089928..39f6c7a4 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json @@ -2,9 +2,10 @@ "class" : { "example" : "ct 11/21/2023 14:49" }, "instance" : { - "basicVisitRoot:" : "ct 11/21/2023 14:27", + "basicVisitRoot:" : "ct 11/24/2023 19:05", "basicVisitText:" : "ct 11/21/2023 14:27", "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", @@ -21,6 +22,7 @@ "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", @@ -51,19 +53,20 @@ "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/21/2023 14:24", + "initialize" : "ct 11/25/2023 19:31", "monticelloIPAImage" : "ct 11/8/2023 20:16", "nameForKey:" : "ct 11/14/2023 22:13", "preprocessedContentsFromFile:" : "ct 11/24/2023 19:33", "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/21/2023 14:28", + "visitStructureElement:forBookNode:" : "ct 11/25/2023 20:14", "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 index 8d79b0fe..dc9f7c80 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/properties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/properties.json @@ -11,7 +11,8 @@ "imageScaleFactor", "nodeStack", "pendingLabels", - "figure" ], + "figure", + "appendix" ], "name" : "SBEBookExtractor", "pools" : [ ], diff --git a/SmalltalkSources/SBE-ExtractBook.package/String.extension/instance/sbeFromAlph.st b/SmalltalkSources/SBE-ExtractBook.package/String.extension/instance/sbeFromAlph.st new file mode 100644 index 00000000..829b1863 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/String.extension/instance/sbeFromAlph.st @@ -0,0 +1,9 @@ +*SBE-ExtractBook-converting +sbeFromAlph + + | zeroChar | + self assert: self size = 1. + self first isLowercase ifTrue: [^ self asUppercase sbeFromAlph]. + zeroChar := Character value: $A asciiValue - 1. + self assert: (self first between: zeroChar and: $Z). + ^ self first asciiValue - $A asciiValue + 1 \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/String.extension/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/String.extension/methodProperties.json new file mode 100644 index 00000000..ac538618 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/String.extension/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "sbeFromAlph" : "ct 11/25/2023 20:15" } } diff --git a/SmalltalkSources/SBE-ExtractBook.package/String.extension/properties.json b/SmalltalkSources/SBE-ExtractBook.package/String.extension/properties.json new file mode 100644 index 00000000..c2138507 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/String.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "String" } From 6de5db4393cb7eb986e4078841054746922cee4e Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sat, 25 Nov 2023 20:24:49 +0100 Subject: [PATCH 18/35] update extractor example with squeakVersion and pdfUrl --- .../SBEBookExtractor.class/class/example.st | 2 ++ .../SBEBookExtractor.class/methodProperties.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/class/example.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/class/example.st index cc21d4bd..1ae4c2ab 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/class/example.st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/class/example.st @@ -5,7 +5,9 @@ example 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/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json index 39f6c7a4..13d12af5 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json @@ -1,6 +1,6 @@ { "class" : { - "example" : "ct 11/21/2023 14:49" }, + "example" : "ct 11/25/2023 20:23" }, "instance" : { "basicVisitRoot:" : "ct 11/24/2023 19:05", "basicVisitText:" : "ct 11/21/2023 14:27", From b1c98ee55c635a95dbc769e5e6a4afd5c3f8d319 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sat, 25 Nov 2023 21:36:19 +0100 Subject: [PATCH 19/35] update and extend SBEHelp prosa --- .../SBEHelp.class/class/introduction.st | 4 ++-- .../SBEHelp.class/class/pages.st | 2 +- .../SBEHelp.class/class/preface.st | 21 +++++++++++++++++++ .../SBEHelp.class/methodProperties.json | 5 +++-- 4 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 SmalltalkSources/SBE-Book.package/SBEHelp.class/class/preface.st diff --git a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/introduction.st b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/introduction.st index 018feeb6..c2987fae 100644 --- a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/introduction.st +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/introduction.st @@ -12,10 +12,10 @@ Squeak by Example is a book, intended for both students and developers, that wil About this version of the book -Squeak by Example is a classical 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 this parser is meant to be an approximation only and we didn''t get every space right to save our own sanity. Nevertheless, if you''ve got any questions or feedback, we''re there at our GitHub repo: https://github.com/hpi-swa-lab/SqueakByExample-english +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 53 3 1 5 151 11 1 11 1 11 7 13 399 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) +]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 index cd11088b..ef6df9a4 100644 --- a/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/pages.st +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/pages.st @@ -1,4 +1,4 @@ accessing pages - ^ #("introduction" "<- enable for edits" theBook) \ No newline at end of file + ^ #("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..91249ebe --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/class/preface.st @@ -0,0 +1,21 @@ +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, 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 in the great darkness outside of Squeak.! +]style[(21 229 22 173 5 15 12 53 5 44 5 4 5 16 5 4 8 42 13 409 16 385)b,,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/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEHelp.class/methodProperties.json index e0d1f5be..427099f5 100644 --- a/SmalltalkSources/SBE-Book.package/SBEHelp.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEHelp.class/methodProperties.json @@ -5,8 +5,9 @@ "bookBlurb" : "ct 11/15/2023 17:39", "bookName" : "ct 11/15/2023 17:30", "icon" : "ct 11/15/2023 21:37", - "introduction" : "ct 11/15/2023 18:03", - "pages" : "ct 11/21/2023 13:58", + "introduction" : "ct 11/25/2023 21:11", + "pages" : "ct 11/25/2023 21:11", + "preface" : "ct 11/25/2023 21:28", "squeakBalloonIcon" : "ct 11/15/2023 17:33", "theBook" : "ct 11/15/2023 17:37" }, "instance" : { From c3ddb214160f85502a95316176dccf0be88f2aa4 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sat, 25 Nov 2023 21:47:01 +0100 Subject: [PATCH 20/35] ci: upload generated figures as artifact --- .github/workflows/build.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 84afb503..62c417dc 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: | From efce7edb44c3a8ae8b850aa687c52c3f1c7b8e51 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sat, 25 Nov 2023 21:49:18 +0100 Subject: [PATCH 21/35] fix ci slip --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 62c417dc..423110cf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -146,7 +146,7 @@ jobs: uses: actions/upload-artifact@master with: name: figures-${{ matrix.smalltalk }} - path: */**/*.png + path: ./*/**/*.png - if: (steps.figures.outcome == 'failure') name: Check DEBUG_FIGURES run: | From f543db65e7a91c25167c424f3caf4f16e9a6ffdf Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sat, 25 Nov 2023 23:25:29 +0100 Subject: [PATCH 22/35] update serialization --- .../SBE-Book.package/SBEBook.class/instance/index..st | 2 +- .../SBE-Book.package/SBEBook.class/instance/index.st | 2 +- .../SBEBook.class/instance/storeOn..st | 9 +++++++++ .../SBEBook.class/methodProperties.json | 5 +++-- .../SBEBookNode.class/instance/storeOn..st | 10 ++++++++-- .../SBEBookNode.class/methodProperties.json | 2 +- .../SBEBookSubsection.class/instance/storeOn..st | 2 +- .../SBEBookSubsection.class/methodProperties.json | 2 +- 8 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/instance/storeOn..st diff --git a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index..st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index..st index 0a2e3d3d..bebd1a17 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index..st +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index..st @@ -1,4 +1,4 @@ accessing index: anInteger - self shouldNotImplement \ No newline at end of file + 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 index 4f7ab9aa..c9e74cd3 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index.st +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/index.st @@ -1,4 +1,4 @@ accessing index - ^ self shouldNotImplement \ No newline at end of file + ^ 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..b137afa4 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/storeOn..st @@ -0,0 +1,9 @@ +converting +storeOn: aStream + + aStream nextPutAll: +('({1} + pdfUrl: {2}; + yourself)' format: + {String streamContents: [:stream | super storeOn: stream]. + self pdfUrl storeString}) \ 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 index b943b52a..df70d375 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBook.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/methodProperties.json @@ -3,10 +3,11 @@ }, "instance" : { "canonicalHierarchyOrder" : "ct 11/8/2023 22:38", - "index" : "ct 11/24/2023 18:43", - "index:" : "ct 11/24/2023 18:43", + "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/25/2023 23:01", "textForHelp" : "ct 11/15/2023 18:02", "type" : "ct 11/25/2023 19:50" } } diff --git a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/storeOn..st b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/storeOn..st index a3a705e0..e12b007b 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/storeOn..st +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/instance/storeOn..st @@ -6,10 +6,16 @@ storeOn: aStream title: {2}; addChildren: {3}; text: {4}; - extraLabels: {5}; + index: {5}; + hasStarIndex: {6}; + extraLabels: {7}; + typeName: {8}; yourself)' format: {self class name. self title sbeStoreHtmlString. self children storeString. self text sbeStoreHtmlString. - self extraLabels storeString}) \ No newline at end of file + 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/methodProperties.json b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json index f3142be3..2f4c2df5 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBookNode.class/methodProperties.json @@ -38,7 +38,7 @@ "pdfUrl" : "ct 11/25/2023 19:11", "pdfUrlFragment" : "ct 11/24/2023 18:30", "printOn:" : "ct 11/8/2023 22:46", - "storeOn:" : "ct 11/15/2023 20:16", + "storeOn:" : "ct 11/25/2023 23:00", "text" : "ct 11/9/2023 22:47", "text:" : "ct 11/9/2023 22:47", "textForHelp" : "ct 11/9/2023 23:05", diff --git a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/storeOn..st b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/storeOn..st index dbac5c65..c44e612d 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/storeOn..st +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/instance/storeOn..st @@ -6,4 +6,4 @@ storeOn: aStream level: {2}; yourself)' format: {String streamContents: [:stream | super storeOn: stream]. - self level}) \ No newline at end of file + self level storeString}) \ 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 index c98d80d3..852f687d 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBookSubsection.class/methodProperties.json @@ -8,7 +8,7 @@ "level" : "ct 11/9/2023 21:11", "level:" : "ct 11/9/2023 21:12", "pdfUrlFragment" : "ct 11/25/2023 19:52", - "storeOn:" : "ct 11/15/2023 19:57", + "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" } } From a424ed7a1901e57944a94e2fb12b9d0f765b04e3 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sun, 26 Nov 2023 20:40:57 +0100 Subject: [PATCH 23/35] handle further character commands --- .../SBEBookExtractor.class/instance/commandLambda..st | 2 +- .../SBELatexBookExtractor.class/instance/commandHash..st | 6 ++++++ .../instance/commandTextAsciiCircum..st | 6 ++++++ .../instance/commandTextDollar..st | 8 ++++++++ .../instance/commandTextQuoteSingle..st | 8 ++++++++ .../SBELatexBookExtractor.class/instance/commandVert..st | 6 ++++++ .../SBELatexBookExtractor.class/methodProperties.json | 5 +++++ 7 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandHash..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTextAsciiCircum..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTextDollar..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTextQuoteSingle..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandVert..st diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLambda..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLambda..st index 09c70c25..1795dfe5 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLambda..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/commandLambda..st @@ -1,4 +1,4 @@ -as yet unclassified +visiting - commands - characters and spacing commandLambda: arguments 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/commandTextAsciiCircum..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTextAsciiCircum..st new file mode 100644 index 00000000..dc549674 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTextAsciiCircum..st @@ -0,0 +1,6 @@ +visiting - commands - characters and spacing +commandTextAsciiCircum: arguments + + + self assert: arguments isEmpty. + self stream nextPut: $^. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTextDollar..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTextDollar..st new file mode 100644 index 00000000..ce036eef --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTextDollar..st @@ -0,0 +1,8 @@ +visiting - commands - characters and spacing +commandTextDollar: arguments + + + self stream nextPut: $$. + + arguments do: [:child | + self visit: child]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTextQuoteSingle..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTextQuoteSingle..st new file mode 100644 index 00000000..609f05ae --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandTextQuoteSingle..st @@ -0,0 +1,8 @@ +visiting - commands - characters and spacing +commandTextQuoteSingle: arguments + + + self stream nextPut: $'. + + arguments do: [:child | + self visit: child]. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandVert..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandVert..st new file mode 100644 index 00000000..a6a10536 --- /dev/null +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandVert..st @@ -0,0 +1,6 @@ +visiting - commands - characters and spacing +commandVert: arguments + + + self assert: arguments isEmpty. + self basicVisitText: '|'. \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json index 30bd17d1..130c5648 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json @@ -23,6 +23,7 @@ "commandExcludeComment:" : "ct 11/8/2023 22:58", "commandGraphicsPath:" : "ct 11/8/2023 14:44", "commandHandlerFor:" : "ct 11/8/2023 22:56", + "commandHash:" : "ct 11/26/2023 00:47", "commandIfThenElse:" : "ct 11/8/2023 19:04", "commandIfx:" : "ct 11/9/2023 23:11", "commandIncludeGraphics:" : "ct 11/15/2023 22:11", @@ -49,9 +50,13 @@ "commandSetBoolean:" : "ct 11/8/2023 19:22", "commandSetCounter:" : "ct 11/8/2023 22:52", "commandSpace:" : "ct 11/8/2023 20:00", + "commandTextAsciiCircum:" : "ct 11/26/2023 00:52", + "commandTextDollar:" : "ct 11/26/2023 01:05", + "commandTextQuoteSingle:" : "ct 11/26/2023 01:05", "commandTilde:" : "ct 11/25/2023 17:48", "commandTimes:" : "ct 11/8/2023 18:46", "commandToday:" : "ct 11/8/2023 17:39", + "commandVert:" : "ct 11/26/2023 02:33", "contents" : "ct 11/9/2023 21:19", "contentsIn:" : "ct 11/25/2023 16:27", "contentsInGroup:" : "ct 11/8/2023 15:11", From eec5d417e306ac672f8e3fe64693ccdce159e4a2 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sun, 26 Nov 2023 20:41:38 +0100 Subject: [PATCH 24/35] ignore bibliography --- .../SBELatexBookExtractor.class/instance/ignoredCommands.st | 3 ++- .../SBELatexBookExtractor.class/methodProperties.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/ignoredCommands.st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/ignoredCommands.st index d26c4951..c3338497 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/ignoredCommands.st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/ignoredCommands.st @@ -8,4 +8,5 @@ ignoredCommands 'setlist' 'renewlist' 'setlistdepth' 'newlength' 'setlength' 'addtolength' 'hspace' 'hspace*' 'vspace' 'vspace*' - 'needlines' 'needspace') \ No newline at end of file + 'needlines' 'needspace' + 'bibliography') \ No newline at end of file diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json index 130c5648..64834d72 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/methodProperties.json @@ -90,7 +90,7 @@ "fullContentsInGroup:optionalBrackets:" : "ct 11/8/2023 15:13", "handleCommand:arguments:" : "ct 11/21/2023 14:04", "handleEnvironment:options:during:" : "ct 11/21/2023 14:04", - "ignoredCommands" : "ct 11/20/2023 19:22", + "ignoredCommands" : "ct 11/26/2023 03:14", "initialize" : "ct 11/21/2023 14:03", "initializeCommandHandlers" : "ct 10/19/2023 12:31", "initializeEnvironmentHandlers" : "ct 10/20/2023 00:53", From 24e92d468b363eb32bcab8b8bb8fa70456596545 Mon Sep 17 00:00:00 2001 From: Christoph Thiede Date: Sun, 26 Nov 2023 20:48:25 +0100 Subject: [PATCH 25/35] extract-book: add index (DOM, links, (de)serialization) --- .../SBEBook.class/instance/bookIndex..st | 4 ++ .../SBEBook.class/instance/bookIndex.st | 4 ++ .../SBEBook.class/instance/storeOn..st | 4 +- .../SBEBook.class/methodProperties.json | 4 +- .../SBEBook.class/properties.json | 3 +- .../SBE-Book.package/SBEIndex.class/README.md | 0 .../SBEIndex.class/class/key.label..st | 7 +++ .../instance/addReferenceKey..st | 5 ++ .../instance/assureSubindexAt..st | 7 +++ .../instance/atPath.putKey.label..st | 15 ++++++ .../SBEIndex.class/instance/entries..st | 4 ++ .../SBEIndex.class/instance/entries.st | 4 ++ .../SBEIndex.class/instance/entriesDo..st | 5 ++ .../instance/forwardReference..st | 5 ++ .../instance/forwardReference.st | 5 ++ .../SBEIndex.class/instance/initialize.st | 7 +++ .../SBEIndex.class/instance/key..st | 4 ++ .../SBEIndex.class/instance/key.st | 4 ++ .../instance/keySortFunction.st | 5 ++ .../SBEIndex.class/instance/label..st | 4 ++ .../SBEIndex.class/instance/label.st | 4 ++ .../instance/makeEntryForKey.label..st | 4 ++ .../instance/makeSubindexForKey..st | 6 +++ .../SBEIndex.class/instance/printOn..st | 14 ++++++ .../SBEIndex.class/instance/referenceKeys..st | 4 ++ .../SBEIndex.class/instance/referenceKeys.st | 5 ++ .../SBEIndex.class/instance/storeOn..st | 17 +++++++ .../SBEIndex.class/methodProperties.json | 24 ++++++++++ .../SBEIndex.class/properties.json | 18 +++++++ .../instance/emitIndex.st | 9 ++++ .../instance/emitIndexForwardReference..st | 6 +++ ...tructureElement.forBookNode.type.title..st | 47 +++++++++++++++++++ .../instance/initialize.st | 1 + .../instance/nameForKey..st | 5 ++ .../instance/preprocessedContentsFromFile..st | 4 ++ .../visitStructureElement.forBookNode..st | 47 +++---------------- .../methodProperties.json | 11 +++-- .../instance/commandIndex..st | 23 ++++++++- .../instance/commandPrintIndex..st | 6 +++ .../instance/emitIndex.st | 5 ++ .../instance/emitIndexEntry..st | 6 +++ .../instance/emitIndexEntry.depth..st | 38 +++++++++++++++ .../emitIndexEntry.keys.forwardReference..st | 14 ++++++ .../instance/emitIndexForwardReference..st | 5 ++ .../instance/initialize.st | 5 +- .../instance/keyForIndexPath..st | 4 ++ .../instance/nameForKey..st | 1 + .../methodProperties.json | 13 +++-- .../properties.json | 3 +- 49 files changed, 395 insertions(+), 54 deletions(-) create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/instance/bookIndex..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEBook.class/instance/bookIndex.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/README.md create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/class/key.label..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/addReferenceKey..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/assureSubindexAt..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/atPath.putKey.label..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/entries..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/entries.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/entriesDo..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/forwardReference..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/forwardReference.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/initialize.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/key..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/key.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/keySortFunction.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/label..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/label.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/makeEntryForKey.label..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/makeSubindexForKey..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/printOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/referenceKeys..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/referenceKeys.st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/storeOn..st create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/methodProperties.json create mode 100644 SmalltalkSources/SBE-Book.package/SBEIndex.class/properties.json create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitIndex.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitIndexForwardReference..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/emitStructureElement.forBookNode.type.title..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandPrintIndex..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitIndex.st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitIndexEntry..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitIndexEntry.depth..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitIndexEntry.keys.forwardReference..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/emitIndexForwardReference..st create mode 100644 SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/keyForIndexPath..st 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/storeOn..st b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/storeOn..st index b137afa4..cd469c45 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/storeOn..st +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/instance/storeOn..st @@ -4,6 +4,8 @@ storeOn: aStream aStream nextPutAll: ('({1} pdfUrl: {2}; + bookIndex: {3}; yourself)' format: {String streamContents: [:stream | super storeOn: stream]. - self pdfUrl storeString}) \ No newline at end of file + self pdfUrl storeString. + self bookIndex storeString}) \ 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 index df70d375..d1d94099 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBook.class/methodProperties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/methodProperties.json @@ -2,12 +2,14 @@ "class" : { }, "instance" : { + "bookIndex" : "ct 11/26/2023 18:00", + "bookIndex:" : "ct 11/26/2023 18:00", "canonicalHierarchyOrder" : "ct 11/8/2023 22:38", "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/25/2023 23:01", + "storeOn:" : "ct 11/26/2023 18:01", "textForHelp" : "ct 11/15/2023 18:02", "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 index 8d22c217..d2c803ec 100644 --- a/SmalltalkSources/SBE-Book.package/SBEBook.class/properties.json +++ b/SmalltalkSources/SBE-Book.package/SBEBook.class/properties.json @@ -6,7 +6,8 @@ ], "commentStamp" : "", "instvars" : [ - "pdfUrl" ], + "pdfUrl", + "bookIndex" ], "name" : "SBEBook", "pools" : [ ], diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/README.md b/SmalltalkSources/SBE-Book.package/SBEIndex.class/README.md new file mode 100644 index 00000000..e69de29b diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/class/key.label..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/class/key.label..st new file mode 100644 index 00000000..6987514e --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/class/key.label..st @@ -0,0 +1,7 @@ +instance creation +key: key label: label + + ^ self new + key: key; + label: label; + yourself \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/addReferenceKey..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/addReferenceKey..st new file mode 100644 index 00000000..00d1e743 --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/addReferenceKey..st @@ -0,0 +1,5 @@ +accessing +addReferenceKey: referenceKey + "Add a key from the book that references this entry." + + referenceKeys addLast: referenceKey. \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/assureSubindexAt..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/assureSubindexAt..st new file mode 100644 index 00000000..881b0cfe --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/assureSubindexAt..st @@ -0,0 +1,7 @@ +private +assureSubindexAt: key + + ^ entries + at: key + ifAbsentPut: + [self makeSubindexForKey: key] \ No newline at end of file diff --git a/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/atPath.putKey.label..st b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/atPath.putKey.label..st new file mode 100644 index 00000000..940bd10f --- /dev/null +++ b/SmalltalkSources/SBE-Book.package/SBEIndex.class/instance/atPath.putKey.label..st @@ -0,0 +1,15 @@ +accessing +atPath: path putKey: key label: label + + | localKey | + path size > 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-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/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/initialize.st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/initialize.st index f23a5e34..8ad17bae 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/initialize.st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/initialize.st @@ -5,6 +5,7 @@ initialize book := SBEBook new title: 'Squeak by Example'; + bookIndex: index; yourself. nodeStack := Stack new. nodeStack push: book. diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/nameForKey..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/nameForKey..st index 39d96023..57bdaddc 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/nameForKey..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/nameForKey..st @@ -4,4 +4,9 @@ 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 index 26602b50..93afa67a 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/preprocessedContentsFromFile..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/preprocessedContentsFromFile..st @@ -14,4 +14,8 @@ preprocessedContentsFromFile: aFSReference 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/visitStructureElement.forBookNode..st b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitStructureElement.forBookNode..st index 127c7e6a..adef1508 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitStructureElement.forBookNode..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/instance/visitStructureElement.forBookNode..st @@ -1,50 +1,15 @@ visiting - nodes visitStructureElement: node forBookNode: bookNodeClass - | bookNode title oldNode incrementer | + | bookNode title | self assert: node children first sbeType isNil. title := self contentsIn: node children second. - bookNode := bookNodeClass new. - bookNode title: title. - "bookNode labels: labels." - bookNode parseNode: node. - oldNode := nodeStack top. - self resolveRefs. - self stream contents withBlanksTrimmed ifNotEmpty: [:text | - self assert: oldNode text isNil. - oldNode text: text withBlanksTrimmed]. - 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: [:type | - type = node type - ifFalse: - [counters at: type put: - ((appendix and: [type = #chapter]) - ifTrue: ['@'] - ifFalse: [0])]; - yourself]. - - incrementer := [:count | count + 1]. - (appendix and: [node sbeType = #chapter]) ifTrue: - [| oldIncrementer | - bookNode typeName: #appendix. - oldIncrementer := incrementer. - incrementer := [:count | (oldIncrementer value: count sbeFromAlph) sbePrintStringAlph]]. - bookNode index: - (counters at: node sbeType put: - (incrementer value: (counters at: node sbeType ifAbsent: [0]))). + bookNode := self + emitStructureElement: node + forBookNode: bookNodeClass + type: node sbeType + title: title. (node children allButFirst: 2) do: [:child | self visit: child]. diff --git a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json index 13d12af5..210a5812 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json +++ b/SmalltalkSources/SBE-ExtractBook.package/SBEBookExtractor.class/methodProperties.json @@ -41,11 +41,14 @@ "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", @@ -53,10 +56,10 @@ "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/25/2023 19:31", + "initialize" : "ct 11/26/2023 18:00", "monticelloIPAImage" : "ct 11/8/2023 20:16", - "nameForKey:" : "ct 11/14/2023 22:13", - "preprocessedContentsFromFile:" : "ct 11/24/2023 19:33", + "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", @@ -67,6 +70,6 @@ "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/25/2023 20:14", + "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/SBELatexBookExtractor.class/instance/commandIndex..st b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIndex..st index f1797747..14798412 100644 --- a/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIndex..st +++ b/SmalltalkSources/SBE-ExtractBook.package/SBELatexBookExtractor.class/instance/commandIndex..st @@ -1,4 +1,25 @@ visiting - commands commandIndex: arguments - "ignore" \ No newline at end of file + + | 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*(?