printColumn parserdisk parser which generates a table from local disk contentsFind/Replace for shorter relative links:
^ link ([^\s]+)\.html
$1.html
container parserhakon parsertufte themegazetteCss. Now use theme gazette.tufteCss. Now use theme tufte.theme parser and 3 themes: roboto, dark, and gazetteiframes parserhaml quick html tagslinks parser to tablescompose parser to tablesquickIncludeJsonParser parsercloc parserfavIcon parserquickCssParserquickIncludeHtmlParserquickScriptParserassertHtmlEqualsParser for faster and more intelligent testingprintTableprintTablelimit parser to tablesloop parser can now loop over tablesclassicForm and scrollForm work differently now.quickImport parser for imports.quickVideo parser for including videos.quickMusic parser for including sound files.quickTable parser for including csvs, tsvs, psvs, and ssvs.tests/sipOfCoffee.m4a
loop
tests/spirit.mp4
loop
pages.csv
printTable
quickImage parser. Add an image with just the filename. quickImageParser detects by filename.particles.png

scrollForm now implements the One Textarea design pattern. Thanks Alejandro for your help!scrollForm parsertextarea to ScrollSet formsabstractTextareaMeasureParsermediumColumn, thinColumn, and wideColumn parsers.form to classicFormform parserExample:
chat
I have some questions
What is your current productivity tool
pen and paper
Hmm and for project management?
pen and paper
youTube parser to youtube (all lowercase). Deprecate old spelling.tree is no longer a table format. Use particles instead.buildPdf parser. Currently requires MacOS + Chrome.printMeasuresprintConceptsbuildConcepts and buildMeasures now generates csv by default instead of tsvBefore:
buildConcepts
printConceptsAfter:
buildConcepts
table
printTableprintUsageStatsprintLeetSheet is now printScrollLeetSheetprintAvancedLeetSheet is now printparsersLeetSheetpaintParser which replaces highlightScopeParserhighlightScope to paintwwsButton is now downloadButtonemail. Now do emailButton [email]downloadUrl. Now do downloadButton [url]printRelatedbr parserbuildCsv parseremailButton parser.scrollVersionLink parser.wwsButton parser.center parser now also creates centered sections:This should be centered.
printViewSource is now viewSourceLinkpageFooter has been split into simpler parsers.find ^pageFooter
replace
center
emailButton
downloadButton
viewSourceButton
scrollVersionLinkhomeButton parser.leftRightButtons parser.viewSourceButton parser.pageHeader. Split that into 3 simpler parsers. Change pageHeader to:find ^pageHeader
replace
homeButton
leftRightButtons
viewSourceButtonprintViewSourceBadge is now viewSourceButtonhomeUrl. Insead do:homeButton
link ../someOtherURL.html
video parser.video tests/spirit.mp4
loop
music parser for playing songs, podcasts, sounds, et cetera.music tests/sipOfCoffee.m4a
loop
nickelbackIpsum parser. Idea from gigamick.label should show up in scatterplot autocompletebutton parserdinkus parserimage parser easier to extendimpute parserfetch now writes to localStorage in browser environment.table now can read from localStorage in browser environment.groupBy parsertableSearch stylingtableSearch now adds copy and CSV buttons.transpose parsersparkline [columnName] is now sparkline\n y [columnName]groupBy parser for "pivot tables"select parserorderBy parserrename parserreverse parserfetch parserscatterplot now gets data from table.table [filename].[json|tsv|csv] to load and print a table from disksparkline now can take a table as input:table posts.csv
sparkline
y wordCount
printTable at root level. Now works nested under tablespaceTable. See below to migrate.tabTable. See below to migrate.treeTable. See below to migrate.commaTable. See below to migrate.pipeTable. See below to migrate.table now takes delimiter and data parsers. Usage:| name | score |
|---|---|
| Kape | 35 |
Regex to find all breaks: ^(printTable|spaceTable|tabTable|treeTable|commaTable|pipeTable|table )
inlineMarkups now supports setting attributes and tagsa href="url" instead.inlineMarkups parser. Thanks to eugenesvk for the idea.printSourceStack now prints [Unchanged] if the source was not changed during a compiler step.wrapsOn is now inlineMarkupsOnwrap is now inlineMarkupcounters parser.printSourceStack parser to provide a clean way to view source code at each step in compilation.readingList parser. Aftertext is a better choice.printExpandedSource and printOriginalSource into printSourceStackbuildFiles to CLI classprintExpandedSource and printOriginalSource parserstestStrict parser to allow disabling catch all paragraph on a per file basis.heatrix now supports using custom labels even for numeric atoms.heatrixheatrix.heatrix is now heatrixAdvanced. heatrix is the simplest fast version now.heatrixprintCsv now includes year columnheatrix parserprintRelated now has support for tags! No need to add a related line on each post.groups is now tags.printRelatedList is now just printRelated.related parser. Now just use tags. Apply tags liberally.codeWithHeader parsercenter aftertext markup parserprintFormatLinks parserprintAdvancedLeetSheet now also prints atom parser docsDemo:
Hello world
bold
This is italicized
italics
Make this code
code
Strikethrough this whole line.
strike
Hello world
This is italicized
Make this code
Strikethrough this whole line.
printAdvancedLeetSheet after feedback in r/WorldWideScrollheight and width to imagesfloat to imageswrapsOn. You can write wrapsOn none to disable all wraps.printCsv now exports authors as wellauthors parser to support multiple authorsauthors now can use all aftertext featuresprintAuthor is now printAuthorsauthor is now authors.To update from author to authors, you can use this regex find/replace:
Find: ^author ([^ ]+) (.*)
Replace: authors 2\n 1 $2
contacts microlang.microlangs foldercenter parser! first blink, now center!printCheatSheet to printLeetSheetprintUsageStats parser.printCheatSheet now prints good txt only docs too.printCheatSheet now prints descriptions.printCheatSheet parser v0.1.0keywordAtom has been replaced by cueAtom. You can do a simple find/replace or just add:keywordAtom
extends cueAtom
scroll build through passed in SSH command was hangingstartColumns, gazetteHeader, gazetteFooter, byLineprintViewSourceBadge parsergit parser. No longer needed now that we use deep link to all source pages.viewSource to printViewSource to clarify that it prints an HTML element.pageHeader and pageFooter parsers will now only emit icons for git, downloadUrl, and email if those items are setstrikethrough parser to strikeloadConcepts fixrelatedParser to relatedScrollFilesParser to free up relatedParser for userland.relatedList to printRelatedListsortBy to printConcepts parserscroll init generates a smaller sitedescriptionParser to openGraphParser and titleParser to pageTitleParser to free up those names for userparserland.buildJs and script parsersbuildCss parserThis is a major breaking release meant to simplify and standardize a lot of the core Scroll concepts.
buildHtml parserbuildRss parserimportOnly on a file if the file uses no buildCommandParsers.snippets => printSnippetsfullSnippets => printFullSnippetsbuildText => buildTxtscroll build will no longer write anything by default. You now need to explicitly include 1 or more buildCommands in your files, such as buildHtml or buildTxt.tags parser in css themes. Instead of this:permalink style.css
gazetteCss
tags false
Do this:
buildCss style.css
gazetteCss
date is now derived from file creation timetitle is now computed by un-camelcasing the filenameidlimit parser to snippetswws to its own repowws. Thank you Nick Noble!writeText is now buildTextwriteConcepts is now buildConceptswriteMeasures is now buildMeasuresbuildFilesInFolder now returns an object of all built files.scatterplot can now take a url as a data sourcescatterplot parserstamp mini languagesparkline parser using beautiful tiny sparkline library by Marius Gundersen.sparkline 5 7 27 87 300 17 10 5
grammar to parsers change.grammar it's just parsers..grammar now end in .parsers.formatAndSave method.wws command line app.downloadUrl parser.canonicalLink is now canonicalUrl.homeLink is now homeUrl.jtree with scrollsdkclasses parserrequireOnceabstractCustomListItemParser for making HTML lists with custom markerswriteConcepts and writeMeasures now strips blank values when generating JSON and/or JStableSearch now will save the sort order to the urlscroll format command now also prettifies concepts and measurements in ScrollSets. If a measurement's sortIndex jumps to a new integer (for example, 1.9 to 2.1), a newline will be inserted before it.sortIndex is now 1.9, and the sort index of id is 1.0. Update sortIndex accordingly.id the filename (without the extension). Have the id be a simple one atom url friendly string. If you want a pretty title, add a name measure. Everything much simpler this way.printAuthor parser prints the author defined by author. byLine has been deprecated--replace with printAuthor.author parser now takes a URL.printDate parserhelpfulNotFound now assumes the script can be found at the root of the domain.Scroll Datasets to ScrollSets.Coverage in Measurements should round down.isMeasureRequired.metaTags from breaking try.scroll.pubslideshow working on try.scroll.pubslideshow parserprintTitle in text filesidParser and filenameParser no longer ship in default grammar. This will allow for useful future dataset features. Instead, add them yourself if you are using Concepts like this:idParser
extends abstractIdParser
filenameParser
extends abstractFilenameParser
printTitleprintTitle parser added for easier templatestitle is now a setter. This regex handles the migration:^title printTitle\ntitle endSnippet and does have a dinkus, it will now generate a snippet rather than using the whole post.measureNames. Restrict them from containing "_", which we use to combine nested measures.> (with aftertext support)!> , those will now be parsed by the quickQuoteParserminutes to read (assuming 200 atoms/minute) to printSearch and printCsv exportssitemap for making sitemaps specific to certain folders/groupsprintFeed, snippets, fullSnippets providing groups is now optionalreplaceJs now has access to the filepathsortBy can now sort on multiple columns and handle asc/descwriteConcepts and writeMeasures can now take multiple filenames in one line and also include a sortBy condition.id measure was appearing twicereplaceDefault parser. No one should be affected.nodejs parser to `replaceNodejs. Few should be affected.keyboardNav was in use. First implementation was accidentally quadratic.printSearchTable now generates correct links when searching across multiple folderstableSearch now takes a parameter from the url #q=[search]. Updating the searching box also updates url.printSearchTable parserscroll test and fix bug in percentAtomwriteMeasures and printMeasures parsersabstractPercentageMeasureParserloadConcepts parser for if you had a dataset split into many files in a folder.float sortIndex [int] for sorting the measures(columns) in dataset generation. Lower sort indexes come first.scroll test will now report if an aftertext pattern has no matches.**** as an "end of post dinkus" which prints โid in conceptsscroll initid parser for using datasets.[measureName]: syntax introduced in version 77. You no longer have to worry about the annoyance that introduced when writing a paragraph such as "Sidenote: yada yada".belowAsCodeUntil parser:: parser. Now concepts are simply identified by the parser id.writeDataset is now writeConcepts and printDataset is now printConcepts.[measureName]: syntax introduced in version 77. To use datasets (aka Concept files) now, just extend Scroll parsers like you normally would. See this blog post for an example.openGraphImage is no longer required. Will be auto-added if not present.link under image. Also added target.openGraph under an image node as an alternative to adding a separate openGraphImage linemediumColumns parserthinColumns parser.Note: startColumns will eventually be removed. You can now safely switch those to thinColumns.
expander parserAnything in the section will show up here. A blank line ends a section.
printTable parserprintTable [index] to print any existing tabular tables.printTable will look for a table to print using this strategy:
npm installnpm install -g scroll-cli --production fastendSnippet was showing up in htmlformatCommand to the CLI for nicely formatting files, moving top matter to the top, cleaning up white space, etc, so you don't have to worry about that.The current formatting conventions are:
importOnly, if present, is moved to the very topNote that currently the title tag is a meta tag and a tag that prints content. Going to split that up into 2 tags soon.
Note that if you are doing something like a tutorial and using a belowAsCode where you purposely put a top matter parser not at the top, it will currently get moved to the top by format. We can probably add a feature like treating meta nodes with // noFormat as if they were content nodes.
related and relatedList parsersplainTextOnly for rare case when you need to include content only for the plain text version.html should not print in text versions (since it is html :)).thoughtParser, that is now called paragraphParser.helpfulNotFound parser for better 404s.wordCount in printCsv now measures wordCount in the text version of a post.writeText parser.Note: there are likely to be a few rapid releases to refine this.
printSiteMap parser for text sitemap generation.^(\t|[^ ]+\t)Spreadsheets are great tools for working with tabular data. I want to copy/paste between Scroll docs and spreadsheets. This makes it easier.
Tabular data is better than line orientation for experimental data because it requires half the number of tokens and it's more efficient eye movement during comparisons and proofreading.
Scroll already supported tabular data using tabTable, but that made copy/paste workflows between spreadsheets and text editors a pain. This should be more ergonomic and make it easier to work with this useful tool of thought.
::, printDataset, writeDataset, and *: and *:: parsers.Sidenote: yada yada., those will now be parsed incorrectly as measures. Just explicitly make them paragraphs * Sidenote: yada yada.. This regex can help you find any instances: ^[^ ]+: .The code below added to a page will create the zoom out effect:
css html {font-size: var(--base-font-size, 8px);}
*** parser to print a Dinkus
Now I will show an example.
***
Above is a dinkus.
Now I will show an example.
Above is a dinkus.
thanksTo parserplainText parserprintSource parser to be able to dump the source code for a group of posts to a plain text file.printCsv parser to make it as easy to generate a CSV of a blog as it is to generate an RSS feed was present in RSS pages. Thank you to Joao for the report.This paragraph has a dropcap. It can be a useful visual aid for the reader to break up sections. You can read more about dropcaps on Wikipedia.
wrapsOn you can now provide parameters to specify only the wraps you want, if any.katex node in a file. So any paragraph containing multiple $ will now behave as before katex wraps were added.wideColumns parser2*4*2 or inline \KaTeX X_{2_i}.katex node in your file and will load the KaTeX code.program parser for Program Links. See blog post for details.<!DOCTYPE html> to improve performance on Google Lighthouse.<html lang></html> back as you need that to get proper hyphenation. Added test.htmlLang parser for overriding the default lang which is set to "en"text-align: justify; on paragraphs to Gazette and Tufte themes.tufteCss beta theme.###, #### and ##### headers.title can be thought of as h0.gazetteHeader is now pageHeader and gazetteFooter is now pageFooter. Headers and footers can be independent of themes.\n\* \n.\n\* [a-z] search first to find any paragraphs that start with a lowercase letter.<!, as they will be parsed as HTML nodes.katex parser. KaTeX: "The fastest math typesetting library for the web."tag parser to thought nodes so you can change the compiled html tag (needed in rare circumstances)thought parser and standardized vocab to calling the thought node the main node that most nodes extend.style parser to provide inline html styles to a thought node.No one should be affected. This was an internal rewrite to upstream the imports code to ParticleFileSystem in Jtree. No changes for Scroll users.
scrollKeywords is no longer exportedDefaultScrollCompiler is now DefaultScrollParserScrollDiskFileSystem and ScrollInMemoryFileSystem replaced by ScrollFileSystemSimplify theme building.
gazetteTheme is now gazetteCss.// Change `gazetteTheme noTags` to:
gazetteCss
tags false
Maintenance release. Update packages and remove unused package and specify required NodeJs versions accurately.
This is The Theme Release.
author node is now byLine. author is kept for now but updating is recommended.scrollCssTag is gone. use gazetteTheme for previous behavior. scrollCss is gone, use gazetteTheme noTag.gazetteTheme now contains that CSS code.scrollHeader is now gazetteHeader and scrollFooter is now gazetteFooterscrollHeaderComponent => gazetteHeader, scrollFooterComponent => gazetteFooterkpiTable is now dashboardNode to Parser).abstractScrollWithRequirementsNode and use it for copyButtons and map to only include the external JS and CSS once.compileSettings as an input in all Scroll nodes rather than maintaining state on instancesThis was a big internal refactor to remove the outdated concept of ScrollFolder and rely on the file system parameter instead. This makes it easier to build webapps serving dynamic Scroll pages. It also simplifies the upcoming isomorphic release.
ScrollFolder. Exports now include ScrollDiskFileSystem and ScrollInMemoryFileSystem. To get the same behavior as new ScrollFolder("folder").buildFiles() use new ScrollDiskFileSystem().buildFilesInFolder("folder").new ScrollFolder(__dirname).defaultScrollCompiler use DefaultScrollCompilercompileSnippet should now be compileEmbeddedVersionfile.folder.folder use file.folderPathloop may be affected:relativeLink to linkRelativeToCompileTargetcanonicalUrl if you need to include query strings in canonical link.canonicalUrl https://scroll.pub/tests/maps.html?canonLinkTest=true
map using LeafletJScopyButtons parser. Use that to give code blocks a copy-to-clipboard button on hover.nodejs node for including small node.js scripts inside a Scroll file, similar to a PHP snippet. . The snippet is written to disk and then require is used to run it. Exports variables are then replaced throughout the script.ScrollFolder constructor now requires an argument. You can now pass an object as a second param to use a virtual filesystem.DefaultScrollCompiler export. Instead use new ScrollFolder().defaultScrollCompilerbuildNeeded method only used programmatically by PLDB. Switching that to dynamic generation which is a better pattern.quickHtml node. A line starting with < will be treated as an html node. So these are the same:html <hr>
<hr>
*) node.---//. Previously it was only commentscroll init now creates a .gitignore file and also runs git init.image parser now supports class and id tagsclass tag with just a class will now apply to the whole parent element and not insert a spanabstractItemsProviderNode[] and [x]- are now indentableloop node type:loop
atoms #2a2d34ff #009ddcff #f26430ff #6761a8ff #009b72ff
javascript `<span style="background-color: ${item}; width: 30px; height: 30px; display: inline-block;"> </span>`
startColumns clear the section stack. Simpler behavior.getFullyExpandedFile is no longer exported. Instead use: new ScrollFile(undefined, filePath).importResults.codeScrollFile have changed. absoluteFilePath is now param #2, instaed of #3.css one liners๐ added support for `css` one liners
class blueOneLiner
css .blueOneLiner { color: blue;}
title nodes are now proper aftertext nodes and can use all features of aftertexthidden parser can now be used on any aftertext nodepermalink on a file the title node won't output an a tagtitle blocks now start a section like # and ##, so you may need to add an empty line to end the section, for example if you previously had a startColumns right after the title tag.snippets nodes can now accept multiple groups and also groups can be in different folders. Syntax is [folderPath]/[groupName] For example:# The Long Beach Pub
snippets 2023/index stories/index 2022/index
jtree 66. If you are extending Scroll you may need to migrate extensions.scroll initaboveAsCode and belowAsCode now take an optional number for showing multiple nodes.1. One
2. Two
3. Three
table grammar error messagetable parser which supports custom delimiters:table
delimiter &&
data
name&&score
kaia&&400
pemma&&100
class aftertext directive now inserts a span across the whole element content if no text search is provided.css
.classDemo {color:blue;}
This whole text will be blue.
class classDemo
This whole text will be blue.
replaceJs parser.youTube CORS fix to work whether someone includes www.youtube or not.watch command. nodemon can be used for hot reloading. Install with sudo npm install -g nodemon. Then run:nodemon -e scroll -x "scroll build"
Or alias it:
alias watch="nodemon -e scroll -x 'scroll build'"
You can add the following code to the page(s) you are working on to have them reload without manually refreshing the browser:
html <meta http-equiv="refresh" content="1;">
scroll init no longer starts with a viewSourceBaseUrl. If not provided then the View Source link is to the scroll file, so new sites don't start with broken links.link nodes can now have target. This link will open in blank tab.๐ `link` nodes can now have `target`. This link will open in blank tab.
https://scroll.pub This link
target _blank
title Title can also be set.
youTube nodes can now have captions.youTube links are converted to proper embed links to fix CORS issues.scrollImageComponent CSS class changed to scrollCaptionedComponent. If you were overwriting the previous class may need to update.note parser under link nodes has been renamed to title and instead of it being a block just the line is used. This is to better reflect what it does. See example above.youTube definition was missing a atom type for url.redirectTo definition was missing a atom type for url.* nodes previously supported multiple lines of text. This now throws an errors. If you need the old behavior you can copy/paste the old node's Grammar code into your project.* node with just a link now works correctly. Previously was rendering blank.html now also supports quick oneliners:html <b>here is some html</b>
here is some html
importOnlybuildNeeded returns whether the folder needs to be rebuilt. You can use this to skip unnecessary builds for faster perf.scroll build now does not overwrite unmodified files. Now mtime reflects when the generated HTML last changed instead of when the scroll build command was last run. This speeds up rsync deploys.Sections. Headers (#, ## and ?) now start a section, and a blank line ends it. A section will not be split across columns.listCommand now much faster (~33% in pldb) because findScrollsInDirRecursive will now skip node_modules folders entirely.notes parser. Referencing a footnote is done the same way but now footnotes just print immediately like you'd expect.For example^exampleFootnote
For example[1]
[1] This is an example footnote.
^exampleFootnote This is an example footnote.
viewSource parser.footnote and caveat directives to hoverNote to avoid confusion with footnotes.startRuledColumns which doesn't appear to be used anywhereyouTube parser for embedding youTube videos with proper responsive sizing.This release simplifies and removes things from the default install.
github parser is now git to make it clearer what it does. The git SVG is now used in the default theme.twitter parser and removed the Twitter link from default theme.SVGS is no longer exported.printFeed, meaning pubDate and lastBuildDate are included.stumpNoSnippet for advanced use case of PLDB until we have better support for custom grammars when using as a library.doNotPrint class to header and footer elements for better printability.startColumns parserThis is a major breaking refactor. Scroll now generates flat html. This release is NOT recommended for the feint of heart. Wait a day or two until the bugs are ironed out.
metaTags parser., , , and tags. Unnecessary. Modern browsers don't need them. HTML never should have had head/body split.SCROLL_CSS export.stump parser works nowscrollCss works nowThis is a major breaking refactor. All the implicit imports are gone. Everything must be explicitly included now (perhaps with a few slight exceptions like meta tags). This migration guide is a work in progress. This release is NOT recommended for the feint of heart. Wait a day or two until the bugs are ironed out.
maxColumns and columnWidth and templatescrollHeader and scrollFooter. The previous behavior of scrollHeader and scrollFooter has been removed.startColumns and endColumns.scrollCssTag. The previous behavior of scrollCss has been removed. Also printScrollCss is now scrollCss.Brockton is a city in Massachusetts[2]. It was incorporated in 1881[3].
[2] A state in the United States.
[3] Incorporated as a city in 1881, but as a town in 1821. Wikipedia.
This is the title simplification refactor release.
description parser for use in open graph description generation.hidden parser on title nodes for setting title without printing it.title in their HTML by default. Must set manually.siteTitle and siteDescription parsers. Those concepts no longer make sense after the introduction of groups concept. Generally if you rename siteTitle to title and siteDescription to description it should work well.htmlTitle parser.http quick links were not matching.SVGS export when using as a library.- some item) compiler was generating an extra p tag.a tags automatically. Note: if an a tag is detected in the node Linkify will be DISABLED for that node.scroll check is now scroll testsearch ^# (\d+\.\d+\.\d+) (\d+)\-(\d+)\-(\d+)
replace # $1 $4.$2.$3
caption now extends the thought (*) node.
You can now use all aftertext directives like bold in caption nodes. Note: in the future we may just remove the parser caption and you can just use * directly.
scroll init no longer creates a feed.xml file by default. You can easily add an XML feed manually with the 2 steps below:comment Add the content below to feed.scroll
settings.scroll
permalink feed.xml
template blank
printFeed index
comment Add the line below to your posts and/or settings import file.
rssFeedUrl feed.xml
aftertext node in favor of * nodes. Regex [search replace] to upgrade: ^aftertext\n * paragraph node. Regex [search replace] to upgrade: ^paragraph\n * question node. Regex [search replace] to upgrade: ^question ? section node. Regex [search replace] to upgrade: ^section # subsection node. Regex [search replace] to upgrade: ^subsection ## list node.orderedList node.unorderedList node. ([^ ]+)๐([^ ]+) 2">1The goal of this release is to simplify and speed up Scroll by removing legacy features.
This is a major release that removes a bunch of the original parsers in favor of the newer more advanced aftertext nodes.
If you don't want to upgrade at this time, it's very easy to just add the removed grammar definitions from this commit into your existing scrolls using the normal extension pattern.
You can also easily alias the newer aftertext node types with the original parsers above if you'd prefer.
* nodes bug๐ Added new better way to do lists.
findScrollsInDirRecursive.redirectTo tagscroll list | scroll buildexecute method on ScrollCli class to executeUsersInstructionsFromShellwhere command is now list?, # and ##*, footnote, and readingListThis is a thought. It's like a condensed form of aftertext with bold and italics and code turned on by default.
* This is a _thought_. It's like a condensed form of aftertext with *bold* and _italics_ and `code` turned on by default.
hoverNote default
And it supports hover notes!
openGraphImage nodereplace now supports multiline stringsabstract. You can then remove all occurrences of the parser abstract from your grammar node definitions.getFullyExpandedFile(str) replace with getFullyExpandedFile(str).codeauthor and kpiTable node typesThis is a major update that radically simplifies Scroll and adds significant new capabilities.
scroll.settings and *.grammar files are gone. Everything is now done with .scroll files, and now every parser is documented and usable on try.scroll.com and type checked.
Use [filepath] to import one scroll file into another. Use replace and replaceDefault for variables.
Define new nodeTypes or create your own aliases on a per file basis. Use the import parser and build your own collection of common reusable node types for your project(s).
Add files to one or more tags and then customize how each tag page prints. No more magic or implicit creation of collection pages.
The new language features (imports, grammar nodes, and variables) required a change from a 1 one stage compilation process to a multi-stage compiler pass pattern. The compilers passes run in this order: imports, grammar extensions, then variables. So variables cannot be used in imports or grammar extensions.
git setting is renamed to viewSourceBaseUrlsourceLink setting is renamed to viewSourceUrlskipIndexPage. Instead you now opt-in to group pages like this: groups index.htmlscroll.settings concept. Use settings.scroll now.footer is now scrollFooter and header is now scrollHeaderignoreGrammarFiles. Custom grammar extensions must now be explicitly imported and/or be in .scroll files.css setting is now scrollCssbuildFiles now. See 'full.scroll', index.scroll, feed.scroll, and style.scroll in tests/kitchenSink for how to implement those in new pattern.scrollArticleDateComponent => scrollDateComponent
scrollArticlePageComponent => scrollFilePageComponent
scrollSingleArticleTitle => scrollFilePageTitle
scrollIndexPageArticleContainerComponent => scrollGroupPageFileContainerComponent
scrollArticleSourceLinkComponent => scrollFileViewSourceUrlComponent
scrollIndexPageComponent => scrollGroupPageComponent
scrollIndexPageFileContainerComponent => scrollGroupPageFileContainerComponent
comment Put this in a file named style.scroll
buildCss style.css
gazetteCSS
scroll wherekeyboardNav nodepermalink lines in .scroll files need .html. Run scroll migrate to find and update automatically.new ScrollPage('title Hello world')treeTabletable
delimiter particles
printTable
data
row
name Javascript
example
console.log("Hello world")
row
name Python
example
# A code block
print "Hello world"
| name | example |
|---|---|
| Javascript | console.log("Hello world") |
| Python | # A code block print "Hello world" |
htmlTitle and sourceLink parsers so an article can override the defaultscss split to write CSS to scroll.css instead of inline, or css none to not generate CSS.wrap parser for advanced custom wraps in aftertext.Some simple and advanced usages. An absolute link and a relative link. Show some added text or some deleted text.
Some !simple! and *advanced* usages. An #absolute link# and @@@a relative link@@@. Show some ++added text++ or some --deleted text--.
inlineMarkup ! em
inlineMarkup * b
inlineMarkup # a href="https://example.com"
inlineMarkup @@@ a href="potato.html"
inlineMarkup ++ span style="color:green"
inlineMarkup -- span style="color:red; text-decoration: line-through;"
wrapsOn parser to aftertext.Support for traditional bold, code, and italics in aftertext with the parser wrapsOn.
Support for traditional *bold*, `code`, and _italics_ in aftertext with the parser `wrapsOn`.
This tiny release adds some ways to include more caveats and context around atoms and references.
This is a great idea.
This is a great idea.
hoverNote great
I'm not actually sure if this is a great idea. But often I want to include a comment and link it
back to the text, but don't quite want to footnote it.
This report showed the treatment had a big impact.
This report showed the treatment had a big impact.
https://example.com/report This report
title The average growth in the treatment group was 14.2x higher than the control group.
Example demonstrating the above:
aftertext
Click here to go to the middle paragraph.
link #middleParagraph Click here
loremIpsum 20
aftertext
Here is the middle paragraph.
id middleParagraph
loremIpsum 20
table
delimiter |
printTable
data
name|nameLink
Wikipedia|https://wikipedia.org
| name |
|---|
| Wikipedia |
By default the article's date will be used but you can also provide a custom date.
A truck transporting llamas collided into a pajama factory late last night.
dateline 2/21/2020
February 21, 2020 โ A truck transporting llamas collided into a pajama factory late last night.
To migrate and keep your existing datelines use the command scroll migrate.
How much wood can a woodchuck chuck if a woodchuck could chuck wood?
How much wood can a woodchuck chuck if a woodchuck could chuck wood?
https://en.wikipedia.org/wiki/Groundhog woodchuck
matchAll
class standout wood
match 0 3
css
.standout {
background-color: yellow;
border: 1px dashed red;
padding: 5px;
}
You write some text. After your text, you add your markup instructions with selectors to select the text to markup, one command per line. For example, this paragraph is written in Aftertext and the source code looks like:
You write some text. After your text, you add your markup instructions with selectors to select the text to markup, one command per line. For example, this paragraph is written in Aftertext and the source code looks like:
italics After your text
italics selectors

This is a caption
blog/screenshot.png
caption This is a caption
question nodes?Question and answer structures are literally older than the Socratic Method. Such a common semantic pattern deserves it's own parsers.
The below regex may help.
Find ^title\d (.+\?)
ReplaceWith question $1
Find ^title\d (.+)
ReplaceWith section $1
| what | why |
|---|---|
| PipeTable | Because it's awesome! |
To use an image node:
image foo.jpg
QuickParagraphs are now an error. When you want to drop in some HTML, do so with HTML node:
html
<b>anything goes here</b>
scroll check commandFor single atom links in paragraph nodes only (for now) you can now do:
paragraph
This is a link๐example.com
Below is a regex for migrating existing *.scroll files.
<a href="https://([^"]+)">([^ ]+)</a>
$2๐$1
The ๐link tag only supports single atom links. Like everything with ScrollScript, you have a number of options if the conventional design doesn't work for you. Your options are:
foo ๐link bar ๐linkNow you can! Sometimes you just want to publish an independent page without including it in the index. To do that, just add skipIndexPage.