diff --git a/404.html b/404.html index 24cc5e56a..46ce92e37 100644 --- a/404.html +++ b/404.html @@ -4,12 +4,12 @@ Page not found - + - + @@ -37,7 +37,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/changes.html b/blog/changes.html index b41cdaa2f..c246f56b2 100644 --- a/blog/changes.html +++ b/blog/changes.html @@ -3,12 +3,12 @@ Changes: A Microlang for Change Logs - + - + @@ -111,7 +111,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/changes.txt b/blog/changes.txt index a24c6f041..e0d8f1c17 100644 --- a/blog/changes.txt +++ b/blog/changes.txt @@ -91,4 +91,4 @@ Related - What can we learn from programming language version numbers? https://breckyunits.com/versionNumbers.html What can we learn from programming language version numbers? -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/contacts.html b/blog/contacts.html index 6803a9af5..c22daf7e7 100644 --- a/blog/contacts.html +++ b/blog/contacts.html @@ -3,12 +3,12 @@ Contacts: A Microlang for Managing Contacts - + - + @@ -115,7 +115,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/contacts.txt b/blog/contacts.txt index 4941fdc5c..876107fe5 100644 --- a/blog/contacts.txt +++ b/blog/contacts.txt @@ -92,4 +92,4 @@ Notes ⁂ -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/counterpoints.html b/blog/counterpoints.html index 1a0f749d4..eedcedfbb 100644 --- a/blog/counterpoints.html +++ b/blog/counterpoints.html @@ -3,12 +3,12 @@ Counterpoints: A new tool for thought in the Scroll Language - + - + @@ -98,7 +98,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/counterpoints.txt b/blog/counterpoints.txt index 4948da029..fd02c56fc 100644 --- a/blog/counterpoints.txt +++ b/blog/counterpoints.txt @@ -80,4 +80,4 @@ Keep writing, keep thinking! ⁂ -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/counters.html b/blog/counters.html index bf51a4ae7..56089a554 100644 --- a/blog/counters.html +++ b/blog/counters.html @@ -3,12 +3,12 @@ Build Your Own Counters With 3 Words - + - + @@ -105,7 +105,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/counters.txt b/blog/counters.txt index 6877fdcc8..1d8b1231a 100644 --- a/blog/counters.txt +++ b/blog/counters.txt @@ -90,4 +90,4 @@ Computer Chips ⁂ -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/csvToScrollSet.html b/blog/csvToScrollSet.html index 513308251..6ae62251f 100644 --- a/blog/csvToScrollSet.html +++ b/blog/csvToScrollSet.html @@ -3,12 +3,12 @@ Convert CSVs to ScrollSets - + - + @@ -87,7 +87,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/csvToScrollSet.txt b/blog/csvToScrollSet.txt index 5cc2ca4a1..8a8562b17 100644 --- a/blog/csvToScrollSet.txt +++ b/blog/csvToScrollSet.txt @@ -30,4 +30,4 @@ ScrollSets: source code for CSVs 04/21/2024 https://scroll.pub/blog/scrollsets.html -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/feed.xml b/blog/feed.xml index e4089b85c..24c358328 100644 --- a/blog/feed.xml +++ b/blog/feed.xml @@ -4,7 +4,7 @@ Feed https://scroll.pub/blog/ Official blog for Scroll - Wed, 13 Nov 2024 14:59:44 +0000 + Wed, 13 Nov 2024 16:43:31 +0000 en-us Scroll in 50 Questions diff --git a/blog/forms.html b/blog/forms.html index 1e3fe0a20..6836390d1 100644 --- a/blog/forms.html +++ b/blog/forms.html @@ -3,12 +3,12 @@ Web Forms for Geniuses - + - + @@ -83,7 +83,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/forms.txt b/blog/forms.txt index e070c986a..fb20ae114 100644 --- a/blog/forms.txt +++ b/blog/forms.txt @@ -56,4 +56,4 @@ If you are a winner, a builder, a genius, join us on GitHub or Reddit. ⁂ -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/full.html b/blog/full.html index 84d92cb24..c7d2b53f9 100644 --- a/blog/full.html +++ b/blog/full.html @@ -3,12 +3,12 @@ The Official Scroll Blog - + - + @@ -1618,7 +1618,7 @@

level 4 heading

-
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/full.txt b/blog/full.txt index 0e0dd80f0..d3b0ac681 100644 --- a/blog/full.txt +++ b/blog/full.txt @@ -95,4 +95,4 @@ The Power of Indented Heredocs: Markdown, Textile, and BBCode in one file with n 08/23/2021 https://scroll.pub/blog/indented-heredocs.html -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/gitOverRss.html b/blog/gitOverRss.html index 69f203faa..745387cb2 100644 --- a/blog/gitOverRss.html +++ b/blog/gitOverRss.html @@ -3,12 +3,12 @@ The Successor to RSS is Git Clone - + - + @@ -76,7 +76,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/gitOverRss.txt b/blog/gitOverRss.txt index ea0064ac0..4ae2803a7 100644 --- a/blog/gitOverRss.txt +++ b/blog/gitOverRss.txt @@ -41,4 +41,4 @@ Notes vladimyr on bluesky dug up a couple of cool examples of prior art. https://bsky.app/profile/vladimyr.bsky.social/post/3l3anievhnm2t vladimyr on bluesky -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/heatrix.html b/blog/heatrix.html index a8f5ec05b..ca9aa1db8 100644 --- a/blog/heatrix.html +++ b/blog/heatrix.html @@ -3,12 +3,12 @@ Heatrix: Heat Maps + Matrix Visualizations - + - + @@ -118,7 +118,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/heatrix.txt b/blog/heatrix.txt index 6b0c7441c..3de397740 100644 --- a/blog/heatrix.txt +++ b/blog/heatrix.txt @@ -63,4 +63,4 @@ If you like `heatrix` and want to see more stuff like this, but a folder on the ⁂ -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/helpful404s.html b/blog/helpful404s.html index c800ff457..ba2de2409 100644 --- a/blog/helpful404s.html +++ b/blog/helpful404s.html @@ -3,12 +3,12 @@ How I Designed Helpful 404's and Stopped Worrying about Broken Links - + - + @@ -98,7 +98,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/helpful404s.txt b/blog/helpful404s.txt index 000c63d53..f3b8ae396 100644 --- a/blog/helpful404s.txt +++ b/blog/helpful404s.txt @@ -87,4 +87,4 @@ Try it today, and if you like what we are doing please consider bringing your si ⁂ -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/indented-heredocs.html b/blog/indented-heredocs.html index 88b2d48de..981d47088 100644 --- a/blog/indented-heredocs.html +++ b/blog/indented-heredocs.html @@ -3,12 +3,12 @@ The Power of Indented Heredocs: Markdown, Textile, and BBCode in one file with no escaping - + - + @@ -313,7 +313,7 @@

level 4 heading

-
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/indented-heredocs.txt b/blog/indented-heredocs.txt index 8b658d716..b8e79865b 100644 --- a/blog/indented-heredocs.txt +++ b/blog/indented-heredocs.txt @@ -39,4 +39,4 @@ Textile BBCode ====== -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/index.html b/blog/index.html index deb4a3baa..1e9cbf82b 100644 --- a/blog/index.html +++ b/blog/index.html @@ -3,12 +3,12 @@ The Official Scroll Blog - + - + @@ -212,7 +212,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/index.txt b/blog/index.txt index 0e0dd80f0..d3b0ac681 100644 --- a/blog/index.txt +++ b/blog/index.txt @@ -95,4 +95,4 @@ The Power of Indented Heredocs: Markdown, Textile, and BBCode in one file with n 08/23/2021 https://scroll.pub/blog/indented-heredocs.html -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/introducingBlink.html b/blog/introducingBlink.html index ee905660b..0db75236e 100644 --- a/blog/introducingBlink.html +++ b/blog/introducingBlink.html @@ -3,12 +3,12 @@ Introducing the Blink Tag - + - + @@ -70,7 +70,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/introducingBlink.txt b/blog/introducingBlink.txt index d7b3bfee9..e173e6d24 100644 --- a/blog/introducingBlink.txt +++ b/blog/introducingBlink.txt @@ -27,4 +27,4 @@ Advertisers have known for ages that human eyes evolved to respond fast to motio _Note: please don't use this. It's a joke_ -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/plot.html b/blog/plot.html index b04990386..20f6ada90 100644 --- a/blog/plot.html +++ b/blog/plot.html @@ -3,12 +3,12 @@ Write scatterplot to get a scatterplot - + - + @@ -240,7 +240,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/plot.txt b/blog/plot.txt index 55c5e4d8c..bb40e40e1 100644 --- a/blog/plot.txt +++ b/blog/plot.txt @@ -68,4 +68,4 @@ If you like where this is headed, give us a star on GitHub. ^engineering: The difference between programming and engineering? It takes programming to make a program that works. It takes engineering to make a program that _barely_ works. -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/programLinks.html b/blog/programLinks.html index d832e9762..dd96ed86c 100644 --- a/blog/programLinks.html +++ b/blog/programLinks.html @@ -3,12 +3,12 @@ Introducing Program Links - + - + @@ -122,7 +122,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/programLinks.txt b/blog/programLinks.txt index 5bf44da7a..58723ca5c 100644 --- a/blog/programLinks.txt +++ b/blog/programLinks.txt @@ -54,4 +54,4 @@ But by the HTML spec newlines are not a URL code point and generally are strippe Program Links in Scroll handle encoding newlines and any other special characters so you can focus on your content and not the encoding. -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/scrollInQuestions.html b/blog/scrollInQuestions.html index eeb8af3b9..d2f574f90 100644 --- a/blog/scrollInQuestions.html +++ b/blog/scrollInQuestions.html @@ -3,12 +3,12 @@ Scroll in 50 Questions - + - + @@ -220,7 +220,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/scrollInQuestions.txt b/blog/scrollInQuestions.txt index 7bd61bfb8..539118382 100644 --- a/blog/scrollInQuestions.txt +++ b/blog/scrollInQuestions.txt @@ -271,4 +271,4 @@ Both. ⁂ -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/scrollsets.html b/blog/scrollsets.html index 9d5a89f82..d3a6bd142 100644 --- a/blog/scrollsets.html +++ b/blog/scrollsets.html @@ -3,12 +3,12 @@ ScrollSets: source code for CSVs - + - + @@ -336,7 +336,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/scrollsets.txt b/blog/scrollsets.txt index 373eeb47c..c5a148f03 100644 --- a/blog/scrollsets.txt +++ b/blog/scrollsets.txt @@ -207,4 +207,4 @@ Convert CSVs to ScrollSets 07/09/2024 https://scroll.pub/blog/csvToScrollSet.html -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/search.html b/blog/search.html index c222762e5..f7c93419b 100644 --- a/blog/search.html +++ b/blog/search.html @@ -3,12 +3,12 @@ Search the Official Scroll Blog - + - + @@ -54,115 +54,115 @@ minutes Scroll in 50 Questions -Scroll in 50 Questions ====================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits October 28, 2024 What is Scroll? =============== Scroll is a language for those who believe that what they cannot build with as few pieces as possible they do not understand. What is Scroll? =============== Scroll is a symbolic language. What is a symbolic language. ============================ A language you write with symbols. What is a symbol? ================= A symbol is a mark repeated to correlate to a pattern in nature. What is a mark? =============== A mark is a discoloration of a surface. What is a symbolic language? ============================ A symbolic language is a collection of symbols and symbol sequences that can be used to trigger the same electrical phenomena in the brain of an observer that seeing that pattern occur in nature would trigger. How do I use a symbolic language? ================================= By writing documents. What is a document? =================== It is a collection of marks on a surface. What is Particle Syntax? ======================== It is the syntax that Scroll uses. What is a syntax? ================= It is a set of rules for how to break up a document into symbols. What is a digital document? =========================== It is a file. What is a file? =============== It is a digital representation of a document as a series of bits. What is a bit? ============== A bit is a persistent location in space that has 2 states: a 1 or 0; a true or false; an on or off; a black or white; a hot or cold; a high or low. What is a character? ==================== A character is a 2D mark that maps to a unique fixed length bit sequence. What is a character encoding? ============================= A map of bit sequences to characters. What character encoding does Scroll use? ======================================== UTF8. For now. What is a word? =============== A word is a list of characters delimited by a word delimiter sequence. What is an atom? ================ An atom is another word for word in the Scroll language. What is a line? =============== A line is a sequence of atoms in the Scroll language delimited by a newline sequence. What is a Particle? =================== A particle in Scroll refers to an object that contains both atoms and a collection of particles referred to as the particle's subparticles. Are all particles also subparticles of a higher particle? ========================================================= Yes. What is a Parser? ================= A Parser is a particle that consumes certain other particles to perform transformations. What transformations can a Parser perform? ========================================== A Parser can perform a variety of transformations but the most common are to: - compile one particle in one language to another language. - format a particle into a standardized format - check a particle for errors - evalute the instructions in a particle and return the results - execute commands contained in the particle What is the syntax of Scroll? ============================= The syntax of Scrolls is Particle Syntax, or just Particles for short. What does Particle Syntax do? ============================= Partilces tells you how to divide a binary sequence into parts. What are the components of Particle Syntax? =========================================== - A sequence of binary bits is converted into characters using UTF8 - Atoms are sequences of characters separated by a single space. - Particles are a sequence of atoms separated by a newline. - Subparticles are indicated by a single indented space. How do I make a subparticle? ============================ - Just indent a particle by 1 space more than its parent particle. - For example, because I started this line with one space more than the line above, this line is a subparticle of that line. - And then this line, starting with 2 spaces, is a subparticle of the line above it. - But this line is a subparticle of the line above that starts with "Just" Can I use the Particles, Parsers, and Scroll concepts to design 2D or 3D languages that don't use computers at all? =================================================================================================================== Yes. But generally when we talk about PPS we are talking about the form designed for binary and computers. What is Parsers? ================ Parsers is a symbolic language where one defines Particles that can consume other Particles. It is a language for making other languages. What is Scroll? =============== Scroll is a language made out of Parsers. What is the purpose of the Parsers language? ============================================ The purpose of the Parsers Language is to make Scroll. What is the purpose of Scroll? ============================== The purpose of Scroll is to help humans communicate with humans and machines. How does one use Scroll to communicate? ======================================= By writing Scroll documents (aka Scroll Programs) to create things. What kinds of things is Scroll currently best at creating? ========================================================== Blogs, websites, web pages, charts, animations, data science reports, ebooks, web forms, maps, that sort of thing. Why use Scroll and not just write HTML directly? ================================================ Scroll helps you better understand what you are writing about and anything HTML can make Scroll can make in fewer symbols. Scroll is a language for those who believe that what they cannot build with as few pieces as possible they do not understand. What is ScrollHub? ================== ScrollHub is a super server for creating and publishing websites instantly using Scroll. What is a cue? ============== Cue refers to the first atom in a particle. What is the significance of the cue? ==================================== When communicating you want to communicate the most important information first, so the cue is often the most important information. What is the cue used for? ========================= Most parsers use the cue to determine whether they should consume a particle or not. Can parsers use other ways to match against particles? ====================================================== Yes. What's another commmon way for parsers to match particles? ========================================================== Regular expressions. Can I build Scroll using only Particles and Parsers and no other languages? =========================================================================== Currently no. Parsers does not have enough functionality yet to be able to write parsers that provide everything Scroll needs. What other language do I currently need? ======================================== The primary implementation of Parsers currently is half Parsers, half Javascript. How does Parsers parser Scroll? =============================== The Parsers program is parsed and compiled by a Javascript implementation of Parsers which generates a Parser and compiler for Scroll programs. Do I need to master Javascript to use Parsers? ============================================== If you've mastered Javascript then using Parsers should be easy once you get the hang of it. Does Parsers have inheritance? ============================== Yes. Does Particle Syntax have types? ================================ No. Does Parsers have types? ======================== Yes. Parsers has atom types. Is Scroll like Lisp? ==================== Scroll and Parsers implement many of the best ideas from Lisp, and leave out a lot of bad ideas (like the parens). Is Scroll designed for humans or AIs? ===================================== Both. ⁂ Built with Scroll v149.0.0 +Scroll in 50 Questions ====================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits October 28, 2024 What is Scroll? =============== Scroll is a language for those who believe that what they cannot build with as few pieces as possible they do not understand. What is Scroll? =============== Scroll is a symbolic language. What is a symbolic language. ============================ A language you write with symbols. What is a symbol? ================= A symbol is a mark repeated to correlate to a pattern in nature. What is a mark? =============== A mark is a discoloration of a surface. What is a symbolic language? ============================ A symbolic language is a collection of symbols and symbol sequences that can be used to trigger the same electrical phenomena in the brain of an observer that seeing that pattern occur in nature would trigger. How do I use a symbolic language? ================================= By writing documents. What is a document? =================== It is a collection of marks on a surface. What is Particle Syntax? ======================== It is the syntax that Scroll uses. What is a syntax? ================= It is a set of rules for how to break up a document into symbols. What is a digital document? =========================== It is a file. What is a file? =============== It is a digital representation of a document as a series of bits. What is a bit? ============== A bit is a persistent location in space that has 2 states: a 1 or 0; a true or false; an on or off; a black or white; a hot or cold; a high or low. What is a character? ==================== A character is a 2D mark that maps to a unique fixed length bit sequence. What is a character encoding? ============================= A map of bit sequences to characters. What character encoding does Scroll use? ======================================== UTF8. For now. What is a word? =============== A word is a list of characters delimited by a word delimiter sequence. What is an atom? ================ An atom is another word for word in the Scroll language. What is a line? =============== A line is a sequence of atoms in the Scroll language delimited by a newline sequence. What is a Particle? =================== A particle in Scroll refers to an object that contains both atoms and a collection of particles referred to as the particle's subparticles. Are all particles also subparticles of a higher particle? ========================================================= Yes. What is a Parser? ================= A Parser is a particle that consumes certain other particles to perform transformations. What transformations can a Parser perform? ========================================== A Parser can perform a variety of transformations but the most common are to: - compile one particle in one language to another language. - format a particle into a standardized format - check a particle for errors - evalute the instructions in a particle and return the results - execute commands contained in the particle What is the syntax of Scroll? ============================= The syntax of Scrolls is Particle Syntax, or just Particles for short. What does Particle Syntax do? ============================= Partilces tells you how to divide a binary sequence into parts. What are the components of Particle Syntax? =========================================== - A sequence of binary bits is converted into characters using UTF8 - Atoms are sequences of characters separated by a single space. - Particles are a sequence of atoms separated by a newline. - Subparticles are indicated by a single indented space. How do I make a subparticle? ============================ - Just indent a particle by 1 space more than its parent particle. - For example, because I started this line with one space more than the line above, this line is a subparticle of that line. - And then this line, starting with 2 spaces, is a subparticle of the line above it. - But this line is a subparticle of the line above that starts with "Just" Can I use the Particles, Parsers, and Scroll concepts to design 2D or 3D languages that don't use computers at all? =================================================================================================================== Yes. But generally when we talk about PPS we are talking about the form designed for binary and computers. What is Parsers? ================ Parsers is a symbolic language where one defines Particles that can consume other Particles. It is a language for making other languages. What is Scroll? =============== Scroll is a language made out of Parsers. What is the purpose of the Parsers language? ============================================ The purpose of the Parsers Language is to make Scroll. What is the purpose of Scroll? ============================== The purpose of Scroll is to help humans communicate with humans and machines. How does one use Scroll to communicate? ======================================= By writing Scroll documents (aka Scroll Programs) to create things. What kinds of things is Scroll currently best at creating? ========================================================== Blogs, websites, web pages, charts, animations, data science reports, ebooks, web forms, maps, that sort of thing. Why use Scroll and not just write HTML directly? ================================================ Scroll helps you better understand what you are writing about and anything HTML can make Scroll can make in fewer symbols. Scroll is a language for those who believe that what they cannot build with as few pieces as possible they do not understand. What is ScrollHub? ================== ScrollHub is a super server for creating and publishing websites instantly using Scroll. What is a cue? ============== Cue refers to the first atom in a particle. What is the significance of the cue? ==================================== When communicating you want to communicate the most important information first, so the cue is often the most important information. What is the cue used for? ========================= Most parsers use the cue to determine whether they should consume a particle or not. Can parsers use other ways to match against particles? ====================================================== Yes. What's another commmon way for parsers to match particles? ========================================================== Regular expressions. Can I build Scroll using only Particles and Parsers and no other languages? =========================================================================== Currently no. Parsers does not have enough functionality yet to be able to write parsers that provide everything Scroll needs. What other language do I currently need? ======================================== The primary implementation of Parsers currently is half Parsers, half Javascript. How does Parsers parser Scroll? =============================== The Parsers program is parsed and compiled by a Javascript implementation of Parsers which generates a Parser and compiler for Scroll programs. Do I need to master Javascript to use Parsers? ============================================== If you've mastered Javascript then using Parsers should be easy once you get the hang of it. Does Parsers have inheritance? ============================== Yes. Does Particle Syntax have types? ================================ No. Does Parsers have types? ======================== Yes. Parsers has atom types. Is Scroll like Lisp? ==================== Scroll and Parsers implement many of the best ideas from Lisp, and leave out a lot of bad ideas (like the parens). Is Scroll designed for humans or AIs? ===================================== Both. ⁂ Built with Scroll v150.0.0 10/28/2024 1080 5.4 Web Forms for Geniuses -Web Forms for Geniuses ====================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits October 1, 2024 If you want to make web forms the inefficient way, there are many other places to read how to do that. If you want to learn how geniuses are doing web forms, read on. * One Field at a Time is Retarded =============================== Building forms for one-field-at-a-time data entry is inefficient. People can't copy/paste your forms. E-receipts are a pain. Auto-form fill works poorly. It's a huge waste of your users' time that retards them and your business. And it will always be this way. Entire Form in One Field is Genius ================================== Everything becomes radically simpler. People can do things like copy/paste entire applications; email them; version control them; collaborate on them; all effortlessly. And guess what? You can still also compile to a one-field-at-a-time HTML form and allow users to swap back and forth! It's pure win, no loss. You can use this TODAY! ======================= This now ships in Scroll. Here is a test form. You can also see it in use in many of our products. https://scroll.pub/blog/../tests/forms.html a test form Because this is new technology, it is not for those that need spoon feeding. Believe it or not, making web forms also used to be complicated. (If you need this urgently, don't have time to figure it out yourself, and need to hire professional consulting, feel free to get in touch.) Don't whine. Build. =================== I'm tired of reading all the whiners commenting about how our CSS doesn't look so pretty yet, or the tiny little feature you need that isn't supported. I don't care much to hear from whining losers. I want to hear from winners. From builders. From those who strive for genius. Beautiful designs, autoincrement, auto timestamp, joins, decision trees, all that stuff is coming. The world is gonna love this. If you are a winner, a builder, a genius, join us on GitHub or Reddit. https://github.com/breck7/scroll GitHub https://www.reddit.com/r/WorldWideScroll/ Reddit ⁂ Built with Scroll v149.0.0 +Web Forms for Geniuses ====================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits October 1, 2024 If you want to make web forms the inefficient way, there are many other places to read how to do that. If you want to learn how geniuses are doing web forms, read on. * One Field at a Time is Retarded =============================== Building forms for one-field-at-a-time data entry is inefficient. People can't copy/paste your forms. E-receipts are a pain. Auto-form fill works poorly. It's a huge waste of your users' time that retards them and your business. And it will always be this way. Entire Form in One Field is Genius ================================== Everything becomes radically simpler. People can do things like copy/paste entire applications; email them; version control them; collaborate on them; all effortlessly. And guess what? You can still also compile to a one-field-at-a-time HTML form and allow users to swap back and forth! It's pure win, no loss. You can use this TODAY! ======================= This now ships in Scroll. Here is a test form. You can also see it in use in many of our products. https://scroll.pub/blog/../tests/forms.html a test form Because this is new technology, it is not for those that need spoon feeding. Believe it or not, making web forms also used to be complicated. (If you need this urgently, don't have time to figure it out yourself, and need to hire professional consulting, feel free to get in touch.) Don't whine. Build. =================== I'm tired of reading all the whiners commenting about how our CSS doesn't look so pretty yet, or the tiny little feature you need that isn't supported. I don't care much to hear from whining losers. I want to hear from winners. From builders. From those who strive for genius. Beautiful designs, autoincrement, auto timestamp, joins, decision trees, all that stuff is coming. The world is gonna love this. If you are a winner, a builder, a genius, join us on GitHub or Reddit. https://github.com/breck7/scroll GitHub https://www.reddit.com/r/WorldWideScroll/ Reddit ⁂ Built with Scroll v150.0.0 10/01/2024 369 1.8 The Successor to RSS is Git Clone -The Successor to RSS is Git Clone ================================= by Breck Yunits https://twitter.com/breckyunits Breck Yunits September 2, 2024 Today on HackerNews Kevin Damm had a great idea: put a `<link>` tag on blogs to point to the git Source Code Repository, much as blogs today have `<link>` tags pointing to their RSS feeds. https://news.ycombinator.com/item?id=41427044 great idea I've added this feature to Scroll and it's live now. If you View Source of this page, you'll see: https://scroll.pub/blog/../index.html Scroll ``` ``` Client applications can start looking for and taking advantage of these tags. * RSS was great, but it's no match for Git Clone ============================================== Git clone solves a million problems. You get a copy of the entire works of your favorite authors that is blazing fast, works offline, is searchable, transformable, censorship resistant, auditable, more trustworthy, ad free, tracker free, et cetera. There is no comparison to the old ways of doing things. * What do you think? ================== Have you already been doing this? Are there ways we can make it better? Would love to hear your feedback! ⁂ Notes ===== vladimyr on bluesky dug up a couple of cool examples of prior art. https://bsky.app/profile/vladimyr.bsky.social/post/3l3anievhnm2t vladimyr on bluesky Built with Scroll v149.0.0 +The Successor to RSS is Git Clone ================================= by Breck Yunits https://twitter.com/breckyunits Breck Yunits September 2, 2024 Today on HackerNews Kevin Damm had a great idea: put a `<link>` tag on blogs to point to the git Source Code Repository, much as blogs today have `<link>` tags pointing to their RSS feeds. https://news.ycombinator.com/item?id=41427044 great idea I've added this feature to Scroll and it's live now. If you View Source of this page, you'll see: https://scroll.pub/blog/../index.html Scroll ``` ``` Client applications can start looking for and taking advantage of these tags. * RSS was great, but it's no match for Git Clone ============================================== Git clone solves a million problems. You get a copy of the entire works of your favorite authors that is blazing fast, works offline, is searchable, transformable, censorship resistant, auditable, more trustworthy, ad free, tracker free, et cetera. There is no comparison to the old ways of doing things. * What do you think? ================== Have you already been doing this? Are there ways we can make it better? Would love to hear your feedback! ⁂ Notes ===== vladimyr on bluesky dug up a couple of cool examples of prior art. https://bsky.app/profile/vladimyr.bsky.social/post/3l3anievhnm2t vladimyr on bluesky Built with Scroll v150.0.0 09/02/2024 224 1.1 A New Way to Program -A New Way to Program ==================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits August 30, 2024 Particles, Scroll, and the Parsers Programming Language ======================================================= I've recorded a short video (1 minute version; 10 minute version) about our recent work which has begun to eat the software world. https://www.youtube.com/watch?v=tpJY7PUmBIU 1 minute version https://www.youtube.com/embed/YcnWSNGEHvI?si=p_vOxpt9lusNKgli&t=75s 10 minute version * Outline ======= 1. Is this stuff relevant to you? ================================= Whether you are an experienced, aspiring, or casual programmer, yes. If you are a writer, yes. If you are a thinker, yes. If you are a builder, yes. If you choose to always remain illiterate to keep your brain different than the crowd, then no. (I applaud your brave creative choice and as a scientist I'm curious to see what happens!) 2. What is Particle Syntax (Particles)? ======================================= One liner: a syntax-free syntax for splitting files into particles (separated by line breaks) which can have atoms (separated by spaces) and subparticles (indented lines). Vibe https://particles.scroll.pub Vibe Playground https://sdk.scroll.pub/sandbox/ Playground LeetSheet https://scroll.pub/particlesLeetsheet.html LeetSheet [Image Omitted] width 400 Each line is a particle. Each dot is a atom. Particles lets you easily compare programs and see which one is simpler (less heavy!). 3. What is Scroll? ================== One liner: Scroll is a language for scientists of all ages where you write and combine particles (written in Particles) to evolve and publish your most intelligence ideas to HTML, PDFs, CSVs, JSON files, movie files, audio files, slideshows, charts, books, et cetera. Vibe https://scroll.pub/blog/index.html Vibe Playground https://try.scroll.pub/ Playground LeetSheet https://scroll.pub/leetsheet.html LeetSheet [Image Omitted] width 400 Scroll is a collection of Parsers that allow you to evolve and publish your most intelligent ideas. 4. What is Parsers? =================== One liner: Parsers is a programming language where programmers write parsers (written in Particles) which consume particles (written in Particles) and also contain logic for translating those particles into actions on computing machines. Vibe https://github.com/breck7/scroll/tree/main/parsers Vibe Playground https://sdk.scroll.pub/designer#url%20https%3A%2F%2Ftry.scroll.pub%2Fscroll.parsers Playground LeetSheet https://scroll.pub/parserLeetsheet.html LeetSheet [Image Omitted] width 400 Programmers who understand how computing machines work write Parsers to translate particles into executable machine code. 5. How do you get started? ========================== ScrollHub http://hub.scroll.pub/ ScrollHub Subreddit https://www.reddit.com/r/WorldWideScroll/ Subreddit ⁂ Built with Scroll v149.0.0 +A New Way to Program ==================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits August 30, 2024 Particles, Scroll, and the Parsers Programming Language ======================================================= I've recorded a short video (1 minute version; 10 minute version) about our recent work which has begun to eat the software world. https://www.youtube.com/watch?v=tpJY7PUmBIU 1 minute version https://www.youtube.com/embed/YcnWSNGEHvI?si=p_vOxpt9lusNKgli&t=75s 10 minute version * Outline ======= 1. Is this stuff relevant to you? ================================= Whether you are an experienced, aspiring, or casual programmer, yes. If you are a writer, yes. If you are a thinker, yes. If you are a builder, yes. If you choose to always remain illiterate to keep your brain different than the crowd, then no. (I applaud your brave creative choice and as a scientist I'm curious to see what happens!) 2. What is Particle Syntax (Particles)? ======================================= One liner: a syntax-free syntax for splitting files into particles (separated by line breaks) which can have atoms (separated by spaces) and subparticles (indented lines). Vibe https://particles.scroll.pub Vibe Playground https://sdk.scroll.pub/sandbox/ Playground LeetSheet https://scroll.pub/particlesLeetsheet.html LeetSheet [Image Omitted] width 400 Each line is a particle. Each dot is a atom. Particles lets you easily compare programs and see which one is simpler (less heavy!). 3. What is Scroll? ================== One liner: Scroll is a language for scientists of all ages where you write and combine particles (written in Particles) to evolve and publish your most intelligence ideas to HTML, PDFs, CSVs, JSON files, movie files, audio files, slideshows, charts, books, et cetera. Vibe https://scroll.pub/blog/index.html Vibe Playground https://try.scroll.pub/ Playground LeetSheet https://scroll.pub/leetsheet.html LeetSheet [Image Omitted] width 400 Scroll is a collection of Parsers that allow you to evolve and publish your most intelligent ideas. 4. What is Parsers? =================== One liner: Parsers is a programming language where programmers write parsers (written in Particles) which consume particles (written in Particles) and also contain logic for translating those particles into actions on computing machines. Vibe https://github.com/breck7/scroll/tree/main/parsers Vibe Playground https://sdk.scroll.pub/designer#url%20https%3A%2F%2Ftry.scroll.pub%2Fscroll.parsers Playground LeetSheet https://scroll.pub/parserLeetsheet.html LeetSheet [Image Omitted] width 400 Programmers who understand how computing machines work write Parsers to translate particles into executable machine code. 5. How do you get started? ========================== ScrollHub http://hub.scroll.pub/ ScrollHub Subreddit https://www.reddit.com/r/WorldWideScroll/ Subreddit ⁂ Built with Scroll v150.0.0 08/30/2024 426 2.1 Tables: a microlang for data science -Tables: a microlang for data science ==================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits August 9, 2024 Tables, aka spreadsheets, are arguably the most important _visual_ thought tool. But no one has designed the perfect _textual_ language for manipulating them. Until now. Say hello to Tables =================== Try now https://try.scroll.pub/#scroll%0A%20theme%20gazette%0A%20%0A%20expander%20Presidents%0A%20https%3A%2F%2Fohayo.breckyunits.com%2Fohayo%2Fpackages%2Fsamples%2Fpresidents.csv%0A%20%20groupBy%20Party%0A%20%20%20orderBy%20-count%0A%20%20%20%20printTable%0A%20%20scatterplot%0A%20%20%20x%20number%0A%20%20%20y%20Party%0A%20%20%20fill%20Party%0A%20%0A%20expander%20Elements%0A%20https%3A%2F%2Fohayo.breckyunits.com%2Fohayo%2Fpackages%2Fsamples%2Fperiodic-table.csv%0A%20%20scatterplot%0A%20%20%20x%20Year%0A%20%20%20y%20AtomicNumber%0A%20%20%20fill%20Radioactive%0A%20%20%20symbol%20Metal%0A%20%0A%20%2F%2F%20expander%20Inline%20Data%0A%20table%0A%20%20scatterplot%0A%20%20%20title%20Top%2050%20programming%20language%20projects%20on%20GitHub.%0A%20%20%20x%20appeared%0A%20%20%20y%20rank%0A%20%20%20radius%20githubStars%0A%20%20%20label%20name%0A%20%20orderBy%20appeared%0A%20%20%20sparkline%0A%20%20%20%20y%20githubStars%0A%20%20%20%20color%20green%0A%20%20%20select%20name%20githubStars%0A%20%20%20%20heatrix%0A%20%20data%0A%20%20%20rank%2Cname%2Cappeared%2CgithubStars%0A%20%20%203%2CPython%2C1991%2C61378%0A%20%20%204%2CJava%2C1995%2C19037%0A%20%20%208%2CPerl%2C1987%2C1886%0A%20%20%209%2CRuby%2C1995%2C21790%0A%20%20%2010%2CPHP%2C1995%2C37688%0A%20%20%2013%2CGo%2C2009%2C121611%0A%20%20%2014%2CTypeScript%2C2012%2C99410%0A%20%20%2018%2CPowerShell%2C2006%2C44220%0A%20%20%2020%2CRust%2C2010%2C95455%0A%20%20%2021%2CSwift%2C2014%2C67064%0A%20%20%2025%2CKotlin%2C2011%2C48462%0A%20%20%2027%2CClojure%2C2007%2C10392%0A%20%20%2028%2CCoffeeScript%2C2009%2C16466%0A%20%20%2029%2CElixir%2C2011%2C24093%0A%20%20%2030%2CErlang%2C1986%2C11203%0A%20%20%2034%2CJulia%2C2012%2C45137%0A%20%20%2041%2CRacket%2C1994%2C4741%0A%20%20%2042%2CSolidity%2C2014%2C22794%0A%20%20%2043%2CWebAssembly%2C2015%2C6621%0A%20%20%2045%2CZig%2C2015%2C32864%0A%20%20%2047%2CNim%2C2008%2C16308%0A%20%20%2050%2CTOML%2C2013%2C19332 Try now ⁂ Acknowledgements ================ Tables evolved over the past decade primarily by: - just doing what Hadley Wickham did in dplyr https://dplyr.tidyverse.org/ dplyr https://hadley.nz/ Hadley Wickham - using Mike Bostock's d3 under the hood https://bost.ocks.org/mike/ Mike Bostock https://d3js.org/ d3 - reading all of Jeffrey Heer's papers https://homes.cs.washington.edu/~jheer/ Jeffrey Heer - thinking about what would be the best tool for Max Roser and Hannah Ritchie. https://ourworldindata.org/ Max Roser and Hannah Ritchie Built with Scroll v149.0.0 +Tables: a microlang for data science ==================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits August 9, 2024 Tables, aka spreadsheets, are arguably the most important _visual_ thought tool. But no one has designed the perfect _textual_ language for manipulating them. Until now. Say hello to Tables =================== Try now https://try.scroll.pub/#scroll%0A%20theme%20gazette%0A%20%0A%20expander%20Presidents%0A%20https%3A%2F%2Fohayo.breckyunits.com%2Fohayo%2Fpackages%2Fsamples%2Fpresidents.csv%0A%20%20groupBy%20Party%0A%20%20%20orderBy%20-count%0A%20%20%20%20printTable%0A%20%20scatterplot%0A%20%20%20x%20number%0A%20%20%20y%20Party%0A%20%20%20fill%20Party%0A%20%0A%20expander%20Elements%0A%20https%3A%2F%2Fohayo.breckyunits.com%2Fohayo%2Fpackages%2Fsamples%2Fperiodic-table.csv%0A%20%20scatterplot%0A%20%20%20x%20Year%0A%20%20%20y%20AtomicNumber%0A%20%20%20fill%20Radioactive%0A%20%20%20symbol%20Metal%0A%20%0A%20%2F%2F%20expander%20Inline%20Data%0A%20table%0A%20%20scatterplot%0A%20%20%20title%20Top%2050%20programming%20language%20projects%20on%20GitHub.%0A%20%20%20x%20appeared%0A%20%20%20y%20rank%0A%20%20%20radius%20githubStars%0A%20%20%20label%20name%0A%20%20orderBy%20appeared%0A%20%20%20sparkline%0A%20%20%20%20y%20githubStars%0A%20%20%20%20color%20green%0A%20%20%20select%20name%20githubStars%0A%20%20%20%20heatrix%0A%20%20data%0A%20%20%20rank%2Cname%2Cappeared%2CgithubStars%0A%20%20%203%2CPython%2C1991%2C61378%0A%20%20%204%2CJava%2C1995%2C19037%0A%20%20%208%2CPerl%2C1987%2C1886%0A%20%20%209%2CRuby%2C1995%2C21790%0A%20%20%2010%2CPHP%2C1995%2C37688%0A%20%20%2013%2CGo%2C2009%2C121611%0A%20%20%2014%2CTypeScript%2C2012%2C99410%0A%20%20%2018%2CPowerShell%2C2006%2C44220%0A%20%20%2020%2CRust%2C2010%2C95455%0A%20%20%2021%2CSwift%2C2014%2C67064%0A%20%20%2025%2CKotlin%2C2011%2C48462%0A%20%20%2027%2CClojure%2C2007%2C10392%0A%20%20%2028%2CCoffeeScript%2C2009%2C16466%0A%20%20%2029%2CElixir%2C2011%2C24093%0A%20%20%2030%2CErlang%2C1986%2C11203%0A%20%20%2034%2CJulia%2C2012%2C45137%0A%20%20%2041%2CRacket%2C1994%2C4741%0A%20%20%2042%2CSolidity%2C2014%2C22794%0A%20%20%2043%2CWebAssembly%2C2015%2C6621%0A%20%20%2045%2CZig%2C2015%2C32864%0A%20%20%2047%2CNim%2C2008%2C16308%0A%20%20%2050%2CTOML%2C2013%2C19332 Try now ⁂ Acknowledgements ================ Tables evolved over the past decade primarily by: - just doing what Hadley Wickham did in dplyr https://dplyr.tidyverse.org/ dplyr https://hadley.nz/ Hadley Wickham - using Mike Bostock's d3 under the hood https://bost.ocks.org/mike/ Mike Bostock https://d3js.org/ d3 - reading all of Jeffrey Heer's papers https://homes.cs.washington.edu/~jheer/ Jeffrey Heer - thinking about what would be the best tool for Max Roser and Hannah Ritchie. https://ourworldindata.org/ Max Roser and Hannah Ritchie Built with Scroll v150.0.0 08/09/2024 479 2.4 Build Your Own Counters With 3 Words -Build Your Own Counters With 3 Words ==================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits August 2, 2024 I like collections of interesting numbers, such as BioNumbers. Animated counters provide a useful perspective when pondering large numbers. I wanted to make it as easy as possible for anyone to create these counters. https://bionumbers.hms.harvard.edu/Search.aspx?task=searchbypop BioNumbers So, today I added a new parser to Scroll: *counter*. ``` counter 1.1 Heartbeats ``` * Try now https://try.scroll.pub/#scroll%0A%20theme%20gazette%0A%20%0A%20%23%20Show%20HN%3A%20Make%20a%20counter%20with%203%20words%0A%20%0A%20New%20in%20Scroll%20v112.1.0.%20Read%20more.%0A%20%20https%3A%2F%2Fscroll.pub%2Fblog%2Fcounters.html%20Read%20more.%0A%20%0A%20code%0A%20%20counter%20%5BRate%2FSecond%5D%20%5BDescription%5D%0A%20%0A%20%23%20Since%20you%20loaded%20this%20page...%0A%20%0A%20thinColumns%0A%20%0A%20%23%23%20World%20Population%0A%20counter%204.5%20Babies%20Born%0A%20%20https%3A%2F%2Fourworldindata.org%2Fbirths-and-deaths%0A%20counter%201.7%20Human%20Deaths%0A%20%20https%3A%2F%2Fourworldindata.org%2Fbirths-and-deaths%0A%20counter%208123456789%20heart%20beats%0A%20%20https%3A%2F%2Fourworldindata.org%2Fgrapher%2Fpopulation%0A%20%0A%20%23%23%20In%20Your%20Body%0A%20counter%203112123%20Red%20Blood%20Cells%20Made%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fbooks%2FNBK2263%2F%0A%20counter%203812123%20Cells%20Made%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fbooks%2FNBK2263%2F%0A%20counter%202123456789123456789123%20ATP%20molecules%20made%0A%20%20https%3A%2F%2Fbio.libretexts.org%2FBookshelves%2FHuman_Biology%2FHuman_Biology_(Wakim_and_Grewal)%2F05%253A_Cells%2F5.09%253A_Cellular_Respiration%0A%20%0A%20%23%23%20In%20Your%20Brain%0A%20counter%201.2e12%20Action%20Potentials%20Fired%0A%20%20https%3A%2F%2Fwww.khanacademy.org%2Ftest-prep%2Fmcat%2Forgan-systems%2Fneural-synapses%2Fa%2Fsignal-propagation-the-movement-of-signals-between-neurons%0A%20counter%203.64e18%20Ketones%20Consumed%20(Ketosis)%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fpmc%2Farticles%2FPMC7699472%2F%0A%20counter%204.64e18%20Glucose%20Molecules%20Consumed%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fpmc%2Farticles%2FPMC3900881%2F%0A%20%0A%20%23%23%20World%20Economy%0A%20counter%202.5%20Cars%20Made%0A%20%20https%3A%2F%2Fwww.statista.com%2Fstatistics%2F262747%2Fworldwide-automobile-production-since-2000%2F%0A%20counter%2026012%20Cups%20of%20Coffee%20Consumed%0A%20%20https%3A%2F%2Fwww.rgare.com%2Fknowledge-center%2Farticle%2Fcoffee-consumption-how-much-is-too-much-and-how-little-is-not-enough%0A%20counter%2059321%20YouTubes%20Watched%0A%20%20https%3A%2F%2Fthesocialshepherd.com%2Fblog%2Fyoutube-statistics%0A%20%0A%20%23%23%20Flight%0A%20counter%200.00008%20Objects%20Launched%20into%20Space%0A%20%20https%3A%2F%2Fourworldindata.org%2Fgrapher%2Fyearly-number-of-objects-launched-into-outer-space%0A%20counter%200.00004%20Planes%20Built%0A%20%20https%3A%2F%2Fwww.ibisworld.com%2Fglobal%2Fmarket-research-reports%2Fglobal-commercial-aircraft-manufacturing-industry%2F%0A%20counter%201.17%20Planes%20Landed%0A%20%20https%3A%2F%2Fwww.faa.gov%2Fair_traffic%2Fby_the_numbers%0A%20%0A%20%23%23%20Animals%0A%20counter%200.00004%20Blue%20Whales%20Born%0A%20%20https%3A%2F%2Fwww.marinemammalcenter.org%2Fanimal-care%2Flearn-about-marine-mammals%2Fcetaceans%2Fblue-whale%0A%20counter%200.001%20Elephants%20Born%0A%20%20https%3A%2F%2Felephantconservation.org%2Fabout-elephants%2F25-things-to-know%2F%0A%20counter%203.1e10%20Ants%20Born%0A%20%20https%3A%2F%2Fprivateexterminator.com%2Fare-all-the-ants-as-heavy-as-all-the-humans%0A%20 Try now =================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== * Since you loaded this page... ============================= World Population ================ 4.5 Babies Born https://ourworldindata.org/births-and-deaths 4.5 Babies Born 1.7 Human Deaths https://ourworldindata.org/births-and-deaths 1.7 Human Deaths 8123456789 heart beats https://ourworldindata.org/grapher/population 8123456789 heart beats In Your Body ============ 3112123 Red Blood Cells Made https://www.ncbi.nlm.nih.gov/books/NBK2263/ 3112123 Red Blood Cells Made 3812123 Cells Made https://www.ncbi.nlm.nih.gov/books/NBK2263/ 3812123 Cells Made 2123456789123456789123 ATP molecules made https://bio.libretexts.org/Bookshelves/Human_Biology/Human_Biology_(Wakim_and_Grewal)/05%3A_Cells/5.09%3A_Cellular_Respiration 2123456789123456789123 ATP molecules made In Your Brain ============= 1.2e12 Action Potentials Fired https://www.khanacademy.org/test-prep/mcat/organ-systems/neural-synapses/a/signal-propagation-the-movement-of-signals-between-neurons 1.2e12 Action Potentials Fired 3.64e18 Ketones Consumed (Ketosis) https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7699472/ 3.64e18 Ketones Consumed (Ketosis) 4.64e18 Glucose Molecules Consumed https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3900881/ 4.64e18 Glucose Molecules Consumed World Economy ============= 2.5 Cars Made https://www.statista.com/statistics/262747/worldwide-automobile-production-since-2000/ 2.5 Cars Made 26012 Cups of Coffee Consumed https://www.rgare.com/knowledge-center/article/coffee-consumption-how-much-is-too-much-and-how-little-is-not-enough 26012 Cups of Coffee Consumed 59321 YouTubes Watched https://thesocialshepherd.com/blog/youtube-statistics 59321 YouTubes Watched Flight ====== 0.00008 Objects Launched into Space https://ourworldindata.org/grapher/yearly-number-of-objects-launched-into-outer-space 0.00008 Objects Launched into Space 0.00004 Planes Built https://www.ibisworld.com/global/market-research-reports/global-commercial-aircraft-manufacturing-industry/ 0.00004 Planes Built 1.17 Planes Landed https://www.faa.gov/air_traffic/by_the_numbers 1.17 Planes Landed Animals ======= 0.00004 Blue Whales Born https://www.marinemammalcenter.org/animal-care/learn-about-marine-mammals/cetaceans/blue-whale 0.00004 Blue Whales Born 0.001 Elephants Born https://elephantconservation.org/about-elephants/25-things-to-know/ 0.001 Elephants Born 3.1e10 Ants Born https://privateexterminator.com/are-all-the-ants-as-heavy-as-all-the-humans 3.1e10 Ants Born Computer Chips ============== 66.7 CPUS made by Intel https://www.intel.com/content/www/us/en/architecture-and-technology/global-manufacturing.html 66.7 CPUS made by Intel 6234556543 Transistors made by Nvidia https://nvidianews.nvidia.com/news/nvidia-announces-hopper-architecture-the-next-generation-of-accelerated-computing 6234556543 Transistors made by Nvidia 61234556543 Transistors made by Intel https://www.intel.com/content/www/us/en/history/museum-transistors-to-transformations-brochure.html 61234556543 Transistors made by Intel ⁂ Built with Scroll v149.0.0 +Build Your Own Counters With 3 Words ==================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits August 2, 2024 I like collections of interesting numbers, such as BioNumbers. Animated counters provide a useful perspective when pondering large numbers. I wanted to make it as easy as possible for anyone to create these counters. https://bionumbers.hms.harvard.edu/Search.aspx?task=searchbypop BioNumbers So, today I added a new parser to Scroll: *counter*. ``` counter 1.1 Heartbeats ``` * Try now https://try.scroll.pub/#scroll%0A%20theme%20gazette%0A%20%0A%20%23%20Show%20HN%3A%20Make%20a%20counter%20with%203%20words%0A%20%0A%20New%20in%20Scroll%20v112.1.0.%20Read%20more.%0A%20%20https%3A%2F%2Fscroll.pub%2Fblog%2Fcounters.html%20Read%20more.%0A%20%0A%20code%0A%20%20counter%20%5BRate%2FSecond%5D%20%5BDescription%5D%0A%20%0A%20%23%20Since%20you%20loaded%20this%20page...%0A%20%0A%20thinColumns%0A%20%0A%20%23%23%20World%20Population%0A%20counter%204.5%20Babies%20Born%0A%20%20https%3A%2F%2Fourworldindata.org%2Fbirths-and-deaths%0A%20counter%201.7%20Human%20Deaths%0A%20%20https%3A%2F%2Fourworldindata.org%2Fbirths-and-deaths%0A%20counter%208123456789%20heart%20beats%0A%20%20https%3A%2F%2Fourworldindata.org%2Fgrapher%2Fpopulation%0A%20%0A%20%23%23%20In%20Your%20Body%0A%20counter%203112123%20Red%20Blood%20Cells%20Made%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fbooks%2FNBK2263%2F%0A%20counter%203812123%20Cells%20Made%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fbooks%2FNBK2263%2F%0A%20counter%202123456789123456789123%20ATP%20molecules%20made%0A%20%20https%3A%2F%2Fbio.libretexts.org%2FBookshelves%2FHuman_Biology%2FHuman_Biology_(Wakim_and_Grewal)%2F05%253A_Cells%2F5.09%253A_Cellular_Respiration%0A%20%0A%20%23%23%20In%20Your%20Brain%0A%20counter%201.2e12%20Action%20Potentials%20Fired%0A%20%20https%3A%2F%2Fwww.khanacademy.org%2Ftest-prep%2Fmcat%2Forgan-systems%2Fneural-synapses%2Fa%2Fsignal-propagation-the-movement-of-signals-between-neurons%0A%20counter%203.64e18%20Ketones%20Consumed%20(Ketosis)%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fpmc%2Farticles%2FPMC7699472%2F%0A%20counter%204.64e18%20Glucose%20Molecules%20Consumed%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fpmc%2Farticles%2FPMC3900881%2F%0A%20%0A%20%23%23%20World%20Economy%0A%20counter%202.5%20Cars%20Made%0A%20%20https%3A%2F%2Fwww.statista.com%2Fstatistics%2F262747%2Fworldwide-automobile-production-since-2000%2F%0A%20counter%2026012%20Cups%20of%20Coffee%20Consumed%0A%20%20https%3A%2F%2Fwww.rgare.com%2Fknowledge-center%2Farticle%2Fcoffee-consumption-how-much-is-too-much-and-how-little-is-not-enough%0A%20counter%2059321%20YouTubes%20Watched%0A%20%20https%3A%2F%2Fthesocialshepherd.com%2Fblog%2Fyoutube-statistics%0A%20%0A%20%23%23%20Flight%0A%20counter%200.00008%20Objects%20Launched%20into%20Space%0A%20%20https%3A%2F%2Fourworldindata.org%2Fgrapher%2Fyearly-number-of-objects-launched-into-outer-space%0A%20counter%200.00004%20Planes%20Built%0A%20%20https%3A%2F%2Fwww.ibisworld.com%2Fglobal%2Fmarket-research-reports%2Fglobal-commercial-aircraft-manufacturing-industry%2F%0A%20counter%201.17%20Planes%20Landed%0A%20%20https%3A%2F%2Fwww.faa.gov%2Fair_traffic%2Fby_the_numbers%0A%20%0A%20%23%23%20Animals%0A%20counter%200.00004%20Blue%20Whales%20Born%0A%20%20https%3A%2F%2Fwww.marinemammalcenter.org%2Fanimal-care%2Flearn-about-marine-mammals%2Fcetaceans%2Fblue-whale%0A%20counter%200.001%20Elephants%20Born%0A%20%20https%3A%2F%2Felephantconservation.org%2Fabout-elephants%2F25-things-to-know%2F%0A%20counter%203.1e10%20Ants%20Born%0A%20%20https%3A%2F%2Fprivateexterminator.com%2Fare-all-the-ants-as-heavy-as-all-the-humans%0A%20 Try now =================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== * Since you loaded this page... ============================= World Population ================ 4.5 Babies Born https://ourworldindata.org/births-and-deaths 4.5 Babies Born 1.7 Human Deaths https://ourworldindata.org/births-and-deaths 1.7 Human Deaths 8123456789 heart beats https://ourworldindata.org/grapher/population 8123456789 heart beats In Your Body ============ 3112123 Red Blood Cells Made https://www.ncbi.nlm.nih.gov/books/NBK2263/ 3112123 Red Blood Cells Made 3812123 Cells Made https://www.ncbi.nlm.nih.gov/books/NBK2263/ 3812123 Cells Made 2123456789123456789123 ATP molecules made https://bio.libretexts.org/Bookshelves/Human_Biology/Human_Biology_(Wakim_and_Grewal)/05%3A_Cells/5.09%3A_Cellular_Respiration 2123456789123456789123 ATP molecules made In Your Brain ============= 1.2e12 Action Potentials Fired https://www.khanacademy.org/test-prep/mcat/organ-systems/neural-synapses/a/signal-propagation-the-movement-of-signals-between-neurons 1.2e12 Action Potentials Fired 3.64e18 Ketones Consumed (Ketosis) https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7699472/ 3.64e18 Ketones Consumed (Ketosis) 4.64e18 Glucose Molecules Consumed https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3900881/ 4.64e18 Glucose Molecules Consumed World Economy ============= 2.5 Cars Made https://www.statista.com/statistics/262747/worldwide-automobile-production-since-2000/ 2.5 Cars Made 26012 Cups of Coffee Consumed https://www.rgare.com/knowledge-center/article/coffee-consumption-how-much-is-too-much-and-how-little-is-not-enough 26012 Cups of Coffee Consumed 59321 YouTubes Watched https://thesocialshepherd.com/blog/youtube-statistics 59321 YouTubes Watched Flight ====== 0.00008 Objects Launched into Space https://ourworldindata.org/grapher/yearly-number-of-objects-launched-into-outer-space 0.00008 Objects Launched into Space 0.00004 Planes Built https://www.ibisworld.com/global/market-research-reports/global-commercial-aircraft-manufacturing-industry/ 0.00004 Planes Built 1.17 Planes Landed https://www.faa.gov/air_traffic/by_the_numbers 1.17 Planes Landed Animals ======= 0.00004 Blue Whales Born https://www.marinemammalcenter.org/animal-care/learn-about-marine-mammals/cetaceans/blue-whale 0.00004 Blue Whales Born 0.001 Elephants Born https://elephantconservation.org/about-elephants/25-things-to-know/ 0.001 Elephants Born 3.1e10 Ants Born https://privateexterminator.com/are-all-the-ants-as-heavy-as-all-the-humans 3.1e10 Ants Born Computer Chips ============== 66.7 CPUS made by Intel https://www.intel.com/content/www/us/en/architecture-and-technology/global-manufacturing.html 66.7 CPUS made by Intel 6234556543 Transistors made by Nvidia https://nvidianews.nvidia.com/news/nvidia-announces-hopper-architecture-the-next-generation-of-accelerated-computing 6234556543 Transistors made by Nvidia 61234556543 Transistors made by Intel https://www.intel.com/content/www/us/en/history/museum-transistors-to-transformations-brochure.html 61234556543 Transistors made by Intel ⁂ Built with Scroll v150.0.0 08/02/2024 1026 5.1 Heatrix: Heat Maps + Matrix Visualizations -Heatrix: Heat Maps + Matrix Visualizations ========================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits [Image Omitted] A heatrix on CancerDB. https://cancerdb.com/blog/cancer-heatmaps.html A heatrix on CancerDB. July 28, 2024 Do you love those GitHub Activity Charts and want to make your own but don't know what they are called or what library to use and your work is busy and you have kids and sorry I'll call you back someone is crying? Introducing Scroll's newest parser: `heatrix`! https://scroll.pub/blog/../index.html Scroll's Try Now | Watch Video https://try.scroll.pub/#scroll%0A%20%23%20Heatrix%20Demos%0A%20%0A%20%23%23%20Adjust%20the%20height%2Fwidth%20of%20individual%20cells%2C%20columns%2C%20or%20rows%3A%0A%20heatrix%0A%20%20h20%3BScroll%20h20%3BPLDB%0A%20%20400%20700%0A%20%0A%20%23%23%20Add%20links%3A%0A%20heatrix%0A%20%20h20%3BScroll%3Bhttps%3A%2F%2Fscroll.pub%20h20%3BPLDB%3Bhttps%3A%2F%2Fpldb.io%0A%20%20400%20700%0A%20%0A%20%23%23%20Use%20numbers%20as%20labels%3A%0A%20heatrix%0A%20%20'2021%20'2017%0A%20%20400%20700%0A%20%0A%20%23%23%20Use%20your%20own%20custom%20color%20palettes%20and%20set%20your%20own%20thresholds%3A%0A%20heatrixAdvanced%0A%20%20table%0A%20%20%20%20%0A%20%20%20h10%3Bw30%20'2015%20'2016%20'2017%20'2018%20'2019%20'2020%20'2021%20'2022%20'2023%20'2024%0A%20%20%20h30%3Bw30%3B%200%200%205%201%202%2011%2015%2010%2012%2056%0A%20%20scale%0A%20%20%20%23ffebee%200%0A%20%20%20%23ffcdd2%201%0A%20%20%20%23ef9a9a%205%0A%20%20%20%23e57373%2010%0A%20%20%20%23ef5350%2025%0A%20%20%20%23b71c1c%2050 Try Now https://www.youtube.com/watch?v=ycF3k63qn1Y Watch Video ========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================= `heatrix` let's you craft custom heatmap visualizations with the fewest keystrokes possible. Heat Map + Matrix = Heatrix =========================== [Image Omitted] Source code. Gif made with CleanShotX. https://try.scroll.pub/#scroll%0A%20heatrix%0A%20%208%206%207%205%0A%20%2030%209 Source code https://cleanshot.com/ CleanShotX * Not just a library, it's a microlanguage! ========================================= `heatrix` is a microlang that let's you customize your visualizations using "directives": Adjust the height/width of individual cells, columns, or rows: ============================================================== Add links: ========== Add labels: =========== Use numbers as labels: ====================== Use your own custom color palettes and set your own thresholds: =============================================================== * Like Heatrix? There's more where that came from! ================================================ Join the World Wide Scroll Beta today! ====================================== If you like `heatrix` and want to see more stuff like this, but a folder on the World Wide Scroll beta and good things will come your way: https://wws.scroll.pub/ World Wide Scroll beta ⁂ Built with Scroll v149.0.0 +Heatrix: Heat Maps + Matrix Visualizations ========================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits [Image Omitted] A heatrix on CancerDB. https://cancerdb.com/blog/cancer-heatmaps.html A heatrix on CancerDB. July 28, 2024 Do you love those GitHub Activity Charts and want to make your own but don't know what they are called or what library to use and your work is busy and you have kids and sorry I'll call you back someone is crying? Introducing Scroll's newest parser: `heatrix`! https://scroll.pub/blog/../index.html Scroll's Try Now | Watch Video https://try.scroll.pub/#scroll%0A%20%23%20Heatrix%20Demos%0A%20%0A%20%23%23%20Adjust%20the%20height%2Fwidth%20of%20individual%20cells%2C%20columns%2C%20or%20rows%3A%0A%20heatrix%0A%20%20h20%3BScroll%20h20%3BPLDB%0A%20%20400%20700%0A%20%0A%20%23%23%20Add%20links%3A%0A%20heatrix%0A%20%20h20%3BScroll%3Bhttps%3A%2F%2Fscroll.pub%20h20%3BPLDB%3Bhttps%3A%2F%2Fpldb.io%0A%20%20400%20700%0A%20%0A%20%23%23%20Use%20numbers%20as%20labels%3A%0A%20heatrix%0A%20%20'2021%20'2017%0A%20%20400%20700%0A%20%0A%20%23%23%20Use%20your%20own%20custom%20color%20palettes%20and%20set%20your%20own%20thresholds%3A%0A%20heatrixAdvanced%0A%20%20table%0A%20%20%20%20%0A%20%20%20h10%3Bw30%20'2015%20'2016%20'2017%20'2018%20'2019%20'2020%20'2021%20'2022%20'2023%20'2024%0A%20%20%20h30%3Bw30%3B%200%200%205%201%202%2011%2015%2010%2012%2056%0A%20%20scale%0A%20%20%20%23ffebee%200%0A%20%20%20%23ffcdd2%201%0A%20%20%20%23ef9a9a%205%0A%20%20%20%23e57373%2010%0A%20%20%20%23ef5350%2025%0A%20%20%20%23b71c1c%2050 Try Now https://www.youtube.com/watch?v=ycF3k63qn1Y Watch Video ========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================= `heatrix` let's you craft custom heatmap visualizations with the fewest keystrokes possible. Heat Map + Matrix = Heatrix =========================== [Image Omitted] Source code. Gif made with CleanShotX. https://try.scroll.pub/#scroll%0A%20heatrix%0A%20%208%206%207%205%0A%20%2030%209 Source code https://cleanshot.com/ CleanShotX * Not just a library, it's a microlanguage! ========================================= `heatrix` is a microlang that let's you customize your visualizations using "directives": Adjust the height/width of individual cells, columns, or rows: ============================================================== Add links: ========== Add labels: =========== Use numbers as labels: ====================== Use your own custom color palettes and set your own thresholds: =============================================================== * Like Heatrix? There's more where that came from! ================================================ Join the World Wide Scroll Beta today! ====================================== If you like `heatrix` and want to see more stuff like this, but a folder on the World Wide Scroll beta and good things will come your way: https://wws.scroll.pub/ World Wide Scroll beta ⁂ Built with Scroll v150.0.0 07/28/2024 467 2.3 Contacts: A Microlang for Managing Contacts -Contacts: A Microlang for Managing Contacts =========================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits July 16, 2024 Imagine a single plain text file named `contacts.scroll` where you stored the contact info for your family, friends, and colleagues, and you could track changes with git, compile it to a beautiful PDF or HTML page with search and sort, and it would also compile to CSV and/or JSON for import into iPhone, Android, Gmail, Outlook, et cetera? Also imagine that this tool is free, open source, and public domain. * Introducing *Contacts*, a microlanguage (currently 23 lines of code, including comments) that makes it as concise as possible to add, prune, display, print and export your contacts. https://github.com/breck7/scroll/blob/main/microlangs/contacts.parsers 23 lines of code * There's almost nothing to learn (the code is self-explanatory). In fact, it's almost guaranteed that using Contacts you will need to write less (we've taken every unnecessary character out). * Example ======= ``` 👤 Jack Doe phone +1 (555) 123-4567 email john.doe@example.com birthday 2/23/84 notes Daughter - Samantha. 👤 Jill Smith phone +1 (555) 123-4562 email jill@gmail.com birthday 1/23/80 ``` * How to use ========== 1. Create a file named something like `contacts.scroll` with this content: ``` // You can import the file, or just copy/paste the 21 lines of code here. [pathToScroll]/microlangs/contacts.parser title My Contacts buildConcepts contacts.csv contacts.json contacts.tsv buildHtml theme gazette mediumColumns 1 printTitle table printTable tableSearch 👤 Jack Doe phone +1 (555) 123-4567 email john.doe@example.com birthday 2/23/84 notes Daughter - Samantha. 👤 Jill Smith phone +1 (555) 123-4562 email jill@gmail.com birthday 1/23/80 ``` 2. Run `scroll build` Done! You should now see a contacts.html file for display and printing as well as TSV, CSV, and JSON files. https://scroll.pub/blog/../tests/contacts.html contacts.html * [Image Omitted] Contacts is interoperable with pen and paper. * What do you think? Anything that should be added/removed/improved? * Notes ===== 1. The idea for Contacts was sparked by this tweet from Tyler Tringas. https://x.com/tylertringas/status/1813239718957461528 this tweet from Tyler Tringas ⁂ Built with Scroll v149.0.0 +Contacts: A Microlang for Managing Contacts =========================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits July 16, 2024 Imagine a single plain text file named `contacts.scroll` where you stored the contact info for your family, friends, and colleagues, and you could track changes with git, compile it to a beautiful PDF or HTML page with search and sort, and it would also compile to CSV and/or JSON for import into iPhone, Android, Gmail, Outlook, et cetera? Also imagine that this tool is free, open source, and public domain. * Introducing *Contacts*, a microlanguage (currently 23 lines of code, including comments) that makes it as concise as possible to add, prune, display, print and export your contacts. https://github.com/breck7/scroll/blob/main/microlangs/contacts.parsers 23 lines of code * There's almost nothing to learn (the code is self-explanatory). In fact, it's almost guaranteed that using Contacts you will need to write less (we've taken every unnecessary character out). * Example ======= ``` 👤 Jack Doe phone +1 (555) 123-4567 email john.doe@example.com birthday 2/23/84 notes Daughter - Samantha. 👤 Jill Smith phone +1 (555) 123-4562 email jill@gmail.com birthday 1/23/80 ``` * How to use ========== 1. Create a file named something like `contacts.scroll` with this content: ``` // You can import the file, or just copy/paste the 21 lines of code here. [pathToScroll]/microlangs/contacts.parser title My Contacts buildConcepts contacts.csv contacts.json contacts.tsv buildHtml theme gazette mediumColumns 1 printTitle table printTable tableSearch 👤 Jack Doe phone +1 (555) 123-4567 email john.doe@example.com birthday 2/23/84 notes Daughter - Samantha. 👤 Jill Smith phone +1 (555) 123-4562 email jill@gmail.com birthday 1/23/80 ``` 2. Run `scroll build` Done! You should now see a contacts.html file for display and printing as well as TSV, CSV, and JSON files. https://scroll.pub/blog/../tests/contacts.html contacts.html * [Image Omitted] Contacts is interoperable with pen and paper. * What do you think? Anything that should be added/removed/improved? * Notes ===== 1. The idea for Contacts was sparked by this tweet from Tyler Tringas. https://x.com/tylertringas/status/1813239718957461528 this tweet from Tyler Tringas ⁂ Built with Scroll v150.0.0 07/16/2024 371 1.9 How I Designed Helpful 404's and Stopped Worrying about Broken Links -How I Designed Helpful 404's and Stopped Worrying about Broken Links ==================================================================== by Breck Yunits https://breckyunits.com Breck Yunits July 12, 2024 _Woohoo!_ Your blog is on top of Reddit! _OH NO._ There's a typo in your url. 🤦 *What do you do?* * You try to calm yourself down. _Almost no one looks at the url and the content of the article is what's important and the traffic is coming_ But then you think _all I can see is that i before e after c!_ But then you think _is that *really* a rule_ and _maybe that's how it's spelled in London?_ * You can't help yourself. It's an affront to your craftsmanship to not correct the bad filename. You know you can so easily rename the file but then existing links will break and so you'll have to add redirects but that means more files to maintain or god forbid that would require adding a server and you just love your static blog and it's almost 2pm and you have to leave and pick up the kids from school what do you do!?!! Or do you just break the links and going forward everyone will have the proper URL but everyone who clicks the old links will see an unhelpful 404 and you reflect on how great this thing that Tim Berners-Lee gave to the world is and how could you litter his creation with unhelpful 404s? * If the story above resonates with you, the bad news is you may suffer from Broken Link Phobia. Luckily, there is now a cure. * Introducing: Helpful 404's - never worry about broken links again! ================================================================== Scroll now comes with a way to generate a very helpful 404 page so your visitors will get redirected to the right place even if the URL they clicked is off by a few characters. The best part? It works entirely client side on static sites. How to use ========== *Step 1* Create a sitemap: ```sitemap.scroll buildTxt sitemap.txt baseUrl https://scroll.pub/ printSiteMap ``` *Step 2* Create a 404 page: ```404.scroll buildHtml Sorry, the url you requested was not found. helpfulNotFound sitemap.txt ``` That's it! The `helpfulNotFound` parser in Scroll will add Javascript to the 404 page that fetches all the urls found in the sitemap and shows the user the closest match. As a bonus, you also get a `sitemap.txt` file great for Google SEO and other uses. See it in action here by clicking on this intentionally broken link: https://scroll.pub/blog/helpful_404s.html intentionally broken link * I've been using Helpful 404s on all my sites for the past couple of months and it's been delightful. I no longer spend any time worrying about making improvements to URLS. I just do it and I know that users following old links will still have a good experience. * If you like stuff like Helpful 404's, there's _a lot_ more like that in Scroll, which is public domain and open source. Try it today, and if you like what we are doing please consider bringing your site to the World Wide Scroll! https://wws.scroll.pub World Wide Scroll ⁂ Built with Scroll v149.0.0 +How I Designed Helpful 404's and Stopped Worrying about Broken Links ==================================================================== by Breck Yunits https://breckyunits.com Breck Yunits July 12, 2024 _Woohoo!_ Your blog is on top of Reddit! _OH NO._ There's a typo in your url. 🤦 *What do you do?* * You try to calm yourself down. _Almost no one looks at the url and the content of the article is what's important and the traffic is coming_ But then you think _all I can see is that i before e after c!_ But then you think _is that *really* a rule_ and _maybe that's how it's spelled in London?_ * You can't help yourself. It's an affront to your craftsmanship to not correct the bad filename. You know you can so easily rename the file but then existing links will break and so you'll have to add redirects but that means more files to maintain or god forbid that would require adding a server and you just love your static blog and it's almost 2pm and you have to leave and pick up the kids from school what do you do!?!! Or do you just break the links and going forward everyone will have the proper URL but everyone who clicks the old links will see an unhelpful 404 and you reflect on how great this thing that Tim Berners-Lee gave to the world is and how could you litter his creation with unhelpful 404s? * If the story above resonates with you, the bad news is you may suffer from Broken Link Phobia. Luckily, there is now a cure. * Introducing: Helpful 404's - never worry about broken links again! ================================================================== Scroll now comes with a way to generate a very helpful 404 page so your visitors will get redirected to the right place even if the URL they clicked is off by a few characters. The best part? It works entirely client side on static sites. How to use ========== *Step 1* Create a sitemap: ```sitemap.scroll buildTxt sitemap.txt baseUrl https://scroll.pub/ printSiteMap ``` *Step 2* Create a 404 page: ```404.scroll buildHtml Sorry, the url you requested was not found. helpfulNotFound sitemap.txt ``` That's it! The `helpfulNotFound` parser in Scroll will add Javascript to the 404 page that fetches all the urls found in the sitemap and shows the user the closest match. As a bonus, you also get a `sitemap.txt` file great for Google SEO and other uses. See it in action here by clicking on this intentionally broken link: https://scroll.pub/blog/helpful_404s.html intentionally broken link * I've been using Helpful 404s on all my sites for the past couple of months and it's been delightful. I no longer spend any time worrying about making improvements to URLS. I just do it and I know that users following old links will still have a good experience. * If you like stuff like Helpful 404's, there's _a lot_ more like that in Scroll, which is public domain and open source. Try it today, and if you like what we are doing please consider bringing your site to the World Wide Scroll! https://wws.scroll.pub World Wide Scroll ⁂ Built with Scroll v150.0.0 07/12/2024 546 2.7 Convert CSVs to ScrollSets -Convert CSVs to ScrollSets ========================== by Breck Yunits https://github.com/breck7 Breck Yunits July 9, 2024 ScrollSets are _very_ useful once you get going. But starting from scratch could be a bit tedious. https://breckyunits.com/scrollsets.html ScrollSets Not anymore! Just drop your CSV or TSV into the textarea below to generate a ScrollSet. (P.S. using LLMs with ScrollSets is another great way to get started) https://sets.scroll.pub/ using LLMs with ScrollSets * Your Data: ========== ScrollSet: ========== Related ======= ScrollSets: source code for CSVs ================================ 04/21/2024 https://scroll.pub/blog/scrollsets.html Built with Scroll v149.0.0 +Convert CSVs to ScrollSets ========================== by Breck Yunits https://github.com/breck7 Breck Yunits July 9, 2024 ScrollSets are _very_ useful once you get going. But starting from scratch could be a bit tedious. https://breckyunits.com/scrollsets.html ScrollSets Not anymore! Just drop your CSV or TSV into the textarea below to generate a ScrollSet. (P.S. using LLMs with ScrollSets is another great way to get started) https://sets.scroll.pub/ using LLMs with ScrollSets * Your Data: ========== ScrollSet: ========== Related ======= ScrollSets: source code for CSVs ================================ 04/21/2024 https://scroll.pub/blog/scrollsets.html Built with Scroll v150.0.0 07/09/2024 100 0.5 Changes: A Microlang for Change Logs -Changes: A Microlang for Change Logs ==================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits [Image Omitted] July 1, 2024 Regardless of what languages you write your programs in, you probably maintain files like _changeLog.txt_ or _releaseNotes.txt_. Change logs are very helpful for: - informing your users of new features and bug fixes - providing detailed technical information to your development team (and open source contributors) - periodical data analysis for strategic project planning - how fast are we shipping new features? fixing bugs? breaking things? What if there was 1 language that let you do all 3 things at once? * Introducing Changes, a microlang (only 70 lines of code, including comments) that makes it as concise as possible to write, read and analyze change logs. https://github.com/breck7/scroll/blob/main/microlangs/changes.parsers 70 lines of code Changes generates a pretty HTML file for your end users; allows for including unlimited detailed technical information for your developers; and generates summary statistics as TSV, CSV, and JSON for your project managers. * There's almost nothing to learn (the code is self explanatory). In fact, it's almost guaranteed that using Changes you will need to write less (we've taken every unnecessary character out). * Example ======= We use Changes for the Scroll Release Notes. https://scroll.pub/blog/../releaseNotes.html Scroll Release Notes Be sure to check out the source code that generates that HTML. https://github.com/breck7/scroll/blob/main/releaseNotes.scroll check out the source code * How to use ========== 1. Install Scroll ``` npm install -g scroll-cli ``` 2. Create a release notes file: ```releaseNotes.scroll title My Release Notes printTitle buildConcepts releaseNotes.csv releaseNotes.json releaseNotes.tsv // You can import the changes parsers or just copy/paste the 70 lines into your own file. [pathToScroll]/microlangs/changes.parser thinColumns 📦 0.1.1 7/1/2024 🏥 fixed bug in command line app 📦 0.1.0 7/1/2024 🎉 added command line app endColumns ``` 3. Run `scroll build` Done! You should now see a `releaseNotes.html` file as well as a TSV, CSV, and JSON file. * What do you think? Anything that should be added/removed/improved? ⁂ Related ======= - Changelog https://en.wikipedia.org/wiki/Changelog Changelog - Release Notes https://en.wikipedia.org/wiki/Release_notes Release Notes - Major Version Numbers are Not Sacred https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred Major Version Numbers are Not Sacred - What can we learn from programming language version numbers? https://breckyunits.com/versionNumbers.html What can we learn from programming language version numbers? Built with Scroll v149.0.0 +Changes: A Microlang for Change Logs ==================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits [Image Omitted] July 1, 2024 Regardless of what languages you write your programs in, you probably maintain files like _changeLog.txt_ or _releaseNotes.txt_. Change logs are very helpful for: - informing your users of new features and bug fixes - providing detailed technical information to your development team (and open source contributors) - periodical data analysis for strategic project planning - how fast are we shipping new features? fixing bugs? breaking things? What if there was 1 language that let you do all 3 things at once? * Introducing Changes, a microlang (only 70 lines of code, including comments) that makes it as concise as possible to write, read and analyze change logs. https://github.com/breck7/scroll/blob/main/microlangs/changes.parsers 70 lines of code Changes generates a pretty HTML file for your end users; allows for including unlimited detailed technical information for your developers; and generates summary statistics as TSV, CSV, and JSON for your project managers. * There's almost nothing to learn (the code is self explanatory). In fact, it's almost guaranteed that using Changes you will need to write less (we've taken every unnecessary character out). * Example ======= We use Changes for the Scroll Release Notes. https://scroll.pub/blog/../releaseNotes.html Scroll Release Notes Be sure to check out the source code that generates that HTML. https://github.com/breck7/scroll/blob/main/releaseNotes.scroll check out the source code * How to use ========== 1. Install Scroll ``` npm install -g scroll-cli ``` 2. Create a release notes file: ```releaseNotes.scroll title My Release Notes printTitle buildConcepts releaseNotes.csv releaseNotes.json releaseNotes.tsv // You can import the changes parsers or just copy/paste the 70 lines into your own file. [pathToScroll]/microlangs/changes.parser thinColumns 📦 0.1.1 7/1/2024 🏥 fixed bug in command line app 📦 0.1.0 7/1/2024 🎉 added command line app endColumns ``` 3. Run `scroll build` Done! You should now see a `releaseNotes.html` file as well as a TSV, CSV, and JSON file. * What do you think? Anything that should be added/removed/improved? ⁂ Related ======= - Changelog https://en.wikipedia.org/wiki/Changelog Changelog - Release Notes https://en.wikipedia.org/wiki/Release_notes Release Notes - Major Version Numbers are Not Sacred https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred Major Version Numbers are Not Sacred - What can we learn from programming language version numbers? https://breckyunits.com/versionNumbers.html What can we learn from programming language version numbers? Built with Scroll v150.0.0 07/01/2024 431 2.2 Write scatterplot to get a scatterplot -Write scatterplot to get a scatterplot ====================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits June 24, 2024 I _engineered on_ many innovative data science tools, including Grapher and Ohayo^engineering. https://github.com/breck7/ohayo Ohayo https://github.com/owid/owid-grapher Grapher So I was excited to see Observable launch something new: Plot. https://observablehq.com/plot/ Plot https://observablehq.com/ Observable * Plot is already great on its own. It handles many of the hard parts of data vis, and it's open source, so we can help them fix the parts that are still a little rough. https://github.com/observablehq/plot open source But I found a way to take Plot to the next level: I combined it with Scroll. https://scroll.pub/blog/../index.html Scroll The Plot/Scroll integration is early, but I can already tell it will evolve into a _very useful_ data science tool. * A Scatterplot with 2 words ========================== You can now make scatterplots with 2 words. Obviously you want to add a few more words, but I don't think I'm exaggerating when I say that this is the simplest way to generate a scatterplot now and forever will be (until the day when we have mind-reading machines that can generate a scatterplot with zero words). But enough talk, let's see some code. A tutorial is below. To follow along, create a new website in 1 second using ScrollHub or install Scroll locally with `npm install -g scroll-cli`. http://hub.scroll.pub ScrollHub * Step 1: Generate a scatterplot with 2 words =========================================== * Step 2: Add a title =================== * Step 3: Add inline data ======================= * Step 4: Everything everywhere all at once ========================================= * That's it (for now)! If you like where this is headed, give us a star on GitHub. https://github.com/breck7/scroll give us a star on GitHub ⁂ ^engineering: The difference between programming and engineering? It takes programming to make a program that works. It takes engineering to make a program that _barely_ works. Built with Scroll v149.0.0 +Write scatterplot to get a scatterplot ====================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits June 24, 2024 I _engineered on_ many innovative data science tools, including Grapher and Ohayo^engineering. https://github.com/breck7/ohayo Ohayo https://github.com/owid/owid-grapher Grapher So I was excited to see Observable launch something new: Plot. https://observablehq.com/plot/ Plot https://observablehq.com/ Observable * Plot is already great on its own. It handles many of the hard parts of data vis, and it's open source, so we can help them fix the parts that are still a little rough. https://github.com/observablehq/plot open source But I found a way to take Plot to the next level: I combined it with Scroll. https://scroll.pub/blog/../index.html Scroll The Plot/Scroll integration is early, but I can already tell it will evolve into a _very useful_ data science tool. * A Scatterplot with 2 words ========================== You can now make scatterplots with 2 words. Obviously you want to add a few more words, but I don't think I'm exaggerating when I say that this is the simplest way to generate a scatterplot now and forever will be (until the day when we have mind-reading machines that can generate a scatterplot with zero words). But enough talk, let's see some code. A tutorial is below. To follow along, create a new website in 1 second using ScrollHub or install Scroll locally with `npm install -g scroll-cli`. http://hub.scroll.pub ScrollHub * Step 1: Generate a scatterplot with 2 words =========================================== * Step 2: Add a title =================== * Step 3: Add inline data ======================= * Step 4: Everything everywhere all at once ========================================= * That's it (for now)! If you like where this is headed, give us a star on GitHub. https://github.com/breck7/scroll give us a star on GitHub ⁂ ^engineering: The difference between programming and engineering? It takes programming to make a program that works. It takes engineering to make a program that _barely_ works. Built with Scroll v150.0.0 06/24/2024 342 1.7 Stamp: a microlang for project templates -Stamp: a microlang for project templates ======================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits June 23, 2024 Regardless if you specialize in React, Rails, Django, Next, Java, C#, or ObjectiveC, you probably use _templates_ to start new projects. Templates generate a handful of files like `readme.md`, `.gitignore`, and `main`. They also initialize a handful of directories like `src/` and `tests/`. What if it was even easier to make, edit and use these templates? * Introducing Stamp, a microlang (only 60 lines of code, including comments) that makes it as concise as possible to write, edit, share and expand project templates. https://github.com/breck7/scroll/blob/main/parsers/stamp.parsers 60 lines of code * How to use ========== 1. Install Scroll ``` npm install -g scroll-cli ``` 2. Create `myFirstStamp.scroll` ``` stamp .gitignore *.html readme.scroll # My First Stamp scripts/ hello.js console.log("Hello world") ``` 3. Run `scroll build` Done! * Stamp was jointly created by me and Guillaume Papin. Other tools (listed below) do similar things, but with some slight differences. https://github.com/Sarcasm Guillaume Papin https://github.com/breck7/scrollsdk/issues/120 jointly created ⁂ [Image Omitted] Prior Art ========= - cookiecutter https://github.com/cookiecutter/cookiecutter cookiecutter - Dired https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html Dired - vimv https://github.com/thameera/vimv vimv - ptar https://github.com/jtvaughan/ptar ptar - shar https://en.wikipedia.org/wiki/Shar shar - dar http://dar.linux.free.fr/ dar - metatar https://github.com/xyproto/metatar metatar - txtar https://pkg.go.dev/golang.org/x/tools@v0.1.0/txtar txtar - Archiving files in plain text https://blog.oquijano.net/id/9?lang=en Archiving files in plain text - Wikipedia list of archive formats https://en.wikipedia.org/wiki/List_of_archive_formats Wikipedia list of archive formats Built with Scroll v149.0.0 +Stamp: a microlang for project templates ======================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits June 23, 2024 Regardless if you specialize in React, Rails, Django, Next, Java, C#, or ObjectiveC, you probably use _templates_ to start new projects. Templates generate a handful of files like `readme.md`, `.gitignore`, and `main`. They also initialize a handful of directories like `src/` and `tests/`. What if it was even easier to make, edit and use these templates? * Introducing Stamp, a microlang (only 60 lines of code, including comments) that makes it as concise as possible to write, edit, share and expand project templates. https://github.com/breck7/scroll/blob/main/parsers/stamp.parsers 60 lines of code * How to use ========== 1. Install Scroll ``` npm install -g scroll-cli ``` 2. Create `myFirstStamp.scroll` ``` stamp .gitignore *.html readme.scroll # My First Stamp scripts/ hello.js console.log("Hello world") ``` 3. Run `scroll build` Done! * Stamp was jointly created by me and Guillaume Papin. Other tools (listed below) do similar things, but with some slight differences. https://github.com/Sarcasm Guillaume Papin https://github.com/breck7/scrollsdk/issues/120 jointly created ⁂ [Image Omitted] Prior Art ========= - cookiecutter https://github.com/cookiecutter/cookiecutter cookiecutter - Dired https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html Dired - vimv https://github.com/thameera/vimv vimv - ptar https://github.com/jtvaughan/ptar ptar - shar https://en.wikipedia.org/wiki/Shar shar - dar http://dar.linux.free.fr/ dar - metatar https://github.com/xyproto/metatar metatar - txtar https://pkg.go.dev/golang.org/x/tools@v0.1.0/txtar txtar - Archiving files in plain text https://blog.oquijano.net/id/9?lang=en Archiving files in plain text - Wikipedia list of archive formats https://en.wikipedia.org/wiki/List_of_archive_formats Wikipedia list of archive formats Built with Scroll v150.0.0 06/23/2024 300 1.5 Scroll builds text files -Scroll builds text files ======================== by Breck Yunits https://breckyunits.com Breck Yunits HTML | TXT link textFiles.html HTML link textFiles.txt TXT April 29, 2024 Scroll is a new language for building HTML and CSV files that powers blogs, websites and knowledge bases. https://scroll.pub/blog/scrollsets.html knowledge bases https://scroll.pub/blog/../index.html Scroll * I often need plain text outputs in addition to HTML files. I used to make those plain text versions copying and pasting text by hand. Now Scroll has plain text output built-in. * How do I tell Scroll to build plain text files? =============================================== Add a single line: `buildTxt` ```example.scroll buildTxt Hello world. ``` `scroll build` will create `example.txt`. Done! * You may want to put `buildTxt` into `header.scroll` or `footer.scroll` to build text files for many pages at once. * I've *loved* this new feature in Scroll. Plain text is a *timeless* way to read, review, and share your thoughts! Hope you enjoy it as much as I have! ⁂ Built with Scroll v149.0.0 +Scroll builds text files ======================== by Breck Yunits https://breckyunits.com Breck Yunits HTML | TXT link textFiles.html HTML link textFiles.txt TXT April 29, 2024 Scroll is a new language for building HTML and CSV files that powers blogs, websites and knowledge bases. https://scroll.pub/blog/scrollsets.html knowledge bases https://scroll.pub/blog/../index.html Scroll * I often need plain text outputs in addition to HTML files. I used to make those plain text versions copying and pasting text by hand. Now Scroll has plain text output built-in. * How do I tell Scroll to build plain text files? =============================================== Add a single line: `buildTxt` ```example.scroll buildTxt Hello world. ``` `scroll build` will create `example.txt`. Done! * You may want to put `buildTxt` into `header.scroll` or `footer.scroll` to build text files for many pages at once. * I've *loved* this new feature in Scroll. Plain text is a *timeless* way to read, review, and share your thoughts! Hope you enjoy it as much as I have! ⁂ Built with Scroll v150.0.0 04/29/2024 175 0.9 ScrollSets: source code for CSVs -ScrollSets: source code for CSVs ================================ by Breck Yunits https://breckyunits.com Breck Yunits [Image Omitted] More examples of ScrollSets from sets.scroll.pub. https://sets.scroll.pub/ sets.scroll.pub April 21, 2024 The source code for this blog post contains a ScrollSet about the planets and generates this HTML file as well as a CSV, a TSV, and a JSON file. This page demonstrates *ScrollSets*. https://scroll.pub/blog/scrollsets.scroll source code for this blog post https://scroll.pub/blog/planets.csv CSV https://scroll.pub/blog/planets.tsv TSV https://scroll.pub/blog/planets.json JSON ScrollSets are useful for small single day projects and large multi-year projects with thousands of concepts like PLDB (a Programming Language Database). https://pldb.io PLDB * ScrollSets are normal plain text files written in Scroll that also contain measurements of concepts and output that data into formats ready for data visualization and analysis tools. https://scroll.pub/ Scroll ScrollSets are line oriented but represent a table(s). You might call them _deconstructed csvs_ or _deconstructed spreadsheets_. - Use LLMs to *instantly generate ScrollSets* that are ready for human verification and improvement. - Intermingle structured data with markup to *annotate any and every part of a ScrollSets* while still generating strict tabular files for data analysis tools. - Put data, schema, citations, and documentation *all* in one (or more) plain text file(s) to easily share, collaborate on, and improve, all *tracked by git for trust*. - Add unlimited citations (or none) to *every* measurement. Quick Code Example: =================== ```planets.scroll This ScrollSets has 2 measures (columns) and 2 concepts (rows). Documentation, column definitions, rows and *any notes/markup/content* can go in the same file. # Measures (aka Header, aka Columns, aka Schema) idParser // Every concept needs an "id" (or other concept delimiter) extends abstractIdParser moonsParser extends abstractIntegerParser # Concepts (aka Rows) id mars moons 2 // I verified moon count with Google. - BY id jupiter moons 63 // Note: the moons of Jupiter have their own Wikipedia Page https://en.wikipedia.org/wiki/Moons_of_Jupiter moons of Jupiter buildConcepts demo.csv ``` The code above generates an HTML page and this: =============================================== ```demo.csv id,moons mars,2 jupiter,63 ``` Overview: ========= - ScrollSets are built from 4 atomic elements: - concepts - think of rows in a spreadsheet - denoted by a line starting with `id ` - concepts are multiple lines of measurements - measures - think of these as the column names in a spreadsheet, along with meta information about the column - aka "parsers" - measures are defined in Parsers that start with a line like `moonsParser` - values - these are just the values of the measurements - measurements - concept & measure & value = measurement - 1 measurement = 1 line - measurements can have nested comments that are stripped when compiling to TSV/CSV How to use ========== - A concept is like a row in a database. All concepts need an id (or other concept delimiter). When you write `id [conceptId]`, Scroll knows that is the beginning of a new concept. - Measure definitions (aka "parsers") must come before the first concept and are written as Parsers, just like any other Scroll Parser. Measure parsers need to extend one of the abstract measure parser classes defined in `measures.scroll`. - Measurements are then done like this `appeared 2024` FAQ === Isn't the better idea to enhance existing spreadsheet GUIs with LLM generation capabilities? ============================================================================================ Almost certainly. Using ScrollSets will be much slower and worse than future spreadsheet apps with carefully crafted LLM integrations. However, it's important to also have simple, lower tech, timeless tools and ScrollSets is one of those. Can't you do this same thing with YAML and/or Markdown? ======================================================= Yes! You can easily achieve the same thing as LLMs & ScrollSets using LLMs & YAML, or LLMs & YAML & Markdown. https://yaml.org/ YAML https://github.github.com/gfm/ Markdown For YAML, just put your documentation and schema in YAML comments up top and then have a tiny script to read that YAML and dump CSV/TSV/JSON or whatever. YAML gives you loads of data structures to use and is widely supported in many languages. But generating HTML from the same file would require more work. If you want to intermix markup content with your data, you can use Markdown to add the marked up content and then have code sections embedding the YAML and a tiny script to parse out those YAML blocks and write your data to disk. So, why use Scroll for storing data instead of YAML? ==================================================== Either can do the job. I expect the Scroll design to end up being more ergonomic, but that might not be true or may be unimportant. If you don't like Scroll's (evolving) version and want to switch it will always be straightforward to automatically refactor to YAML. What other related work is out there? ===================================== This is a simple pattern to implement, so I'm sure it is likely it has been done a few times before. Please let me know so I can include links to--and learn from--any other prior art. What are the advanced features? =============================== - Types correctly exported in JSON - Supports nested measures - Support for computed measures - Autojoins across files on ids^roadmap - Auto generates normalized tables for array measures^roadmap - Support for text blobs^roadmap ^roadmap: Planned. What is the origin of ScrollSets? ================================= LLM dataset generation is a _major_ breakthrough in datasets. ScrollSets are, at best, a minor improvement. They are designed to work alongside LLMs to help solve the Dataset Needed problem. https://breckyunits.com/dataset-needed.html Dataset Needed ScrollSets evolved out of TrueBase. ScrollSets have eliminated the need for the TrueBase software (and existing TrueBase sites should be migrated to ScrollSets), but were informed by the TrueBase build experience. https://truebase.treenotation.org TrueBase Although ScrollSets are designed for a world with LLMs, the design is meant to be useful without them as well, and would also have been mildly useful 30 years ago. What were the design goals? =========================== - Have an LLM do the bulk of the work while humans supervise to remove hallucinations. - Can store everything (documentation, schema, all concepts) in 1 clean plain text file or split into many files (using the `import` parser). - The ScrollSet syntax balances _looseness_ useful in creative thinking with the _tightness_ needed by tabular data visualization and analysis tools. Why are measures and concepts root-level features and not indented? =================================================================== The normal way to implement this in Scroll would be something like: ``` measures id string moons int concept id mars moons 2 concept id jupiter moons 63 ``` The flat design was chosen for ergonomic reasons. ScrollSets seem like they might be useful enough to be worth breaking from Scroll convention a bit. Like all things in Scroll, ScrollSets are an experiment, and maybe this design will evolve. Extended Example: a Planets ScrollSet ===================================== Below is the ScrollSet embedded in this Scroll file. Measurements of the measures ============================ Extended Measures Example ========================= Extended Concepts Example ========================= Related ======= Convert CSVs to ScrollSets ========================== 07/09/2024 https://scroll.pub/blog/csvToScrollSet.html Built with Scroll v149.0.0 +ScrollSets: source code for CSVs ================================ by Breck Yunits https://breckyunits.com Breck Yunits [Image Omitted] More examples of ScrollSets from sets.scroll.pub. https://sets.scroll.pub/ sets.scroll.pub April 21, 2024 The source code for this blog post contains a ScrollSet about the planets and generates this HTML file as well as a CSV, a TSV, and a JSON file. This page demonstrates *ScrollSets*. https://scroll.pub/blog/scrollsets.scroll source code for this blog post https://scroll.pub/blog/planets.csv CSV https://scroll.pub/blog/planets.tsv TSV https://scroll.pub/blog/planets.json JSON ScrollSets are useful for small single day projects and large multi-year projects with thousands of concepts like PLDB (a Programming Language Database). https://pldb.io PLDB * ScrollSets are normal plain text files written in Scroll that also contain measurements of concepts and output that data into formats ready for data visualization and analysis tools. https://scroll.pub/ Scroll ScrollSets are line oriented but represent a table(s). You might call them _deconstructed csvs_ or _deconstructed spreadsheets_. - Use LLMs to *instantly generate ScrollSets* that are ready for human verification and improvement. - Intermingle structured data with markup to *annotate any and every part of a ScrollSets* while still generating strict tabular files for data analysis tools. - Put data, schema, citations, and documentation *all* in one (or more) plain text file(s) to easily share, collaborate on, and improve, all *tracked by git for trust*. - Add unlimited citations (or none) to *every* measurement. Quick Code Example: =================== ```planets.scroll This ScrollSets has 2 measures (columns) and 2 concepts (rows). Documentation, column definitions, rows and *any notes/markup/content* can go in the same file. # Measures (aka Header, aka Columns, aka Schema) idParser // Every concept needs an "id" (or other concept delimiter) extends abstractIdParser moonsParser extends abstractIntegerParser # Concepts (aka Rows) id mars moons 2 // I verified moon count with Google. - BY id jupiter moons 63 // Note: the moons of Jupiter have their own Wikipedia Page https://en.wikipedia.org/wiki/Moons_of_Jupiter moons of Jupiter buildConcepts demo.csv ``` The code above generates an HTML page and this: =============================================== ```demo.csv id,moons mars,2 jupiter,63 ``` Overview: ========= - ScrollSets are built from 4 atomic elements: - concepts - think of rows in a spreadsheet - denoted by a line starting with `id ` - concepts are multiple lines of measurements - measures - think of these as the column names in a spreadsheet, along with meta information about the column - aka "parsers" - measures are defined in Parsers that start with a line like `moonsParser` - values - these are just the values of the measurements - measurements - concept & measure & value = measurement - 1 measurement = 1 line - measurements can have nested comments that are stripped when compiling to TSV/CSV How to use ========== - A concept is like a row in a database. All concepts need an id (or other concept delimiter). When you write `id [conceptId]`, Scroll knows that is the beginning of a new concept. - Measure definitions (aka "parsers") must come before the first concept and are written as Parsers, just like any other Scroll Parser. Measure parsers need to extend one of the abstract measure parser classes defined in `measures.scroll`. - Measurements are then done like this `appeared 2024` FAQ === Isn't the better idea to enhance existing spreadsheet GUIs with LLM generation capabilities? ============================================================================================ Almost certainly. Using ScrollSets will be much slower and worse than future spreadsheet apps with carefully crafted LLM integrations. However, it's important to also have simple, lower tech, timeless tools and ScrollSets is one of those. Can't you do this same thing with YAML and/or Markdown? ======================================================= Yes! You can easily achieve the same thing as LLMs & ScrollSets using LLMs & YAML, or LLMs & YAML & Markdown. https://yaml.org/ YAML https://github.github.com/gfm/ Markdown For YAML, just put your documentation and schema in YAML comments up top and then have a tiny script to read that YAML and dump CSV/TSV/JSON or whatever. YAML gives you loads of data structures to use and is widely supported in many languages. But generating HTML from the same file would require more work. If you want to intermix markup content with your data, you can use Markdown to add the marked up content and then have code sections embedding the YAML and a tiny script to parse out those YAML blocks and write your data to disk. So, why use Scroll for storing data instead of YAML? ==================================================== Either can do the job. I expect the Scroll design to end up being more ergonomic, but that might not be true or may be unimportant. If you don't like Scroll's (evolving) version and want to switch it will always be straightforward to automatically refactor to YAML. What other related work is out there? ===================================== This is a simple pattern to implement, so I'm sure it is likely it has been done a few times before. Please let me know so I can include links to--and learn from--any other prior art. What are the advanced features? =============================== - Types correctly exported in JSON - Supports nested measures - Support for computed measures - Autojoins across files on ids^roadmap - Auto generates normalized tables for array measures^roadmap - Support for text blobs^roadmap ^roadmap: Planned. What is the origin of ScrollSets? ================================= LLM dataset generation is a _major_ breakthrough in datasets. ScrollSets are, at best, a minor improvement. They are designed to work alongside LLMs to help solve the Dataset Needed problem. https://breckyunits.com/dataset-needed.html Dataset Needed ScrollSets evolved out of TrueBase. ScrollSets have eliminated the need for the TrueBase software (and existing TrueBase sites should be migrated to ScrollSets), but were informed by the TrueBase build experience. https://truebase.treenotation.org TrueBase Although ScrollSets are designed for a world with LLMs, the design is meant to be useful without them as well, and would also have been mildly useful 30 years ago. What were the design goals? =========================== - Have an LLM do the bulk of the work while humans supervise to remove hallucinations. - Can store everything (documentation, schema, all concepts) in 1 clean plain text file or split into many files (using the `import` parser). - The ScrollSet syntax balances _looseness_ useful in creative thinking with the _tightness_ needed by tabular data visualization and analysis tools. Why are measures and concepts root-level features and not indented? =================================================================== The normal way to implement this in Scroll would be something like: ``` measures id string moons int concept id mars moons 2 concept id jupiter moons 63 ``` The flat design was chosen for ergonomic reasons. ScrollSets seem like they might be useful enough to be worth breaking from Scroll convention a bit. Like all things in Scroll, ScrollSets are an experiment, and maybe this design will evolve. Extended Example: a Planets ScrollSet ===================================== Below is the ScrollSet embedded in this Scroll file. Measurements of the measures ============================ Extended Measures Example ========================= Extended Concepts Example ========================= Related ======= Convert CSVs to ScrollSets ========================== 07/09/2024 https://scroll.pub/blog/csvToScrollSet.html Built with Scroll v150.0.0 04/21/2024 1161 5.8 Introducing Program Links -Introducing Program Links ========================= by Breck Yunits https://github.com/breck7 Breck Yunits May 8, 2023 Some web apps are designed to load _entire programs_ from a link. But if a program contain certain characters, such as _newlines_, those links won't work as-is. To create working links you have to run them through `encodeURIComponent`. * If you are creating blog content by hand this is annoying. To update a program link you have to keep a copy of the program, update that, then run `encodeURIComponent`, then paste the result into your post. Today's release of Scroll includes a small new addition that solves this problem. You can call them "Multline Links" or "Program Links". * Here are two examples ===================== Here is a program link to the Scroll web app. https://try.scroll.pub/#scroll%0A%20%23%20Testing%20Program%20Links%0A%20It%20worked!%0A%20%20style%20color%3Agreen%3B%20font-size%3A%20100px%3B program link If you click that link you should see "It worked!" in big green text. * Now let's show a complex real world example. The link below contains a 28 line program pasted verbatim from the Ohayo data science studio. See code Discovery of the Elements https://ohayo.breckyunits.com?filename=test.ohayo&data=doc.title%20Discovery%20of%20the%20Elements%0Adoc.subtitle%20What%20is%20the%20growth%20in%20known%20elements%20over%20time%3F%0Asamples.periodicTable%0A%20hidden%0A%20fill.missing%20Year%201000%0A%20%20hidden%0A%20%20columns.keep%20Element%20Year%0A%20%20%20hidden%0A%20%20%20rows.sortBy%20Year%0A%20%20%20%20hidden%0A%20%20group.by%20Year%0A%20%20%20hidden%0A%20%20%20rows.sortBy%20Year%0A%20%20%20%20hidden%0A%20%20%20%20rows.runningTotal%20count%0A%20%20%20%20%20hidden%0A%20%20%20%20%20vega.bar%20Number%20of%20Elements%20Found%20Each%20Year%0A%20%20%20%20%20%20xColumn%20Year%0A%20%20%20%20%20%20yColumn%20count%0A%20%20%20%20%20vega.line%20Cumulative%20Number%20of%20Elements%0A%20%20%20%20%20%20xColumn%20Year%0A%20%20%20%20%20%20yColumn%20total%0A%20vega.scatter%20Year%20of%20Discovery%20by%20Atomic%20Number%0A%20%20xColumn%20Year%0A%20%20yColumn%20AtomicNumber%0A%20tables.basic%0A%20%20rowDisplayLimit%20200%0Adoc.categories%20chemistry Discovery of the Elements If you click that link you should see a few data visualizations generated from that program. Edit the source and the link will update accordingly. Scroll handles the `encodeURIComponent`. * Why not use HTML directly? ========================== Modern browsers do their best to make URLs well-formed and you will notice that they auto encode certain characters like spaces. But by the HTML spec newlines are not a URL code point and generally are stripped and collapsed. https://url.spec.whatwg.org/#url-code-points URL code point https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace stripped and collapsed Program Links in Scroll handle encoding newlines and any other special characters so you can focus on your content and not the encoding. Built with Scroll v149.0.0 +Introducing Program Links ========================= by Breck Yunits https://github.com/breck7 Breck Yunits May 8, 2023 Some web apps are designed to load _entire programs_ from a link. But if a program contain certain characters, such as _newlines_, those links won't work as-is. To create working links you have to run them through `encodeURIComponent`. * If you are creating blog content by hand this is annoying. To update a program link you have to keep a copy of the program, update that, then run `encodeURIComponent`, then paste the result into your post. Today's release of Scroll includes a small new addition that solves this problem. You can call them "Multline Links" or "Program Links". * Here are two examples ===================== Here is a program link to the Scroll web app. https://try.scroll.pub/#scroll%0A%20%23%20Testing%20Program%20Links%0A%20It%20worked!%0A%20%20style%20color%3Agreen%3B%20font-size%3A%20100px%3B program link If you click that link you should see "It worked!" in big green text. * Now let's show a complex real world example. The link below contains a 28 line program pasted verbatim from the Ohayo data science studio. See code Discovery of the Elements https://ohayo.breckyunits.com?filename=test.ohayo&data=doc.title%20Discovery%20of%20the%20Elements%0Adoc.subtitle%20What%20is%20the%20growth%20in%20known%20elements%20over%20time%3F%0Asamples.periodicTable%0A%20hidden%0A%20fill.missing%20Year%201000%0A%20%20hidden%0A%20%20columns.keep%20Element%20Year%0A%20%20%20hidden%0A%20%20%20rows.sortBy%20Year%0A%20%20%20%20hidden%0A%20%20group.by%20Year%0A%20%20%20hidden%0A%20%20%20rows.sortBy%20Year%0A%20%20%20%20hidden%0A%20%20%20%20rows.runningTotal%20count%0A%20%20%20%20%20hidden%0A%20%20%20%20%20vega.bar%20Number%20of%20Elements%20Found%20Each%20Year%0A%20%20%20%20%20%20xColumn%20Year%0A%20%20%20%20%20%20yColumn%20count%0A%20%20%20%20%20vega.line%20Cumulative%20Number%20of%20Elements%0A%20%20%20%20%20%20xColumn%20Year%0A%20%20%20%20%20%20yColumn%20total%0A%20vega.scatter%20Year%20of%20Discovery%20by%20Atomic%20Number%0A%20%20xColumn%20Year%0A%20%20yColumn%20AtomicNumber%0A%20tables.basic%0A%20%20rowDisplayLimit%20200%0Adoc.categories%20chemistry Discovery of the Elements If you click that link you should see a few data visualizations generated from that program. Edit the source and the link will update accordingly. Scroll handles the `encodeURIComponent`. * Why not use HTML directly? ========================== Modern browsers do their best to make URLs well-formed and you will notice that they auto encode certain characters like spaces. But by the HTML spec newlines are not a URL code point and generally are stripped and collapsed. https://url.spec.whatwg.org/#url-code-points URL code point https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace stripped and collapsed Program Links in Scroll handle encoding newlines and any other special characters so you can focus on your content and not the encoding. Built with Scroll v150.0.0 05/08/2023 507 2.5 Counterpoints: A new tool for thought in the Scroll Language -Counterpoints: A new tool for thought in the Scroll Language ============================================================ by Breck Yunits https://github.com/breck7 Breck Yunits Improve your writing by welcoming counterarguments ================================================== April 13, 2023 There's a tiny new symbol in Scroll today: `!`. https://scroll.pub/ Scroll The exclamation mark stands for *Counterpoint*. "Counters" aim to help writers strengthen their ideas by encouraging the integration of counterarguments throughout their essays. You can write your own counters or invite counters from friends, LLMs or Internet commenters. * Counterpoints are easy to use: just start a line with `!`. For example: ``` Humans will eventually establish colonies on Mars. ! But we haven't colonized the Arctic, 1,000x easier ``` You can go as deep as you want in countering your own counters! ``` Humans will eventually establish colonies on Mars. ! But we haven't colonized the Arctic, 1,000x easier - Colonizing Mars is 10,000x more valuable ``` * The Benefits of Countering ========================== When we have a lot of terms for a thing, it's usually a hint that it's a valuable thing. And we have a lot of terms for countering. To name a few: - "Steel manning" - "red teaming" - "playing devil's advocate" Countering is a helpful habit that helps clarify your thoughts, understand and empathize with other perspectives, fix logical blunders, hone your pitch, and improve at truth-seeking. Counterpoints in Scroll are in a sense just a reminder to frequently use these techniques. * The Downsides of Countering =========================== Addressing every plausible counter in your main thread can be difficult if not impossible. It can make your writing too verbose and lose reader interest. Counters in Scroll give you a place to record every scattered counter as it comes to you. You can then choose which are important enough to address in your main argument and relegate the rest to the source code (for the very avid reader). * Implementation ============== Counterpoints do not currently appear in the compiled HTML. Instead you only see them during write time. For now, they are just an alternate syntax for comments. But though they perform no new function, like traffic lines, sometimes form is function. That being said, there are potentially interesting directions this could go in the future, and it would be interesting to hear ideas of what people would like in a v2. * Keep writing, keep thinking! ⁂ Built with Scroll v149.0.0 +Counterpoints: A new tool for thought in the Scroll Language ============================================================ by Breck Yunits https://github.com/breck7 Breck Yunits Improve your writing by welcoming counterarguments ================================================== April 13, 2023 There's a tiny new symbol in Scroll today: `!`. https://scroll.pub/ Scroll The exclamation mark stands for *Counterpoint*. "Counters" aim to help writers strengthen their ideas by encouraging the integration of counterarguments throughout their essays. You can write your own counters or invite counters from friends, LLMs or Internet commenters. * Counterpoints are easy to use: just start a line with `!`. For example: ``` Humans will eventually establish colonies on Mars. ! But we haven't colonized the Arctic, 1,000x easier ``` You can go as deep as you want in countering your own counters! ``` Humans will eventually establish colonies on Mars. ! But we haven't colonized the Arctic, 1,000x easier - Colonizing Mars is 10,000x more valuable ``` * The Benefits of Countering ========================== When we have a lot of terms for a thing, it's usually a hint that it's a valuable thing. And we have a lot of terms for countering. To name a few: - "Steel manning" - "red teaming" - "playing devil's advocate" Countering is a helpful habit that helps clarify your thoughts, understand and empathize with other perspectives, fix logical blunders, hone your pitch, and improve at truth-seeking. Counterpoints in Scroll are in a sense just a reminder to frequently use these techniques. * The Downsides of Countering =========================== Addressing every plausible counter in your main thread can be difficult if not impossible. It can make your writing too verbose and lose reader interest. Counters in Scroll give you a place to record every scattered counter as it comes to you. You can then choose which are important enough to address in your main argument and relegate the rest to the source code (for the very avid reader). * Implementation ============== Counterpoints do not currently appear in the compiled HTML. Instead you only see them during write time. For now, they are just an alternate syntax for comments. But though they perform no new function, like traffic lines, sometimes form is function. That being said, there are potentially interesting directions this could go in the future, and it would be interesting to hear ideas of what people would like in a v2. * Keep writing, keep thinking! ⁂ Built with Scroll v150.0.0 04/13/2023 388 1.9 Introducing the Blink Tag -Introducing the Blink Tag ========================= by Breck Yunits https://github.com/breck7 Breck Yunits October 2, 2022 October 2, 2022 *Scroll's new blink tag lets you call attention to something important* I am really happy with the current state of Scroll and so grateful for the many people who have helped us get it to this point. That being said, I had a feeling we were missing something important. * *So I invented something simple and completely novel* Introducing the `blink` tag. When you have something important to say and you want to interupt people's lives, use the `blink` tag. It's as easy as this: ``` blink This blinks ``` Advertisers have known for ages that human eyes evolved to respond fast to motion. Now, using my new invention, the `blink` tag, you can bring this innovation from advertising to your products and websites. *The blink tag, available now in Scroll 34.1.0* https://scroll.pub/ Scroll 34.1.0 _Note: please don't use this. It's a joke_ Built with Scroll v149.0.0 +Introducing the Blink Tag ========================= by Breck Yunits https://github.com/breck7 Breck Yunits October 2, 2022 October 2, 2022 *Scroll's new blink tag lets you call attention to something important* I am really happy with the current state of Scroll and so grateful for the many people who have helped us get it to this point. That being said, I had a feeling we were missing something important. * *So I invented something simple and completely novel* Introducing the `blink` tag. When you have something important to say and you want to interupt people's lives, use the `blink` tag. It's as easy as this: ``` blink This blinks ``` Advertisers have known for ages that human eyes evolved to respond fast to motion. Now, using my new invention, the `blink` tag, you can bring this innovation from advertising to your products and websites. *The blink tag, available now in Scroll 34.1.0* https://scroll.pub/ Scroll 34.1.0 _Note: please don't use this. It's a joke_ Built with Scroll v150.0.0 10/02/2022 176 0.9 The Power of Indented Heredocs: Markdown, Textile, and BBCode in one file with no escaping -The Power of Indented Heredocs: Markdown, Textile, and BBCode in one file with no escaping ========================================================================================== by Breck Yunits https://github.com/breck7 Breck Yunits August 23, 2021 Scroll is a new language and static site generator that is mostly written in Parsers which are both built on a new syntax called Particles. * In this demo, I extend Scroll by adding support for Markdown, Textile, and BBCode. I want to demonstrate how easy it is to compose many languages into one using Particles, which is due to what you might call the Indented or Off-side Heredoc pattern. https://en.wikipedia.org/wiki/Markdown Markdown https://en.wikipedia.org/wiki/Textile_(markup_language) Textile https://en.wikipedia.org/wiki/BBCode BBCode My implementation is still _researchy_—Parsers still needs a lot of work—but my main point here is to demo how _simple and powerful indented heredocs are_. They allow you to compose unlimited languages in one file in a clean and scalable way. You don't need escaping. I think this is a very helpful pattern you can use in your own languages and code. Traditional Heredocs ==================== Traditional heredocs use start and end delimiters, like these examples from Ruby and Python and Markdown: ``` # Heredoc in Ruby puts Particles is that it is just indented or off-side HereDocs. Or in colloquial academic speak _The Off-Side Rule is all you need_. Most people learn of the off-side rule via Python. Imagine if your whole language was just the off-side rule. That's basically Particles. But my code is not the important thing—the important thing is this pattern. Try it yourself—I bet you will love it. https://en.wikipedia.org/wiki/Off-side_rule Off-Side Rule https://en.wikipedia.org/wiki/Here_document HereDocs Extended Examples ================= Markdown ======== Textile ======= BBCode ====== Built with Scroll v149.0.0 +The Power of Indented Heredocs: Markdown, Textile, and BBCode in one file with no escaping ========================================================================================== by Breck Yunits https://github.com/breck7 Breck Yunits August 23, 2021 Scroll is a new language and static site generator that is mostly written in Parsers which are both built on a new syntax called Particles. * In this demo, I extend Scroll by adding support for Markdown, Textile, and BBCode. I want to demonstrate how easy it is to compose many languages into one using Particles, which is due to what you might call the Indented or Off-side Heredoc pattern. https://en.wikipedia.org/wiki/Markdown Markdown https://en.wikipedia.org/wiki/Textile_(markup_language) Textile https://en.wikipedia.org/wiki/BBCode BBCode My implementation is still _researchy_—Parsers still needs a lot of work—but my main point here is to demo how _simple and powerful indented heredocs are_. They allow you to compose unlimited languages in one file in a clean and scalable way. You don't need escaping. I think this is a very helpful pattern you can use in your own languages and code. Traditional Heredocs ==================== Traditional heredocs use start and end delimiters, like these examples from Ruby and Python and Markdown: ``` # Heredoc in Ruby puts Particles is that it is just indented or off-side HereDocs. Or in colloquial academic speak _The Off-Side Rule is all you need_. Most people learn of the off-side rule via Python. Imagine if your whole language was just the off-side rule. That's basically Particles. But my code is not the important thing—the important thing is this pattern. Try it yourself—I bet you will love it. https://en.wikipedia.org/wiki/Off-side_rule Off-Side Rule https://en.wikipedia.org/wiki/Here_document HereDocs Extended Examples ================= Markdown ======== Textile ======= BBCode ====== Built with Scroll v150.0.0 08/23/2021 306 1.5 @@ -180,7 +180,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/search.txt b/blog/search.txt index 7d66a86d7..c02b75129 100644 --- a/blog/search.txt +++ b/blog/search.txt @@ -2,24 +2,24 @@ Search the Official Scroll Blog =============================== title,titleLink,text,date,wordCount,minutes -Scroll in 50 Questions,scrollInQuestions.html,"Scroll in 50 Questions ====================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits October 28, 2024 What is Scroll? =============== Scroll is a language for those who believe that what they cannot build with as few pieces as possible they do not understand. What is Scroll? =============== Scroll is a symbolic language. What is a symbolic language. ============================ A language you write with symbols. What is a symbol? ================= A symbol is a mark repeated to correlate to a pattern in nature. What is a mark? =============== A mark is a discoloration of a surface. What is a symbolic language? ============================ A symbolic language is a collection of symbols and symbol sequences that can be used to trigger the same electrical phenomena in the brain of an observer that seeing that pattern occur in nature would trigger. How do I use a symbolic language? ================================= By writing documents. What is a document? =================== It is a collection of marks on a surface. What is Particle Syntax? ======================== It is the syntax that Scroll uses. What is a syntax? ================= It is a set of rules for how to break up a document into symbols. What is a digital document? =========================== It is a file. What is a file? =============== It is a digital representation of a document as a series of bits. What is a bit? ============== A bit is a persistent location in space that has 2 states: a 1 or 0; a true or false; an on or off; a black or white; a hot or cold; a high or low. What is a character? ==================== A character is a 2D mark that maps to a unique fixed length bit sequence. What is a character encoding? ============================= A map of bit sequences to characters. What character encoding does Scroll use? ======================================== UTF8. For now. What is a word? =============== A word is a list of characters delimited by a word delimiter sequence. What is an atom? ================ An atom is another word for word in the Scroll language. What is a line? =============== A line is a sequence of atoms in the Scroll language delimited by a newline sequence. What is a Particle? =================== A particle in Scroll refers to an object that contains both atoms and a collection of particles referred to as the particle's subparticles. Are all particles also subparticles of a higher particle? ========================================================= Yes. What is a Parser? ================= A Parser is a particle that consumes certain other particles to perform transformations. What transformations can a Parser perform? ========================================== A Parser can perform a variety of transformations but the most common are to: - compile one particle in one language to another language. - format a particle into a standardized format - check a particle for errors - evalute the instructions in a particle and return the results - execute commands contained in the particle What is the syntax of Scroll? ============================= The syntax of Scrolls is Particle Syntax, or just Particles for short. What does Particle Syntax do? ============================= Partilces tells you how to divide a binary sequence into parts. What are the components of Particle Syntax? =========================================== - A sequence of binary bits is converted into characters using UTF8 - Atoms are sequences of characters separated by a single space. - Particles are a sequence of atoms separated by a newline. - Subparticles are indicated by a single indented space. How do I make a subparticle? ============================ - Just indent a particle by 1 space more than its parent particle. - For example, because I started this line with one space more than the line above, this line is a subparticle of that line. - And then this line, starting with 2 spaces, is a subparticle of the line above it. - But this line is a subparticle of the line above that starts with ""Just"" Can I use the Particles, Parsers, and Scroll concepts to design 2D or 3D languages that don't use computers at all? =================================================================================================================== Yes. But generally when we talk about PPS we are talking about the form designed for binary and computers. What is Parsers? ================ Parsers is a symbolic language where one defines Particles that can consume other Particles. It is a language for making other languages. What is Scroll? =============== Scroll is a language made out of Parsers. What is the purpose of the Parsers language? ============================================ The purpose of the Parsers Language is to make Scroll. What is the purpose of Scroll? ============================== The purpose of Scroll is to help humans communicate with humans and machines. How does one use Scroll to communicate? ======================================= By writing Scroll documents (aka Scroll Programs) to create things. What kinds of things is Scroll currently best at creating? ========================================================== Blogs, websites, web pages, charts, animations, data science reports, ebooks, web forms, maps, that sort of thing. Why use Scroll and not just write HTML directly? ================================================ Scroll helps you better understand what you are writing about and anything HTML can make Scroll can make in fewer symbols. Scroll is a language for those who believe that what they cannot build with as few pieces as possible they do not understand. What is ScrollHub? ================== ScrollHub is a super server for creating and publishing websites instantly using Scroll. What is a cue? ============== Cue refers to the first atom in a particle. What is the significance of the cue? ==================================== When communicating you want to communicate the most important information first, so the cue is often the most important information. What is the cue used for? ========================= Most parsers use the cue to determine whether they should consume a particle or not. Can parsers use other ways to match against particles? ====================================================== Yes. What's another commmon way for parsers to match particles? ========================================================== Regular expressions. Can I build Scroll using only Particles and Parsers and no other languages? =========================================================================== Currently no. Parsers does not have enough functionality yet to be able to write parsers that provide everything Scroll needs. What other language do I currently need? ======================================== The primary implementation of Parsers currently is half Parsers, half Javascript. How does Parsers parser Scroll? =============================== The Parsers program is parsed and compiled by a Javascript implementation of Parsers which generates a Parser and compiler for Scroll programs. Do I need to master Javascript to use Parsers? ============================================== If you've mastered Javascript then using Parsers should be easy once you get the hang of it. Does Parsers have inheritance? ============================== Yes. Does Particle Syntax have types? ================================ No. Does Parsers have types? ======================== Yes. Parsers has atom types. Is Scroll like Lisp? ==================== Scroll and Parsers implement many of the best ideas from Lisp, and leave out a lot of bad ideas (like the parens). Is Scroll designed for humans or AIs? ===================================== Both. ⁂ Built with Scroll v149.0.0 ",10/28/2024,1080,5.4 -Web Forms for Geniuses,forms.html,"Web Forms for Geniuses ====================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits October 1, 2024 If you want to make web forms the inefficient way, there are many other places to read how to do that. If you want to learn how geniuses are doing web forms, read on. * One Field at a Time is Retarded =============================== Building forms for one-field-at-a-time data entry is inefficient. People can't copy/paste your forms. E-receipts are a pain. Auto-form fill works poorly. It's a huge waste of your users' time that retards them and your business. And it will always be this way. Entire Form in One Field is Genius ================================== Everything becomes radically simpler. People can do things like copy/paste entire applications; email them; version control them; collaborate on them; all effortlessly. And guess what? You can still also compile to a one-field-at-a-time HTML form and allow users to swap back and forth! It's pure win, no loss. You can use this TODAY! ======================= This now ships in Scroll. Here is a test form. You can also see it in use in many of our products. https://scroll.pub/blog/../tests/forms.html a test form Because this is new technology, it is not for those that need spoon feeding. Believe it or not, making web forms also used to be complicated. (If you need this urgently, don't have time to figure it out yourself, and need to hire professional consulting, feel free to get in touch.) Don't whine. Build. =================== I'm tired of reading all the whiners commenting about how our CSS doesn't look so pretty yet, or the tiny little feature you need that isn't supported. I don't care much to hear from whining losers. I want to hear from winners. From builders. From those who strive for genius. Beautiful designs, autoincrement, auto timestamp, joins, decision trees, all that stuff is coming. The world is gonna love this. If you are a winner, a builder, a genius, join us on GitHub or Reddit. https://github.com/breck7/scroll GitHub https://www.reddit.com/r/WorldWideScroll/ Reddit ⁂ Built with Scroll v149.0.0 ",10/01/2024,369,1.8 -The Successor to RSS is Git Clone,gitOverRss.html,"The Successor to RSS is Git Clone ================================= by Breck Yunits https://twitter.com/breckyunits Breck Yunits September 2, 2024 Today on HackerNews Kevin Damm had a great idea: put a `<link>` tag on blogs to point to the git Source Code Repository, much as blogs today have `<link>` tags pointing to their RSS feeds. https://news.ycombinator.com/item?id=41427044 great idea I've added this feature to Scroll and it's live now. If you View Source of this page, you'll see: https://scroll.pub/blog/../index.html Scroll ``` ``` Client applications can start looking for and taking advantage of these tags. * RSS was great, but it's no match for Git Clone ============================================== Git clone solves a million problems. You get a copy of the entire works of your favorite authors that is blazing fast, works offline, is searchable, transformable, censorship resistant, auditable, more trustworthy, ad free, tracker free, et cetera. There is no comparison to the old ways of doing things. * What do you think? ================== Have you already been doing this? Are there ways we can make it better? Would love to hear your feedback! ⁂ Notes ===== vladimyr on bluesky dug up a couple of cool examples of prior art. https://bsky.app/profile/vladimyr.bsky.social/post/3l3anievhnm2t vladimyr on bluesky Built with Scroll v149.0.0 ",09/02/2024,224,1.1 -A New Way to Program,teddyTalk.html,"A New Way to Program ==================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits August 30, 2024 Particles, Scroll, and the Parsers Programming Language ======================================================= I've recorded a short video (1 minute version; 10 minute version) about our recent work which has begun to eat the software world. https://www.youtube.com/watch?v=tpJY7PUmBIU 1 minute version https://www.youtube.com/embed/YcnWSNGEHvI?si=p_vOxpt9lusNKgli&t=75s 10 minute version * Outline ======= 1. Is this stuff relevant to you? ================================= Whether you are an experienced, aspiring, or casual programmer, yes. If you are a writer, yes. If you are a thinker, yes. If you are a builder, yes. If you choose to always remain illiterate to keep your brain different than the crowd, then no. (I applaud your brave creative choice and as a scientist I'm curious to see what happens!) 2. What is Particle Syntax (Particles)? ======================================= One liner: a syntax-free syntax for splitting files into particles (separated by line breaks) which can have atoms (separated by spaces) and subparticles (indented lines). Vibe https://particles.scroll.pub Vibe Playground https://sdk.scroll.pub/sandbox/ Playground LeetSheet https://scroll.pub/particlesLeetsheet.html LeetSheet [Image Omitted] width 400 Each line is a particle. Each dot is a atom. Particles lets you easily compare programs and see which one is simpler (less heavy!). 3. What is Scroll? ================== One liner: Scroll is a language for scientists of all ages where you write and combine particles (written in Particles) to evolve and publish your most intelligence ideas to HTML, PDFs, CSVs, JSON files, movie files, audio files, slideshows, charts, books, et cetera. Vibe https://scroll.pub/blog/index.html Vibe Playground https://try.scroll.pub/ Playground LeetSheet https://scroll.pub/leetsheet.html LeetSheet [Image Omitted] width 400 Scroll is a collection of Parsers that allow you to evolve and publish your most intelligent ideas. 4. What is Parsers? =================== One liner: Parsers is a programming language where programmers write parsers (written in Particles) which consume particles (written in Particles) and also contain logic for translating those particles into actions on computing machines. Vibe https://github.com/breck7/scroll/tree/main/parsers Vibe Playground https://sdk.scroll.pub/designer#url%20https%3A%2F%2Ftry.scroll.pub%2Fscroll.parsers Playground LeetSheet https://scroll.pub/parserLeetsheet.html LeetSheet [Image Omitted] width 400 Programmers who understand how computing machines work write Parsers to translate particles into executable machine code. 5. How do you get started? ========================== ScrollHub http://hub.scroll.pub/ ScrollHub Subreddit https://www.reddit.com/r/WorldWideScroll/ Subreddit ⁂ Built with Scroll v149.0.0 ",08/30/2024,426,2.1 -Tables: a microlang for data science,tables.html,"Tables: a microlang for data science ==================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits August 9, 2024 Tables, aka spreadsheets, are arguably the most important _visual_ thought tool. But no one has designed the perfect _textual_ language for manipulating them. Until now. Say hello to Tables =================== Try now https://try.scroll.pub/#scroll%0A%20theme%20gazette%0A%20%0A%20expander%20Presidents%0A%20https%3A%2F%2Fohayo.breckyunits.com%2Fohayo%2Fpackages%2Fsamples%2Fpresidents.csv%0A%20%20groupBy%20Party%0A%20%20%20orderBy%20-count%0A%20%20%20%20printTable%0A%20%20scatterplot%0A%20%20%20x%20number%0A%20%20%20y%20Party%0A%20%20%20fill%20Party%0A%20%0A%20expander%20Elements%0A%20https%3A%2F%2Fohayo.breckyunits.com%2Fohayo%2Fpackages%2Fsamples%2Fperiodic-table.csv%0A%20%20scatterplot%0A%20%20%20x%20Year%0A%20%20%20y%20AtomicNumber%0A%20%20%20fill%20Radioactive%0A%20%20%20symbol%20Metal%0A%20%0A%20%2F%2F%20expander%20Inline%20Data%0A%20table%0A%20%20scatterplot%0A%20%20%20title%20Top%2050%20programming%20language%20projects%20on%20GitHub.%0A%20%20%20x%20appeared%0A%20%20%20y%20rank%0A%20%20%20radius%20githubStars%0A%20%20%20label%20name%0A%20%20orderBy%20appeared%0A%20%20%20sparkline%0A%20%20%20%20y%20githubStars%0A%20%20%20%20color%20green%0A%20%20%20select%20name%20githubStars%0A%20%20%20%20heatrix%0A%20%20data%0A%20%20%20rank%2Cname%2Cappeared%2CgithubStars%0A%20%20%203%2CPython%2C1991%2C61378%0A%20%20%204%2CJava%2C1995%2C19037%0A%20%20%208%2CPerl%2C1987%2C1886%0A%20%20%209%2CRuby%2C1995%2C21790%0A%20%20%2010%2CPHP%2C1995%2C37688%0A%20%20%2013%2CGo%2C2009%2C121611%0A%20%20%2014%2CTypeScript%2C2012%2C99410%0A%20%20%2018%2CPowerShell%2C2006%2C44220%0A%20%20%2020%2CRust%2C2010%2C95455%0A%20%20%2021%2CSwift%2C2014%2C67064%0A%20%20%2025%2CKotlin%2C2011%2C48462%0A%20%20%2027%2CClojure%2C2007%2C10392%0A%20%20%2028%2CCoffeeScript%2C2009%2C16466%0A%20%20%2029%2CElixir%2C2011%2C24093%0A%20%20%2030%2CErlang%2C1986%2C11203%0A%20%20%2034%2CJulia%2C2012%2C45137%0A%20%20%2041%2CRacket%2C1994%2C4741%0A%20%20%2042%2CSolidity%2C2014%2C22794%0A%20%20%2043%2CWebAssembly%2C2015%2C6621%0A%20%20%2045%2CZig%2C2015%2C32864%0A%20%20%2047%2CNim%2C2008%2C16308%0A%20%20%2050%2CTOML%2C2013%2C19332 Try now ⁂ Acknowledgements ================ Tables evolved over the past decade primarily by: - just doing what Hadley Wickham did in dplyr https://dplyr.tidyverse.org/ dplyr https://hadley.nz/ Hadley Wickham - using Mike Bostock's d3 under the hood https://bost.ocks.org/mike/ Mike Bostock https://d3js.org/ d3 - reading all of Jeffrey Heer's papers https://homes.cs.washington.edu/~jheer/ Jeffrey Heer - thinking about what would be the best tool for Max Roser and Hannah Ritchie. https://ourworldindata.org/ Max Roser and Hannah Ritchie Built with Scroll v149.0.0 ",08/09/2024,479,2.4 -Build Your Own Counters With 3 Words,counters.html,"Build Your Own Counters With 3 Words ==================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits August 2, 2024 I like collections of interesting numbers, such as BioNumbers. Animated counters provide a useful perspective when pondering large numbers. I wanted to make it as easy as possible for anyone to create these counters. https://bionumbers.hms.harvard.edu/Search.aspx?task=searchbypop BioNumbers So, today I added a new parser to Scroll: *counter*. ``` counter 1.1 Heartbeats ``` * Try now https://try.scroll.pub/#scroll%0A%20theme%20gazette%0A%20%0A%20%23%20Show%20HN%3A%20Make%20a%20counter%20with%203%20words%0A%20%0A%20New%20in%20Scroll%20v112.1.0.%20Read%20more.%0A%20%20https%3A%2F%2Fscroll.pub%2Fblog%2Fcounters.html%20Read%20more.%0A%20%0A%20code%0A%20%20counter%20%5BRate%2FSecond%5D%20%5BDescription%5D%0A%20%0A%20%23%20Since%20you%20loaded%20this%20page...%0A%20%0A%20thinColumns%0A%20%0A%20%23%23%20World%20Population%0A%20counter%204.5%20Babies%20Born%0A%20%20https%3A%2F%2Fourworldindata.org%2Fbirths-and-deaths%0A%20counter%201.7%20Human%20Deaths%0A%20%20https%3A%2F%2Fourworldindata.org%2Fbirths-and-deaths%0A%20counter%208123456789%20heart%20beats%0A%20%20https%3A%2F%2Fourworldindata.org%2Fgrapher%2Fpopulation%0A%20%0A%20%23%23%20In%20Your%20Body%0A%20counter%203112123%20Red%20Blood%20Cells%20Made%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fbooks%2FNBK2263%2F%0A%20counter%203812123%20Cells%20Made%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fbooks%2FNBK2263%2F%0A%20counter%202123456789123456789123%20ATP%20molecules%20made%0A%20%20https%3A%2F%2Fbio.libretexts.org%2FBookshelves%2FHuman_Biology%2FHuman_Biology_(Wakim_and_Grewal)%2F05%253A_Cells%2F5.09%253A_Cellular_Respiration%0A%20%0A%20%23%23%20In%20Your%20Brain%0A%20counter%201.2e12%20Action%20Potentials%20Fired%0A%20%20https%3A%2F%2Fwww.khanacademy.org%2Ftest-prep%2Fmcat%2Forgan-systems%2Fneural-synapses%2Fa%2Fsignal-propagation-the-movement-of-signals-between-neurons%0A%20counter%203.64e18%20Ketones%20Consumed%20(Ketosis)%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fpmc%2Farticles%2FPMC7699472%2F%0A%20counter%204.64e18%20Glucose%20Molecules%20Consumed%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fpmc%2Farticles%2FPMC3900881%2F%0A%20%0A%20%23%23%20World%20Economy%0A%20counter%202.5%20Cars%20Made%0A%20%20https%3A%2F%2Fwww.statista.com%2Fstatistics%2F262747%2Fworldwide-automobile-production-since-2000%2F%0A%20counter%2026012%20Cups%20of%20Coffee%20Consumed%0A%20%20https%3A%2F%2Fwww.rgare.com%2Fknowledge-center%2Farticle%2Fcoffee-consumption-how-much-is-too-much-and-how-little-is-not-enough%0A%20counter%2059321%20YouTubes%20Watched%0A%20%20https%3A%2F%2Fthesocialshepherd.com%2Fblog%2Fyoutube-statistics%0A%20%0A%20%23%23%20Flight%0A%20counter%200.00008%20Objects%20Launched%20into%20Space%0A%20%20https%3A%2F%2Fourworldindata.org%2Fgrapher%2Fyearly-number-of-objects-launched-into-outer-space%0A%20counter%200.00004%20Planes%20Built%0A%20%20https%3A%2F%2Fwww.ibisworld.com%2Fglobal%2Fmarket-research-reports%2Fglobal-commercial-aircraft-manufacturing-industry%2F%0A%20counter%201.17%20Planes%20Landed%0A%20%20https%3A%2F%2Fwww.faa.gov%2Fair_traffic%2Fby_the_numbers%0A%20%0A%20%23%23%20Animals%0A%20counter%200.00004%20Blue%20Whales%20Born%0A%20%20https%3A%2F%2Fwww.marinemammalcenter.org%2Fanimal-care%2Flearn-about-marine-mammals%2Fcetaceans%2Fblue-whale%0A%20counter%200.001%20Elephants%20Born%0A%20%20https%3A%2F%2Felephantconservation.org%2Fabout-elephants%2F25-things-to-know%2F%0A%20counter%203.1e10%20Ants%20Born%0A%20%20https%3A%2F%2Fprivateexterminator.com%2Fare-all-the-ants-as-heavy-as-all-the-humans%0A%20 Try now =================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== * Since you loaded this page... ============================= World Population ================ 4.5 Babies Born https://ourworldindata.org/births-and-deaths 4.5 Babies Born 1.7 Human Deaths https://ourworldindata.org/births-and-deaths 1.7 Human Deaths 8123456789 heart beats https://ourworldindata.org/grapher/population 8123456789 heart beats In Your Body ============ 3112123 Red Blood Cells Made https://www.ncbi.nlm.nih.gov/books/NBK2263/ 3112123 Red Blood Cells Made 3812123 Cells Made https://www.ncbi.nlm.nih.gov/books/NBK2263/ 3812123 Cells Made 2123456789123456789123 ATP molecules made https://bio.libretexts.org/Bookshelves/Human_Biology/Human_Biology_(Wakim_and_Grewal)/05%3A_Cells/5.09%3A_Cellular_Respiration 2123456789123456789123 ATP molecules made In Your Brain ============= 1.2e12 Action Potentials Fired https://www.khanacademy.org/test-prep/mcat/organ-systems/neural-synapses/a/signal-propagation-the-movement-of-signals-between-neurons 1.2e12 Action Potentials Fired 3.64e18 Ketones Consumed (Ketosis) https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7699472/ 3.64e18 Ketones Consumed (Ketosis) 4.64e18 Glucose Molecules Consumed https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3900881/ 4.64e18 Glucose Molecules Consumed World Economy ============= 2.5 Cars Made https://www.statista.com/statistics/262747/worldwide-automobile-production-since-2000/ 2.5 Cars Made 26012 Cups of Coffee Consumed https://www.rgare.com/knowledge-center/article/coffee-consumption-how-much-is-too-much-and-how-little-is-not-enough 26012 Cups of Coffee Consumed 59321 YouTubes Watched https://thesocialshepherd.com/blog/youtube-statistics 59321 YouTubes Watched Flight ====== 0.00008 Objects Launched into Space https://ourworldindata.org/grapher/yearly-number-of-objects-launched-into-outer-space 0.00008 Objects Launched into Space 0.00004 Planes Built https://www.ibisworld.com/global/market-research-reports/global-commercial-aircraft-manufacturing-industry/ 0.00004 Planes Built 1.17 Planes Landed https://www.faa.gov/air_traffic/by_the_numbers 1.17 Planes Landed Animals ======= 0.00004 Blue Whales Born https://www.marinemammalcenter.org/animal-care/learn-about-marine-mammals/cetaceans/blue-whale 0.00004 Blue Whales Born 0.001 Elephants Born https://elephantconservation.org/about-elephants/25-things-to-know/ 0.001 Elephants Born 3.1e10 Ants Born https://privateexterminator.com/are-all-the-ants-as-heavy-as-all-the-humans 3.1e10 Ants Born Computer Chips ============== 66.7 CPUS made by Intel https://www.intel.com/content/www/us/en/architecture-and-technology/global-manufacturing.html 66.7 CPUS made by Intel 6234556543 Transistors made by Nvidia https://nvidianews.nvidia.com/news/nvidia-announces-hopper-architecture-the-next-generation-of-accelerated-computing 6234556543 Transistors made by Nvidia 61234556543 Transistors made by Intel https://www.intel.com/content/www/us/en/history/museum-transistors-to-transformations-brochure.html 61234556543 Transistors made by Intel ⁂ Built with Scroll v149.0.0 ",08/02/2024,1026,5.1 -Heatrix: Heat Maps + Matrix Visualizations,heatrix.html,"Heatrix: Heat Maps + Matrix Visualizations ========================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits [Image Omitted] A heatrix on CancerDB. https://cancerdb.com/blog/cancer-heatmaps.html A heatrix on CancerDB. July 28, 2024 Do you love those GitHub Activity Charts and want to make your own but don't know what they are called or what library to use and your work is busy and you have kids and sorry I'll call you back someone is crying? Introducing Scroll's newest parser: `heatrix`! https://scroll.pub/blog/../index.html Scroll's Try Now | Watch Video https://try.scroll.pub/#scroll%0A%20%23%20Heatrix%20Demos%0A%20%0A%20%23%23%20Adjust%20the%20height%2Fwidth%20of%20individual%20cells%2C%20columns%2C%20or%20rows%3A%0A%20heatrix%0A%20%20h20%3BScroll%20h20%3BPLDB%0A%20%20400%20700%0A%20%0A%20%23%23%20Add%20links%3A%0A%20heatrix%0A%20%20h20%3BScroll%3Bhttps%3A%2F%2Fscroll.pub%20h20%3BPLDB%3Bhttps%3A%2F%2Fpldb.io%0A%20%20400%20700%0A%20%0A%20%23%23%20Use%20numbers%20as%20labels%3A%0A%20heatrix%0A%20%20'2021%20'2017%0A%20%20400%20700%0A%20%0A%20%23%23%20Use%20your%20own%20custom%20color%20palettes%20and%20set%20your%20own%20thresholds%3A%0A%20heatrixAdvanced%0A%20%20table%0A%20%20%20%20%0A%20%20%20h10%3Bw30%20'2015%20'2016%20'2017%20'2018%20'2019%20'2020%20'2021%20'2022%20'2023%20'2024%0A%20%20%20h30%3Bw30%3B%200%200%205%201%202%2011%2015%2010%2012%2056%0A%20%20scale%0A%20%20%20%23ffebee%200%0A%20%20%20%23ffcdd2%201%0A%20%20%20%23ef9a9a%205%0A%20%20%20%23e57373%2010%0A%20%20%20%23ef5350%2025%0A%20%20%20%23b71c1c%2050 Try Now https://www.youtube.com/watch?v=ycF3k63qn1Y Watch Video ========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================= `heatrix` let's you craft custom heatmap visualizations with the fewest keystrokes possible. Heat Map + Matrix = Heatrix =========================== [Image Omitted] Source code. Gif made with CleanShotX. https://try.scroll.pub/#scroll%0A%20heatrix%0A%20%208%206%207%205%0A%20%2030%209 Source code https://cleanshot.com/ CleanShotX * Not just a library, it's a microlanguage! ========================================= `heatrix` is a microlang that let's you customize your visualizations using ""directives"": Adjust the height/width of individual cells, columns, or rows: ============================================================== Add links: ========== Add labels: =========== Use numbers as labels: ====================== Use your own custom color palettes and set your own thresholds: =============================================================== * Like Heatrix? There's more where that came from! ================================================ Join the World Wide Scroll Beta today! ====================================== If you like `heatrix` and want to see more stuff like this, but a folder on the World Wide Scroll beta and good things will come your way: https://wws.scroll.pub/ World Wide Scroll beta ⁂ Built with Scroll v149.0.0 ",07/28/2024,467,2.3 -Contacts: A Microlang for Managing Contacts,contacts.html,"Contacts: A Microlang for Managing Contacts =========================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits July 16, 2024 Imagine a single plain text file named `contacts.scroll` where you stored the contact info for your family, friends, and colleagues, and you could track changes with git, compile it to a beautiful PDF or HTML page with search and sort, and it would also compile to CSV and/or JSON for import into iPhone, Android, Gmail, Outlook, et cetera? Also imagine that this tool is free, open source, and public domain. * Introducing *Contacts*, a microlanguage (currently 23 lines of code, including comments) that makes it as concise as possible to add, prune, display, print and export your contacts. https://github.com/breck7/scroll/blob/main/microlangs/contacts.parsers 23 lines of code * There's almost nothing to learn (the code is self-explanatory). In fact, it's almost guaranteed that using Contacts you will need to write less (we've taken every unnecessary character out). * Example ======= ``` 👤 Jack Doe phone +1 (555) 123-4567 email john.doe@example.com birthday 2/23/84 notes Daughter - Samantha. 👤 Jill Smith phone +1 (555) 123-4562 email jill@gmail.com birthday 1/23/80 ``` * How to use ========== 1. Create a file named something like `contacts.scroll` with this content: ``` // You can import the file, or just copy/paste the 21 lines of code here. [pathToScroll]/microlangs/contacts.parser title My Contacts buildConcepts contacts.csv contacts.json contacts.tsv buildHtml theme gazette mediumColumns 1 printTitle table printTable tableSearch 👤 Jack Doe phone +1 (555) 123-4567 email john.doe@example.com birthday 2/23/84 notes Daughter - Samantha. 👤 Jill Smith phone +1 (555) 123-4562 email jill@gmail.com birthday 1/23/80 ``` 2. Run `scroll build` Done! You should now see a contacts.html file for display and printing as well as TSV, CSV, and JSON files. https://scroll.pub/blog/../tests/contacts.html contacts.html * [Image Omitted] Contacts is interoperable with pen and paper. * What do you think? Anything that should be added/removed/improved? * Notes ===== 1. The idea for Contacts was sparked by this tweet from Tyler Tringas. https://x.com/tylertringas/status/1813239718957461528 this tweet from Tyler Tringas ⁂ Built with Scroll v149.0.0 ",07/16/2024,371,1.9 -How I Designed Helpful 404's and Stopped Worrying about Broken Links,helpful404s.html,"How I Designed Helpful 404's and Stopped Worrying about Broken Links ==================================================================== by Breck Yunits https://breckyunits.com Breck Yunits July 12, 2024 _Woohoo!_ Your blog is on top of Reddit! _OH NO._ There's a typo in your url. 🤦 *What do you do?* * You try to calm yourself down. _Almost no one looks at the url and the content of the article is what's important and the traffic is coming_ But then you think _all I can see is that i before e after c!_ But then you think _is that *really* a rule_ and _maybe that's how it's spelled in London?_ * You can't help yourself. It's an affront to your craftsmanship to not correct the bad filename. You know you can so easily rename the file but then existing links will break and so you'll have to add redirects but that means more files to maintain or god forbid that would require adding a server and you just love your static blog and it's almost 2pm and you have to leave and pick up the kids from school what do you do!?!! Or do you just break the links and going forward everyone will have the proper URL but everyone who clicks the old links will see an unhelpful 404 and you reflect on how great this thing that Tim Berners-Lee gave to the world is and how could you litter his creation with unhelpful 404s? * If the story above resonates with you, the bad news is you may suffer from Broken Link Phobia. Luckily, there is now a cure. * Introducing: Helpful 404's - never worry about broken links again! ================================================================== Scroll now comes with a way to generate a very helpful 404 page so your visitors will get redirected to the right place even if the URL they clicked is off by a few characters. The best part? It works entirely client side on static sites. How to use ========== *Step 1* Create a sitemap: ```sitemap.scroll buildTxt sitemap.txt baseUrl https://scroll.pub/ printSiteMap ``` *Step 2* Create a 404 page: ```404.scroll buildHtml Sorry, the url you requested was not found. helpfulNotFound sitemap.txt ``` That's it! The `helpfulNotFound` parser in Scroll will add Javascript to the 404 page that fetches all the urls found in the sitemap and shows the user the closest match. As a bonus, you also get a `sitemap.txt` file great for Google SEO and other uses. See it in action here by clicking on this intentionally broken link: https://scroll.pub/blog/helpful_404s.html intentionally broken link * I've been using Helpful 404s on all my sites for the past couple of months and it's been delightful. I no longer spend any time worrying about making improvements to URLS. I just do it and I know that users following old links will still have a good experience. * If you like stuff like Helpful 404's, there's _a lot_ more like that in Scroll, which is public domain and open source. Try it today, and if you like what we are doing please consider bringing your site to the World Wide Scroll! https://wws.scroll.pub World Wide Scroll ⁂ Built with Scroll v149.0.0 ",07/12/2024,546,2.7 -Convert CSVs to ScrollSets,csvToScrollSet.html,"Convert CSVs to ScrollSets ========================== by Breck Yunits https://github.com/breck7 Breck Yunits July 9, 2024 ScrollSets are _very_ useful once you get going. But starting from scratch could be a bit tedious. https://breckyunits.com/scrollsets.html ScrollSets Not anymore! Just drop your CSV or TSV into the textarea below to generate a ScrollSet. (P.S. using LLMs with ScrollSets is another great way to get started) https://sets.scroll.pub/ using LLMs with ScrollSets * Your Data: ========== ScrollSet: ========== Related ======= ScrollSets: source code for CSVs ================================ 04/21/2024 https://scroll.pub/blog/scrollsets.html Built with Scroll v149.0.0 ",07/09/2024,100,0.5 -Changes: A Microlang for Change Logs,changes.html,"Changes: A Microlang for Change Logs ==================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits [Image Omitted] July 1, 2024 Regardless of what languages you write your programs in, you probably maintain files like _changeLog.txt_ or _releaseNotes.txt_. Change logs are very helpful for: - informing your users of new features and bug fixes - providing detailed technical information to your development team (and open source contributors) - periodical data analysis for strategic project planning - how fast are we shipping new features? fixing bugs? breaking things? What if there was 1 language that let you do all 3 things at once? * Introducing Changes, a microlang (only 70 lines of code, including comments) that makes it as concise as possible to write, read and analyze change logs. https://github.com/breck7/scroll/blob/main/microlangs/changes.parsers 70 lines of code Changes generates a pretty HTML file for your end users; allows for including unlimited detailed technical information for your developers; and generates summary statistics as TSV, CSV, and JSON for your project managers. * There's almost nothing to learn (the code is self explanatory). In fact, it's almost guaranteed that using Changes you will need to write less (we've taken every unnecessary character out). * Example ======= We use Changes for the Scroll Release Notes. https://scroll.pub/blog/../releaseNotes.html Scroll Release Notes Be sure to check out the source code that generates that HTML. https://github.com/breck7/scroll/blob/main/releaseNotes.scroll check out the source code * How to use ========== 1. Install Scroll ``` npm install -g scroll-cli ``` 2. Create a release notes file: ```releaseNotes.scroll title My Release Notes printTitle buildConcepts releaseNotes.csv releaseNotes.json releaseNotes.tsv // You can import the changes parsers or just copy/paste the 70 lines into your own file. [pathToScroll]/microlangs/changes.parser thinColumns 📦 0.1.1 7/1/2024 🏥 fixed bug in command line app 📦 0.1.0 7/1/2024 🎉 added command line app endColumns ``` 3. Run `scroll build` Done! You should now see a `releaseNotes.html` file as well as a TSV, CSV, and JSON file. * What do you think? Anything that should be added/removed/improved? ⁂ Related ======= - Changelog https://en.wikipedia.org/wiki/Changelog Changelog - Release Notes https://en.wikipedia.org/wiki/Release_notes Release Notes - Major Version Numbers are Not Sacred https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred Major Version Numbers are Not Sacred - What can we learn from programming language version numbers? https://breckyunits.com/versionNumbers.html What can we learn from programming language version numbers? Built with Scroll v149.0.0 ",07/01/2024,431,2.2 -Write scatterplot to get a scatterplot,plot.html,"Write scatterplot to get a scatterplot ====================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits June 24, 2024 I _engineered on_ many innovative data science tools, including Grapher and Ohayo^engineering. https://github.com/breck7/ohayo Ohayo https://github.com/owid/owid-grapher Grapher So I was excited to see Observable launch something new: Plot. https://observablehq.com/plot/ Plot https://observablehq.com/ Observable * Plot is already great on its own. It handles many of the hard parts of data vis, and it's open source, so we can help them fix the parts that are still a little rough. https://github.com/observablehq/plot open source But I found a way to take Plot to the next level: I combined it with Scroll. https://scroll.pub/blog/../index.html Scroll The Plot/Scroll integration is early, but I can already tell it will evolve into a _very useful_ data science tool. * A Scatterplot with 2 words ========================== You can now make scatterplots with 2 words. Obviously you want to add a few more words, but I don't think I'm exaggerating when I say that this is the simplest way to generate a scatterplot now and forever will be (until the day when we have mind-reading machines that can generate a scatterplot with zero words). But enough talk, let's see some code. A tutorial is below. To follow along, create a new website in 1 second using ScrollHub or install Scroll locally with `npm install -g scroll-cli`. http://hub.scroll.pub ScrollHub * Step 1: Generate a scatterplot with 2 words =========================================== * Step 2: Add a title =================== * Step 3: Add inline data ======================= * Step 4: Everything everywhere all at once ========================================= * That's it (for now)! If you like where this is headed, give us a star on GitHub. https://github.com/breck7/scroll give us a star on GitHub ⁂ ^engineering: The difference between programming and engineering? It takes programming to make a program that works. It takes engineering to make a program that _barely_ works. Built with Scroll v149.0.0 ",06/24/2024,342,1.7 -Stamp: a microlang for project templates,stamp.html,"Stamp: a microlang for project templates ======================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits June 23, 2024 Regardless if you specialize in React, Rails, Django, Next, Java, C#, or ObjectiveC, you probably use _templates_ to start new projects. Templates generate a handful of files like `readme.md`, `.gitignore`, and `main`. They also initialize a handful of directories like `src/` and `tests/`. What if it was even easier to make, edit and use these templates? * Introducing Stamp, a microlang (only 60 lines of code, including comments) that makes it as concise as possible to write, edit, share and expand project templates. https://github.com/breck7/scroll/blob/main/parsers/stamp.parsers 60 lines of code * How to use ========== 1. Install Scroll ``` npm install -g scroll-cli ``` 2. Create `myFirstStamp.scroll` ``` stamp .gitignore *.html readme.scroll # My First Stamp scripts/ hello.js console.log(""Hello world"") ``` 3. Run `scroll build` Done! * Stamp was jointly created by me and Guillaume Papin. Other tools (listed below) do similar things, but with some slight differences. https://github.com/Sarcasm Guillaume Papin https://github.com/breck7/scrollsdk/issues/120 jointly created ⁂ [Image Omitted] Prior Art ========= - cookiecutter https://github.com/cookiecutter/cookiecutter cookiecutter - Dired https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html Dired - vimv https://github.com/thameera/vimv vimv - ptar https://github.com/jtvaughan/ptar ptar - shar https://en.wikipedia.org/wiki/Shar shar - dar http://dar.linux.free.fr/ dar - metatar https://github.com/xyproto/metatar metatar - txtar https://pkg.go.dev/golang.org/x/tools@v0.1.0/txtar txtar - Archiving files in plain text https://blog.oquijano.net/id/9?lang=en Archiving files in plain text - Wikipedia list of archive formats https://en.wikipedia.org/wiki/List_of_archive_formats Wikipedia list of archive formats Built with Scroll v149.0.0 ",06/23/2024,300,1.5 -Scroll builds text files,textFiles.html,"Scroll builds text files ======================== by Breck Yunits https://breckyunits.com Breck Yunits HTML | TXT link textFiles.html HTML link textFiles.txt TXT April 29, 2024 Scroll is a new language for building HTML and CSV files that powers blogs, websites and knowledge bases. https://scroll.pub/blog/scrollsets.html knowledge bases https://scroll.pub/blog/../index.html Scroll * I often need plain text outputs in addition to HTML files. I used to make those plain text versions copying and pasting text by hand. Now Scroll has plain text output built-in. * How do I tell Scroll to build plain text files? =============================================== Add a single line: `buildTxt` ```example.scroll buildTxt Hello world. ``` `scroll build` will create `example.txt`. Done! * You may want to put `buildTxt` into `header.scroll` or `footer.scroll` to build text files for many pages at once. * I've *loved* this new feature in Scroll. Plain text is a *timeless* way to read, review, and share your thoughts! Hope you enjoy it as much as I have! ⁂ Built with Scroll v149.0.0 ",04/29/2024,175,0.9 -ScrollSets: source code for CSVs,scrollsets.html,"ScrollSets: source code for CSVs ================================ by Breck Yunits https://breckyunits.com Breck Yunits [Image Omitted] More examples of ScrollSets from sets.scroll.pub. https://sets.scroll.pub/ sets.scroll.pub April 21, 2024 The source code for this blog post contains a ScrollSet about the planets and generates this HTML file as well as a CSV, a TSV, and a JSON file. This page demonstrates *ScrollSets*. https://scroll.pub/blog/scrollsets.scroll source code for this blog post https://scroll.pub/blog/planets.csv CSV https://scroll.pub/blog/planets.tsv TSV https://scroll.pub/blog/planets.json JSON ScrollSets are useful for small single day projects and large multi-year projects with thousands of concepts like PLDB (a Programming Language Database). https://pldb.io PLDB * ScrollSets are normal plain text files written in Scroll that also contain measurements of concepts and output that data into formats ready for data visualization and analysis tools. https://scroll.pub/ Scroll ScrollSets are line oriented but represent a table(s). You might call them _deconstructed csvs_ or _deconstructed spreadsheets_. - Use LLMs to *instantly generate ScrollSets* that are ready for human verification and improvement. - Intermingle structured data with markup to *annotate any and every part of a ScrollSets* while still generating strict tabular files for data analysis tools. - Put data, schema, citations, and documentation *all* in one (or more) plain text file(s) to easily share, collaborate on, and improve, all *tracked by git for trust*. - Add unlimited citations (or none) to *every* measurement. Quick Code Example: =================== ```planets.scroll This ScrollSets has 2 measures (columns) and 2 concepts (rows). Documentation, column definitions, rows and *any notes/markup/content* can go in the same file. # Measures (aka Header, aka Columns, aka Schema) idParser // Every concept needs an ""id"" (or other concept delimiter) extends abstractIdParser moonsParser extends abstractIntegerParser # Concepts (aka Rows) id mars moons 2 // I verified moon count with Google. - BY id jupiter moons 63 // Note: the moons of Jupiter have their own Wikipedia Page https://en.wikipedia.org/wiki/Moons_of_Jupiter moons of Jupiter buildConcepts demo.csv ``` The code above generates an HTML page and this: =============================================== ```demo.csv id,moons mars,2 jupiter,63 ``` Overview: ========= - ScrollSets are built from 4 atomic elements: - concepts - think of rows in a spreadsheet - denoted by a line starting with `id ` - concepts are multiple lines of measurements - measures - think of these as the column names in a spreadsheet, along with meta information about the column - aka ""parsers"" - measures are defined in Parsers that start with a line like `moonsParser` - values - these are just the values of the measurements - measurements - concept & measure & value = measurement - 1 measurement = 1 line - measurements can have nested comments that are stripped when compiling to TSV/CSV How to use ========== - A concept is like a row in a database. All concepts need an id (or other concept delimiter). When you write `id [conceptId]`, Scroll knows that is the beginning of a new concept. - Measure definitions (aka ""parsers"") must come before the first concept and are written as Parsers, just like any other Scroll Parser. Measure parsers need to extend one of the abstract measure parser classes defined in `measures.scroll`. - Measurements are then done like this `appeared 2024` FAQ === Isn't the better idea to enhance existing spreadsheet GUIs with LLM generation capabilities? ============================================================================================ Almost certainly. Using ScrollSets will be much slower and worse than future spreadsheet apps with carefully crafted LLM integrations. However, it's important to also have simple, lower tech, timeless tools and ScrollSets is one of those. Can't you do this same thing with YAML and/or Markdown? ======================================================= Yes! You can easily achieve the same thing as LLMs & ScrollSets using LLMs & YAML, or LLMs & YAML & Markdown. https://yaml.org/ YAML https://github.github.com/gfm/ Markdown For YAML, just put your documentation and schema in YAML comments up top and then have a tiny script to read that YAML and dump CSV/TSV/JSON or whatever. YAML gives you loads of data structures to use and is widely supported in many languages. But generating HTML from the same file would require more work. If you want to intermix markup content with your data, you can use Markdown to add the marked up content and then have code sections embedding the YAML and a tiny script to parse out those YAML blocks and write your data to disk. So, why use Scroll for storing data instead of YAML? ==================================================== Either can do the job. I expect the Scroll design to end up being more ergonomic, but that might not be true or may be unimportant. If you don't like Scroll's (evolving) version and want to switch it will always be straightforward to automatically refactor to YAML. What other related work is out there? ===================================== This is a simple pattern to implement, so I'm sure it is likely it has been done a few times before. Please let me know so I can include links to--and learn from--any other prior art. What are the advanced features? =============================== - Types correctly exported in JSON - Supports nested measures - Support for computed measures - Autojoins across files on ids^roadmap - Auto generates normalized tables for array measures^roadmap - Support for text blobs^roadmap ^roadmap: Planned. What is the origin of ScrollSets? ================================= LLM dataset generation is a _major_ breakthrough in datasets. ScrollSets are, at best, a minor improvement. They are designed to work alongside LLMs to help solve the Dataset Needed problem. https://breckyunits.com/dataset-needed.html Dataset Needed ScrollSets evolved out of TrueBase. ScrollSets have eliminated the need for the TrueBase software (and existing TrueBase sites should be migrated to ScrollSets), but were informed by the TrueBase build experience. https://truebase.treenotation.org TrueBase Although ScrollSets are designed for a world with LLMs, the design is meant to be useful without them as well, and would also have been mildly useful 30 years ago. What were the design goals? =========================== - Have an LLM do the bulk of the work while humans supervise to remove hallucinations. - Can store everything (documentation, schema, all concepts) in 1 clean plain text file or split into many files (using the `import` parser). - The ScrollSet syntax balances _looseness_ useful in creative thinking with the _tightness_ needed by tabular data visualization and analysis tools. Why are measures and concepts root-level features and not indented? =================================================================== The normal way to implement this in Scroll would be something like: ``` measures id string moons int concept id mars moons 2 concept id jupiter moons 63 ``` The flat design was chosen for ergonomic reasons. ScrollSets seem like they might be useful enough to be worth breaking from Scroll convention a bit. Like all things in Scroll, ScrollSets are an experiment, and maybe this design will evolve. Extended Example: a Planets ScrollSet ===================================== Below is the ScrollSet embedded in this Scroll file. Measurements of the measures ============================ Extended Measures Example ========================= Extended Concepts Example ========================= Related ======= Convert CSVs to ScrollSets ========================== 07/09/2024 https://scroll.pub/blog/csvToScrollSet.html Built with Scroll v149.0.0 ",04/21/2024,1161,5.8 -Introducing Program Links,programLinks.html,"Introducing Program Links ========================= by Breck Yunits https://github.com/breck7 Breck Yunits May 8, 2023 Some web apps are designed to load _entire programs_ from a link. But if a program contain certain characters, such as _newlines_, those links won't work as-is. To create working links you have to run them through `encodeURIComponent`. * If you are creating blog content by hand this is annoying. To update a program link you have to keep a copy of the program, update that, then run `encodeURIComponent`, then paste the result into your post. Today's release of Scroll includes a small new addition that solves this problem. You can call them ""Multline Links"" or ""Program Links"". * Here are two examples ===================== Here is a program link to the Scroll web app. https://try.scroll.pub/#scroll%0A%20%23%20Testing%20Program%20Links%0A%20It%20worked!%0A%20%20style%20color%3Agreen%3B%20font-size%3A%20100px%3B program link If you click that link you should see ""It worked!"" in big green text. * Now let's show a complex real world example. The link below contains a 28 line program pasted verbatim from the Ohayo data science studio. See code Discovery of the Elements https://ohayo.breckyunits.com?filename=test.ohayo&data=doc.title%20Discovery%20of%20the%20Elements%0Adoc.subtitle%20What%20is%20the%20growth%20in%20known%20elements%20over%20time%3F%0Asamples.periodicTable%0A%20hidden%0A%20fill.missing%20Year%201000%0A%20%20hidden%0A%20%20columns.keep%20Element%20Year%0A%20%20%20hidden%0A%20%20%20rows.sortBy%20Year%0A%20%20%20%20hidden%0A%20%20group.by%20Year%0A%20%20%20hidden%0A%20%20%20rows.sortBy%20Year%0A%20%20%20%20hidden%0A%20%20%20%20rows.runningTotal%20count%0A%20%20%20%20%20hidden%0A%20%20%20%20%20vega.bar%20Number%20of%20Elements%20Found%20Each%20Year%0A%20%20%20%20%20%20xColumn%20Year%0A%20%20%20%20%20%20yColumn%20count%0A%20%20%20%20%20vega.line%20Cumulative%20Number%20of%20Elements%0A%20%20%20%20%20%20xColumn%20Year%0A%20%20%20%20%20%20yColumn%20total%0A%20vega.scatter%20Year%20of%20Discovery%20by%20Atomic%20Number%0A%20%20xColumn%20Year%0A%20%20yColumn%20AtomicNumber%0A%20tables.basic%0A%20%20rowDisplayLimit%20200%0Adoc.categories%20chemistry Discovery of the Elements If you click that link you should see a few data visualizations generated from that program. Edit the source and the link will update accordingly. Scroll handles the `encodeURIComponent`. * Why not use HTML directly? ========================== Modern browsers do their best to make URLs well-formed and you will notice that they auto encode certain characters like spaces. But by the HTML spec newlines are not a URL code point and generally are stripped and collapsed. https://url.spec.whatwg.org/#url-code-points URL code point https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace stripped and collapsed Program Links in Scroll handle encoding newlines and any other special characters so you can focus on your content and not the encoding. Built with Scroll v149.0.0 ",05/08/2023,507,2.5 -Counterpoints: A new tool for thought in the Scroll Language,counterpoints.html,"Counterpoints: A new tool for thought in the Scroll Language ============================================================ by Breck Yunits https://github.com/breck7 Breck Yunits Improve your writing by welcoming counterarguments ================================================== April 13, 2023 There's a tiny new symbol in Scroll today: `!`. https://scroll.pub/ Scroll The exclamation mark stands for *Counterpoint*. ""Counters"" aim to help writers strengthen their ideas by encouraging the integration of counterarguments throughout their essays. You can write your own counters or invite counters from friends, LLMs or Internet commenters. * Counterpoints are easy to use: just start a line with `!`. For example: ``` Humans will eventually establish colonies on Mars. ! But we haven't colonized the Arctic, 1,000x easier ``` You can go as deep as you want in countering your own counters! ``` Humans will eventually establish colonies on Mars. ! But we haven't colonized the Arctic, 1,000x easier - Colonizing Mars is 10,000x more valuable ``` * The Benefits of Countering ========================== When we have a lot of terms for a thing, it's usually a hint that it's a valuable thing. And we have a lot of terms for countering. To name a few: - ""Steel manning"" - ""red teaming"" - ""playing devil's advocate"" Countering is a helpful habit that helps clarify your thoughts, understand and empathize with other perspectives, fix logical blunders, hone your pitch, and improve at truth-seeking. Counterpoints in Scroll are in a sense just a reminder to frequently use these techniques. * The Downsides of Countering =========================== Addressing every plausible counter in your main thread can be difficult if not impossible. It can make your writing too verbose and lose reader interest. Counters in Scroll give you a place to record every scattered counter as it comes to you. You can then choose which are important enough to address in your main argument and relegate the rest to the source code (for the very avid reader). * Implementation ============== Counterpoints do not currently appear in the compiled HTML. Instead you only see them during write time. For now, they are just an alternate syntax for comments. But though they perform no new function, like traffic lines, sometimes form is function. That being said, there are potentially interesting directions this could go in the future, and it would be interesting to hear ideas of what people would like in a v2. * Keep writing, keep thinking! ⁂ Built with Scroll v149.0.0 ",04/13/2023,388,1.9 -Introducing the Blink Tag,introducingBlink.html,"Introducing the Blink Tag ========================= by Breck Yunits https://github.com/breck7 Breck Yunits October 2, 2022 October 2, 2022 *Scroll's new blink tag lets you call attention to something important* I am really happy with the current state of Scroll and so grateful for the many people who have helped us get it to this point. That being said, I had a feeling we were missing something important. * *So I invented something simple and completely novel* Introducing the `blink` tag. When you have something important to say and you want to interupt people's lives, use the `blink` tag. It's as easy as this: ``` blink This blinks ``` Advertisers have known for ages that human eyes evolved to respond fast to motion. Now, using my new invention, the `blink` tag, you can bring this innovation from advertising to your products and websites. *The blink tag, available now in Scroll 34.1.0* https://scroll.pub/ Scroll 34.1.0 _Note: please don't use this. It's a joke_ Built with Scroll v149.0.0 ",10/02/2022,176,0.9 -"The Power of Indented Heredocs: Markdown, Textile, and BBCode in one file with no escaping",indented-heredocs.html,"The Power of Indented Heredocs: Markdown, Textile, and BBCode in one file with no escaping ========================================================================================== by Breck Yunits https://github.com/breck7 Breck Yunits August 23, 2021 Scroll is a new language and static site generator that is mostly written in Parsers which are both built on a new syntax called Particles. * In this demo, I extend Scroll by adding support for Markdown, Textile, and BBCode. I want to demonstrate how easy it is to compose many languages into one using Particles, which is due to what you might call the Indented or Off-side Heredoc pattern. https://en.wikipedia.org/wiki/Markdown Markdown https://en.wikipedia.org/wiki/Textile_(markup_language) Textile https://en.wikipedia.org/wiki/BBCode BBCode My implementation is still _researchy_—Parsers still needs a lot of work—but my main point here is to demo how _simple and powerful indented heredocs are_. They allow you to compose unlimited languages in one file in a clean and scalable way. You don't need escaping. I think this is a very helpful pattern you can use in your own languages and code. Traditional Heredocs ==================== Traditional heredocs use start and end delimiters, like these examples from Ruby and Python and Markdown: ``` # Heredoc in Ruby puts Particles is that it is just indented or off-side HereDocs. Or in colloquial academic speak _The Off-Side Rule is all you need_. Most people learn of the off-side rule via Python. Imagine if your whole language was just the off-side rule. That's basically Particles. But my code is not the important thing—the important thing is this pattern. Try it yourself—I bet you will love it. https://en.wikipedia.org/wiki/Off-side_rule Off-Side Rule https://en.wikipedia.org/wiki/Here_document HereDocs Extended Examples ================= Markdown ======== Textile ======= BBCode ====== Built with Scroll v149.0.0 ",08/23/2021,306,1.5 +Scroll in 50 Questions,scrollInQuestions.html,"Scroll in 50 Questions ====================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits October 28, 2024 What is Scroll? =============== Scroll is a language for those who believe that what they cannot build with as few pieces as possible they do not understand. What is Scroll? =============== Scroll is a symbolic language. What is a symbolic language. ============================ A language you write with symbols. What is a symbol? ================= A symbol is a mark repeated to correlate to a pattern in nature. What is a mark? =============== A mark is a discoloration of a surface. What is a symbolic language? ============================ A symbolic language is a collection of symbols and symbol sequences that can be used to trigger the same electrical phenomena in the brain of an observer that seeing that pattern occur in nature would trigger. How do I use a symbolic language? ================================= By writing documents. What is a document? =================== It is a collection of marks on a surface. What is Particle Syntax? ======================== It is the syntax that Scroll uses. What is a syntax? ================= It is a set of rules for how to break up a document into symbols. What is a digital document? =========================== It is a file. What is a file? =============== It is a digital representation of a document as a series of bits. What is a bit? ============== A bit is a persistent location in space that has 2 states: a 1 or 0; a true or false; an on or off; a black or white; a hot or cold; a high or low. What is a character? ==================== A character is a 2D mark that maps to a unique fixed length bit sequence. What is a character encoding? ============================= A map of bit sequences to characters. What character encoding does Scroll use? ======================================== UTF8. For now. What is a word? =============== A word is a list of characters delimited by a word delimiter sequence. What is an atom? ================ An atom is another word for word in the Scroll language. What is a line? =============== A line is a sequence of atoms in the Scroll language delimited by a newline sequence. What is a Particle? =================== A particle in Scroll refers to an object that contains both atoms and a collection of particles referred to as the particle's subparticles. Are all particles also subparticles of a higher particle? ========================================================= Yes. What is a Parser? ================= A Parser is a particle that consumes certain other particles to perform transformations. What transformations can a Parser perform? ========================================== A Parser can perform a variety of transformations but the most common are to: - compile one particle in one language to another language. - format a particle into a standardized format - check a particle for errors - evalute the instructions in a particle and return the results - execute commands contained in the particle What is the syntax of Scroll? ============================= The syntax of Scrolls is Particle Syntax, or just Particles for short. What does Particle Syntax do? ============================= Partilces tells you how to divide a binary sequence into parts. What are the components of Particle Syntax? =========================================== - A sequence of binary bits is converted into characters using UTF8 - Atoms are sequences of characters separated by a single space. - Particles are a sequence of atoms separated by a newline. - Subparticles are indicated by a single indented space. How do I make a subparticle? ============================ - Just indent a particle by 1 space more than its parent particle. - For example, because I started this line with one space more than the line above, this line is a subparticle of that line. - And then this line, starting with 2 spaces, is a subparticle of the line above it. - But this line is a subparticle of the line above that starts with ""Just"" Can I use the Particles, Parsers, and Scroll concepts to design 2D or 3D languages that don't use computers at all? =================================================================================================================== Yes. But generally when we talk about PPS we are talking about the form designed for binary and computers. What is Parsers? ================ Parsers is a symbolic language where one defines Particles that can consume other Particles. It is a language for making other languages. What is Scroll? =============== Scroll is a language made out of Parsers. What is the purpose of the Parsers language? ============================================ The purpose of the Parsers Language is to make Scroll. What is the purpose of Scroll? ============================== The purpose of Scroll is to help humans communicate with humans and machines. How does one use Scroll to communicate? ======================================= By writing Scroll documents (aka Scroll Programs) to create things. What kinds of things is Scroll currently best at creating? ========================================================== Blogs, websites, web pages, charts, animations, data science reports, ebooks, web forms, maps, that sort of thing. Why use Scroll and not just write HTML directly? ================================================ Scroll helps you better understand what you are writing about and anything HTML can make Scroll can make in fewer symbols. Scroll is a language for those who believe that what they cannot build with as few pieces as possible they do not understand. What is ScrollHub? ================== ScrollHub is a super server for creating and publishing websites instantly using Scroll. What is a cue? ============== Cue refers to the first atom in a particle. What is the significance of the cue? ==================================== When communicating you want to communicate the most important information first, so the cue is often the most important information. What is the cue used for? ========================= Most parsers use the cue to determine whether they should consume a particle or not. Can parsers use other ways to match against particles? ====================================================== Yes. What's another commmon way for parsers to match particles? ========================================================== Regular expressions. Can I build Scroll using only Particles and Parsers and no other languages? =========================================================================== Currently no. Parsers does not have enough functionality yet to be able to write parsers that provide everything Scroll needs. What other language do I currently need? ======================================== The primary implementation of Parsers currently is half Parsers, half Javascript. How does Parsers parser Scroll? =============================== The Parsers program is parsed and compiled by a Javascript implementation of Parsers which generates a Parser and compiler for Scroll programs. Do I need to master Javascript to use Parsers? ============================================== If you've mastered Javascript then using Parsers should be easy once you get the hang of it. Does Parsers have inheritance? ============================== Yes. Does Particle Syntax have types? ================================ No. Does Parsers have types? ======================== Yes. Parsers has atom types. Is Scroll like Lisp? ==================== Scroll and Parsers implement many of the best ideas from Lisp, and leave out a lot of bad ideas (like the parens). Is Scroll designed for humans or AIs? ===================================== Both. ⁂ Built with Scroll v150.0.0 ",10/28/2024,1080,5.4 +Web Forms for Geniuses,forms.html,"Web Forms for Geniuses ====================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits October 1, 2024 If you want to make web forms the inefficient way, there are many other places to read how to do that. If you want to learn how geniuses are doing web forms, read on. * One Field at a Time is Retarded =============================== Building forms for one-field-at-a-time data entry is inefficient. People can't copy/paste your forms. E-receipts are a pain. Auto-form fill works poorly. It's a huge waste of your users' time that retards them and your business. And it will always be this way. Entire Form in One Field is Genius ================================== Everything becomes radically simpler. People can do things like copy/paste entire applications; email them; version control them; collaborate on them; all effortlessly. And guess what? You can still also compile to a one-field-at-a-time HTML form and allow users to swap back and forth! It's pure win, no loss. You can use this TODAY! ======================= This now ships in Scroll. Here is a test form. You can also see it in use in many of our products. https://scroll.pub/blog/../tests/forms.html a test form Because this is new technology, it is not for those that need spoon feeding. Believe it or not, making web forms also used to be complicated. (If you need this urgently, don't have time to figure it out yourself, and need to hire professional consulting, feel free to get in touch.) Don't whine. Build. =================== I'm tired of reading all the whiners commenting about how our CSS doesn't look so pretty yet, or the tiny little feature you need that isn't supported. I don't care much to hear from whining losers. I want to hear from winners. From builders. From those who strive for genius. Beautiful designs, autoincrement, auto timestamp, joins, decision trees, all that stuff is coming. The world is gonna love this. If you are a winner, a builder, a genius, join us on GitHub or Reddit. https://github.com/breck7/scroll GitHub https://www.reddit.com/r/WorldWideScroll/ Reddit ⁂ Built with Scroll v150.0.0 ",10/01/2024,369,1.8 +The Successor to RSS is Git Clone,gitOverRss.html,"The Successor to RSS is Git Clone ================================= by Breck Yunits https://twitter.com/breckyunits Breck Yunits September 2, 2024 Today on HackerNews Kevin Damm had a great idea: put a `<link>` tag on blogs to point to the git Source Code Repository, much as blogs today have `<link>` tags pointing to their RSS feeds. https://news.ycombinator.com/item?id=41427044 great idea I've added this feature to Scroll and it's live now. If you View Source of this page, you'll see: https://scroll.pub/blog/../index.html Scroll ``` ``` Client applications can start looking for and taking advantage of these tags. * RSS was great, but it's no match for Git Clone ============================================== Git clone solves a million problems. You get a copy of the entire works of your favorite authors that is blazing fast, works offline, is searchable, transformable, censorship resistant, auditable, more trustworthy, ad free, tracker free, et cetera. There is no comparison to the old ways of doing things. * What do you think? ================== Have you already been doing this? Are there ways we can make it better? Would love to hear your feedback! ⁂ Notes ===== vladimyr on bluesky dug up a couple of cool examples of prior art. https://bsky.app/profile/vladimyr.bsky.social/post/3l3anievhnm2t vladimyr on bluesky Built with Scroll v150.0.0 ",09/02/2024,224,1.1 +A New Way to Program,teddyTalk.html,"A New Way to Program ==================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits August 30, 2024 Particles, Scroll, and the Parsers Programming Language ======================================================= I've recorded a short video (1 minute version; 10 minute version) about our recent work which has begun to eat the software world. https://www.youtube.com/watch?v=tpJY7PUmBIU 1 minute version https://www.youtube.com/embed/YcnWSNGEHvI?si=p_vOxpt9lusNKgli&t=75s 10 minute version * Outline ======= 1. Is this stuff relevant to you? ================================= Whether you are an experienced, aspiring, or casual programmer, yes. If you are a writer, yes. If you are a thinker, yes. If you are a builder, yes. If you choose to always remain illiterate to keep your brain different than the crowd, then no. (I applaud your brave creative choice and as a scientist I'm curious to see what happens!) 2. What is Particle Syntax (Particles)? ======================================= One liner: a syntax-free syntax for splitting files into particles (separated by line breaks) which can have atoms (separated by spaces) and subparticles (indented lines). Vibe https://particles.scroll.pub Vibe Playground https://sdk.scroll.pub/sandbox/ Playground LeetSheet https://scroll.pub/particlesLeetsheet.html LeetSheet [Image Omitted] width 400 Each line is a particle. Each dot is a atom. Particles lets you easily compare programs and see which one is simpler (less heavy!). 3. What is Scroll? ================== One liner: Scroll is a language for scientists of all ages where you write and combine particles (written in Particles) to evolve and publish your most intelligence ideas to HTML, PDFs, CSVs, JSON files, movie files, audio files, slideshows, charts, books, et cetera. Vibe https://scroll.pub/blog/index.html Vibe Playground https://try.scroll.pub/ Playground LeetSheet https://scroll.pub/leetsheet.html LeetSheet [Image Omitted] width 400 Scroll is a collection of Parsers that allow you to evolve and publish your most intelligent ideas. 4. What is Parsers? =================== One liner: Parsers is a programming language where programmers write parsers (written in Particles) which consume particles (written in Particles) and also contain logic for translating those particles into actions on computing machines. Vibe https://github.com/breck7/scroll/tree/main/parsers Vibe Playground https://sdk.scroll.pub/designer#url%20https%3A%2F%2Ftry.scroll.pub%2Fscroll.parsers Playground LeetSheet https://scroll.pub/parserLeetsheet.html LeetSheet [Image Omitted] width 400 Programmers who understand how computing machines work write Parsers to translate particles into executable machine code. 5. How do you get started? ========================== ScrollHub http://hub.scroll.pub/ ScrollHub Subreddit https://www.reddit.com/r/WorldWideScroll/ Subreddit ⁂ Built with Scroll v150.0.0 ",08/30/2024,426,2.1 +Tables: a microlang for data science,tables.html,"Tables: a microlang for data science ==================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits August 9, 2024 Tables, aka spreadsheets, are arguably the most important _visual_ thought tool. But no one has designed the perfect _textual_ language for manipulating them. Until now. Say hello to Tables =================== Try now https://try.scroll.pub/#scroll%0A%20theme%20gazette%0A%20%0A%20expander%20Presidents%0A%20https%3A%2F%2Fohayo.breckyunits.com%2Fohayo%2Fpackages%2Fsamples%2Fpresidents.csv%0A%20%20groupBy%20Party%0A%20%20%20orderBy%20-count%0A%20%20%20%20printTable%0A%20%20scatterplot%0A%20%20%20x%20number%0A%20%20%20y%20Party%0A%20%20%20fill%20Party%0A%20%0A%20expander%20Elements%0A%20https%3A%2F%2Fohayo.breckyunits.com%2Fohayo%2Fpackages%2Fsamples%2Fperiodic-table.csv%0A%20%20scatterplot%0A%20%20%20x%20Year%0A%20%20%20y%20AtomicNumber%0A%20%20%20fill%20Radioactive%0A%20%20%20symbol%20Metal%0A%20%0A%20%2F%2F%20expander%20Inline%20Data%0A%20table%0A%20%20scatterplot%0A%20%20%20title%20Top%2050%20programming%20language%20projects%20on%20GitHub.%0A%20%20%20x%20appeared%0A%20%20%20y%20rank%0A%20%20%20radius%20githubStars%0A%20%20%20label%20name%0A%20%20orderBy%20appeared%0A%20%20%20sparkline%0A%20%20%20%20y%20githubStars%0A%20%20%20%20color%20green%0A%20%20%20select%20name%20githubStars%0A%20%20%20%20heatrix%0A%20%20data%0A%20%20%20rank%2Cname%2Cappeared%2CgithubStars%0A%20%20%203%2CPython%2C1991%2C61378%0A%20%20%204%2CJava%2C1995%2C19037%0A%20%20%208%2CPerl%2C1987%2C1886%0A%20%20%209%2CRuby%2C1995%2C21790%0A%20%20%2010%2CPHP%2C1995%2C37688%0A%20%20%2013%2CGo%2C2009%2C121611%0A%20%20%2014%2CTypeScript%2C2012%2C99410%0A%20%20%2018%2CPowerShell%2C2006%2C44220%0A%20%20%2020%2CRust%2C2010%2C95455%0A%20%20%2021%2CSwift%2C2014%2C67064%0A%20%20%2025%2CKotlin%2C2011%2C48462%0A%20%20%2027%2CClojure%2C2007%2C10392%0A%20%20%2028%2CCoffeeScript%2C2009%2C16466%0A%20%20%2029%2CElixir%2C2011%2C24093%0A%20%20%2030%2CErlang%2C1986%2C11203%0A%20%20%2034%2CJulia%2C2012%2C45137%0A%20%20%2041%2CRacket%2C1994%2C4741%0A%20%20%2042%2CSolidity%2C2014%2C22794%0A%20%20%2043%2CWebAssembly%2C2015%2C6621%0A%20%20%2045%2CZig%2C2015%2C32864%0A%20%20%2047%2CNim%2C2008%2C16308%0A%20%20%2050%2CTOML%2C2013%2C19332 Try now ⁂ Acknowledgements ================ Tables evolved over the past decade primarily by: - just doing what Hadley Wickham did in dplyr https://dplyr.tidyverse.org/ dplyr https://hadley.nz/ Hadley Wickham - using Mike Bostock's d3 under the hood https://bost.ocks.org/mike/ Mike Bostock https://d3js.org/ d3 - reading all of Jeffrey Heer's papers https://homes.cs.washington.edu/~jheer/ Jeffrey Heer - thinking about what would be the best tool for Max Roser and Hannah Ritchie. https://ourworldindata.org/ Max Roser and Hannah Ritchie Built with Scroll v150.0.0 ",08/09/2024,479,2.4 +Build Your Own Counters With 3 Words,counters.html,"Build Your Own Counters With 3 Words ==================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits August 2, 2024 I like collections of interesting numbers, such as BioNumbers. Animated counters provide a useful perspective when pondering large numbers. I wanted to make it as easy as possible for anyone to create these counters. https://bionumbers.hms.harvard.edu/Search.aspx?task=searchbypop BioNumbers So, today I added a new parser to Scroll: *counter*. ``` counter 1.1 Heartbeats ``` * Try now https://try.scroll.pub/#scroll%0A%20theme%20gazette%0A%20%0A%20%23%20Show%20HN%3A%20Make%20a%20counter%20with%203%20words%0A%20%0A%20New%20in%20Scroll%20v112.1.0.%20Read%20more.%0A%20%20https%3A%2F%2Fscroll.pub%2Fblog%2Fcounters.html%20Read%20more.%0A%20%0A%20code%0A%20%20counter%20%5BRate%2FSecond%5D%20%5BDescription%5D%0A%20%0A%20%23%20Since%20you%20loaded%20this%20page...%0A%20%0A%20thinColumns%0A%20%0A%20%23%23%20World%20Population%0A%20counter%204.5%20Babies%20Born%0A%20%20https%3A%2F%2Fourworldindata.org%2Fbirths-and-deaths%0A%20counter%201.7%20Human%20Deaths%0A%20%20https%3A%2F%2Fourworldindata.org%2Fbirths-and-deaths%0A%20counter%208123456789%20heart%20beats%0A%20%20https%3A%2F%2Fourworldindata.org%2Fgrapher%2Fpopulation%0A%20%0A%20%23%23%20In%20Your%20Body%0A%20counter%203112123%20Red%20Blood%20Cells%20Made%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fbooks%2FNBK2263%2F%0A%20counter%203812123%20Cells%20Made%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fbooks%2FNBK2263%2F%0A%20counter%202123456789123456789123%20ATP%20molecules%20made%0A%20%20https%3A%2F%2Fbio.libretexts.org%2FBookshelves%2FHuman_Biology%2FHuman_Biology_(Wakim_and_Grewal)%2F05%253A_Cells%2F5.09%253A_Cellular_Respiration%0A%20%0A%20%23%23%20In%20Your%20Brain%0A%20counter%201.2e12%20Action%20Potentials%20Fired%0A%20%20https%3A%2F%2Fwww.khanacademy.org%2Ftest-prep%2Fmcat%2Forgan-systems%2Fneural-synapses%2Fa%2Fsignal-propagation-the-movement-of-signals-between-neurons%0A%20counter%203.64e18%20Ketones%20Consumed%20(Ketosis)%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fpmc%2Farticles%2FPMC7699472%2F%0A%20counter%204.64e18%20Glucose%20Molecules%20Consumed%0A%20%20https%3A%2F%2Fwww.ncbi.nlm.nih.gov%2Fpmc%2Farticles%2FPMC3900881%2F%0A%20%0A%20%23%23%20World%20Economy%0A%20counter%202.5%20Cars%20Made%0A%20%20https%3A%2F%2Fwww.statista.com%2Fstatistics%2F262747%2Fworldwide-automobile-production-since-2000%2F%0A%20counter%2026012%20Cups%20of%20Coffee%20Consumed%0A%20%20https%3A%2F%2Fwww.rgare.com%2Fknowledge-center%2Farticle%2Fcoffee-consumption-how-much-is-too-much-and-how-little-is-not-enough%0A%20counter%2059321%20YouTubes%20Watched%0A%20%20https%3A%2F%2Fthesocialshepherd.com%2Fblog%2Fyoutube-statistics%0A%20%0A%20%23%23%20Flight%0A%20counter%200.00008%20Objects%20Launched%20into%20Space%0A%20%20https%3A%2F%2Fourworldindata.org%2Fgrapher%2Fyearly-number-of-objects-launched-into-outer-space%0A%20counter%200.00004%20Planes%20Built%0A%20%20https%3A%2F%2Fwww.ibisworld.com%2Fglobal%2Fmarket-research-reports%2Fglobal-commercial-aircraft-manufacturing-industry%2F%0A%20counter%201.17%20Planes%20Landed%0A%20%20https%3A%2F%2Fwww.faa.gov%2Fair_traffic%2Fby_the_numbers%0A%20%0A%20%23%23%20Animals%0A%20counter%200.00004%20Blue%20Whales%20Born%0A%20%20https%3A%2F%2Fwww.marinemammalcenter.org%2Fanimal-care%2Flearn-about-marine-mammals%2Fcetaceans%2Fblue-whale%0A%20counter%200.001%20Elephants%20Born%0A%20%20https%3A%2F%2Felephantconservation.org%2Fabout-elephants%2F25-things-to-know%2F%0A%20counter%203.1e10%20Ants%20Born%0A%20%20https%3A%2F%2Fprivateexterminator.com%2Fare-all-the-ants-as-heavy-as-all-the-humans%0A%20 Try now =================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== * Since you loaded this page... ============================= World Population ================ 4.5 Babies Born https://ourworldindata.org/births-and-deaths 4.5 Babies Born 1.7 Human Deaths https://ourworldindata.org/births-and-deaths 1.7 Human Deaths 8123456789 heart beats https://ourworldindata.org/grapher/population 8123456789 heart beats In Your Body ============ 3112123 Red Blood Cells Made https://www.ncbi.nlm.nih.gov/books/NBK2263/ 3112123 Red Blood Cells Made 3812123 Cells Made https://www.ncbi.nlm.nih.gov/books/NBK2263/ 3812123 Cells Made 2123456789123456789123 ATP molecules made https://bio.libretexts.org/Bookshelves/Human_Biology/Human_Biology_(Wakim_and_Grewal)/05%3A_Cells/5.09%3A_Cellular_Respiration 2123456789123456789123 ATP molecules made In Your Brain ============= 1.2e12 Action Potentials Fired https://www.khanacademy.org/test-prep/mcat/organ-systems/neural-synapses/a/signal-propagation-the-movement-of-signals-between-neurons 1.2e12 Action Potentials Fired 3.64e18 Ketones Consumed (Ketosis) https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7699472/ 3.64e18 Ketones Consumed (Ketosis) 4.64e18 Glucose Molecules Consumed https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3900881/ 4.64e18 Glucose Molecules Consumed World Economy ============= 2.5 Cars Made https://www.statista.com/statistics/262747/worldwide-automobile-production-since-2000/ 2.5 Cars Made 26012 Cups of Coffee Consumed https://www.rgare.com/knowledge-center/article/coffee-consumption-how-much-is-too-much-and-how-little-is-not-enough 26012 Cups of Coffee Consumed 59321 YouTubes Watched https://thesocialshepherd.com/blog/youtube-statistics 59321 YouTubes Watched Flight ====== 0.00008 Objects Launched into Space https://ourworldindata.org/grapher/yearly-number-of-objects-launched-into-outer-space 0.00008 Objects Launched into Space 0.00004 Planes Built https://www.ibisworld.com/global/market-research-reports/global-commercial-aircraft-manufacturing-industry/ 0.00004 Planes Built 1.17 Planes Landed https://www.faa.gov/air_traffic/by_the_numbers 1.17 Planes Landed Animals ======= 0.00004 Blue Whales Born https://www.marinemammalcenter.org/animal-care/learn-about-marine-mammals/cetaceans/blue-whale 0.00004 Blue Whales Born 0.001 Elephants Born https://elephantconservation.org/about-elephants/25-things-to-know/ 0.001 Elephants Born 3.1e10 Ants Born https://privateexterminator.com/are-all-the-ants-as-heavy-as-all-the-humans 3.1e10 Ants Born Computer Chips ============== 66.7 CPUS made by Intel https://www.intel.com/content/www/us/en/architecture-and-technology/global-manufacturing.html 66.7 CPUS made by Intel 6234556543 Transistors made by Nvidia https://nvidianews.nvidia.com/news/nvidia-announces-hopper-architecture-the-next-generation-of-accelerated-computing 6234556543 Transistors made by Nvidia 61234556543 Transistors made by Intel https://www.intel.com/content/www/us/en/history/museum-transistors-to-transformations-brochure.html 61234556543 Transistors made by Intel ⁂ Built with Scroll v150.0.0 ",08/02/2024,1026,5.1 +Heatrix: Heat Maps + Matrix Visualizations,heatrix.html,"Heatrix: Heat Maps + Matrix Visualizations ========================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits [Image Omitted] A heatrix on CancerDB. https://cancerdb.com/blog/cancer-heatmaps.html A heatrix on CancerDB. July 28, 2024 Do you love those GitHub Activity Charts and want to make your own but don't know what they are called or what library to use and your work is busy and you have kids and sorry I'll call you back someone is crying? Introducing Scroll's newest parser: `heatrix`! https://scroll.pub/blog/../index.html Scroll's Try Now | Watch Video https://try.scroll.pub/#scroll%0A%20%23%20Heatrix%20Demos%0A%20%0A%20%23%23%20Adjust%20the%20height%2Fwidth%20of%20individual%20cells%2C%20columns%2C%20or%20rows%3A%0A%20heatrix%0A%20%20h20%3BScroll%20h20%3BPLDB%0A%20%20400%20700%0A%20%0A%20%23%23%20Add%20links%3A%0A%20heatrix%0A%20%20h20%3BScroll%3Bhttps%3A%2F%2Fscroll.pub%20h20%3BPLDB%3Bhttps%3A%2F%2Fpldb.io%0A%20%20400%20700%0A%20%0A%20%23%23%20Use%20numbers%20as%20labels%3A%0A%20heatrix%0A%20%20'2021%20'2017%0A%20%20400%20700%0A%20%0A%20%23%23%20Use%20your%20own%20custom%20color%20palettes%20and%20set%20your%20own%20thresholds%3A%0A%20heatrixAdvanced%0A%20%20table%0A%20%20%20%20%0A%20%20%20h10%3Bw30%20'2015%20'2016%20'2017%20'2018%20'2019%20'2020%20'2021%20'2022%20'2023%20'2024%0A%20%20%20h30%3Bw30%3B%200%200%205%201%202%2011%2015%2010%2012%2056%0A%20%20scale%0A%20%20%20%23ffebee%200%0A%20%20%20%23ffcdd2%201%0A%20%20%20%23ef9a9a%205%0A%20%20%20%23e57373%2010%0A%20%20%20%23ef5350%2025%0A%20%20%20%23b71c1c%2050 Try Now https://www.youtube.com/watch?v=ycF3k63qn1Y Watch Video ========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================= `heatrix` let's you craft custom heatmap visualizations with the fewest keystrokes possible. Heat Map + Matrix = Heatrix =========================== [Image Omitted] Source code. Gif made with CleanShotX. https://try.scroll.pub/#scroll%0A%20heatrix%0A%20%208%206%207%205%0A%20%2030%209 Source code https://cleanshot.com/ CleanShotX * Not just a library, it's a microlanguage! ========================================= `heatrix` is a microlang that let's you customize your visualizations using ""directives"": Adjust the height/width of individual cells, columns, or rows: ============================================================== Add links: ========== Add labels: =========== Use numbers as labels: ====================== Use your own custom color palettes and set your own thresholds: =============================================================== * Like Heatrix? There's more where that came from! ================================================ Join the World Wide Scroll Beta today! ====================================== If you like `heatrix` and want to see more stuff like this, but a folder on the World Wide Scroll beta and good things will come your way: https://wws.scroll.pub/ World Wide Scroll beta ⁂ Built with Scroll v150.0.0 ",07/28/2024,467,2.3 +Contacts: A Microlang for Managing Contacts,contacts.html,"Contacts: A Microlang for Managing Contacts =========================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits July 16, 2024 Imagine a single plain text file named `contacts.scroll` where you stored the contact info for your family, friends, and colleagues, and you could track changes with git, compile it to a beautiful PDF or HTML page with search and sort, and it would also compile to CSV and/or JSON for import into iPhone, Android, Gmail, Outlook, et cetera? Also imagine that this tool is free, open source, and public domain. * Introducing *Contacts*, a microlanguage (currently 23 lines of code, including comments) that makes it as concise as possible to add, prune, display, print and export your contacts. https://github.com/breck7/scroll/blob/main/microlangs/contacts.parsers 23 lines of code * There's almost nothing to learn (the code is self-explanatory). In fact, it's almost guaranteed that using Contacts you will need to write less (we've taken every unnecessary character out). * Example ======= ``` 👤 Jack Doe phone +1 (555) 123-4567 email john.doe@example.com birthday 2/23/84 notes Daughter - Samantha. 👤 Jill Smith phone +1 (555) 123-4562 email jill@gmail.com birthday 1/23/80 ``` * How to use ========== 1. Create a file named something like `contacts.scroll` with this content: ``` // You can import the file, or just copy/paste the 21 lines of code here. [pathToScroll]/microlangs/contacts.parser title My Contacts buildConcepts contacts.csv contacts.json contacts.tsv buildHtml theme gazette mediumColumns 1 printTitle table printTable tableSearch 👤 Jack Doe phone +1 (555) 123-4567 email john.doe@example.com birthday 2/23/84 notes Daughter - Samantha. 👤 Jill Smith phone +1 (555) 123-4562 email jill@gmail.com birthday 1/23/80 ``` 2. Run `scroll build` Done! You should now see a contacts.html file for display and printing as well as TSV, CSV, and JSON files. https://scroll.pub/blog/../tests/contacts.html contacts.html * [Image Omitted] Contacts is interoperable with pen and paper. * What do you think? Anything that should be added/removed/improved? * Notes ===== 1. The idea for Contacts was sparked by this tweet from Tyler Tringas. https://x.com/tylertringas/status/1813239718957461528 this tweet from Tyler Tringas ⁂ Built with Scroll v150.0.0 ",07/16/2024,371,1.9 +How I Designed Helpful 404's and Stopped Worrying about Broken Links,helpful404s.html,"How I Designed Helpful 404's and Stopped Worrying about Broken Links ==================================================================== by Breck Yunits https://breckyunits.com Breck Yunits July 12, 2024 _Woohoo!_ Your blog is on top of Reddit! _OH NO._ There's a typo in your url. 🤦 *What do you do?* * You try to calm yourself down. _Almost no one looks at the url and the content of the article is what's important and the traffic is coming_ But then you think _all I can see is that i before e after c!_ But then you think _is that *really* a rule_ and _maybe that's how it's spelled in London?_ * You can't help yourself. It's an affront to your craftsmanship to not correct the bad filename. You know you can so easily rename the file but then existing links will break and so you'll have to add redirects but that means more files to maintain or god forbid that would require adding a server and you just love your static blog and it's almost 2pm and you have to leave and pick up the kids from school what do you do!?!! Or do you just break the links and going forward everyone will have the proper URL but everyone who clicks the old links will see an unhelpful 404 and you reflect on how great this thing that Tim Berners-Lee gave to the world is and how could you litter his creation with unhelpful 404s? * If the story above resonates with you, the bad news is you may suffer from Broken Link Phobia. Luckily, there is now a cure. * Introducing: Helpful 404's - never worry about broken links again! ================================================================== Scroll now comes with a way to generate a very helpful 404 page so your visitors will get redirected to the right place even if the URL they clicked is off by a few characters. The best part? It works entirely client side on static sites. How to use ========== *Step 1* Create a sitemap: ```sitemap.scroll buildTxt sitemap.txt baseUrl https://scroll.pub/ printSiteMap ``` *Step 2* Create a 404 page: ```404.scroll buildHtml Sorry, the url you requested was not found. helpfulNotFound sitemap.txt ``` That's it! The `helpfulNotFound` parser in Scroll will add Javascript to the 404 page that fetches all the urls found in the sitemap and shows the user the closest match. As a bonus, you also get a `sitemap.txt` file great for Google SEO and other uses. See it in action here by clicking on this intentionally broken link: https://scroll.pub/blog/helpful_404s.html intentionally broken link * I've been using Helpful 404s on all my sites for the past couple of months and it's been delightful. I no longer spend any time worrying about making improvements to URLS. I just do it and I know that users following old links will still have a good experience. * If you like stuff like Helpful 404's, there's _a lot_ more like that in Scroll, which is public domain and open source. Try it today, and if you like what we are doing please consider bringing your site to the World Wide Scroll! https://wws.scroll.pub World Wide Scroll ⁂ Built with Scroll v150.0.0 ",07/12/2024,546,2.7 +Convert CSVs to ScrollSets,csvToScrollSet.html,"Convert CSVs to ScrollSets ========================== by Breck Yunits https://github.com/breck7 Breck Yunits July 9, 2024 ScrollSets are _very_ useful once you get going. But starting from scratch could be a bit tedious. https://breckyunits.com/scrollsets.html ScrollSets Not anymore! Just drop your CSV or TSV into the textarea below to generate a ScrollSet. (P.S. using LLMs with ScrollSets is another great way to get started) https://sets.scroll.pub/ using LLMs with ScrollSets * Your Data: ========== ScrollSet: ========== Related ======= ScrollSets: source code for CSVs ================================ 04/21/2024 https://scroll.pub/blog/scrollsets.html Built with Scroll v150.0.0 ",07/09/2024,100,0.5 +Changes: A Microlang for Change Logs,changes.html,"Changes: A Microlang for Change Logs ==================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits [Image Omitted] July 1, 2024 Regardless of what languages you write your programs in, you probably maintain files like _changeLog.txt_ or _releaseNotes.txt_. Change logs are very helpful for: - informing your users of new features and bug fixes - providing detailed technical information to your development team (and open source contributors) - periodical data analysis for strategic project planning - how fast are we shipping new features? fixing bugs? breaking things? What if there was 1 language that let you do all 3 things at once? * Introducing Changes, a microlang (only 70 lines of code, including comments) that makes it as concise as possible to write, read and analyze change logs. https://github.com/breck7/scroll/blob/main/microlangs/changes.parsers 70 lines of code Changes generates a pretty HTML file for your end users; allows for including unlimited detailed technical information for your developers; and generates summary statistics as TSV, CSV, and JSON for your project managers. * There's almost nothing to learn (the code is self explanatory). In fact, it's almost guaranteed that using Changes you will need to write less (we've taken every unnecessary character out). * Example ======= We use Changes for the Scroll Release Notes. https://scroll.pub/blog/../releaseNotes.html Scroll Release Notes Be sure to check out the source code that generates that HTML. https://github.com/breck7/scroll/blob/main/releaseNotes.scroll check out the source code * How to use ========== 1. Install Scroll ``` npm install -g scroll-cli ``` 2. Create a release notes file: ```releaseNotes.scroll title My Release Notes printTitle buildConcepts releaseNotes.csv releaseNotes.json releaseNotes.tsv // You can import the changes parsers or just copy/paste the 70 lines into your own file. [pathToScroll]/microlangs/changes.parser thinColumns 📦 0.1.1 7/1/2024 🏥 fixed bug in command line app 📦 0.1.0 7/1/2024 🎉 added command line app endColumns ``` 3. Run `scroll build` Done! You should now see a `releaseNotes.html` file as well as a TSV, CSV, and JSON file. * What do you think? Anything that should be added/removed/improved? ⁂ Related ======= - Changelog https://en.wikipedia.org/wiki/Changelog Changelog - Release Notes https://en.wikipedia.org/wiki/Release_notes Release Notes - Major Version Numbers are Not Sacred https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred Major Version Numbers are Not Sacred - What can we learn from programming language version numbers? https://breckyunits.com/versionNumbers.html What can we learn from programming language version numbers? Built with Scroll v150.0.0 ",07/01/2024,431,2.2 +Write scatterplot to get a scatterplot,plot.html,"Write scatterplot to get a scatterplot ====================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits June 24, 2024 I _engineered on_ many innovative data science tools, including Grapher and Ohayo^engineering. https://github.com/breck7/ohayo Ohayo https://github.com/owid/owid-grapher Grapher So I was excited to see Observable launch something new: Plot. https://observablehq.com/plot/ Plot https://observablehq.com/ Observable * Plot is already great on its own. It handles many of the hard parts of data vis, and it's open source, so we can help them fix the parts that are still a little rough. https://github.com/observablehq/plot open source But I found a way to take Plot to the next level: I combined it with Scroll. https://scroll.pub/blog/../index.html Scroll The Plot/Scroll integration is early, but I can already tell it will evolve into a _very useful_ data science tool. * A Scatterplot with 2 words ========================== You can now make scatterplots with 2 words. Obviously you want to add a few more words, but I don't think I'm exaggerating when I say that this is the simplest way to generate a scatterplot now and forever will be (until the day when we have mind-reading machines that can generate a scatterplot with zero words). But enough talk, let's see some code. A tutorial is below. To follow along, create a new website in 1 second using ScrollHub or install Scroll locally with `npm install -g scroll-cli`. http://hub.scroll.pub ScrollHub * Step 1: Generate a scatterplot with 2 words =========================================== * Step 2: Add a title =================== * Step 3: Add inline data ======================= * Step 4: Everything everywhere all at once ========================================= * That's it (for now)! If you like where this is headed, give us a star on GitHub. https://github.com/breck7/scroll give us a star on GitHub ⁂ ^engineering: The difference between programming and engineering? It takes programming to make a program that works. It takes engineering to make a program that _barely_ works. Built with Scroll v150.0.0 ",06/24/2024,342,1.7 +Stamp: a microlang for project templates,stamp.html,"Stamp: a microlang for project templates ======================================== by Breck Yunits https://twitter.com/breckyunits Breck Yunits June 23, 2024 Regardless if you specialize in React, Rails, Django, Next, Java, C#, or ObjectiveC, you probably use _templates_ to start new projects. Templates generate a handful of files like `readme.md`, `.gitignore`, and `main`. They also initialize a handful of directories like `src/` and `tests/`. What if it was even easier to make, edit and use these templates? * Introducing Stamp, a microlang (only 60 lines of code, including comments) that makes it as concise as possible to write, edit, share and expand project templates. https://github.com/breck7/scroll/blob/main/parsers/stamp.parsers 60 lines of code * How to use ========== 1. Install Scroll ``` npm install -g scroll-cli ``` 2. Create `myFirstStamp.scroll` ``` stamp .gitignore *.html readme.scroll # My First Stamp scripts/ hello.js console.log(""Hello world"") ``` 3. Run `scroll build` Done! * Stamp was jointly created by me and Guillaume Papin. Other tools (listed below) do similar things, but with some slight differences. https://github.com/Sarcasm Guillaume Papin https://github.com/breck7/scrollsdk/issues/120 jointly created ⁂ [Image Omitted] Prior Art ========= - cookiecutter https://github.com/cookiecutter/cookiecutter cookiecutter - Dired https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html Dired - vimv https://github.com/thameera/vimv vimv - ptar https://github.com/jtvaughan/ptar ptar - shar https://en.wikipedia.org/wiki/Shar shar - dar http://dar.linux.free.fr/ dar - metatar https://github.com/xyproto/metatar metatar - txtar https://pkg.go.dev/golang.org/x/tools@v0.1.0/txtar txtar - Archiving files in plain text https://blog.oquijano.net/id/9?lang=en Archiving files in plain text - Wikipedia list of archive formats https://en.wikipedia.org/wiki/List_of_archive_formats Wikipedia list of archive formats Built with Scroll v150.0.0 ",06/23/2024,300,1.5 +Scroll builds text files,textFiles.html,"Scroll builds text files ======================== by Breck Yunits https://breckyunits.com Breck Yunits HTML | TXT link textFiles.html HTML link textFiles.txt TXT April 29, 2024 Scroll is a new language for building HTML and CSV files that powers blogs, websites and knowledge bases. https://scroll.pub/blog/scrollsets.html knowledge bases https://scroll.pub/blog/../index.html Scroll * I often need plain text outputs in addition to HTML files. I used to make those plain text versions copying and pasting text by hand. Now Scroll has plain text output built-in. * How do I tell Scroll to build plain text files? =============================================== Add a single line: `buildTxt` ```example.scroll buildTxt Hello world. ``` `scroll build` will create `example.txt`. Done! * You may want to put `buildTxt` into `header.scroll` or `footer.scroll` to build text files for many pages at once. * I've *loved* this new feature in Scroll. Plain text is a *timeless* way to read, review, and share your thoughts! Hope you enjoy it as much as I have! ⁂ Built with Scroll v150.0.0 ",04/29/2024,175,0.9 +ScrollSets: source code for CSVs,scrollsets.html,"ScrollSets: source code for CSVs ================================ by Breck Yunits https://breckyunits.com Breck Yunits [Image Omitted] More examples of ScrollSets from sets.scroll.pub. https://sets.scroll.pub/ sets.scroll.pub April 21, 2024 The source code for this blog post contains a ScrollSet about the planets and generates this HTML file as well as a CSV, a TSV, and a JSON file. This page demonstrates *ScrollSets*. https://scroll.pub/blog/scrollsets.scroll source code for this blog post https://scroll.pub/blog/planets.csv CSV https://scroll.pub/blog/planets.tsv TSV https://scroll.pub/blog/planets.json JSON ScrollSets are useful for small single day projects and large multi-year projects with thousands of concepts like PLDB (a Programming Language Database). https://pldb.io PLDB * ScrollSets are normal plain text files written in Scroll that also contain measurements of concepts and output that data into formats ready for data visualization and analysis tools. https://scroll.pub/ Scroll ScrollSets are line oriented but represent a table(s). You might call them _deconstructed csvs_ or _deconstructed spreadsheets_. - Use LLMs to *instantly generate ScrollSets* that are ready for human verification and improvement. - Intermingle structured data with markup to *annotate any and every part of a ScrollSets* while still generating strict tabular files for data analysis tools. - Put data, schema, citations, and documentation *all* in one (or more) plain text file(s) to easily share, collaborate on, and improve, all *tracked by git for trust*. - Add unlimited citations (or none) to *every* measurement. Quick Code Example: =================== ```planets.scroll This ScrollSets has 2 measures (columns) and 2 concepts (rows). Documentation, column definitions, rows and *any notes/markup/content* can go in the same file. # Measures (aka Header, aka Columns, aka Schema) idParser // Every concept needs an ""id"" (or other concept delimiter) extends abstractIdParser moonsParser extends abstractIntegerParser # Concepts (aka Rows) id mars moons 2 // I verified moon count with Google. - BY id jupiter moons 63 // Note: the moons of Jupiter have their own Wikipedia Page https://en.wikipedia.org/wiki/Moons_of_Jupiter moons of Jupiter buildConcepts demo.csv ``` The code above generates an HTML page and this: =============================================== ```demo.csv id,moons mars,2 jupiter,63 ``` Overview: ========= - ScrollSets are built from 4 atomic elements: - concepts - think of rows in a spreadsheet - denoted by a line starting with `id ` - concepts are multiple lines of measurements - measures - think of these as the column names in a spreadsheet, along with meta information about the column - aka ""parsers"" - measures are defined in Parsers that start with a line like `moonsParser` - values - these are just the values of the measurements - measurements - concept & measure & value = measurement - 1 measurement = 1 line - measurements can have nested comments that are stripped when compiling to TSV/CSV How to use ========== - A concept is like a row in a database. All concepts need an id (or other concept delimiter). When you write `id [conceptId]`, Scroll knows that is the beginning of a new concept. - Measure definitions (aka ""parsers"") must come before the first concept and are written as Parsers, just like any other Scroll Parser. Measure parsers need to extend one of the abstract measure parser classes defined in `measures.scroll`. - Measurements are then done like this `appeared 2024` FAQ === Isn't the better idea to enhance existing spreadsheet GUIs with LLM generation capabilities? ============================================================================================ Almost certainly. Using ScrollSets will be much slower and worse than future spreadsheet apps with carefully crafted LLM integrations. However, it's important to also have simple, lower tech, timeless tools and ScrollSets is one of those. Can't you do this same thing with YAML and/or Markdown? ======================================================= Yes! You can easily achieve the same thing as LLMs & ScrollSets using LLMs & YAML, or LLMs & YAML & Markdown. https://yaml.org/ YAML https://github.github.com/gfm/ Markdown For YAML, just put your documentation and schema in YAML comments up top and then have a tiny script to read that YAML and dump CSV/TSV/JSON or whatever. YAML gives you loads of data structures to use and is widely supported in many languages. But generating HTML from the same file would require more work. If you want to intermix markup content with your data, you can use Markdown to add the marked up content and then have code sections embedding the YAML and a tiny script to parse out those YAML blocks and write your data to disk. So, why use Scroll for storing data instead of YAML? ==================================================== Either can do the job. I expect the Scroll design to end up being more ergonomic, but that might not be true or may be unimportant. If you don't like Scroll's (evolving) version and want to switch it will always be straightforward to automatically refactor to YAML. What other related work is out there? ===================================== This is a simple pattern to implement, so I'm sure it is likely it has been done a few times before. Please let me know so I can include links to--and learn from--any other prior art. What are the advanced features? =============================== - Types correctly exported in JSON - Supports nested measures - Support for computed measures - Autojoins across files on ids^roadmap - Auto generates normalized tables for array measures^roadmap - Support for text blobs^roadmap ^roadmap: Planned. What is the origin of ScrollSets? ================================= LLM dataset generation is a _major_ breakthrough in datasets. ScrollSets are, at best, a minor improvement. They are designed to work alongside LLMs to help solve the Dataset Needed problem. https://breckyunits.com/dataset-needed.html Dataset Needed ScrollSets evolved out of TrueBase. ScrollSets have eliminated the need for the TrueBase software (and existing TrueBase sites should be migrated to ScrollSets), but were informed by the TrueBase build experience. https://truebase.treenotation.org TrueBase Although ScrollSets are designed for a world with LLMs, the design is meant to be useful without them as well, and would also have been mildly useful 30 years ago. What were the design goals? =========================== - Have an LLM do the bulk of the work while humans supervise to remove hallucinations. - Can store everything (documentation, schema, all concepts) in 1 clean plain text file or split into many files (using the `import` parser). - The ScrollSet syntax balances _looseness_ useful in creative thinking with the _tightness_ needed by tabular data visualization and analysis tools. Why are measures and concepts root-level features and not indented? =================================================================== The normal way to implement this in Scroll would be something like: ``` measures id string moons int concept id mars moons 2 concept id jupiter moons 63 ``` The flat design was chosen for ergonomic reasons. ScrollSets seem like they might be useful enough to be worth breaking from Scroll convention a bit. Like all things in Scroll, ScrollSets are an experiment, and maybe this design will evolve. Extended Example: a Planets ScrollSet ===================================== Below is the ScrollSet embedded in this Scroll file. Measurements of the measures ============================ Extended Measures Example ========================= Extended Concepts Example ========================= Related ======= Convert CSVs to ScrollSets ========================== 07/09/2024 https://scroll.pub/blog/csvToScrollSet.html Built with Scroll v150.0.0 ",04/21/2024,1161,5.8 +Introducing Program Links,programLinks.html,"Introducing Program Links ========================= by Breck Yunits https://github.com/breck7 Breck Yunits May 8, 2023 Some web apps are designed to load _entire programs_ from a link. But if a program contain certain characters, such as _newlines_, those links won't work as-is. To create working links you have to run them through `encodeURIComponent`. * If you are creating blog content by hand this is annoying. To update a program link you have to keep a copy of the program, update that, then run `encodeURIComponent`, then paste the result into your post. Today's release of Scroll includes a small new addition that solves this problem. You can call them ""Multline Links"" or ""Program Links"". * Here are two examples ===================== Here is a program link to the Scroll web app. https://try.scroll.pub/#scroll%0A%20%23%20Testing%20Program%20Links%0A%20It%20worked!%0A%20%20style%20color%3Agreen%3B%20font-size%3A%20100px%3B program link If you click that link you should see ""It worked!"" in big green text. * Now let's show a complex real world example. The link below contains a 28 line program pasted verbatim from the Ohayo data science studio. See code Discovery of the Elements https://ohayo.breckyunits.com?filename=test.ohayo&data=doc.title%20Discovery%20of%20the%20Elements%0Adoc.subtitle%20What%20is%20the%20growth%20in%20known%20elements%20over%20time%3F%0Asamples.periodicTable%0A%20hidden%0A%20fill.missing%20Year%201000%0A%20%20hidden%0A%20%20columns.keep%20Element%20Year%0A%20%20%20hidden%0A%20%20%20rows.sortBy%20Year%0A%20%20%20%20hidden%0A%20%20group.by%20Year%0A%20%20%20hidden%0A%20%20%20rows.sortBy%20Year%0A%20%20%20%20hidden%0A%20%20%20%20rows.runningTotal%20count%0A%20%20%20%20%20hidden%0A%20%20%20%20%20vega.bar%20Number%20of%20Elements%20Found%20Each%20Year%0A%20%20%20%20%20%20xColumn%20Year%0A%20%20%20%20%20%20yColumn%20count%0A%20%20%20%20%20vega.line%20Cumulative%20Number%20of%20Elements%0A%20%20%20%20%20%20xColumn%20Year%0A%20%20%20%20%20%20yColumn%20total%0A%20vega.scatter%20Year%20of%20Discovery%20by%20Atomic%20Number%0A%20%20xColumn%20Year%0A%20%20yColumn%20AtomicNumber%0A%20tables.basic%0A%20%20rowDisplayLimit%20200%0Adoc.categories%20chemistry Discovery of the Elements If you click that link you should see a few data visualizations generated from that program. Edit the source and the link will update accordingly. Scroll handles the `encodeURIComponent`. * Why not use HTML directly? ========================== Modern browsers do their best to make URLs well-formed and you will notice that they auto encode certain characters like spaces. But by the HTML spec newlines are not a URL code point and generally are stripped and collapsed. https://url.spec.whatwg.org/#url-code-points URL code point https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace stripped and collapsed Program Links in Scroll handle encoding newlines and any other special characters so you can focus on your content and not the encoding. Built with Scroll v150.0.0 ",05/08/2023,507,2.5 +Counterpoints: A new tool for thought in the Scroll Language,counterpoints.html,"Counterpoints: A new tool for thought in the Scroll Language ============================================================ by Breck Yunits https://github.com/breck7 Breck Yunits Improve your writing by welcoming counterarguments ================================================== April 13, 2023 There's a tiny new symbol in Scroll today: `!`. https://scroll.pub/ Scroll The exclamation mark stands for *Counterpoint*. ""Counters"" aim to help writers strengthen their ideas by encouraging the integration of counterarguments throughout their essays. You can write your own counters or invite counters from friends, LLMs or Internet commenters. * Counterpoints are easy to use: just start a line with `!`. For example: ``` Humans will eventually establish colonies on Mars. ! But we haven't colonized the Arctic, 1,000x easier ``` You can go as deep as you want in countering your own counters! ``` Humans will eventually establish colonies on Mars. ! But we haven't colonized the Arctic, 1,000x easier - Colonizing Mars is 10,000x more valuable ``` * The Benefits of Countering ========================== When we have a lot of terms for a thing, it's usually a hint that it's a valuable thing. And we have a lot of terms for countering. To name a few: - ""Steel manning"" - ""red teaming"" - ""playing devil's advocate"" Countering is a helpful habit that helps clarify your thoughts, understand and empathize with other perspectives, fix logical blunders, hone your pitch, and improve at truth-seeking. Counterpoints in Scroll are in a sense just a reminder to frequently use these techniques. * The Downsides of Countering =========================== Addressing every plausible counter in your main thread can be difficult if not impossible. It can make your writing too verbose and lose reader interest. Counters in Scroll give you a place to record every scattered counter as it comes to you. You can then choose which are important enough to address in your main argument and relegate the rest to the source code (for the very avid reader). * Implementation ============== Counterpoints do not currently appear in the compiled HTML. Instead you only see them during write time. For now, they are just an alternate syntax for comments. But though they perform no new function, like traffic lines, sometimes form is function. That being said, there are potentially interesting directions this could go in the future, and it would be interesting to hear ideas of what people would like in a v2. * Keep writing, keep thinking! ⁂ Built with Scroll v150.0.0 ",04/13/2023,388,1.9 +Introducing the Blink Tag,introducingBlink.html,"Introducing the Blink Tag ========================= by Breck Yunits https://github.com/breck7 Breck Yunits October 2, 2022 October 2, 2022 *Scroll's new blink tag lets you call attention to something important* I am really happy with the current state of Scroll and so grateful for the many people who have helped us get it to this point. That being said, I had a feeling we were missing something important. * *So I invented something simple and completely novel* Introducing the `blink` tag. When you have something important to say and you want to interupt people's lives, use the `blink` tag. It's as easy as this: ``` blink This blinks ``` Advertisers have known for ages that human eyes evolved to respond fast to motion. Now, using my new invention, the `blink` tag, you can bring this innovation from advertising to your products and websites. *The blink tag, available now in Scroll 34.1.0* https://scroll.pub/ Scroll 34.1.0 _Note: please don't use this. It's a joke_ Built with Scroll v150.0.0 ",10/02/2022,176,0.9 +"The Power of Indented Heredocs: Markdown, Textile, and BBCode in one file with no escaping",indented-heredocs.html,"The Power of Indented Heredocs: Markdown, Textile, and BBCode in one file with no escaping ========================================================================================== by Breck Yunits https://github.com/breck7 Breck Yunits August 23, 2021 Scroll is a new language and static site generator that is mostly written in Parsers which are both built on a new syntax called Particles. * In this demo, I extend Scroll by adding support for Markdown, Textile, and BBCode. I want to demonstrate how easy it is to compose many languages into one using Particles, which is due to what you might call the Indented or Off-side Heredoc pattern. https://en.wikipedia.org/wiki/Markdown Markdown https://en.wikipedia.org/wiki/Textile_(markup_language) Textile https://en.wikipedia.org/wiki/BBCode BBCode My implementation is still _researchy_—Parsers still needs a lot of work—but my main point here is to demo how _simple and powerful indented heredocs are_. They allow you to compose unlimited languages in one file in a clean and scalable way. You don't need escaping. I think this is a very helpful pattern you can use in your own languages and code. Traditional Heredocs ==================== Traditional heredocs use start and end delimiters, like these examples from Ruby and Python and Markdown: ``` # Heredoc in Ruby puts Particles is that it is just indented or off-side HereDocs. Or in colloquial academic speak _The Off-Side Rule is all you need_. Most people learn of the off-side rule via Python. Imagine if your whole language was just the off-side rule. That's basically Particles. But my code is not the important thing—the important thing is this pattern. Try it yourself—I bet you will love it. https://en.wikipedia.org/wiki/Off-side_rule Off-Side Rule https://en.wikipedia.org/wiki/Here_document HereDocs Extended Examples ================= Markdown ======== Textile ======= BBCode ====== Built with Scroll v150.0.0 ",08/23/2021,306,1.5 -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/stamp.html b/blog/stamp.html index e0016e193..affb73f46 100644 --- a/blog/stamp.html +++ b/blog/stamp.html @@ -3,12 +3,12 @@ Stamp: a microlang for project templates - + - + @@ -98,7 +98,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/stamp.txt b/blog/stamp.txt index 86bb425c2..623531dc0 100644 --- a/blog/stamp.txt +++ b/blog/stamp.txt @@ -78,4 +78,4 @@ Prior Art - Wikipedia list of archive formats https://en.wikipedia.org/wiki/List_of_archive_formats Wikipedia list of archive formats -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/tables.html b/blog/tables.html index 3daee2704..0d81cdc4a 100644 --- a/blog/tables.html +++ b/blog/tables.html @@ -3,12 +3,12 @@ Tables: a microlang for data science - + - + @@ -75,7 +75,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/tables.txt b/blog/tables.txt index ce99205e5..4baf1deca 100644 --- a/blog/tables.txt +++ b/blog/tables.txt @@ -35,4 +35,4 @@ Tables evolved over the past decade primarily by: - thinking about what would be the best tool for Max Roser and Hannah Ritchie. https://ourworldindata.org/ Max Roser and Hannah Ritchie -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/teddyTalk.html b/blog/teddyTalk.html index bafe2b97c..8f59e3cd6 100644 --- a/blog/teddyTalk.html +++ b/blog/teddyTalk.html @@ -3,12 +3,12 @@ A New Way to Program - + - + @@ -97,7 +97,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/teddyTalk.txt b/blog/teddyTalk.txt index 3a4648877..b83426146 100644 --- a/blog/teddyTalk.txt +++ b/blog/teddyTalk.txt @@ -94,4 +94,4 @@ Subreddit ⁂ -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/blog/textFiles.html b/blog/textFiles.html index c7790f3ee..e55ad9586 100644 --- a/blog/textFiles.html +++ b/blog/textFiles.html @@ -3,12 +3,12 @@ Scroll builds text files - + - + @@ -77,7 +77,7 @@ -
Built with Scroll v149.0.0
+
Built with Scroll v150.0.0
\ No newline at end of file diff --git a/blog/textFiles.txt b/blog/textFiles.txt index c1eac9637..79ad41a67 100644 --- a/blog/textFiles.txt +++ b/blog/textFiles.txt @@ -50,4 +50,4 @@ Hope you enjoy it as much as I have! ⁂ -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/cloc.html b/cloc.html index 917e2b708..b4bb1d9ab 100644 --- a/cloc.html +++ b/cloc.html @@ -3,12 +3,12 @@ Scroll Cloc Stats - + - + @@ -56,10 +56,10 @@

Files

-
+


Code

-
+
@@ -73,21 +73,21 @@ - + - + - + - + - + - - - + + + @@ -137,11 +137,11 @@ - + - - - + + +
files
107 Parsers327328 056775971
129
130 Scroll18211826 050695090
9 JavaScript2271151254202931013
2 SVG0 1
261
262 SUM24061181256123879612635
\ No newline at end of file diff --git a/download.txt b/download.txt index 7f0d2da32..27b8c112b 100644 --- a/download.txt +++ b/download.txt @@ -11,4 +11,4 @@ wws fetch scroll You can also download it as a zip file. https://github.com/breck7/scroll/archive/refs/heads/wws.zip zip file -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/faq.html b/faq.html index a24eb5bf8..3b6b4579d 100644 --- a/faq.html +++ b/faq.html @@ -3,12 +3,12 @@ Scroll FAQ - + - + @@ -398,7 +398,7 @@ - + \ No newline at end of file diff --git a/faq.txt b/faq.txt index 55a06501c..b2783a005 100644 --- a/faq.txt +++ b/faq.txt @@ -536,4 +536,4 @@ Why the name Scroll? ==================== The scroll was invented thousands of years ago and scrolls are still useful today. Scroll has been designed with a focus on simplicity and a goal of making something that would have been useful decades ago, with the hope that this will make it useful decades into the future. -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/index.html b/index.html index a42657d6c..d97b6c929 100644 --- a/index.html +++ b/index.html @@ -3,12 +3,12 @@ Scroll is a language for scientists of all ages - + - + @@ -79,7 +79,7 @@ - + \ No newline at end of file diff --git a/index.txt b/index.txt index f0e7e4c78..977dac256 100644 --- a/index.txt +++ b/index.txt @@ -34,4 +34,4 @@ scroll prompt · parser prompt https://scroll.pub/scrollPrompt.txt scroll prompt https://scroll.pub/parserPrompt.txt parser prompt -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/leetsheet.csv b/leetsheet.csv index 5ae09c85d..6b392a203 100644 --- a/leetsheet.csv +++ b/leetsheet.csv @@ -60,6 +60,7 @@ cloc,,Output results of cloc as table.,214, codeFromFile,,A code block.,17, codeWithHeader,,A code block.,17, comment,,Prints nothing.,20, +concepts,,Load concepts as table.,0, container,,A centered HTML div.,10, copyButtons,,Copy code widget.,148, counter,,Visualize the speed of something.,0, diff --git a/leetsheet.html b/leetsheet.html index 8b9391366..5caadae78 100644 --- a/leetsheet.html +++ b/leetsheet.html @@ -3,12 +3,12 @@ Scroll LeetSheet - + - + @@ -105,6 +105,7 @@
codeFromFile A code block.
codeWithHeader A code block.
comment Prints nothing.
+
concepts Load concepts as table.
container A centered HTML div.
copyButtons Copy code widget.
counter Visualize the speed of something.
@@ -253,7 +254,7 @@ - + \ No newline at end of file diff --git a/leetsheet.txt b/leetsheet.txt index 9ba88aa32..bee69bc99 100644 --- a/leetsheet.txt +++ b/leetsheet.txt @@ -56,6 +56,7 @@ code - A code block. codeFromFile - A code block. codeWithHeader - A code block. comment - Prints nothing. +concepts - Load concepts as table. container - A centered HTML div. copyButtons - Copy code widget. counter - Visualize the speed of something. @@ -178,4 +179,4 @@ Links - ScrollHub · Try Scroll · r/WorldWideScroll · Parsers LeetSheet · Par Parser usage rankings A rough _estimate_ of the parser usage in Scroll. Not all parsers have stats available yet. -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 3bf141e35..81fc4651a 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -1,6 +1,6 @@ { "name": "scroll-cli", - "version": "149.0.0", + "version": "150.0.0", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/package-lock.json b/package-lock.json index 35ed940ba..665942777 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scroll-cli", - "version": "149.0.0", + "version": "150.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "scroll-cli", - "version": "149.0.0", + "version": "150.0.0", "dependencies": { "d3": "^6.7.0", "dayjs": "^1.11.7", diff --git a/package.json b/package.json index b43051fcb..02cdfa00d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scroll-cli", - "version": "149.0.0", + "version": "150.0.0", "description": "A language for scientists of all ages. A curated collection of tools for refining and sharing thoughts.", "main": "scroll.js", "engines": { diff --git a/pages.csv b/pages.csv index 3d6914128..63e9e3536 100644 --- a/pages.csv +++ b/pages.csv @@ -7,14 +7,14 @@ date,year,title,permalink,authors,tags,wordCount,minutes 11/13/2024,2024,Settings,settings.html,,,0,0 11/13/2024,2024,Scroll Prompt,scrollPrompt.html,,,1026,5.1 11/13/2024,2024,Scroll Roadmap,roadmap.html,,main,162,0.8 -11/13/2024,2024,Scroll Release Notes,releaseNotes.html,,main,14550,72.8 -11/13/2024,2024,Readme Prompt,readmePrompt.html,,,19340,96.7 +11/13/2024,2024,Scroll Release Notes,releaseNotes.html,,main,14630,73.2 +11/13/2024,2024,Readme Prompt,readmePrompt.html,,,19420,97.1 11/13/2024,2024,Scroll is a language for scientists of all ages,index.html,,,166,0.8 11/13/2024,2024,Particles LeetSheet,particlesLeetsheet.html,,,124,0.6 11/13/2024,2024,Parser Usage,parserUsage.html,,,270,1.4 -11/13/2024,2024,Parser Prompt,parserPrompt.html,,,17604,88 +11/13/2024,2024,Parser Prompt,parserPrompt.html,,,18916,94.6 11/13/2024,2024,Parsers LeetSheet,parserLeetsheet.html,,,299,1.5 -11/13/2024,2024,Scroll LeetSheet,leetsheet.html,,,872,4.4 +11/13/2024,2024,Scroll LeetSheet,leetsheet.html,,,877,4.4 11/13/2024,2024,Header,header.html,,,0,0 11/13/2024,2024,Scroll FAQ,faq.html,,main,3307,16.5 11/13/2024,2024,Download Scroll.pub,download.html,,,49,0.2 diff --git a/parserLeetsheet.html b/parserLeetsheet.html index ef02d23d2..a6b6d2ce6 100644 --- a/parserLeetsheet.html +++ b/parserLeetsheet.html @@ -3,12 +3,12 @@ Parsers LeetSheet - + - + @@ -212,7 +212,7 @@ - + \ No newline at end of file diff --git a/parserLeetsheet.txt b/parserLeetsheet.txt index f8d1f4eef..9475ed434 100644 --- a/parserLeetsheet.txt +++ b/parserLeetsheet.txt @@ -76,4 +76,4 @@ count id 1 extensionsParser 1 compilesToParser -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/parserPrompt.txt b/parserPrompt.txt index 937e4da8d..50fca0a51 100644 --- a/parserPrompt.txt +++ b/parserPrompt.txt @@ -911,6 +911,22 @@ stamp boolean isPopular true description A comment. Prints nothing. concepts.parsers + scrollConceptsParser + description Load concepts as table. + extends abstractDatatableProviderParser + cue concepts + atoms cueAtom + example + concepts + printTable + javascript + get coreTable() { + return this.root.concepts + } + get columnNames() { + return this.root.measures.map(col => col.Name) + } + loadConceptsParser // todo: clean this up. just add smarter imports with globs? // this currently removes any "import" statements. @@ -1552,8 +1568,7 @@ stamp javascript get inputs() { - const {measures} = this.parent.file - return measures.filter(measure => !measure.IsComputed).map((measure, index) => { + return this.root.measures.filter(measure => !measure.IsComputed).map((measure, index) => { const {Name, Question, IsRequired, Type} = measure const type = Type || "text" const placeholder = Question @@ -3144,7 +3159,7 @@ stamp javascript getErrors() { const errors = super.getErrors() - let requiredMeasureNames = this.parent.file.measures.filter(measure => measure.isMeasureRequired).map(measure => measure.Name).filter(name => name !== "id") + let requiredMeasureNames = this.root.measures.filter(measure => measure.isMeasureRequired).map(measure => measure.Name).filter(name => name !== "id") if (!requiredMeasureNames.length) return errors let next = this.next while (requiredMeasureNames.length && next.cue !== "id" && next.index !== 0) { @@ -4222,7 +4237,7 @@ stamp return this.readFile(fullpath) } log(message) { - // console.log(message) + this.file.log ? this.file.log(message) : "" } async fetchBrowser(url) { const content = localStorage.getItem(url) @@ -4273,6 +4288,12 @@ stamp getFromParserId(parserId) { return this.parserIdIndex[parserId]?.[0].content } + get fileSystem() { + return this.file.fileSystem + } + get filePath() { + return this.file.filePath + } get folderPath() { return this.file.folderPath } @@ -4533,6 +4554,280 @@ stamp .replace(/\n+$/, "") return trimmed === "" ? trimmed : trimmed + "\n" // End non blank Scroll files in a newline character POSIX style for better working with tools like git } + get parser() { + return this.constructor + } + get parsersRequiringExternals() { + const { parser } = this + // todo: could be cleaned up a bit + if (!parser.parsersRequiringExternals) parser.parsersRequiringExternals = parser.cachedHandParsersProgramRoot.filter(particle => particle.copyFromExternal).map(particle => particle.atoms[0]) + return parser.parsersRequiringExternals + } + _copyExternalFiles(externalFilesCopied = {}) { + if (!this.isNodeJs()) return + // If this file uses a parser that has external requirements, + // copy those from external folder into the destination folder. + const { parsersRequiringExternals, folderPath, fileSystem, filename, parserIdIndex, path } = this + const { Disk } = require("scrollsdk/products/Disk.node.js") + if (!externalFilesCopied[folderPath]) externalFilesCopied[folderPath] = {} + parsersRequiringExternals.forEach(parserId => { + if (externalFilesCopied[folderPath][parserId]) return + if (!parserIdIndex[parserId]) return + parserIdIndex[parserId].map(particle => { + const externalFiles = particle.copyFromExternal.split(" ") + externalFiles.forEach(name => { + const newPath = path.join(folderPath, name) + fileSystem.writeProduct(newPath, Disk.read(path.join(this.externalsPath, name))) + this.log(`💾 Copied external file needed by ${filename} to ${name}`) + }) + }) + if (parserId !== "scrollThemeParser") + // todo: generalize when not to cache + externalFilesCopied[folderPath][parserId] = true + }) + } + _buildFileType(extension) { + const { fileSystem, folderPath, filename, filePath, path } = this + const capitalized = this.lodash.capitalize(extension) + const buildKeyword = "build" + capitalized + if (!this.has(buildKeyword)) return + const { permalink } = this + const outputFiles = this.get(buildKeyword)?.split(" ") || [""] + outputFiles.forEach(name => { + const link = name || permalink.replace(".html", "." + extension) + try { + fileSystem.writeProduct(path.join(folderPath, link), this.compileTo(capitalized)) + this.log(`💾 Built ${link} from ${filename}`) + } catch (err) { + console.error(`Error while building '${filePath}' with extension '${extension}'`) + throw err + } + }) + } + async buildPdf() { + if (!this.isNodeJs()) return "Only works in Node currently." + const { filename } = this + const outputFile = this.filenameNoExtension + ".pdf" + // relevant source code for chrome: https://github.com/chromium/chromium/blob/a56ef4a02086c6c09770446733700312c86f7623/components/headless/command_handler/headless_command_switches.cc#L22 + const command = `/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --headless --disable-gpu --no-pdf-header-footer --default-background-color=00000000 --no-pdf-background --print-to-pdf="${outputFile}" "${this.permalink}"` + // console.log(`Node.js is running on architecture: ${process.arch}`) + try { + const output = require("child_process").execSync(command, { stdio: "ignore" }) + this.log(`💾 Built ${outputFile} from ${filename}`) + } catch (error) { + console.error(error) + } + } + async buildOne() { + // todo: cleanup + // todo: iterate over buildFile particles directly. not this hard coded order. + await this.build() + this._buildFileType("parsers") + this._buildConceptsAndMeasures() // todo: call this buildDelimited? + this._buildFileType("csv") + this._buildFileType("tsv") + this._buildFileType("json") + } + async buildTwo(externalFilesCopied = {}) { + // todo: iterate over buildFile particles directly. not this hard coded order. + if (this.has("buildHtml")) this._copyExternalFiles(externalFilesCopied) + this._buildFileType("js") + this._buildFileType("txt") + this._buildFileType("html") + this._buildFileType("rss") + this._buildFileType("css") + if (this.has("buildPdf")) this.buildPdf() + } + _buildConceptsAndMeasures() { + const { fileSystem, folderPath, filename, path } = this + // If this proves useful maybe make slight adjustments to Scroll lang to be more imperative. + if (!this.has("buildConcepts")) return + const { permalink } = this + this.findParticles("buildConcepts").forEach(particle => { + const files = particle.getAtomsFrom(1) + if (!files.length) files.push(permalink.replace(".html", ".csv")) + const sortBy = particle.get("sortBy") + files.forEach(link => { + fileSystem.writeProduct(path.join(folderPath, link), this.compileConcepts(link, sortBy)) + this.log(`💾 Built concepts in ${filename} to ${link}`) + }) + }) + if (!this.has("buildMeasures")) return + this.findParticles("buildMeasures").forEach(particle => { + const files = particle.getAtomsFrom(1) + if (!files.length) files.push(permalink.replace(".html", ".csv")) + const sortBy = particle.get("sortBy") + files.forEach(link => { + fileSystem.writeProduct(path.join(folderPath, link), this.compileMeasures(link, sortBy)) + this.log(`💾 Built measures in ${filename} to ${link}`) + }) + }) + } + _compileArray(filename, arr) { + const removeBlanks = data => data.map(obj => Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== ""))) + const parts = filename.split(".") + const format = parts.pop() + if (format === "json") return JSON.stringify(removeBlanks(arr), null, 2) + if (format === "js") return `const ${parts[0]} = ` + JSON.stringify(removeBlanks(arr), null, 2) + if (format === "csv") return this.arrayToCSV(arr) + if (format === "tsv") return this.arrayToCSV(arr, "\t") + if (format === "particles") return particles.toString() + return particles.toString() + } + makeLodashOrderByParams(str) { + const part1 = str.split(" ") + const part2 = part1.map(col => (col.startsWith("-") ? "desc" : "asc")) + return [part1.map(col => col.replace(/^\-/, "")), part2] + } + arrayToCSV(data, delimiter = ",") { + if (!data.length) return "" + // Extract headers + const headers = Object.keys(data[0]) + const csv = data.map(row => + headers + .map(fieldName => { + const fieldValue = row[fieldName] + // Escape commas if the value is a string + if (typeof fieldValue === "string" && fieldValue.includes(delimiter)) { + return `"${fieldValue.replace(/"/g, '""')}"` // Escape double quotes and wrap in double quotes + } + return fieldValue + }) + .join(delimiter) + ) + csv.unshift(headers.join(delimiter)) // Add header row at the top + return csv.join("\n") + } + compileConcepts(filename = "csv", sortBy = "") { + const {lodash} = this + if (!sortBy) return this._compileArray(filename, this.concepts) + const orderBy = this.makeLodashOrderByParams(sortBy) + return this._compileArray(filename, lodash.orderBy(this.concepts, orderBy[0], orderBy[1])) + } + _withStats + get measuresWithStats() { + if (!this._withStats) this._withStats = this.addMeasureStats(this.concepts, this.measures) + return this._withStats + } + addMeasureStats(concepts, measures){ + return measures.map(measure => { + let Type = false + concepts.forEach(concept => { + const value = concept[measure.Name] + if (value === undefined || value === "") return + measure.Values++ + if (!Type) { + measure.Example = value.toString().replace(/\n/g, " ") + measure.Type = typeof value + Type = true + } + }) + measure.Coverage = Math.floor((100 * measure.Values) / concepts.length) + "%" + return measure + }) + } + parseMeasures(parser) { + if (!Particle.measureCache) + Particle.measureCache = new Map() + const measureCache = Particle.measureCache + if (measureCache.get(parser)) return measureCache.get(parser) + const {lodash} = this + // todo: clean this up + const getCueAtoms = rootParserProgram => + rootParserProgram + .filter(particle => particle.getLine().endsWith("Parser") && !particle.getLine().startsWith("abstract")) + .map(particle => particle.get("cue") || particle.getLine()) + .map(line => line.replace(/Parser$/, "")) + // Generate a fake program with one of every of the available parsers. Then parse it. Then we can easily access the meta data on the parsers + const dummyProgram = new parser( + Array.from( + new Set( + getCueAtoms(parser.cachedHandParsersProgramRoot) // is there a better method name than this? + ) + ).join("\n") + ) + // Delete any particles that are not measures + dummyProgram.filter(particle => !particle.isMeasure).forEach(particle => particle.destroy()) + dummyProgram.forEach(particle => { + // add nested measures + Object.keys(particle.definition.cueMapWithDefinitions).forEach(key => particle.appendLine(key)) + }) + // Delete any nested particles that are not measures + dummyProgram.topDownArray.filter(particle => !particle.isMeasure).forEach(particle => particle.destroy()) + const measures = dummyProgram.topDownArray.map(particle => { + return { + Name: particle.measureName, + Values: 0, + Coverage: 0, + Question: particle.definition.description, + Example: particle.definition.getParticle("example")?.subparticlesToString() || "", + Type: particle.typeForWebForms, + Source: particle.sourceDomain, + //Definition: parsedProgram.root.filename + ":" + particle.lineNumber + SortIndex: particle.sortIndex, + IsComputed: particle.isComputed, + IsRequired: particle.isMeasureRequired, + IsConceptDelimiter: particle.isConceptDelimiter, + Cue: particle.definition.get("cue") + } + }) + measureCache.set(parser, lodash.sortBy(measures, "SortIndex")) + return measureCache.get(parser) + } + _concepts + get concepts() { + if (this._concepts) return this._concepts + this._concepts = this.parseConcepts(this, this.measures) + return this._concepts + } + _measures + get measures() { + if (this._measures) return this._measures + this._measures = this.parseMeasures(this.parser) + return this._measures + } + parseConcepts(parsedProgram, measures){ + // Todo: might be a perf/memory/simplicity win to have a "segment" method in ScrollSDK, where you could + // virtually split a Particle into multiple segments, and then query on those segments. + // So we would "segment" on "id ", and then not need to create a bunch of new objects, and the original + // already parsed lines could then learn about/access to their respective segments. + const conceptDelimiter = measures.filter(measure => measure.IsConceptDelimiter)[0] + if (!conceptDelimiter) return [] + const concepts = parsedProgram.split(conceptDelimiter.Cue || conceptDelimiter.Name) + concepts.shift() // Remove the part before "id" + return concepts.map(concept => { + const row = {} + measures.forEach(measure => { + const measureName = measure.Name + const measureKey = measure.Cue || measureName.replace(/_/g, " ") + if (!measure.IsComputed) row[measureName] = concept.getParticle(measureKey)?.measureValue ?? "" + else row[measureName] = this.computeMeasure(parsedProgram, measureName, concept, concepts) + }) + return row + }) + } + computeMeasure(parsedProgram, measureName, concept, concepts){ + // note that this is currently global, assuming there wont be. name conflicts in computed measures in a single scroll + if (!Particle.measureFnCache) Particle.measureFnCache = {} + const measureFnCache = Particle.measureFnCache + if (!measureFnCache[measureName]) { + // a bit hacky but works?? + const particle = parsedProgram.appendLine(measureName) + measureFnCache[measureName] = particle.computeValue + particle.destroy() + } + return measureFnCache[measureName](concept, measureName, parsedProgram, concepts) + } + compileMeasures(filename = "csv", sortBy = "") { + const withStats = this.measuresWithStats + if (!sortBy) return this._compileArray(filename, withStats) + const orderBy = this.makeLodashOrderByParams(sortBy) + return this._compileArray(filename, this.lodash.orderBy(withStats, orderBy[0], orderBy[1])) + } + async buildAll() { + await this.buildOne() + this.buildTwo() + } toRss() { const { title, canonicalUrl } = this return ` diff --git a/parserUsage.csv b/parserUsage.csv index cd8c700e7..05aadc0d5 100644 --- a/parserUsage.csv +++ b/parserUsage.csv @@ -1,11 +1,11 @@ parserId,uses -blankLineParser,1064 -versionParser,571 -newFeatureParser,501 -catchAllParagraphParser,264 +blankLineParser,1066 +versionParser,572 +newFeatureParser,502 +catchAllParagraphParser,265 bugFixParser,216 lineOfCodeParser,216 -breakingChangeParser,208 +breakingChangeParser,209 BlobParser,108 quickLinkParser,99 scrollQuestionParser,65 diff --git a/parsers/concepts.parsers b/parsers/concepts.parsers index 77b7693d7..fa8ef46ef 100644 --- a/parsers/concepts.parsers +++ b/parsers/concepts.parsers @@ -1,3 +1,19 @@ +scrollConceptsParser + description Load concepts as table. + extends abstractDatatableProviderParser + cue concepts + atoms cueAtom + example + concepts + printTable + javascript + get coreTable() { + return this.root.concepts + } + get columnNames() { + return this.root.measures.map(col => col.Name) + } + loadConceptsParser // todo: clean this up. just add smarter imports with globs? // this currently removes any "import" statements. diff --git a/parsers/forms.parsers b/parsers/forms.parsers index a99f8e703..4c4b1efb7 100644 --- a/parsers/forms.parsers +++ b/parsers/forms.parsers @@ -36,8 +36,7 @@ classicFormParser javascript get inputs() { - const {measures} = this.parent.file - return measures.filter(measure => !measure.IsComputed).map((measure, index) => { + return this.root.measures.filter(measure => !measure.IsComputed).map((measure, index) => { const {Name, Question, IsRequired, Type} = measure const type = Type || "text" const placeholder = Question @@ -101,7 +100,7 @@ scrollFormParser } get inputs() { const Name = "particles" - return ` + return ` + - + @@ -76,7 +76,7 @@ - + \ No newline at end of file diff --git a/particlesLeetsheet.txt b/particlesLeetsheet.txt index 2c5fbcb56..de22b6aae 100644 --- a/particlesLeetsheet.txt +++ b/particlesLeetsheet.txt @@ -17,4 +17,4 @@ Links - r/WorldWideScroll · Scroll LeetSheet · Parsers LeetSheet https://scroll.pub/leetsheet.html Scroll LeetSheet https://scroll.pub/parserLeetsheet.html Parsers LeetSheet -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/readmePrompt.txt b/readmePrompt.txt index 1199ae64c..54254b7dc 100644 --- a/readmePrompt.txt +++ b/readmePrompt.txt @@ -88,6 +88,12 @@ ciBadges.scroll br thinColumns +📦 150.0.0 11/13/2024 +🎉 added `concepts` parser for loading concepts in a file into a table +⚠️ BREAKING: (no one should be affected) nearly all Scroll code is now available to Scroll in the browser. Some internal APIs may have changed if using Scroll programmatically. + +This is prep work for the major release coming imminently which brings the full power of PPS to the browser, including ability to write Parsers, fully user Scrollsets, and more, dynamically, clientside in browser. + 📦 149.0.0 11/13/2024 🎉 `parsers.parsers` now ships with Scroll! Syntax highlighting, autocomplete, and other tools for writing parsers in try.scroll.pub. - Note: compiling these Parsers still requires desktop Scroll. Not everything runs in browser...yet diff --git a/releaseNotes.csv b/releaseNotes.csv index b506b982e..e80d1ea39 100644 --- a/releaseNotes.csv +++ b/releaseNotes.csv @@ -1,4 +1,5 @@ version,releaseDate,bugFixes,newFeatures,breakingChanges +150.0.0,11/13/2024,0,1,1 149.0.0,11/13/2024,0,1,1 148.3.1,11/12/2024,1,0,0 148.3.0,11/12/2024,0,1,0 diff --git a/releaseNotes.html b/releaseNotes.html index e502bc8b6..467bfad6f 100644 --- a/releaseNotes.html +++ b/releaseNotes.html @@ -3,12 +3,12 @@ Scroll Release Notes - + - + @@ -60,424 +60,429 @@
-

149.0.0 11/13/2024

+

150.0.0 11/13/2024

    -
  • parsers.parsers now ships with Scroll! Syntax highlighting, autocomplete, and other tools for writing parsers in try.scroll.pub.
    • Note: compiling these Parsers still requires desktop Scroll. Not everything runs in browser...yet
+
  • added concepts parser for loading concepts in a file into a table
    • -
    • BREAKING: (no one should be affected) any custom parsers in your Scroll files will now be fully parsed. So previously undetected errors will now be caught. There may also be some namespace conflicts as we cleanup the Parser code.
    +
  • BREAKING: (no one should be affected) nearly all Scroll code is now available to Scroll in the browser. Some internal APIs may have changed if using Scroll programmatically.
  • -

    148.3.1 11/12/2024

    +

    This is prep work for the major release coming imminently which brings the full power of PPS to the browser, including ability to write Parsers, fully user Scrollsets, and more, dynamically, clientside in browser.

    +

    149.0.0 11/13/2024

    +
    • parsers.parsers now ships with Scroll! Syntax highlighting, autocomplete, and other tools for writing parsers in try.scroll.pub.
      • Note: compiling these Parsers still requires desktop Scroll. Not everything runs in browser...yet
    +
    • BREAKING: (no one should be affected) any custom parsers in your Scroll files will now be fully parsed. So previously undetected errors will now be caught. There may also be some namespace conflicts as we cleanup the Parser code.
    +
    +

    148.3.1 11/12/2024

      -
    • fix author bug in postsMeta
    -
    -

    148.3.0 11/12/2024

    -
    • moved format code to root parser for use in browser
    -
    -

    148.2.0 11/12/2024

    -
    • created bindTo parsers property which tells particles to stick with next/previous when formatting
    • -
    • created allowTrailingWhitespace parser property to allow particles to allow trailing whitespace when formatting
    -
    -

    148.1.0 11/12/2024

    -
    • added codeFromFile parser
    • -
    • buildTxt + code parsers now output code surrounded by backticks
    -
    -

    148.0.0 11/11/2024

    -
    -

    🚨 MAJOR RELEASE

    -
    • Vastly improved data science capabilities!
    • -
    • Major cleanup of Scroll to remove loops concept. Tables is all we need.
    • -
    • Major cleanup toward running Scroll fully in browser
    -
    -
    • added buildTsv parser
    • -
    • added buildJson parser
    • -
    • added posts parser for iterating over posts as a table
    • -
    • added postsMeta parser for iterating over post metadata as a table
    • -
    • added assertBuildIncludes
    • -
    • printTable combined with buildTsv/Csv/Json will now save the table to disk.
    -
    • BREAKING: removed loop. tables can do everything loops could, much better.
    • -
    • BREAKING: removed printCsv parser
    • -
    • BREAKING: removed printSearchTable parser. Can now be done with:
    +
  • fix author bug in postsMeta
  • +
    +

    148.3.0 11/12/2024

    +
    • moved format code to root parser for use in browser
    +
    +

    148.2.0 11/12/2024

    +
    • created bindTo parsers property which tells particles to stick with next/previous when formatting
    • +
    • created allowTrailingWhitespace parser property to allow particles to allow trailing whitespace when formatting
    +
    +

    148.1.0 11/12/2024

    +
    • added codeFromFile parser
    • +
    • buildTxt + code parsers now output code surrounded by backticks
    +
    +

    148.0.0 11/11/2024

    +
    +

    🚨 MAJOR RELEASE

    +
    • Vastly improved data science capabilities!
    • +
    • Major cleanup of Scroll to remove loops concept. Tables is all we need.
    • +
    • Major cleanup toward running Scroll fully in browser
    +
    +
    • added buildTsv parser
    • +
    • added buildJson parser
    • +
    • added posts parser for iterating over posts as a table
    • +
    • added postsMeta parser for iterating over post metadata as a table
    • +
    • added assertBuildIncludes
    • +
    • printTable combined with buildTsv/Csv/Json will now save the table to disk.
    +
    • BREAKING: removed loop. tables can do everything loops could, much better.
    • +
    • BREAKING: removed printCsv parser
    • +
    • BREAKING: removed printSearchTable parser. Can now be done with:
    posts All printTable tableSearch -

    147.1.0 11/11/2024

    -
    • added shuffle parser
    • -
    • added iris parser for easier quick testing/demoing of scroll tables
    +

    147.1.0 11/11/2024

    +
    • added shuffle parser
    • +
    • added iris parser for easier quick testing/demoing of scroll tables
    -

    147.0.0 11/09/2024

    -
    • added quickRunScriptParser to run python, php, ruby, perl, and sh scripts and include output in compiled output
    -
    • match less in quick tables
    -
    • BREAKING: (no one should be affected) if you have a line that is just a filename like *.(py|rb|sh|php|pl), it will now attempt to run that script
    +

    147.0.0 11/09/2024

    +
    • added quickRunScriptParser to run python, php, ruby, perl, and sh scripts and include output in compiled output
    +
    • match less in quick tables
    +
    • BREAKING: (no one should be affected) if you have a line that is just a filename like *.(py|rb|sh|php|pl), it will now attempt to run that script
    -

    146.4.0 11/09/2024

    -
    • when using maps, geolocate now adds an icon to current location
    +

    146.4.0 11/09/2024

    +
    • when using maps, geolocate now adds an icon to current location
    -

    146.3.0 11/08/2024

    -
    • inlineJs now concats without script tag when paired with buildJs
    +

    146.3.0 11/08/2024

    +
    • inlineJs now concats without script tag when paired with buildJs
    -

    146.2.0 11/07/2024

    -
    • more comment support across parsers
    +

    146.2.0 11/07/2024

    +
    • more comment support across parsers
    -

    146.1.0 11/05/2024

    -
    • added background parser
    +

    146.1.0 11/05/2024

    +
    • added background parser
    -

    146.0.0 11/02/2024

    -
    • upgrade ScrollSDK to get "imported" functionality.
    • -
    • added importedParser
    • -
    • added support for optional imports using a temporary parser. Long term implementation coming soon.
    -
    • BREAKING: (no one should be affected) import particles are now replaced by "imported" particles
    +

    146.0.0 11/02/2024

    +
    • upgrade ScrollSDK to get "imported" functionality.
    • +
    • added importedParser
    • +
    • added support for optional imports using a temporary parser. Long term implementation coming soon.
    +
    • BREAKING: (no one should be affected) import particles are now replaced by "imported" particles
    -

    145.12.0 11/02/2024

    -
    • assertion parsers can now be chained and will test the output of previous non-assertion parser
    • -
    • added dependenciesParser
    +

    145.12.0 11/02/2024

    +
    • assertion parsers can now be chained and will test the output of previous non-assertion parser
    • +
    • added dependenciesParser
    -

    145.11.1 11/01/2024

    -
    • remove carriage returns ('\r') when running scroll format
    +

    145.11.1 11/01/2024

    +
    • remove carriage returns ('\r') when running scroll format
    -

    145.11.0 10/31/2024

    -
    • add join parser to printColumn
    +

    145.11.0 10/31/2024

    +
    • add join parser to printColumn
    -

    145.10.0 10/30/2024

    -
    • much improved inspector parsers
    +

    145.10.0 10/30/2024

    +
    • much improved inspector parsers
    -

    145.9.0 10/30/2024

    -
    • added buildParsersParser
    • -
    • added scrollDefParser
    • -
    • added inspectBelowParser
    • -
    • added inspectAboveParser
    -
    • atom highlight fixes for css and html
    • -
    • allow scrollForms gracefully handle zero params
    +

    145.9.0 10/30/2024

    +
    • added buildParsersParser
    • +
    • added scrollDefParser
    • +
    • added inspectBelowParser
    • +
    • added inspectAboveParser
    +
    • atom highlight fixes for css and html
    • +
    • allow scrollForms gracefully handle zero params
    -

    This version starts introduces "Defs", a new short hand way to create forms/parsers/scrollsets.

    -

    Expect Def parsers to evolve quickly.

    -

    145.8.0 10/27/2024

    -
    • added scrollNavParser
    • -
    • added scrollLinkTitleParser
    +

    This version starts introduces "Defs", a new short hand way to create forms/parsers/scrollsets.

    +

    Expect Def parsers to evolve quickly.

    +

    145.8.0 10/27/2024

    +
    • added scrollNavParser
    • +
    • added scrollLinkTitleParser
    -

    145.7.0 10/27/2024

    -
    • improved how long ago magic column to handle timestamps better and also show original date on hover
    +

    145.7.0 10/27/2024

    +
    • improved how long ago magic column to handle timestamps better and also show original date on hover
    -

    145.6.0 10/27/2024

    -
    • added magic last[Verbed] columns to tables which now renders a "how long ago" value
    +

    145.6.0 10/27/2024

    +
    • added magic last[Verbed] columns to tables which now renders a "how long ago" value
    -

    145.5.1 10/26/2024

    -
    • table fix for missing values
    +

    145.5.1 10/26/2024

    +
    • table fix for missing values
    -

    145.5.0 10/25/2024

    -
    • new internal build API to support single file building
    +

    145.5.0 10/25/2024

    +
    • new internal build API to support single file building
    -

    145.4.0 10/25/2024

    -
    • added startsWith and endsWith atoms to where parser
    +

    145.4.0 10/25/2024

    +
    • added startsWith and endsWith atoms to where parser
    -

    145.3.0 10/24/2024

    -
    • added nav styling
    +

    145.3.0 10/24/2024

    +
    • added nav styling
    -

    145.2.0 10/24/2024

    -
    • add HAML parser for plain tags
    +

    145.2.0 10/24/2024

    +
    • add HAML parser for plain tags
    -

    145.1.2 10/23/2024

    -
    • clone fixes
    +

    145.1.2 10/23/2024

    +
    • clone fixes
    -

    145.1.1 10/23/2024

    -
    • clone fix
    +

    145.1.1 10/23/2024

    +
    • clone fix
    -

    145.1.0 10/23/2024

    -
    • clone command api updates
    +

    145.1.0 10/23/2024

    +
    • clone command api updates
    -

    145.0.0 10/23/2024

    -
    • added onclickParser
    • -
    • added scrollEvalParser
    • -
    • started refactoring CSS code to make theming easier
    -
    • BREAKING: if using --base-font-size rename to --scrollBaseFontSize
    +

    145.0.0 10/23/2024

    +
    • added onclickParser
    • +
    • added scrollEvalParser
    • +
    • started refactoring CSS code to make theming easier
    +
    • BREAKING: if using --base-font-size rename to --scrollBaseFontSize
    -

    144.0.0 10/22/2024

    -
    • big refactor to make more of Scroll work entirely in browser
    -
    • BREAKING: (no user breaking changes). Changes for ScrollFile API users: some methods have moved to scrollProgram.
    +

    144.0.0 10/22/2024

    +
    • big refactor to make more of Scroll work entirely in browser
    +
    • BREAKING: (no user breaking changes). Changes for ScrollFile API users: some methods have moved to scrollProgram.
    -

    143.0.0 10/19/2024

    -
    • BREAKING: "viewSource" is now "edit" globally
    +

    143.0.0 10/19/2024

    +
    • BREAKING: "viewSource" is now "edit" globally
    -

    142.3.0 10/19/2024

    -
    • command line output cleanup
    +

    142.3.0 10/19/2024

    +
    • command line output cleanup
    -

    142.2.0 10/18/2024

    -
    • added inlineCss and inlineJs parsers
    +

    142.2.0 10/18/2024

    +
    • added inlineCss and inlineJs parsers
    -

    142.1.0 10/18/2024

    -
    • added new post parser to buttons
    +

    142.1.0 10/18/2024

    +
    • added new post parser to buttons
    -

    142.0.2 10/16/2024

    -
    • clone fix
    +

    142.0.2 10/16/2024

    +
    • clone fix
    -

    142.0.1 10/14/2024

    -
    • clone fixes
    +

    142.0.1 10/14/2024

    +
    • clone fixes
    -

    142.0.0 10/14/2024

    -
    • added new clone cli command
    +

    142.0.0 10/14/2024

    +
    • added new clone cli command
    -

    141.3.1 10/14/2024

    -
    • whoops! major format regression
    +

    141.3.1 10/14/2024

    +
    • whoops! major format regression
    -

    141.3.0 10/14/2024

    -
    • format command should not insert newlines into blank files
    +

    141.3.0 10/14/2024

    +
    • format command should not insert newlines into blank files
    -

    141.2.0 10/14/2024

    -
    • toStamp supports a single file
    • -
    • moved prompt to parsersPrompt
    • -
    • added scrollPrompt
    +

    141.2.0 10/14/2024

    +
    • toStamp supports a single file
    • +
    • moved prompt to parsersPrompt
    • +
    • added scrollPrompt
    -

    141.1.0 10/14/2024

    -
    • added toStamp parser
    • -
    • created prompt.scroll
    +

    141.1.0 10/14/2024

    +
    • added toStamp parser
    • +
    • created prompt.scroll
    -

    141.0.0 10/12/2024

    -
    • updated ScrollSDK
    -
    • bug fix in maps nested under tables. Thanks TD for the report!
    -
    • BREAKING: firstAtom is now cue everywhere
    +

    141.0.0 10/12/2024

    +
    • updated ScrollSDK
    +
    • bug fix in maps nested under tables. Thanks TD for the report!
    +
    • BREAKING: firstAtom is now cue everywhere
    -

    140.0.0 10/12/2024

    -
    • updated ScrollSDK
    -
    • BREAKING: crux, a "temporary" word that lasted years 😀, is now cue
    +

    140.0.0 10/12/2024

    +
    • updated ScrollSDK
    +
    • BREAKING: crux, a "temporary" word that lasted years 😀, is now cue
    -

    139.1.0 10/11/2024

    -
    • added qrcode parser
    +

    139.1.0 10/11/2024

    +
    • added qrcode parser
    -

    139.0.1 10/11/2024

    -
    • bug fix in quick tables. Thanks TD for the report!
    +

    139.0.1 10/11/2024

    +
    • bug fix in quick tables. Thanks TD for the report!
    -

    139.0.0 10/11/2024

    -
    • the quickTable parser now works with JSON files as well.
    -
    • BREAKING: to use the JSON Script parser, instead of *.json you now need to use the cue "jsonScript"
    +

    139.0.0 10/11/2024

    +
    • the quickTable parser now works with JSON files as well.
    +
    • BREAKING: to use the JSON Script parser, instead of *.json you now need to use the cue "jsonScript"
    -

    Regex find:

    +

    Regex find:

    ^[^\s]+\.json -

    138.4.0 10/09/2024

    -
    • added placeholder and value parsers to ScrollForms
    +

    138.4.0 10/09/2024

    +
    • added placeholder and value parsers to ScrollForms
    -

    138.3.0 10/09/2024

    -
    • add geolocate parser for better map UX.
    +

    138.3.0 10/09/2024

    +
    • add geolocate parser for better map UX.
    -

    138.2.0 10/08/2024

    -
    • add theScrollButton parser
    +

    138.2.0 10/08/2024

    +
    • add theScrollButton parser
    -

    138.1.1 10/08/2024

    -
    • scroll forms fixes
    +

    138.1.1 10/08/2024

    +
    • scroll forms fixes
    -

    138.1.0 10/08/2024

    -
    • scroll forms can now post
    +

    138.1.0 10/08/2024

    +
    • scroll forms can now post
    -

    138.0.0 10/08/2024

    -
    • compiled HTML of all aftertext nodes now deep linkable. Thanks to Hari for the request!
    -
    • BREAKING: upgraded ScrollSDK so getIndex is now index on Particles
    +

    138.0.0 10/08/2024

    +
    • compiled HTML of all aftertext nodes now deep linkable. Thanks to Hari for the request!
    +
    • BREAKING: upgraded ScrollSDK so getIndex is now index on Particles
    -

    137.4.0 10/08/2024

    -
    • maps now can request users location
    +

    137.4.0 10/08/2024

    +
    • maps now can request users location
    -

    137.3.0 10/07/2024

    -
    • export SimpleCLI
    +

    137.3.0 10/07/2024

    +
    • export SimpleCLI
    -

    137.2.0 10/06/2024

    -
    • added tiles parser to maps
    +

    137.2.0 10/06/2024

    +
    • added tiles parser to maps
    -

    137.1.0 10/05/2024

    -
    • added rank parser to tables
    +

    137.1.0 10/05/2024

    +
    • added rank parser to tables
    -

    137.0.0 10/04/2024

    -
    • maps now takes a table
    • -
    • maps now supports fullscreen
    • -
    • maps now supports custom hover template strings
    • -
    • maps now supports color
    • -
    • maps now supports fillColor
    • -
    • maps now supports radius
    • -
    • maps now supports fillOpacity
    • -
    • added compute table parser
    -
    • BREAKING: remove "points" parser. maps now takes a table as input.
    +

    137.0.0 10/04/2024

    +
    • maps now takes a table
    • +
    • maps now supports fullscreen
    • +
    • maps now supports custom hover template strings
    • +
    • maps now supports color
    • +
    • maps now supports fillColor
    • +
    • maps now supports radius
    • +
    • maps now supports fillOpacity
    • +
    • added compute table parser
    +
    • BREAKING: remove "points" parser. maps now takes a table as input.
    -

    136.12.0 10/04/2024

    -
    • table now accepts urls
    • -
    • build now works in web version
    +

    136.12.0 10/04/2024

    +
    • table now accepts urls
    • +
    • build now works in web version
    -

    136.11.1 10/02/2024

    -
    • description escape fix
    +

    136.11.1 10/02/2024

    +
    • description escape fix
    -

    136.11.0 10/02/2024

    -
    • added printShortSnippetsParser
    +

    136.11.0 10/02/2024

    +
    • added printShortSnippetsParser
    -

    136.10.0 10/02/2024

    -
    • added footer Parser
    +

    136.10.0 10/02/2024

    +
    • added footer Parser
    -

    136.9.0 9/30/2024

    -
    • added stopwatch Parser
    +

    136.9.0 9/30/2024

    +
    • added stopwatch Parser
    -

    136.8.0 9/30/2024

    -
    • viewSourceButton can now take a url
    +

    136.8.0 9/30/2024

    +
    • viewSourceButton can now take a url
    -

    136.7.0 9/30/2024

    -
    • dark theme improvements
    +

    136.7.0 9/30/2024

    +
    • dark theme improvements
    -

    136.6.0 9/27/2024

    -
    • added printColumn parser
    +

    136.6.0 9/27/2024

    +
    • added printColumn parser
    -

    136.5.0 9/27/2024

    -
    • added disk parser which generates a table from local disk contents
    +

    136.5.0 9/27/2024

    +
    • added disk parser which generates a table from local disk contents
    -

    136.4.1 9/27/2024

    -
    • type fix in table links
    +

    136.4.1 9/27/2024

    +
    • type fix in table links
    -

    136.4.0 9/27/2024

    -
    • new aftertext relative link parser. relative links with 33% fewer words.
    • -
    • use quick links in image tags.
    -
    • bug fix where tableSearch was getting applied to non scroll tables such as Dashboards
    +

    136.4.0 9/27/2024

    +
    • new aftertext relative link parser. relative links with 33% fewer words.
    • +
    • use quick links in image tags.
    +
    • bug fix where tableSearch was getting applied to non scroll tables such as Dashboards
    -

    Find/Replace for shorter relative links:

    +

    Find/Replace for shorter relative links:

    ^ link ([^\s]+)\.html $1.html -

    136.3.0 9/27/2024

    -
    • new expand/collapse button on tables and removed confusing zoom in/zoom out
    • -
    • copy button on tables now generates just data, no more header/footer cruft
    • -
    • removed rarely used csv button on tables in favor of better copy button
    +

    136.3.0 9/27/2024

    +
    • new expand/collapse button on tables and removed confusing zoom in/zoom out
    • +
    • copy button on tables now generates just data, no more header/footer cruft
    • +
    • removed rarely used csv button on tables in favor of better copy button
    -

    136.2.1 9/26/2024

    -
    • container style fix when in snippets
    +

    136.2.1 9/26/2024

    +
    • container style fix when in snippets
    -

    136.2.0 9/26/2024

    -
    • added container parser
    +

    136.2.0 9/26/2024

    +
    • added container parser
    -

    136.1.0 9/26/2024

    -
    • added hakon parser
    +

    136.1.0 9/26/2024

    +
    • added hakon parser
    -

    136.0.0 9/26/2024

    -
    • BREAKING: (no one should be affected). haml was matching too much. now haml parser requires an #id.
    +

    136.0.0 9/26/2024

    +
    • BREAKING: (no one should be affected). haml was matching too much. now haml parser requires an #id.
    -

    135.0.0 9/26/2024

    -
    • added tufte theme
    -
    • BREAKING: removed gazetteCss. Now use theme gazette.
    • -
    • BREAKING: removed tufteCss. Now use theme tufte.
    +

    135.0.0 9/26/2024

    +
    • added tufte theme
    +
    • BREAKING: removed gazetteCss. Now use theme gazette.
    • +
    • BREAKING: removed tufteCss. Now use theme tufte.
    -

    134.1.0 9/26/2024

    -
    • added theme parser and 3 themes: roboto, dark, and gazette
    • -
    • added iframes parser
    +

    134.1.0 9/26/2024

    +
    • added theme parser and 3 themes: roboto, dark, and gazette
    • +
    • added iframes parser
    -

    134.0.0 9/25/2024

    -
    • added haml quick html tags
    -
    • BREAKING: (no one should be affected) if you have lines starting with a sequence like tag#id or tag.someClassName, they will now get matched to HAML parser.
    +

    134.0.0 9/25/2024

    +
    • added haml quick html tags
    +
    • BREAKING: (no one should be affected) if you have lines starting with a sequence like tag#id or tag.someClassName, they will now get matched to HAML parser.
    -

    133.6.0 9/24/2024

    -
    • added links parser to tables
    +

    133.6.0 9/24/2024

    +
    • added links parser to tables
    -

    133.5.0 9/24/2024

    -
    • added compose parser to tables
    +

    133.5.0 9/24/2024

    +
    • added compose parser to tables
    -

    133.4.0 9/24/2024

    -
    • added quickIncludeJsonParser parser
    +

    133.4.0 9/24/2024

    +
    • added quickIncludeJsonParser parser
    -

    133.3.0 9/24/2024

    -
    • added cloc parser
    • -
    • you can now use quickHtml in table flows
    +

    133.3.0 9/24/2024

    +
    • added cloc parser
    • +
    • you can now use quickHtml in table flows
    -

    133.2.0 9/22/2024

    -
    • added favIcon parser
    +

    133.2.0 9/22/2024

    +
    • added favIcon parser
    -

    133.1.0 9/21/2024

    -
    • groupBy now supports better reductions including concat and first
    +

    133.1.0 9/21/2024

    +
    • groupBy now supports better reductions including concat and first
    -

    133.0.1 9/15/2024

    -
    • better error message when eval'ing macros
    +

    133.0.1 9/15/2024

    +
    • better error message when eval'ing macros
    -

    133.0.0 9/15/2024

    -
    • Updated ScrollSDK to get new "atoms" terminology.
    -
    • BREAKING: see ScrollSDK breaking changes
    +

    133.0.0 9/15/2024

    +
    • Updated ScrollSDK to get new "atoms" terminology.
    +
    • BREAKING: see ScrollSDK breaking changes
    -

    132.0.1 9/14/2024

    -
    • fix unix timestamps in printTable
    +

    132.0.1 9/14/2024

    +
    • fix unix timestamps in printTable
    -

    132.0.0 9/14/2024

    -
    • Updated ScrollSDK to get new "subparticle" terminology
    -
    • BREAKING: see ScrollSDK breaking changes
    +

    132.0.0 9/14/2024

    +
    • Updated ScrollSDK to get new "subparticle" terminology
    +
    • BREAKING: see ScrollSDK breaking changes
    -

    131.0.0 9/14/2024

    -
    • new parser: quickCssParser
    • -
    • new parser: quickIncludeHtmlParser
    • -
    • new parser: quickScriptParser
    -
    • BREAKING: (no one should be affected) if you have a one atom line that ends with .js, .css, or .html it will now be consumed by these parsers above.
    +

    131.0.0 9/14/2024

    +
    • new parser: quickCssParser
    • +
    • new parser: quickIncludeHtmlParser
    • +
    • new parser: quickScriptParser
    +
    • BREAKING: (no one should be affected) if you have a one atom line that ends with .js, .css, or .html it will now be consumed by these parsers above.
    -

    130.5.0 9/13/2024

    -
    • new assertHtmlEqualsParser for faster and more intelligent testing
    -
    • fix edge bug in inline markup parsers
    +

    130.5.0 9/13/2024

    +
    • new assertHtmlEqualsParser for faster and more intelligent testing
    +
    • fix edge bug in inline markup parsers
    -

    130.4.2 9/13/2024

    -
    • counter should be floor not ceil
    +

    130.4.2 9/13/2024

    +
    • counter should be floor not ceil
    -

    130.4.1 9/12/2024

    -
    • support for relative links in Url columns in printTable
    -
    • scroll init style fix
    +

    130.4.1 9/12/2024

    +
    • support for relative links in Url columns in printTable
    +
    • scroll init style fix
    -

    130.4.0 9/12/2024

    -
    • add detection of timestamp columns and print them as dates in printTable
    • -
    • remove "Exported data" from copied text in datatables copy buttons
    +

    130.4.0 9/12/2024

    +
    • add detection of timestamp columns and print them as dates in printTable
    • +
    • remove "Exported data" from copied text in datatables copy buttons
    -

    130.3.6 9/12/2024

    -
    • buttons with link should be fully clickable
    +

    130.3.6 9/12/2024

    +
    • buttons with link should be fully clickable
    -

    130.3.5 9/11/2024

    -
    • ScrollSetCLI fix
    +

    130.3.5 9/11/2024

    +
    • ScrollSetCLI fix
    -

    130.3.4 9/10/2024

    -
    • ScrollSetCLI fix
    +

    130.3.4 9/10/2024

    +
    • ScrollSetCLI fix
    -

    130.3.3 9/10/2024

    -
    • ScrollSetCLI fix
    +

    130.3.3 9/10/2024

    +
    • ScrollSetCLI fix
    -

    130.3.2 9/10/2024

    -
    • make just text clickable in view source links
    +

    130.3.2 9/10/2024

    +
    • make just text clickable in view source links
    -

    130.3.1 9/9/2024

    -
    • npm fix
    +

    130.3.1 9/9/2024

    +
    • npm fix
    -

    130.3.0 9/9/2024

    -
    • upstream ScrollSetCLI
    +

    130.3.0 9/9/2024

    +
    • upstream ScrollSetCLI
    -

    130.2.1 9/8/2024

    -
    • table loop fixes
    • -
    • table json parsing fixes
    +

    130.2.1 9/8/2024

    +
    • table loop fixes
    • +
    • table json parsing fixes
    -

    130.2.0 9/8/2024

    -
    • added limit parser to tables
    • -
    • loop parser can now loop over tables
    +

    130.2.0 9/8/2024

    +
    • added limit parser to tables
    • +
    • loop parser can now loop over tables
    -

    130.1.1 9/5/2024

    -
    • oneTextarea max height
    +

    130.1.1 9/5/2024

    +
    • oneTextarea max height
    -

    130.1.0 9/5/2024

    -
    • oneTextarea forms now show a placeholder and example form
    +

    130.1.0 9/5/2024

    +
    • oneTextarea forms now show a placeholder and example form
    -

    130.0.0 9/4/2024

    -
    • forms now submit via email and generate a nicely formatted email
    -
    • BREAKING: (no one should be effected) classicForm and scrollForm work differently now.
    +

    130.0.0 9/4/2024

    +
    • forms now submit via email and generate a nicely formatted email
    +
    • BREAKING: (no one should be effected) classicForm and scrollForm work differently now.
    -

    129.0.0 9/4/2024

    -
    • added quickImport parser for imports.
    -
    • BREAKING: (no one should be effected) if you had any lines that were just [filename].(scroll|parser), those will now be parsed as imports
    +

    129.0.0 9/4/2024

    +
    • added quickImport parser for imports.
    +
    • BREAKING: (no one should be effected) if you had any lines that were just [filename].(scroll|parser), those will now be parsed as imports
    -

    128.0.1 9/4/2024

    -
    • better handling of circular dependencies with tables
    +

    128.0.1 9/4/2024

    +
    • better handling of circular dependencies with tables
    -

    128.0.0 9/4/2024

    -
    • added quickVideo parser for including videos.
    • -
    • added quickMusic parser for including sound files.
    • -
    • added quickTable parser for including csvs, tsvs, psvs, and ssvs.
    -
    • BREAKING: (no one should be effected) if you had any catch all lines starting with [filename].[one of the above extensions] will now be caught by one of these quick parsers
    +

    128.0.0 9/4/2024

    +
    • added quickVideo parser for including videos.
    • +
    • added quickMusic parser for including sound files.
    • +
    • added quickTable parser for including csvs, tsvs, psvs, and ssvs.
    +
    • BREAKING: (no one should be effected) if you had any catch all lines starting with [filename].[one of the above extensions] will now be caught by one of these quick parsers
    -

    Demos

    +

    Demos

    tests/sipOfCoffee.m4a loop @@ -499,51 +504,51 @@ -

    127.0.0 9/4/2024

    -
    • added quickImage parser. Add an image with just the filename. quickImageParser detects by filename.
    -
    • BREAKING: (no one should be effected) if you had any lines starting with [filename].(png|jpg|et cetera) will be parsed as image.
    +

    127.0.0 9/4/2024

    +
    • added quickImage parser. Add an image with just the filename. quickImageParser detects by filename.
    +
    • BREAKING: (no one should be effected) if you had any lines starting with [filename].(png|jpg|et cetera) will be parsed as image.
    particles.png
    -

    126.1.0 9/3/2024

    - +

    126.1.0 9/3/2024

    +
    -

    126.0.1 9/3/2024

    -
    • column stack fix
    +

    126.0.1 9/3/2024

    +
    • column stack fix
    -

    126.0.0 9/3/2024

    -
    • added scrollForm parser
    • -
    • added support for textarea to ScrollSet forms
    • -
    • added abstractTextareaMeasureParser
    • -
    • added mediumColumn, thinColumn, and wideColumn parsers.
    -
    • BREAKING: renamed form to classicForm
    +

    126.0.0 9/3/2024

    +
    • added scrollForm parser
    • +
    • added support for textarea to ScrollSet forms
    • +
    • added abstractTextareaMeasureParser
    • +
    • added mediumColumn, thinColumn, and wideColumn parsers.
    +
    • BREAKING: renamed form to classicForm
    -

    125.8.0 9/2/2024

    -
    • show * on required form fields
    +

    125.8.0 9/2/2024

    +
    • show * on required form fields
    -

    125.7.0 9/2/2024

    -
    • added form parser
    +

    125.7.0 9/2/2024

    +
    • added form parser
    -

    125.6.0 9/2/2024

    -
    • metaParser now emits link to git tags
    +

    125.6.0 9/2/2024

    +
    • metaParser now emits link to git tags
    -

    125.5.1 9/2/2024

    -
    • make printCsv work with buildCsv
    +

    125.5.1 9/2/2024

    +
    • make printCsv work with buildCsv
    -

    125.5.0 9/2/2024

    -
    • heatrix drops first row if after a transpose
    • -
    • heatrix now does not color years if first row
    +

    125.5.0 9/2/2024

    +
    • heatrix drops first row if after a transpose
    • +
    • heatrix now does not color years if first row
    -

    125.4.0 9/1/2024

    -
    • upgrade ScrollSDK
    +

    125.4.0 9/1/2024

    +
    • upgrade ScrollSDK
    -

    125.3.0 9/1/2024

    -
    • cleanup docs to switch to term Particle Syntax (aka Particles).
    +

    125.3.0 9/1/2024

    +
    • cleanup docs to switch to term Particle Syntax (aka Particles).
    -

    125.2.0 8/31/2024

    -
    • chat parser now supports repeated messages from 1 side via blank lines
    +

    125.2.0 8/31/2024

    +
    • chat parser now supports repeated messages from 1 side via blank lines
    -

    Example:

    +

    Example:

    chat I have some questions @@ -552,83 +557,83 @@ Hmm and for project management? pen and paper
    I have some questions
    What is your current productivity tool
    pen and paper
    Hmm and for project management?
    pen and paper
    -

    125.1.0 8/30/2024

    -
    • switch youTube parser to youtube (all lowercase). Deprecate old spelling.
    +

    125.1.0 8/30/2024

    +
    • switch youTube parser to youtube (all lowercase). Deprecate old spelling.
    -

    125.0.1 8/29/2024

    -
    • particles table fix
    +

    125.0.1 8/29/2024

    +
    • particles table fix
    -

    125.0.0 8/29/2024

    -
    • upgraded ScrollSDK to 84
    -
    • BREAKING: ScrollSDK updates require updating any Parsers with new "Particle" nomenclature
    • -
    • BREAKING: tree is no longer a table format. Use particles instead.
    +

    125.0.0 8/29/2024

    +
    • upgraded ScrollSDK to 84
    +
    • BREAKING: ScrollSDK updates require updating any Parsers with new "Particle" nomenclature
    • +
    • BREAKING: tree is no longer a table format. Use particles instead.
    -

    124.1.0 8/28/2024

    -
    • added buildPdf parser. Currently requires MacOS + Chrome.
    +

    124.1.0 8/28/2024

    +
    • added buildPdf parser. Currently requires MacOS + Chrome.
    -

    124.0.0 8/27/2024

    -
    • BREAKING: removed printMeasures
    • -
    • BREAKING: removed printConcepts
    • -
    • BREAKING: buildConcepts and buildMeasures now generates csv by default instead of tsv
    +

    124.0.0 8/27/2024

    +
    • BREAKING: removed printMeasures
    • +
    • BREAKING: removed printConcepts
    • +
    • BREAKING: buildConcepts and buildMeasures now generates csv by default instead of tsv
    -

    Before:

    +

    Before:

    contacts.scroll
    buildConcepts printConcepts
    -

    After:

    +

    After:

    contacts.scroll
    buildConcepts table printTable
    -

    123.3.0 8/27/2024

    -
    • ending a column with "Url" in tables will now print the column name linked rather than url
    -
    -

    123.2.0 8/26/2024

    -
    • added popularity table to leetsheet
    • -
    • added popularity numbers to parsers
    • -
    • added csv output to printUsageStats
    -
    -

    123.1.0 8/26/2024

    -
    • updated ScrollSDK
    • -
    • better Parsers leetsheet documentation
    -
    -

    123.0.0 8/25/2024

    -
    • updated ScrollSDK
    -
    • BREAKING: (no one should be affected). printLeetSheet is now printScrollLeetSheet
    • -
    • BREAKING: (no one should be affected). printAvancedLeetSheet is now printparsersLeetSheet
    -
    -

    122.0.0 8/25/2024

    -
    • updated ScrollSDK to get paintParser which replaces highlightScopeParser
    -
    • BREAKING: rename highlightScope to paint
    -
    -

    121.0.1 8/20/2024

    -
    • web version printTitle fix.
    -
    -

    121.0.0 8/19/2024

    -
    • emailButton, homeButton, downloadButton can now take a link
    -
    • BREAKING: wwsButton is now downloadButton
    • -
    • BREAKING: removed email. Now do emailButton [email]
    • -
    • BREAKING: removed downloadUrl. Now do downloadButton [url]
    -
    -

    120.2.1 8/19/2024

    -
    • fix indent bug in printRelated
    -
    -

    120.2.0 8/15/2024

    -
    • added br parser
    • -
    • added buildCsv parser
    -
    -

    120.1.0 8/15/2024

    -
    • add clickable examples to leetsheet
    -
    -

    120.0.0 8/14/2024

    -
    • added emailButton parser.
    • -
    • added scrollVersionLink parser.
    • -
    • added wwsButton parser.
    • -
    • center parser now also creates centered sections:
    -
    -

    -

    This should be centered.

    +

    123.3.0 8/27/2024

    +
    • ending a column with "Url" in tables will now print the column name linked rather than url
    +
    +

    123.2.0 8/26/2024

    +
    • added popularity table to leetsheet
    • +
    • added popularity numbers to parsers
    • +
    • added csv output to printUsageStats
    +
    +

    123.1.0 8/26/2024

    +
    • updated ScrollSDK
    • +
    • better Parsers leetsheet documentation
    +
    +

    123.0.0 8/25/2024

    +
    • updated ScrollSDK
    +
    • BREAKING: (no one should be affected). printLeetSheet is now printScrollLeetSheet
    • +
    • BREAKING: (no one should be affected). printAvancedLeetSheet is now printparsersLeetSheet
    +
    +

    122.0.0 8/25/2024

    +
    • updated ScrollSDK to get paintParser which replaces highlightScopeParser
    +
    • BREAKING: rename highlightScope to paint
    +
    +

    121.0.1 8/20/2024

    +
    • web version printTitle fix.
    +
    +

    121.0.0 8/19/2024

    +
    • emailButton, homeButton, downloadButton can now take a link
    +
    • BREAKING: wwsButton is now downloadButton
    • +
    • BREAKING: removed email. Now do emailButton [email]
    • +
    • BREAKING: removed downloadUrl. Now do downloadButton [url]
    +
    +

    120.2.1 8/19/2024

    +
    • fix indent bug in printRelated
    +
    +

    120.2.0 8/15/2024

    +
    • added br parser
    • +
    • added buildCsv parser
    +
    +

    120.1.0 8/15/2024

    +
    • add clickable examples to leetsheet
    +
    +

    120.0.0 8/14/2024

    +
    • added emailButton parser.
    • +
    • added scrollVersionLink parser.
    • +
    • added wwsButton parser.
    • +
    • center parser now also creates centered sections:
    +
    +

    +

    This should be centered.

    -
    • BREAKING: printViewSource is now viewSourceLink
    • -
    • BREAKING: pageFooter has been split into simpler parsers.
    +
    • BREAKING: printViewSource is now viewSourceLink
    • +
    • BREAKING: pageFooter has been split into simpler parsers.
    Find/Replace
    find ^pageFooter replace center @@ -636,122 +641,122 @@ downloadButton viewSourceButton scrollVersionLink
    -

    119.0.0 8/13/2024

    -
    • added homeButton parser.
    • -
    • added leftRightButtons parser.
    • -
    • added viewSourceButton parser.
    -
    • BREAKING: removed pageHeader. Split that into 3 simpler parsers. Change pageHeader to:
    +

    119.0.0 8/13/2024

    +
    • added homeButton parser.
    • +
    • added leftRightButtons parser.
    • +
    • added viewSourceButton parser.
    +
    • BREAKING: removed pageHeader. Split that into 3 simpler parsers. Change pageHeader to:
    Find/Replace
    find ^pageHeader replace homeButton leftRightButtons viewSourceButton
    -
    • BREAKING: printViewSourceBadge is now viewSourceButton
    • -
    • BREAKING: removed homeUrl. Insead do:
    +
    • BREAKING: printViewSourceBadge is now viewSourceButton
    • +
    • BREAKING: removed homeUrl. Insead do:
    homeButton link ../someOtherURL.html
    -

    118.9.0 8/11/2024

    -
    • added video parser.
    +

    118.9.0 8/11/2024

    +
    • added video parser.
    video tests/spirit.mp4 loop
    -

    118.8.0 8/11/2024

    -
    • added music parser for playing songs, podcasts, sounds, et cetera.
    +

    118.8.0 8/11/2024

    +
    • added music parser for playing songs, podcasts, sounds, et cetera.
    music tests/sipOfCoffee.m4a loop
    -

    118.7.0 8/11/2024

    -
    • added v0.1.0 of nickelbackIpsum parser. Idea from gigamick.
    +

    118.7.0 8/11/2024

    +
    • added v0.1.0 of nickelbackIpsum parser. Idea from gigamick.
    -

    118.6.3 8/10/2024

    -
    • label should show up in scatterplot autocomplete
    +

    118.6.3 8/10/2024

    +
    • label should show up in scatterplot autocomplete
    -

    118.6.2 8/9/2024

    -
    • don't trigger keyboard shortcuts if someone is trying to use keyboard back button shortcut. Thanks to Ben Atkin for the bug report!
    +

    118.6.2 8/9/2024

    +
    • don't trigger keyboard shortcuts if someone is trying to use keyboard back button shortcut. Thanks to Ben Atkin for the bug report!
    -

    118.6.1 8/9/2024

    -
    • button link color fix
    +

    118.6.1 8/9/2024

    +
    • button link color fix
    -

    118.6.0 8/9/2024

    -
    • added button parser
    • -
    • added dinkus parser
    +

    118.6.0 8/9/2024

    +
    • added button parser
    • +
    • added dinkus parser
    -

    118.5.0 8/8/2024

    -
    • make image parser easier to extend
    +

    118.5.0 8/8/2024

    +
    • make image parser easier to extend
    -

    118.4.0 8/6/2024

    -
    • add impute parser
    +

    118.4.0 8/6/2024

    +
    • add impute parser
    -

    118.3.0 8/6/2024

    -
    • fetch now writes to localStorage in browser environment.
    • -
    • table now can read from localStorage in browser environment.
    -
    • handle empty values in groupBy parser
    +

    118.3.0 8/6/2024

    +
    • fetch now writes to localStorage in browser environment.
    • +
    • table now can read from localStorage in browser environment.
    +
    • handle empty values in groupBy parser
    -

    118.2.2 8/6/2024

    -
    • fix mac file name lower case issue
    +

    118.2.2 8/6/2024

    +
    • fix mac file name lower case issue
    -

    118.2.1 8/6/2024

    -
    • fix mac file name lower case issue
    +

    118.2.1 8/6/2024

    +
    • fix mac file name lower case issue
    -

    118.2.0 8/6/2024

    -
    • more concise tableSearch styling
    +

    118.2.0 8/6/2024

    +
    • more concise tableSearch styling
    -

    118.1.0 8/6/2024

    -
    • tableSearch now adds copy and CSV buttons.
    +

    118.1.0 8/6/2024

    +
    • tableSearch now adds copy and CSV buttons.
    -

    118.0.0 8/6/2024

    -
    • tables: added delimiter autodetection
    • -
    • tables: added columnName autocomplete
    • -
    • tables: added transpose parser
    • -
    • scatterplot: added x, y, and other autocompletes
    -
    • BREAKING: sparkline [columnName] is now sparkline\n y [columnName]
    +

    118.0.0 8/6/2024

    +
    • tables: added delimiter autodetection
    • +
    • tables: added columnName autocomplete
    • +
    • tables: added transpose parser
    • +
    • scatterplot: added x, y, and other autocompletes
    +
    • BREAKING: sparkline [columnName] is now sparkline\n y [columnName]
    -

    117.1.0 8/5/2024

    -
    • tables: added groupBy parser for "pivot tables"
    +

    117.1.0 8/5/2024

    +
    • tables: added groupBy parser for "pivot tables"
    -

    117.0.1 8/5/2024

    -
    • fix highlight bug in where parser
    +

    117.0.1 8/5/2024

    +
    • fix highlight bug in where parser
    -

    117.0.0 8/5/2024

    -
    • tables: added select parser
    • -
    • tables: added orderBy parser
    • -
    • tables: added rename parser
    • -
    • tables: added reverse parser
    • -
    • added fetch parser
    -
    • BREAKING: (no one should be affected) Scroll now requires NodeJS >= 18.0.0.
    +

    117.0.0 8/5/2024

    +
    • tables: added select parser
    • +
    • tables: added orderBy parser
    • +
    • tables: added rename parser
    • +
    • tables: added reverse parser
    • +
    • added fetch parser
    +
    • BREAKING: (no one should be affected) Scroll now requires NodeJS >= 18.0.0.
    -

    116.0.0 8/3/2024

    -
    • BREAKING: scatterplot now gets data from table.
    +

    116.0.0 8/3/2024

    +
    • BREAKING: scatterplot now gets data from table.
    -

    115.2.0 8/3/2024

    -
    • fix extra space in related snippets
    +

    115.2.0 8/3/2024

    +
    • fix extra space in related snippets
    -

    115.1.0 8/3/2024

    -
    • more regression fixes.
    +

    115.1.0 8/3/2024

    +
    • more regression fixes.
    -

    115.0.2 8/3/2024

    -
    • more regression fixes.
    +

    115.0.2 8/3/2024

    +
    • more regression fixes.
    -

    115.0.1 8/3/2024

    -
    • fix table regression.
    +

    115.0.1 8/3/2024

    +
    • fix table regression.
    -

    115.0.0 8/3/2024

    -
    • table [filename].[json|tsv|csv] to load and print a table from disk
    • -
    • sparkline now can take a table as input:
    +

    115.0.0 8/3/2024

    +
    • table [filename].[json|tsv|csv] to load and print a table from disk
    • +
    • sparkline now can take a table as input:
    table posts.csv sparkline y wordCount -
    • BREAKING: removed support for root level TSV. Not useful enough. Convert any root TSV to a standard table.
    • -
    • BREAKING: removed printTable at root level. Now works nested under table
    • -
    • BREAKING: removed spaceTable. See below to migrate.
    • -
    • BREAKING: removed tabTable. See below to migrate.
    • -
    • BREAKING: removed treeTable. See below to migrate.
    • -
    • BREAKING: removed commaTable. See below to migrate.
    • -
    • BREAKING: removed pipeTable. See below to migrate.
    • -
    • BREAKING: table now takes delimiter and data parsers. Usage:
    +
    • BREAKING: removed support for root level TSV. Not useful enough. Convert any root TSV to a standard table.
    • +
    • BREAKING: removed printTable at root level. Now works nested under table
    • +
    • BREAKING: removed spaceTable. See below to migrate.
    • +
    • BREAKING: removed tabTable. See below to migrate.
    • +
    • BREAKING: removed treeTable. See below to migrate.
    • +
    • BREAKING: removed commaTable. See below to migrate.
    • +
    • BREAKING: removed pipeTable. See below to migrate.
    • +
    • BREAKING: table now takes delimiter and data parsers. Usage:
    @@ -761,83 +766,83 @@
    name35
    -

    Regex to find all breaks: ^(printTable|spaceTable|tabTable|treeTable|commaTable|pipeTable|table )

    +

    Regex to find all breaks: ^(printTable|spaceTable|tabTable|treeTable|commaTable|pipeTable|table )

    -

    114.0.0 8/2/2024

    -
    • inlineMarkups now supports setting attributes and tags
    -
    • upgrade scrollsdk to get exponential notation numbers fix
    -
    • BREAKING: (no one should be affected). Removed short form of link inline markup. Just use a href="url" instead.
    +

    114.0.0 8/2/2024

    +
    • inlineMarkups now supports setting attributes and tags
    +
    • upgrade scrollsdk to get exponential notation numbers fix
    +
    • BREAKING: (no one should be affected). Removed short form of link inline markup. Just use a href="url" instead.
    -

    113.0.0 8/1/2024

    -
    • added inlineMarkups parser. Thanks to eugenesvk for the idea.
    • -
    • printSourceStack now prints [Unchanged] if the source was not changed during a compiler step.
    -
    • BREAKING: wrapsOn is now inlineMarkupsOn
    • -
    • BREAKING: wrap is now inlineMarkup
    +

    113.0.0 8/1/2024

    +
    • added inlineMarkups parser. Thanks to eugenesvk for the idea.
    • +
    • printSourceStack now prints [Unchanged] if the source was not changed during a compiler step.
    +
    • BREAKING: wrapsOn is now inlineMarkupsOn
    • +
    • BREAKING: wrap is now inlineMarkup
    -

    112.1.2 7/31/2024

    -
    • counters fix
    +

    112.1.2 7/31/2024

    +
    • counters fix
    -

    112.1.1 7/31/2024

    -
    • counters fix
    +

    112.1.1 7/31/2024

    +
    • counters fix
    -

    112.1.0 7/31/2024

    -
    • added counters parser.
    +

    112.1.0 7/31/2024

    +
    • added counters parser.
    -

    112.0.0 7/31/2024

    -
    • added printSourceStack parser to provide a clean way to view source code at each step in compilation.
    -
    • BREAKING: removed readingList parser. Aftertext is a better choice.
    • -
    • BREAKING: merged printExpandedSource and printOriginalSource into printSourceStack
    +

    112.0.0 7/31/2024

    +
    • added printSourceStack parser to provide a clean way to view source code at each step in compilation.
    +
    • BREAKING: removed readingList parser. Aftertext is a better choice.
    • +
    • BREAKING: merged printExpandedSource and printOriginalSource into printSourceStack
    -

    111.5.0 7/29/2024

    -
    • added buildFiles to CLI class
    +

    111.5.0 7/29/2024

    +
    • added buildFiles to CLI class
    -

    111.4.0 7/29/2024

    -
    • added printExpandedSource and printOriginalSource parsers
    +

    111.4.0 7/29/2024

    +
    • added printExpandedSource and printOriginalSource parsers
    -

    111.3.0 7/29/2024

    -
    • better error messages
    +

    111.3.0 7/29/2024

    +
    • better error messages
    -

    111.2.0 7/29/2024

    -
    • added testStrict parser to allow disabling catch all paragraph on a per file basis.
    +

    111.2.0 7/29/2024

    +
    • added testStrict parser to allow disabling catch all paragraph on a per file basis.
    -

    111.1.0 7/26/2024

    -
    • heatrix now supports using custom labels even for numeric atoms.
    -
    • always include a 0 value in heatrix
    +

    111.1.0 7/26/2024

    +
    • heatrix now supports using custom labels even for numeric atoms.
    +
    • always include a 0 value in heatrix
    -

    111.0.0 7/26/2024

    -
    • redesigned heatrix.
    -
    • BREAKING: (no one should be affected). heatrix is now heatrixAdvanced. heatrix is the simplest fast version now.
    +

    111.0.0 7/26/2024

    +
    • redesigned heatrix.
    +
    • BREAKING: (no one should be affected). heatrix is now heatrixAdvanced. heatrix is the simplest fast version now.
    -

    110.3.0 7/25/2024

    -
    • print 0's in heatrix
    -
    • remove stray console.log
    +

    110.3.0 7/25/2024

    +
    • print 0's in heatrix
    +
    • remove stray console.log
    -

    110.2.0 7/25/2024

    -
    • printCsv now includes year column
    • -
    • added heatrix parser
    +

    110.2.0 7/25/2024

    +
    • printCsv now includes year column
    • +
    • added heatrix parser
    -

    110.1.0 7/25/2024

    -
    • captions now have the same width as their images
    +

    110.1.0 7/25/2024

    +
    • captions now have the same width as their images
    -

    110.0.0 7/24/2024

    -
    • printRelated now has support for tags! No need to add a related line on each post.
    -
    • BREAKING: groups is now tags.
    • -
    • BREAKING: printRelatedList is now just printRelated.
    • -
    • BREAKING: removed related parser. Now just use tags. Apply tags liberally.
    +

    110.0.0 7/24/2024

    +
    • printRelated now has support for tags! No need to add a related line on each post.
    +
    • BREAKING: groups is now tags.
    • +
    • BREAKING: printRelatedList is now just printRelated.
    • +
    • BREAKING: removed related parser. Now just use tags. Apply tags liberally.
    -

    109.5.0 7/21/2024

    -
    • added codeWithHeader parser
    • -
    • added center aftertext markup parser
    • -
    • txt versions of aftertext links now includes the pattern
    • -
    • added printFormatLinks parser
    +

    109.5.0 7/21/2024

    +
    • added codeWithHeader parser
    • +
    • added center aftertext markup parser
    • +
    • txt versions of aftertext links now includes the pattern
    • +
    • added printFormatLinks parser
    -

    109.4.0 7/21/2024

    -
    • printAdvancedLeetSheet now also prints atom parser docs
    +

    109.4.0 7/21/2024

    +
    • printAdvancedLeetSheet now also prints atom parser docs
    -

    109.3.0 7/20/2024

    -
    • easily apply styling to a whole paragraph using aftertext.
    +

    109.3.0 7/20/2024

    +
    • easily apply styling to a whole paragraph using aftertext.
    -

    Demo:

    +

    Demo:

    Hello world bold This is italicized @@ -846,583 +851,583 @@ code Strikethrough this whole line. strike -

    Hello world

    -

    This is italicized

    -

    Make this code

    -

    Strikethrough this whole line.

    -

    109.2.0 7/19/2024

    - -
    -

    109.1.0 7/19/2024

    -
    • added support for height and width to images
    • -
    • added support for float to images
    -
    -

    109.0.2 7/19/2024

    -
    • fixed incorrect error report.
    -
    -

    109.0.1 7/19/2024

    -
    • fix atom syntax highlighting in wrapsOn. You can write wrapsOn none to disable all wraps.
    -
    -

    109.0.0 7/18/2024

    -
    • printCsv now exports authors as well
    • -
    • added authors parser to support multiple authors
    • -
    • authors now can use all aftertext features
    -
    • BREAKING: printAuthor is now printAuthors
    • -
    • BREAKING: author is now authors.
    -
    -

    To update from author to authors, you can use this regex find/replace:

    -

    Find: ^author ([^ ]+) (.*)

    -

    Replace: authors 2\n 1 $2

    -

    108.3.1 7/16/2024

    -
    • include microlangs in npm package
    -
    -

    108.3.0 7/16/2024

    -
    • added contacts microlang.
    • -
    • changed gazetteCss link color to be subtler
    • -
    • added microlangs folder
    -
    -

    108.2.0 7/15/2024

    -
    • added center parser! first blink, now center!
    -
    -

    108.1.0 7/15/2024

    -
    • table style improvements
    -
    -

    108.0.0 7/15/2024

    -
    • BREAKING: (no one should be affected) Renamed printCheatSheet to printLeetSheet
    -
    -

    107.3.0 7/14/2024

    -
    • added printUsageStats parser.
    • -
    • docs: bolded commonly used parsers in cheat sheet.
    • -
    • docs: other cheat sheet improvements.
    • -
    • docs: printCheatSheet now prints good txt only docs too.
    -
    -

    107.2.0 7/14/2024

    -
    • docs: clearer, more conscise descriptions of 7 atoms or less on every parser.
    • -
    • docs: printCheatSheet now prints descriptions.
    -
    -

    107.1.0 7/14/2024

    -
    • add printCheatSheet parser v0.1.0
    -
    -

    107.0.0 7/14/2024

    -
    • correct syntax highlighting for the different kinds of Parsers.
    • -
    • removed some parsers from appearing in autocomplete
    -
    • blink works for any colors now.
    -
    • BREAKING: If you have written your own parsers keywordAtom has been replaced by cueAtom. You can do a simple find/replace or just add:
    +

    Hello world

    +

    This is italicized

    +

    Make this code

    +

    Strikethrough this whole line.

    +

    109.2.0 7/19/2024

    + +
    +

    109.1.0 7/19/2024

    +
    • added support for height and width to images
    • +
    • added support for float to images
    +
    +

    109.0.2 7/19/2024

    +
    • fixed incorrect error report.
    +
    +

    109.0.1 7/19/2024

    +
    • fix atom syntax highlighting in wrapsOn. You can write wrapsOn none to disable all wraps.
    +
    +

    109.0.0 7/18/2024

    +
    • printCsv now exports authors as well
    • +
    • added authors parser to support multiple authors
    • +
    • authors now can use all aftertext features
    +
    • BREAKING: printAuthor is now printAuthors
    • +
    • BREAKING: author is now authors.
    +
    +

    To update from author to authors, you can use this regex find/replace:

    +

    Find: ^author ([^ ]+) (.*)

    +

    Replace: authors 2\n 1 $2

    +

    108.3.1 7/16/2024

    +
    • include microlangs in npm package
    +
    +

    108.3.0 7/16/2024

    +
    • added contacts microlang.
    • +
    • changed gazetteCss link color to be subtler
    • +
    • added microlangs folder
    +
    +

    108.2.0 7/15/2024

    +
    • added center parser! first blink, now center!
    +
    +

    108.1.0 7/15/2024

    +
    • table style improvements
    +
    +

    108.0.0 7/15/2024

    +
    • BREAKING: (no one should be affected) Renamed printCheatSheet to printLeetSheet
    +
    +

    107.3.0 7/14/2024

    +
    • added printUsageStats parser.
    • +
    • docs: bolded commonly used parsers in cheat sheet.
    • +
    • docs: other cheat sheet improvements.
    • +
    • docs: printCheatSheet now prints good txt only docs too.
    +
    +

    107.2.0 7/14/2024

    +
    • docs: clearer, more conscise descriptions of 7 atoms or less on every parser.
    • +
    • docs: printCheatSheet now prints descriptions.
    +
    +

    107.1.0 7/14/2024

    +
    • add printCheatSheet parser v0.1.0
    +
    +

    107.0.0 7/14/2024

    +
    • correct syntax highlighting for the different kinds of Parsers.
    • +
    • removed some parsers from appearing in autocomplete
    +
    • blink works for any colors now.
    +
    • BREAKING: If you have written your own parsers keywordAtom has been replaced by cueAtom. You can do a simple find/replace or just add:
    keywordAtom extends cueAtom
    -

    106.0.1 7/13/2024

    -
    • fix bug where running scroll build through passed in SSH command was hanging
    +

    106.0.1 7/13/2024

    +
    • fix bug where running scroll build through passed in SSH command was hanging
    -

    106.0.0 7/11/2024

    -
    • added missing documentation for better autocomplete
    -
    • BREAKING: removed deprecated parsers: startColumns, gazetteHeader, gazetteFooter, byLine
    +

    106.0.0 7/11/2024

    +
    • added missing documentation for better autocomplete
    +
    • BREAKING: removed deprecated parsers: startColumns, gazetteHeader, gazetteFooter, byLine
    -

    105.1.0 7/11/2024

    -
    • added printViewSourceBadge parser
    +

    105.1.0 7/11/2024

    +
    • added printViewSourceBadge parser
    -

    105.0.0 7/11/2024

    -
    • BREAKING: removed the git parser. No longer needed now that we use deep link to all source pages.
    • -
    • BREAKING: renamed viewSource to printViewSource to clarify that it prints an HTML element.
    +

    105.0.0 7/11/2024

    +
    • BREAKING: removed the git parser. No longer needed now that we use deep link to all source pages.
    • +
    • BREAKING: renamed viewSource to printViewSource to clarify that it prints an HTML element.
    -

    104.0.0 7/11/2024

    -
    • BREAKING: the git icons now point to the viewSource url, not to a master git repo page. This should make it easier to go to the specific source file of interest.
    +

    104.0.0 7/11/2024

    +
    • BREAKING: the git icons now point to the viewSource url, not to a master git repo page. This should make it easier to go to the specific source file of interest.
    -

    103.0.2 7/11/2024

    -
    • pageHeader and pageFooter parsers will now only emit icons for git, downloadUrl, and email if those items are set
    +

    103.0.2 7/11/2024

    +
    • pageHeader and pageFooter parsers will now only emit icons for git, downloadUrl, and email if those items are set
    -

    103.0.1 7/11/2024

    -
    • code div fix in slideshows
    +

    103.0.1 7/11/2024

    +
    • code div fix in slideshows
    -

    103.0.0 7/10/2024

    -
    • BREAKING: shortened strikethrough parser to strike
    +

    103.0.0 7/10/2024

    +
    • BREAKING: shortened strikethrough parser to strike
    -

    102.3.0 7/08/2024

    -
    • add support for TSVs to scatterplot
    +

    102.3.0 7/08/2024

    +
    • add support for TSVs to scatterplot
    -

    102.2.2 7/08/2024

    -
    • measureStats fix
    +

    102.2.2 7/08/2024

    +
    • measureStats fix
    -

    102.2.1 7/08/2024

    -
    • loadConcepts fix
    +

    102.2.1 7/08/2024

    +
    • loadConcepts fix
    -

    102.2.0 7/08/2024

    -
    • build scrollsets first and so the outputs can be used to build html files
    +

    102.2.0 7/08/2024

    +
    • build scrollsets first and so the outputs can be used to build html files
    -

    102.1.0 7/07/2024

    - +

    102.1.0 7/07/2024

    +
    -

    102.0.0 7/06/2024

    -
    • changed relatedParser to relatedScrollFilesParser to free up relatedParser for userland.
    -
    • BREAKING: renamed relatedList to printRelatedList
    +

    102.0.0 7/06/2024

    +
    • changed relatedParser to relatedScrollFilesParser to free up relatedParser for userland.
    +
    • BREAKING: renamed relatedList to printRelatedList
    -

    101.6.0 7/06/2024

    -
    • added sortBy to printConcepts parser
    +

    101.6.0 7/06/2024

    +
    • added sortBy to printConcepts parser
    -

    101.5.0 7/05/2024

    -
    • scroll init generates a smaller site
    +

    101.5.0 7/05/2024

    +
    • scroll init generates a smaller site
    -

    101.4.0 7/04/2024

    -
    • renamed descriptionParser to openGraphParser and titleParser to pageTitleParser to free up those names for userparserland.
    +

    101.4.0 7/04/2024

    +
    • renamed descriptionParser to openGraphParser and titleParser to pageTitleParser to free up those names for userparserland.
    -

    101.3.0 7/03/2024

    -
    • added buildJs and script parsers
    +

    101.3.0 7/03/2024

    +
    • added buildJs and script parsers
    -

    101.2.0 7/03/2024

    -
    • added buildCss parser
    -
    • fix css text regression
    +

    101.2.0 7/03/2024

    +
    • added buildCss parser
    +
    • fix css text regression
    -

    101.0.1 7/03/2024

    -
    • fix sitemap regression
    +

    101.0.1 7/03/2024

    +
    • fix sitemap regression
    -

    101.0.0 7/03/2024

    -

    This is a major breaking release meant to simplify and standardize a lot of the core Scroll concepts.

    -
    • added buildHtml parser
    • -
    • added buildRss parser
    • -
    • you no longer need to write importOnly on a file if the file uses no buildCommandParsers.
    -
    • BREAKING: snippets => printSnippets
    • -
    • BREAKING: fullSnippets => printFullSnippets
    • -
    • BREAKING: buildText => buildTxt
    • -
    • BREAKING: scroll 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.
    • -
    • BREAKING: removed tags parser in css themes. Instead of this:
    +

    101.0.0 7/03/2024

    +

    This is a major breaking release meant to simplify and standardize a lot of the core Scroll concepts.

    +
    • added buildHtml parser
    • +
    • added buildRss parser
    • +
    • you no longer need to write importOnly on a file if the file uses no buildCommandParsers.
    +
    • BREAKING: snippets => printSnippets
    • +
    • BREAKING: fullSnippets => printFullSnippets
    • +
    • BREAKING: buildText => buildTxt
    • +
    • BREAKING: scroll 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.
    • +
    • BREAKING: removed tags parser in css themes. Instead of this:
    permalink style.css gazetteCss tags false -

    Do this:

    +

    Do this:

    buildCss style.css gazetteCss -

    100.0.0 7/02/2024

    -
    • if not present, date is now derived from file creation time
    • -
    • if not present, title is now computed by un-camelcasing the filename
    -
    • BREAKING: (no one should be affected) date and title are now computed automatically so if you had a file missing those previously on purpose (for some reason), they will now actually have those.
    +

    100.0.0 7/02/2024

    +
    • if not present, date is now derived from file creation time
    • +
    • if not present, title is now computed by un-camelcasing the filename
    +
    • BREAKING: (no one should be affected) date and title are now computed automatically so if you had a file missing those previously on purpose (for some reason), they will now actually have those.
    -

    99.2.0 7/01/2024

    -
    • added changes.parsers
    • -
    • Scrollsets now supports defining concept delimiters other than id
    +

    99.2.0 7/01/2024

    +
    • added changes.parsers
    • +
    • Scrollsets now supports defining concept delimiters other than id
    -

    99.1.0 7/01/2024

    -
    • added limit parser to snippets
    +

    99.1.0 7/01/2024

    +
    • added limit parser to snippets
    -

    99.0.0 6/30/2024

    -
    • BREAKING: I moved wws to its own repo
    +

    99.0.0 6/30/2024

    +
    • BREAKING: I moved wws to its own repo
    -

    98.0.2 6/30/2024

    -
    • another missing file in package fix
    +

    98.0.2 6/30/2024

    +
    • another missing file in package fix
    -

    98.0.1 6/29/2024

    - +

    98.0.1 6/29/2024

    +
    -

    98.0.0 6/26/2024

    -
    • BREAKING: writeText is now buildText
    • -
    • BREAKING: writeConcepts is now buildConcepts
    • -
    • BREAKING: writeMeasures is now buildMeasures
    • -
    • BREAKING: (no one should be affected), buildFilesInFolder now returns an object of all built files.
    +

    98.0.0 6/26/2024

    +
    • BREAKING: writeText is now buildText
    • +
    • BREAKING: writeConcepts is now buildConcepts
    • +
    • BREAKING: writeMeasures is now buildMeasures
    • +
    • BREAKING: (no one should be affected), buildFilesInFolder now returns an object of all built files.
    -

    97.4.0 6/25/2024

    -
    • added scatterplot can now take a url as a data source
    +

    97.4.0 6/25/2024

    +
    • added scatterplot can now take a url as a data source
    -

    97.3.1 6/24/2024

    -
    • bug fix
    +

    97.3.1 6/24/2024

    +
    • bug fix
    -

    97.3.0 6/24/2024

    -
    • added scatterplot parser
    +

    97.3.0 6/24/2024

    +
    • added scatterplot parser
    -

    97.2.0 6/23/2024

    -
    • added stamp mini language
    +

    97.2.0 6/23/2024

    +
    • added stamp mini language
    -

    97.1.1 6/21/2024

    -
    • test fix
    +

    97.1.1 6/21/2024

    +
    • test fix
    -

    97.1.0 6/21/2024

    - +

    97.1.0 6/21/2024

    +
    sparkline 5 7 27 87 300 17 10 5 -

    97.0.0 6/19/2024

    -
    • BREAKING: upgraded scrollSDK to get grammar to parsers change.
    +

    97.0.0 6/19/2024

    +
    • BREAKING: upgraded scrollSDK to get grammar to parsers change.
    -

    96.0.0 6/18/2024

    -
    • Instead of grammar it's just parsers.
    -
    • BREAKING: (no one should be affected) files previously ending in .grammar now end in .parsers.
    +

    96.0.0 6/18/2024

    +
    • Instead of grammar it's just parsers.
    +
    • BREAKING: (no one should be affected) files previously ending in .grammar now end in .parsers.
    -

    95.2.0 6/16/2024

    -
    • added formatAndSave method.
    +

    95.2.0 6/16/2024

    +
    • added formatAndSave method.
    -

    95.1.0 6/14/2024

    -
    • added wws command line app.
    +

    95.1.0 6/14/2024

    +
    • added wws command line app.
    -

    95.0.0 6/11/2024

    -
    • added downloadUrl parser.
    -
    • BREAKING: canonicalLink is now canonicalUrl.
    • -
    • BREAKING: homeLink is now homeUrl.
    +

    95.0.0 6/11/2024

    +
    • added downloadUrl parser.
    +
    • BREAKING: canonicalLink is now canonicalUrl.
    • +
    • BREAKING: homeLink is now homeUrl.
    -

    94.0.1 6/1/2024

    -
    • make slideshow start after the first dinkus
    +

    94.0.1 6/1/2024

    +
    • make slideshow start after the first dinkus
    -

    94.0.0 5/31/2024

    -
    • jtree is now the "ScrollSDK" and "Tree Notation" is now "Particles"
    -
    • BREAKING: (only advanced users affected), if you wrote custom Parsers, you may need to find/replace jtree with scrollsdk
    +

    94.0.0 5/31/2024

    +
    • jtree is now the "ScrollSDK" and "Tree Notation" is now "Particles"
    +
    • BREAKING: (only advanced users affected), if you wrote custom Parsers, you may need to find/replace jtree with scrollsdk
    -

    93.7.1 5/30/2024

    -
    • katex should print contents in txt compilation
    +

    93.7.1 5/30/2024

    +
    • katex should print contents in txt compilation
    -

    93.7.0 5/29/2024

    -
    • added classes parser
    +

    93.7.0 5/29/2024

    +
    • added classes parser
    -

    93.6.2 5/28/2024

    -
    • more Windows fixes
    +

    93.6.2 5/28/2024

    +
    • more Windows fixes
    -

    93.6.1 5/28/2024

    -
    • upgrade JTree to try and get Scroll working on Windows
    +

    93.6.1 5/28/2024

    +
    • upgrade JTree to try and get Scroll working on Windows
    -

    93.6.0 5/28/2024

    -
    • clean up generated html (add a tag).
    +

    93.6.0 5/28/2024

    +
    • clean up generated html (add a tag).
    -

    93.5.0 5/27/2024

    -
    • clean up generated html (add a tag, for instance).
    +

    93.5.0 5/27/2024

    +
    • clean up generated html (add a tag, for instance).
    -

    93.4.0 5/27/2024

    -
    • improved meta tags
    +

    93.4.0 5/27/2024

    +
    • improved meta tags
    -

    93.3.0 5/27/2024

    -
    • all Parsers can now use requireOnce
    • -
    • added abstractCustomListItemParser for making HTML lists with custom markers
    -
    • bug fix in slideshow
    +

    93.3.0 5/27/2024

    +
    • all Parsers can now use requireOnce
    • +
    • added abstractCustomListItemParser for making HTML lists with custom markers
    +
    • bug fix in slideshow
    -

    93.2.0 5/23/2024

    -
    • writeConcepts and writeMeasures now strips blank values when generating JSON and/or JS
    +

    93.2.0 5/23/2024

    +
    • writeConcepts and writeMeasures now strips blank values when generating JSON and/or JS
    -

    93.1.0 5/23/2024

    -
    • tableSearch now will save the sort order to the url
    -
    • fixed bug where updates to externals would not get copied
    +

    93.1.0 5/23/2024

    +
    • tableSearch now will save the sort order to the url
    +
    • fixed bug where updates to externals would not get copied
    -

    93.0.0 5/21/2024

    -
    • scroll 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.
    -
    • BREAKING: (no one should be affected) the default sortIndex is now 1.9, and the sort index of id is 1.0. Update sortIndex accordingly.
    +

    93.0.0 5/21/2024

    +
    • scroll 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.
    +
    • BREAKING: (no one should be affected) the default sortIndex is now 1.9, and the sort index of id is 1.0. Update sortIndex accordingly.
    -

    92.0.0 5/20/2024

    -
    • simplified ScrollSets by removing the filename "magic". When putting a concept into a file, make the 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.
    -
    • BREAKING: (no one should be affected) remove any spaghetti filename code.
    +

    92.0.0 5/20/2024

    +
    • simplified ScrollSets by removing the filename "magic". When putting a concept into a file, make the 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.
    +
    • BREAKING: (no one should be affected) remove any spaghetti filename code.
    -

    91.0.0 5/19/2024

    -
    • printAuthor parser prints the author defined by author. byLine has been deprecated--replace with printAuthor.
    -
    • BREAKING: author parser now takes a URL.
    +

    91.0.0 5/19/2024

    +
    • printAuthor parser prints the author defined by author. byLine has been deprecated--replace with printAuthor.
    +
    • BREAKING: author parser now takes a URL.
    -

    90.5.0 5/19/2024

    -
    • added printDate parser
    +

    90.5.0 5/19/2024

    +
    • added printDate parser
    -

    90.4.1 5/19/2024

    -
    • helpfulNotFound now assumes the script can be found at the root of the domain.
    +

    90.4.1 5/19/2024

    +
    • helpfulNotFound now assumes the script can be found at the root of the domain.
    -

    90.4.0 5/19/2024

    -
    • helpful 404 can now take multiple sitemaps as a parameter
    +

    90.4.0 5/19/2024

    +
    • helpful 404 can now take multiple sitemaps as a parameter
    -

    90.3.0 5/18/2024

    -
    • renamed Scroll Datasets to ScrollSets.
    +

    90.3.0 5/18/2024

    +
    • renamed Scroll Datasets to ScrollSets.
    -

    90.2.3 5/18/2024

    -
    • Coverage in Measurements should round down.
    +

    90.2.3 5/18/2024

    +
    • Coverage in Measurements should round down.
    -

    90.2.2 5/18/2024

    -
    • fixed Grammar method name conflict with measures. Now they should be isMeasureRequired.
    +

    90.2.2 5/18/2024

    +
    • fixed Grammar method name conflict with measures. Now they should be isMeasureRequired.
    -

    90.2.1 5/18/2024

    -
    • fixed metaTags from breaking try.scroll.pub
    • -
    • got slideshow working on try.scroll.pub
    +

    90.2.1 5/18/2024

    +
    • fixed metaTags from breaking try.scroll.pub
    • +
    • got slideshow working on try.scroll.pub
    -

    90.2.0 5/18/2024

    -
    • added slideshow parser
    • -
    • grammar extensions can now use "copyFromExternal"
    +

    90.2.0 5/18/2024

    +
    • added slideshow parser
    • +
    • grammar extensions can now use "copyFromExternal"
    -

    90.1.1 5/17/2024

    -
    • added test and fixed bug with printTitle in text files
    +

    90.1.1 5/17/2024

    +
    • added test and fixed bug with printTitle in text files
    -

    90.1.0 5/17/2024

    -
    • 2.5x faster test running thanks to adding cacheing to measure parser
    +

    90.1.0 5/17/2024

    +
    • 2.5x faster test running thanks to adding cacheing to measure parser
    -

    90.0.0 5/16/2024

    -
    • BREAKING: idParser 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:
    +

    90.0.0 5/16/2024

    +
    • BREAKING: idParser 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 -

    89.2.1 5/16/2024

    -
    • fixed required measurements when computeds are involved
    -
    • print folder name when running scroll test
    +

    89.2.1 5/16/2024

    +
    • fixed required measurements when computeds are involved
    +
    • print folder name when running scroll test
    -

    89.2.0 5/16/2024

    -
    • added support for required measurements
    +

    89.2.0 5/16/2024

    +
    • added support for required measurements
    -

    89.1.2 5/16/2024

    -
    • loadConcepts should only load Scroll files containing a concept (as determined by having an "id ").
    +

    89.1.2 5/16/2024

    +
    • loadConcepts should only load Scroll files containing a concept (as determined by having an "id ").
    -

    89.1.1 5/16/2024

    -
    • minor fix in themes grammar.
    +

    89.1.1 5/16/2024

    +
    • minor fix in themes grammar.
    -

    89.1.0 5/15/2024

    -
    • added ability to override content in printTitle
    +

    89.1.0 5/15/2024

    +
    • added ability to override content in printTitle
    -

    89.0.0 5/15/2024

    -
    • printTitle parser added for easier templates
    -
    • BREAKING: title is now a setter. This regex handles the migration:
      • ^title printTitle\ntitle
        • Then (optionally) run "scroll format" or "scroll list | scroll format" to format which will automove your titles up top.
    +

    89.0.0 5/15/2024

    +
    • printTitle parser added for easier templates
    +
    • BREAKING: title is now a setter. This regex handles the migration:
      • ^title printTitle\ntitle
        • Then (optionally) run "scroll format" or "scroll list | scroll format" to format which will automove your titles up top.
    -

    88.0.0 5/15/2024

    -
    • easier snippets! if you have a dinkus anywhere "**|***|---", that will be used as an "endSnippet"
    -
    • BREAKING: (no one should be affected). If you had a post that purposefully had no endSnippet and does have a dinkus, it will now generate a snippet rather than using the whole post.
    +

    88.0.0 5/15/2024

    +
    • easier snippets! if you have a dinkus anywhere "**|***|---", that will be used as an "endSnippet"
    +
    • BREAKING: (no one should be affected). If you had a post that purposefully had no endSnippet and does have a dinkus, it will now generate a snippet rather than using the whole post.
    -

    87.0.1 5/15/2024

    -
    • fixed off by 1 bug in computed measures
    +

    87.0.1 5/15/2024

    +
    • fixed off by 1 bug in computed measures
    -

    87.0.0 5/14/2024

    -
    • BREAKING: added stricter conventions for measureNames. Restrict them from containing "_", which we use to combine nested measures.
    +

    87.0.0 5/14/2024

    +
    • BREAKING: added stricter conventions for measureNames. Restrict them from containing "_", which we use to combine nested measures.
    -

    86.0.2 5/12/2024

    -
    • add relative paths to sitemaps if needed
    +

    86.0.2 5/12/2024

    +
    • add relative paths to sitemaps if needed
    -

    86.0.1 5/12/2024

    -
    • improved test coverage
    +

    86.0.1 5/12/2024

    +
    • improved test coverage
    -

    86.0.0 5/12/2024

    -
    • added a v1 version of a markdown style of doing quotes > (with aftertext support)!
    +

    86.0.0 5/12/2024

    +
    • added a v1 version of a markdown style of doing quotes > (with aftertext support)!
      -
    • made the View Source links have same style as other Scroll chrome, and removed those links in short snippet renders (never get needed there--only on the actual page)
    -
    • BREAKING: if you have any lines starting with > , those will now be parsed by the quickQuoteParser
    +
  • made the View Source links have same style as other Scroll chrome, and removed those links in short snippet renders (never get needed there--only on the actual page)
  • +
    • BREAKING: if you have any lines starting with > , those will now be parsed by the quickQuoteParser
    -

    85.9.0 5/12/2024

    -
    • added minutes to read (assuming 200 atoms/minute) to printSearch and printCsv exports
    • -
    • you can now pass groups to sitemap for making sitemaps specific to certain folders/groups
    • -
    • for printFeed, snippets, fullSnippets providing groups is now optional
    +

    85.9.0 5/12/2024

    +
    • added minutes to read (assuming 200 atoms/minute) to printSearch and printCsv exports
    • +
    • you can now pass groups to sitemap for making sitemaps specific to certain folders/groups
    • +
    • for printFeed, snippets, fullSnippets providing groups is now optional
    -

    85.8.0 5/10/2024

    -
    • measures and concepts can now also be written as Javascript for explore pages.
    +

    85.8.0 5/10/2024

    +
    • measures and concepts can now also be written as Javascript for explore pages.
    -

    85.7.0 5/10/2024

    -
    • replaceJs now has access to the filepath
    +

    85.7.0 5/10/2024

    +
    • replaceJs now has access to the filepath
    -

    85.6.0 5/10/2024

    -
    • sortBy can now sort on multiple columns and handle asc/desc
    +

    85.6.0 5/10/2024

    +
    • sortBy can now sort on multiple columns and handle asc/desc
    -

    85.5.0 5/10/2024

    -
    • writeConcepts and writeMeasures can now take multiple filenames in one line and also include a sortBy condition.
    +

    85.5.0 5/10/2024

    +
    • writeConcepts and writeMeasures can now take multiple filenames in one line and also include a sortBy condition.
    -

    85.4.0 5/10/2024

    -
    • Scroll now auto-adds a "filename" measure as to which file the concept appears in.
    +

    85.4.0 5/10/2024

    +
    • Scroll now auto-adds a "filename" measure as to which file the concept appears in.
    -

    85.3.0 5/10/2024

    -
    • Scroll now only wraps compiler output with html tags if permalink ends in "html" or "htm". Makes it easier to use Scroll to compile files to different language targets.
    +

    85.3.0 5/10/2024

    +
    • Scroll now only wraps compiler output with html tags if permalink ends in "html" or "htm". Makes it easier to use Scroll to compile files to different language targets.
    -

    85.2.1 5/10/2024

    -
    • fixed bug where id measure was appearing twice
    +

    85.2.1 5/10/2024

    +
    • fixed bug where id measure was appearing twice
    -

    85.2.0 5/10/2024

    -
    • fixed bug with nested measure names.
    -
    • some slight enhancements to computed measures
    +

    85.2.0 5/10/2024

    +
    • fixed bug with nested measure names.
    +
    • some slight enhancements to computed measures
    -

    85.1.0 5/09/2024

    -
    • added support for nested measures. The underscore "_" character is used for column names for nested measures for the broadest compatibility with other data science tools
    +

    85.1.0 5/09/2024

    +
    • added support for nested measures. The underscore "_" character is used for column names for nested measures for the broadest compatibility with other data science tools
    -

    85.0.0 5/08/2024

    -
    • upgraded jtree to get ability for faster compilations
    -
    • BREAKING: removed replaceDefault parser. No one should be affected.
    • -
    • BREAKING: renamed nodejs parser to `replaceNodejs. Few should be affected.
    +

    85.0.0 5/08/2024

    +
    • upgraded jtree to get ability for faster compilations
    +
    • BREAKING: removed replaceDefault parser. No one should be affected.
    • +
    • BREAKING: renamed nodejs parser to `replaceNodejs. Few should be affected.
    -

    84.10.1 5/08/2024

    -
    • fix hanging test (infinite loop regression) during build when you have just 1 file.
    +

    84.10.1 5/08/2024

    +
    • fix hanging test (infinite loop regression) during build when you have just 1 file.
    -

    84.10.0 5/08/2024

    -
    • faster html generation when keyboardNav was in use. First implementation was accidentally quadratic.
    +

    84.10.0 5/08/2024

    +
    • faster html generation when keyboardNav was in use. First implementation was accidentally quadratic.
    -

    84.9.0 5/08/2024

    -
    • faster concepts and measures compilation
    +

    84.9.0 5/08/2024

    +
    • faster concepts and measures compilation
    -

    84.8.1 5/07/2024

    -
    • printSearchTable now generates correct links when searching across multiple folders
    +

    84.8.1 5/07/2024

    +
    • printSearchTable now generates correct links when searching across multiple folders
    -

    84.8.0 5/07/2024

    -
    • tableSearch now takes a parameter from the url #q=[search]. Updating the searching box also updates url.
    +

    84.8.0 5/07/2024

    +
    • tableSearch now takes a parameter from the url #q=[search]. Updating the searching box also updates url.
    -

    84.7.0 5/07/2024

    -
    • Added printSearchTable parser
    +

    84.7.0 5/07/2024

    +
    • Added printSearchTable parser
    -

    84.6.0 5/07/2024

    -
    • Added support for computed measures
    • -
    • better measure statistics printing
    +

    84.6.0 5/07/2024

    +
    • Added support for computed measures
    • +
    • better measure statistics printing
    -

    84.5.1 5/07/2024

    -
    • better error printing with scroll test and fix bug in percentAtom
    +

    84.5.1 5/07/2024

    +
    • better error printing with scroll test and fix bug in percentAtom
    -

    84.5.0 5/07/2024

    -
    • Added writeMeasures and printMeasures parsers
    • -
    • Added abstractPercentageMeasureParser
    +

    84.5.0 5/07/2024

    +
    • Added writeMeasures and printMeasures parsers
    • +
    • Added abstractPercentageMeasureParser
    -

    84.4.0 5/06/2024

    -
    • Added loadConcepts parser for if you had a dataset split into many files in a folder.
    • -
    • Added float sortIndex [int] for sorting the measures(columns) in dataset generation. Lower sort indexes come first.
    +

    84.4.0 5/06/2024

    +
    • Added loadConcepts parser for if you had a dataset split into many files in a folder.
    • +
    • Added float sortIndex [int] for sorting the measures(columns) in dataset generation. Lower sort indexes come first.
    -

    84.3.0 5/06/2024

    -
    • scroll test will now report if an aftertext pattern has no matches.
    +

    84.3.0 5/06/2024

    +
    • scroll test will now report if an aftertext pattern has no matches.
    -

    84.2.0 5/06/2024

    -
    • added **** as an "end of post dinkus" which prints ⁂
    • -
    • tabular tables now support aftertext!
    -
    • allow multiatom strings to be used as an id in concepts
    +

    84.2.0 5/06/2024

    +
    • added **** as an "end of post dinkus" which prints ⁂
    • +
    • tabular tables now support aftertext!
    +
    • allow multiatom strings to be used as an id in concepts
    -

    84.1.0 5/04/2024

    -
    • snippets now export some content in plain text
    • -
    • improved the default site generated by scroll init
    +

    84.1.0 5/04/2024

    +
    • snippets now export some content in plain text
    • +
    • improved the default site generated by scroll init
    -

    84.0.0 5/04/2024

    -
    • Datasets (aka "Concept files") version 2! Much simpler.
    • -
    • Added the id parser for using datasets.
    • -
    • Removed the [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".
    • -
    • Added belowAsCodeUntil parser
    +

    84.0.0 5/04/2024

    +
    • Datasets (aka "Concept files") version 2! Much simpler.
    • +
    • Added the id parser for using datasets.
    • +
    • Removed the [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".
    • +
    • Added belowAsCodeUntil parser
    -
    • BREAKING: removed :: parser. Now concepts are simply identified by the parser id.
    • -
    • BREAKING: writeDataset is now writeConcepts and printDataset is now printConcepts.
    • -
    • BREAKING: Removed the [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.
    -

    83.3.0 5/04/2024

    -
    • repeating the baseUrl after openGraphImage is no longer required. Will be auto-added if not present.
    +
    • BREAKING: removed :: parser. Now concepts are simply identified by the parser id.
    • +
    • BREAKING: writeDataset is now writeConcepts and printDataset is now printConcepts.
    • +
    • BREAKING: Removed the [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.
    +

    83.3.0 5/04/2024

    +
    • repeating the baseUrl after openGraphImage is no longer required. Will be auto-added if not present.
    -

    83.2.0 5/04/2024

    -
    • added link under image. Also added target.
    • -
    • for posts with multiple images, you can now put openGraph under an image node as an alternative to adding a separate openGraphImage line
    • -
    • added mediumColumns parser
    • -
    • added thinColumns parser.
    +

    83.2.0 5/04/2024

    +
    • added link under image. Also added target.
    • +
    • for posts with multiple images, you can now put openGraph under an image node as an alternative to adding a separate openGraphImage line
    • +
    • added mediumColumns parser
    • +
    • added thinColumns parser.
    -

    Note: startColumns will eventually be removed. You can now safely switch those to thinColumns.

    -

    83.1.0 5/03/2024

    -
    • added expander parser
    +

    Note: startColumns will eventually be removed. You can now safely switch those to thinColumns.

    +

    83.1.0 5/03/2024

    +
    • added expander parser
    -
    Click me -

    Anything in the section will show up here. A blank line ends a section.

    +
    Click me +

    Anything in the section will show up here. A blank line ends a section.

    -

    83.0.0 5/03/2024

    -
    • all tables now print in plain text outputs
    • -
    • added printTable parser
    -
    • BREAKING: root level tabular tables no longer produce output. Add a printTable [index] to print any existing tabular tables.
    -
    -

    printTable will look for a table to print using this strategy:

    -
    • If an index is provided, print that table.
    • -
    • Else, is there a table right below this line?
    • -
    • Else, is there a table right before this line?
    • -
    • Else, print the first table in the file.
    -

    82.2.0 5/03/2024

    -
    • pruned more files from npm install
    -
    -

    82.1.0 5/03/2024

    -
    • pruned dependencies to make npm install -g scroll-cli --production fast
    -
    -

    82.0.1 5/01/2024

    -
    • fixed regression where endSnippet was showing up in html
    -
    -

    82.0.0 5/01/2024

    -
    • meta tags can now have nested comments
    • -
    • added formatCommand 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.
    • -
    • plain text files now will have a maximum of 2 blank lines in a row
    • -
    • plain text files now print date, if there's a dateline
    -
    -

    The current formatting conventions are:

    -
    • Scroll files end in a single newline
    • -
    • Trailing spaces and tabs are stripped from lines, unless the whole line is whitespace
    • -
    • importOnly, if present, is moved to the very top
    • -
    • 3 or more newlines are trimmed down to 2
    • -
    • Meta tags are moved to the top of the file
    • -
    • 2 newlines comes after meta tags
    • -
    • Tags that print content and comments stay put
    • -
    • Meta tags are sorted alphabetically with no blank lines in between [In the future, may want to allow customizing this]
    -

    Note 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.

    -

    81.2.0 4/30/2024

    -
    • added related and relatedList parsers
    -
    -

    81.1.0 4/29/2024

    -
    • added plainTextOnly 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 :)).
    -
    -

    81.0.0 4/29/2024

    -
    • links now appear in plain text output. relative links are made absolute.
    • -
    • indented lists now appear in plain text output.
    -
    -
    • BREAKING: (no one should be affected) if you extended the thoughtParser, that is now called paragraphParser.
    -

    80.2.1 4/29/2024

    -
    • fixed regression in tabular tables printing
    -
    -

    80.2.0 4/29/2024

    -
    • added helpfulNotFound parser for better 404s.
    -
    -

    80.1.0 4/29/2024

    -
    • wordCount in printCsv now measures wordCount in the text version of a post.
    -
    -

    80.0.0 4/29/2024

    - -
    -

    Note: there are likely to be a few rapid releases to refine this.

    -

    79.1.0 4/27/2024

    -
    • added printSiteMap parser for text sitemap generation.
    -
    -

    79.0.1 4/27/2024

    -
    • fix npm issue
    -
    -

    79.0.0 4/27/2024

    -
    • better offline builds: if used, katex, tableSearch, and maps now copy their needed css and js into their folder and those assets are served locally rather than through CDN.
    -
    • BREAKING: you may need to make some slight updates, such as adding the copied files to .gitignore.
    -
    -

    78.0.2 4/27/2024

    -
    • open graph image url fix: remove the extra "/" which caused images not to show in Twitter
    -
    -

    78.0.1 4/26/2024

    -
    • style fix: ensure column splits don't separate images from their captions
    -
    -

    78.0.0 4/25/2024

    -
    • made tabular data a root level parser in Scroll.
    -
    • BREAKING: if you had lines with tabs that currently match the catchall paragraph, you'll need to make those explicit paragraphs to avoid them getting parsed by the tabular data parser. You should be able to find those lines with a regex like this: ^(\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.

    -

    77.3.1 4/23/2024

    -
    • style fix: fixed style bug where on narrow screens the post title would overlap the corner nav buttons.
    -
    -

    77.3.0 4/22/2024

    -
    • updated presentation of footnotes
    -
    -

    77.2.0 4/22/2024

    -
    • improved default table styles
    -
    -

    77.1.0 4/21/2024

    -
    • Simplified datasets further after user tests.
    -
    -

    77.0.0 4/21/2024

    -
    • Added Scroll Datasets, which consists of the ::, printDataset, writeDataset, and *: and *:: parsers.
    -
    -
    • BREAKING: if you had lines starting with a atom then colon, that used the catchall paragraph, such as 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: ^[^ ]+: .
    -

    76.0.0 4/19/2024

    -
    • try using "rem" in CSS to better support the "zooming out" effect on a blog
    -
    -

    The code below added to a page will create the zoom out effect:

    +

    83.0.0 5/03/2024

    +
    • all tables now print in plain text outputs
    • +
    • added printTable parser
    +
    • BREAKING: root level tabular tables no longer produce output. Add a printTable [index] to print any existing tabular tables.
    +
    +

    printTable will look for a table to print using this strategy:

    +
    • If an index is provided, print that table.
    • +
    • Else, is there a table right below this line?
    • +
    • Else, is there a table right before this line?
    • +
    • Else, print the first table in the file.
    +

    82.2.0 5/03/2024

    +
    • pruned more files from npm install
    +
    +

    82.1.0 5/03/2024

    +
    • pruned dependencies to make npm install -g scroll-cli --production fast
    +
    +

    82.0.1 5/01/2024

    +
    • fixed regression where endSnippet was showing up in html
    +
    +

    82.0.0 5/01/2024

    +
    • meta tags can now have nested comments
    • +
    • added formatCommand 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.
    • +
    • plain text files now will have a maximum of 2 blank lines in a row
    • +
    • plain text files now print date, if there's a dateline
    +
    +

    The current formatting conventions are:

    +
    • Scroll files end in a single newline
    • +
    • Trailing spaces and tabs are stripped from lines, unless the whole line is whitespace
    • +
    • importOnly, if present, is moved to the very top
    • +
    • 3 or more newlines are trimmed down to 2
    • +
    • Meta tags are moved to the top of the file
    • +
    • 2 newlines comes after meta tags
    • +
    • Tags that print content and comments stay put
    • +
    • Meta tags are sorted alphabetically with no blank lines in between [In the future, may want to allow customizing this]
    +

    Note 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.

    +

    81.2.0 4/30/2024

    +
    • added related and relatedList parsers
    +
    +

    81.1.0 4/29/2024

    +
    • added plainTextOnly 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 :)).
    +
    +

    81.0.0 4/29/2024

    +
    • links now appear in plain text output. relative links are made absolute.
    • +
    • indented lists now appear in plain text output.
    +
    +
    • BREAKING: (no one should be affected) if you extended the thoughtParser, that is now called paragraphParser.
    +

    80.2.1 4/29/2024

    +
    • fixed regression in tabular tables printing
    +
    +

    80.2.0 4/29/2024

    +
    • added helpfulNotFound parser for better 404s.
    +
    +

    80.1.0 4/29/2024

    +
    • wordCount in printCsv now measures wordCount in the text version of a post.
    +
    +

    80.0.0 4/29/2024

    + +
    +

    Note: there are likely to be a few rapid releases to refine this.

    +

    79.1.0 4/27/2024

    +
    • added printSiteMap parser for text sitemap generation.
    +
    +

    79.0.1 4/27/2024

    +
    • fix npm issue
    +
    +

    79.0.0 4/27/2024

    +
    • better offline builds: if used, katex, tableSearch, and maps now copy their needed css and js into their folder and those assets are served locally rather than through CDN.
    +
    • BREAKING: you may need to make some slight updates, such as adding the copied files to .gitignore.
    +
    +

    78.0.2 4/27/2024

    +
    • open graph image url fix: remove the extra "/" which caused images not to show in Twitter
    +
    +

    78.0.1 4/26/2024

    +
    • style fix: ensure column splits don't separate images from their captions
    +
    +

    78.0.0 4/25/2024

    +
    • made tabular data a root level parser in Scroll.
    +
    • BREAKING: if you had lines with tabs that currently match the catchall paragraph, you'll need to make those explicit paragraphs to avoid them getting parsed by the tabular data parser. You should be able to find those lines with a regex like this: ^(\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.

    +

    77.3.1 4/23/2024

    +
    • style fix: fixed style bug where on narrow screens the post title would overlap the corner nav buttons.
    +
    +

    77.3.0 4/22/2024

    +
    • updated presentation of footnotes
    +
    +

    77.2.0 4/22/2024

    +
    • improved default table styles
    +
    +

    77.1.0 4/21/2024

    +
    • Simplified datasets further after user tests.
    +
    +

    77.0.0 4/21/2024

    +
    • Added Scroll Datasets, which consists of the ::, printDataset, writeDataset, and *: and *:: parsers.
    +
    +
    • BREAKING: if you had lines starting with a atom then colon, that used the catchall paragraph, such as 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: ^[^ ]+: .
    +

    76.0.0 4/19/2024

    +
    • try using "rem" in CSS to better support the "zooming out" effect on a blog
    +
    +

    The code below added to a page will create the zoom out effect:

    css html {font-size: var(--scrollBaseFontSize, 8px);} -
    • BREAKING: There might be some slight style breaks related to this change.
    -

    75.2.1 4/18/2024

    -
    • style fix: removed top margin on headers when they are in the first section
    +
    • BREAKING: There might be some slight style breaks related to this change.
    +

    75.2.1 4/18/2024

    +
    • style fix: removed top margin on headers when they are in the first section
    -

    75.2.0 4/18/2024

    -
    • increased the default font-size from 14px to 16px
    • -
    • changed the font-family and line height of captions which previously looked off
    • -
    • adjusted margins on question h4s
    -
    • fix slight line-height issue with datelines
    +

    75.2.0 4/18/2024

    +
    • increased the default font-size from 14px to 16px
    • +
    • changed the font-family and line height of captions which previously looked off
    • +
    • adjusted margins on question h4s
    +
    • fix slight line-height issue with datelines
    -

    75.1.1 4/16/2024

    -
    • fix bug where quick links could not be used inside a footnote definition.
    +

    75.1.1 4/16/2024

    +
    • fix bug where quick links could not be used inside a footnote definition.
    -

    75.1.0 4/10/2024

    -
    • Added *** parser to print a Dinkus
    +

    75.1.0 4/10/2024

    +
    • Added *** parser to print a Dinkus
    Now I will show an example. @@ -1430,54 +1435,54 @@ *** Above is a dinkus. -

    Now I will show an example.

    +

    Now I will show an example.

    *
    -

    Above is a dinkus.

    -

    75.0.0 4/06/2024

    -
    • Revert version 74. There was a simpler way to fix that pattern.
    +

    Above is a dinkus.

    +

    75.0.0 4/06/2024

    +
    • Revert version 74. There was a simpler way to fix that pattern.
    -

    74.0.0 4/06/2024

    -
    • (Reverted)
    +

    74.0.0 4/06/2024

    +
    • (Reverted)
    -

    73.2.0 4/05/2024

    -
    • added thanksTo parser
    +

    73.2.0 4/05/2024

    +
    • added thanksTo parser
    -

    73.1.0 4/05/2024

    -
    • added plainText parser
    • -
    • added printSource parser to be able to dump the source code for a group of posts to a plain text file.
    +

    73.1.0 4/05/2024

    +
    • added plainText parser
    • +
    • added printSource parser to be able to dump the source code for a group of posts to a plain text file.
    -

    73.0.0 4/03/2024

    -
    • added printCsv parser to make it as easy to generate a CSV of a blog as it is to generate an RSS feed
    +

    73.0.0 4/03/2024

    +
    • added printCsv parser to make it as easy to generate a CSV of a blog as it is to generate an RSS feed
    -

    72.4.4 2/07/2024

    -
    • do not print "undefined" in tables in rows missing columns
    +

    72.4.4 2/07/2024

    +
    • do not print "undefined" in tables in rows missing columns
    -

    72.4.3 11/04/2023

    -
    • fix extra indentation in nested lists. Browser already adds it.
    +

    72.4.3 11/04/2023

    +
    • fix extra indentation in nested lists. Browser already adds it.
    -

    72.4.2 11/04/2023

    -
    • do not compile aftertext nodes having the "hidden" attribute
    +

    72.4.2 11/04/2023

    +
    • do not compile aftertext nodes having the "hidden" attribute
    -

    72.4.1 11/04/2023

    -
    • fixed regression where was present in RSS pages. Thank you to Joao for the report.
    +

    72.4.1 11/04/2023

    +
    • fixed regression where was present in RSS pages. Thank you to Joao for the report.
    -

    72.4.0 6/27/2023

    -
    • provide "dropcap" CSS class.
    • -
    • tweaked default styling of images and captions
    +

    72.4.0 6/27/2023

    +
    • provide "dropcap" CSS class.
    • +
    • tweaked default styling of images and captions
    -

    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.

    -

    72.3.0 6/13/2023

    -
    • if you want to disable wrapsOn you can now provide parameters to specify only the wraps you want, if any.
    -
    • by default katex wraps won't run unless there is a katex node in a file. So any paragraph containing multiple $ will now behave as before katex wraps were added.
    +

    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.

    +

    72.3.0 6/13/2023

    +
    • if you want to disable wrapsOn you can now provide parameters to specify only the wraps you want, if any.
    +
    • by default katex wraps won't run unless there is a katex node in a file. So any paragraph containing multiple $ will now behave as before katex wraps were added.
    -

    72.2.0 5/31/2023

    -
    • added wideColumns parser
    +

    72.2.0 5/31/2023

    +
    • added wideColumns parser
    -

    72.1.0 5/26/2023

    -
    • Bold and italics are no longer parsed inside inline code 2*4*2 or inline \KaTeX X_{2_i}.
    +

    72.1.0 5/26/2023

    +
    • Bold and italics are no longer parsed inside inline code 2*4*2 or inline \KaTeX X_{2_i}.
    -

    72.0.0 5/25/2023

    -
    • added support for inline \TeX via \KaTeX.
      • Current implementation requires adding at least one katex node in your file and will load the KaTeX code.
    +

    72.0.0 5/25/2023

    +
    • added support for inline \TeX via \KaTeX.
      • Current implementation requires adding at least one katex node in your file and will load the KaTeX code.
    @@ -1492,264 +1497,264 @@
    -

    71.5.0 5/19/2023

    -
    • added support for extra newlines between items in ordered lists
    • -
    • added support for custom footnote labels and move footnote link to end with new style
    • -
    • added hover style to "Built with Scroll" footer link
    -
    -

    71.4.0 5/9/2023

    -
    • style improvements to lists
    -
    -

    71.3.0 5/8/2023

    -
    • added program parser for Program Links. See blog post for details.
    -
    -

    71.2.0 5/07/2023

    -
    • add <!DOCTYPE html> to improve performance on Google Lighthouse.
    • -
    • fix regression of meta description generation and add test
    • -
    • upgrade JTree to get colorized test output
    -
    -

    71.1.0 5/07/2023

    -
    • add <html lang></html> back as you need that to get proper hyphenation. Added test.
    -
    • added htmlLang parser for overriding the default lang which is set to "en"
    • -
    • added text-align: justify; on paragraphs to Gazette and Tufte themes.
    -
    -

    71.0.0 5/06/2023

    -
    • added tufteCss beta theme.
    • -
    • added ###, #### and ##### headers.
    -
    • BREAKING: slight changes to the h1-h4 font sizes and margins in the default gazetteTheme.
      • A single # is now h1, ## is h2, et cetera. title can be thought of as h0.
      -
    • BREAKING: gazetteHeader is now pageHeader and gazetteFooter is now pageFooter. Headers and footers can be independent of themes.
    -
    -

    70.0.0 4/29/2023

    -
    • Paragraphs no longer need to start with '* '. All non-blank lines that don't start with a defined parser are now treated as a paragraph. The catch-all is no longer an error. It is recommended to start all paragraphs with a capital letter, as in the future it may become the standard that parsers start with a lowercase or symbol, and you will avoid any future parser collisions.
      • Thanks to zoeartemis for the feedback.
      • +

        71.5.0 5/19/2023

        +
        • added support for extra newlines between items in ordered lists
        • +
        • added support for custom footnote labels and move footnote link to end with new style
        • +
        • added hover style to "Built with Scroll" footer link
        +
        +

        71.4.0 5/9/2023

        +
        • style improvements to lists
        +
        +

        71.3.0 5/8/2023

        +
        • added program parser for Program Links. See blog post for details.
        +
        +

        71.2.0 5/07/2023

        +
        • add <!DOCTYPE html> to improve performance on Google Lighthouse.
        • +
        • fix regression of meta description generation and add test
        • +
        • upgrade JTree to get colorized test output
        +
        +

        71.1.0 5/07/2023

        +
        • add <html lang></html> back as you need that to get proper hyphenation. Added test.
        +
        • added htmlLang parser for overriding the default lang which is set to "en"
        • +
        • added text-align: justify; on paragraphs to Gazette and Tufte themes.
        +
        +

        71.0.0 5/06/2023

        +
        • added tufteCss beta theme.
        • +
        • added ###, #### and ##### headers.
        +
        • BREAKING: slight changes to the h1-h4 font sizes and margins in the default gazetteTheme.
          • A single # is now h1, ## is h2, et cetera. title can be thought of as h0.
          +
        • BREAKING: gazetteHeader is now pageHeader and gazetteFooter is now pageFooter. Headers and footers can be independent of themes.
        +
        +

        70.0.0 4/29/2023

        +
        • Paragraphs no longer need to start with '* '. All non-blank lines that don't start with a defined parser are now treated as a paragraph. The catch-all is no longer an error. It is recommended to start all paragraphs with a capital letter, as in the future it may become the standard that parsers start with a lowercase or symbol, and you will avoid any future parser collisions.
          • Thanks to zoeartemis for the feedback.
          • No changes are needed but you can update your files with the find/replace combo: \n\* \n.
            • You may want to use the case sensitive \n\* [a-z] search first to find any paragraphs that start with a lowercase letter.
            • You also want to be careful of any lines that would now start with <!, as they will be parsed as HTML nodes.
        -

        69.3.0 4/26/2023

        -
        • Add katex parser. KaTeX: "The fastest math typesetting library for the web."
        +

        69.3.0 4/26/2023

        +
        • Add katex parser. KaTeX: "The fastest math typesetting library for the web."
        -

        69.2.0 4/18/2023

        -
        • added the tag parser to thought nodes so you can change the compiled html tag (needed in rare circumstances)
        • -
        • added the thought parser and standardized vocab to calling the thought node the main node that most nodes extend.
        • -
        • added the style parser to provide inline html styles to a thought node.
        +

        69.2.0 4/18/2023

        +
        • added the tag parser to thought nodes so you can change the compiled html tag (needed in rare circumstances)
        • +
        • added the thought parser and standardized vocab to calling the thought node the main node that most nodes extend.
        • +
        • added the style parser to provide inline html styles to a thought node.
        -

        69.1.4 4/13/2023

        -
        • get tfs fixes in jtree
        +

        69.1.4 4/13/2023

        +
        • get tfs fixes in jtree
        -

        69.1.3 4/13/2023

        -
        • get tfs fixes in jtree
        +

        69.1.3 4/13/2023

        +
        • get tfs fixes in jtree
        -

        69.1.1 4/13/2023

        -
        • Improve syntax highlighting of counters and comments
        +

        69.1.1 4/13/2023

        +
        • Improve syntax highlighting of counters and comments
        -

        69.1.0 4/13/2023

        -
        • Added counters
        +

        69.1.0 4/13/2023

        +
        • Added counters
        -

        69.0.0 4/9/2023

        -

        No one should be affected. This was an internal rewrite to upstream the imports code to ParticleFileSystem in Jtree. No changes for Scroll users.

        -
        • BREAKING: scrollKeywords is no longer exported
        • -
        • BREAKING: DefaultScrollCompiler is now DefaultScrollParser
        • -
        • BREAKING: ScrollDiskFileSystem and ScrollInMemoryFileSystem replaced by ScrollFileSystem
        +

        69.0.0 4/9/2023

        +

        No one should be affected. This was an internal rewrite to upstream the imports code to ParticleFileSystem in Jtree. No changes for Scroll users.

        +
        • BREAKING: scrollKeywords is no longer exported
        • +
        • BREAKING: DefaultScrollCompiler is now DefaultScrollParser
        • +
        • BREAKING: ScrollDiskFileSystem and ScrollInMemoryFileSystem replaced by ScrollFileSystem
        -

        68.0.0 4/3/2023

        -

        Simplify theme building.

        -
        • BREAKING: gazetteTheme is now gazetteCss.
        • -
        • BREAKING:
        +

        68.0.0 4/3/2023

        +

        Simplify theme building.

        +
        • BREAKING: gazetteTheme is now gazetteCss.
        • +
        • BREAKING:
        // Change `gazetteTheme noTags` to: gazetteCss tags false
        -

        67.1.0 4/3/2023

        -

        Maintenance release. Update packages and remove unused package and specify required NodeJs versions accurately.

        +

        67.1.0 4/3/2023

        +

        Maintenance release. Update packages and remove unused package and specify required NodeJs versions accurately.

        -

        67.0.0 4/2/2023

        -

        This is The Theme Release.

        -
        • Introduce the idea of parsers for theming scrolls.
        -
        • BREAKING: author node is now byLine. author is kept for now but updating is recommended.
        • -
        • BREAKING: scrollCssTag is gone. use gazetteTheme for previous behavior. scrollCss is gone, use gazetteTheme noTag.
        • -
        • BREAKING: SCROLL_CSS has been removed. gazetteTheme now contains that CSS code.
        • -
        • BREAKING: scrollHeader is now gazetteHeader and scrollFooter is now gazetteFooter
        • -
        • BREAKING: css classes: scrollHeaderComponent => gazetteHeader, scrollFooterComponent => gazetteFooter
        • -
        • BREAKING: kpiTable is now dashboard
        +

        67.0.0 4/2/2023

        +

        This is The Theme Release.

        +
        • Introduce the idea of parsers for theming scrolls.
        +
        • BREAKING: author node is now byLine. author is kept for now but updating is recommended.
        • +
        • BREAKING: scrollCssTag is gone. use gazetteTheme for previous behavior. scrollCss is gone, use gazetteTheme noTag.
        • +
        • BREAKING: SCROLL_CSS has been removed. gazetteTheme now contains that CSS code.
        • +
        • BREAKING: scrollHeader is now gazetteHeader and scrollFooter is now gazetteFooter
        • +
        • BREAKING: css classes: scrollHeaderComponent => gazetteHeader, scrollFooterComponent => gazetteFooter
        • +
        • BREAKING: kpiTable is now dashboard
        -

        66.0.0 4/2/2023

        -
        • BREAKING: This upgrades to JTree 73 and Grammar 6. Any custom grammar files need to be updated (generally this just means a find/replace of Node to Parser).
        +

        66.0.0 4/2/2023

        +
        • BREAKING: This upgrades to JTree 73 and Grammar 6. Any custom grammar files need to be updated (generally this just means a find/replace of Node to Parser).
        -

        65.0.0 3/30/2023

        -
        • Upgrade to Jtree 71 to get Grammar 5 wiith scoped parsers.
        +

        65.0.0 3/30/2023

        +
        • Upgrade to Jtree 71 to get Grammar 5 wiith scoped parsers.
        -

        64.0.0 3/28/2023

        -
        • Upgrade to Jtree 70 to get Grammar 4. Now comments and blank lines are okay in grammars.
        +

        64.0.0 3/28/2023

        +
        • Upgrade to Jtree 70 to get Grammar 4. Now comments and blank lines are okay in grammars.
        -

        63.1.0 3/27/2023

        -
        • Added abstractScrollWithRequirementsNode and use it for copyButtons and map to only include the external JS and CSS once.
        • -
        • Added compileSettings as an input in all Scroll nodes rather than maintaining state on instances
        -
        • minor code cleanup and bug fixes
        +

        63.1.0 3/27/2023

        +
        • Added abstractScrollWithRequirementsNode and use it for copyButtons and map to only include the external JS and CSS once.
        • +
        • Added compileSettings as an input in all Scroll nodes rather than maintaining state on instances
        +
        • minor code cleanup and bug fixes
        -

        63.0.1 3/27/2023

        -
        • cache hotfix for embedded snippets.
        +

        63.0.1 3/27/2023

        +
        • cache hotfix for embedded snippets.
        -

        63.0.0 3/27/2023

        -

        This 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.

        -
        • BREAKING: Only users using Scroll as a module may be affected:
          • Removed ScrollFolder. Exports now include ScrollDiskFileSystem and ScrollInMemoryFileSystem. To get the same behavior as new ScrollFolder("folder").buildFiles() use new ScrollDiskFileSystem().buildFilesInFolder("folder").
          • +

            63.0.0 3/27/2023

            +

            This 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.

            +
            • BREAKING: Only users using Scroll as a module may be affected:
              • Removed ScrollFolder. Exports now include ScrollDiskFileSystem and ScrollInMemoryFileSystem. To get the same behavior as new ScrollFolder("folder").buildFiles() use new ScrollDiskFileSystem().buildFilesInFolder("folder").
              • Instead of new ScrollFolder(__dirname).defaultScrollCompiler use DefaultScrollCompiler
              -
            • BREAKING: Only users using Scroll extensions may be affected:
              • In extensions compileSnippet should now be compileEmbeddedVersion
              • +
              • BREAKING: Only users using Scroll extensions may be affected:
                • In extensions compileSnippet should now be compileEmbeddedVersion
                • Instead of file.folder.folder use file.folderPath
                -
              • BREAKING: Only users using loop may be affected:
                • Temporarily renamed relativeLink to linkRelativeToCompileTarget
              +
            • BREAKING: Only users using loop may be affected:
              • Temporarily renamed relativeLink to linkRelativeToCompileTarget
            -

            62.5.1 3/27/2023

            -
            • if something goes wrong in a nodejs block, be sure to clean up the temporary file
            +

            62.5.1 3/27/2023

            +
            • if something goes wrong in a nodejs block, be sure to clean up the temporary file
            -

            62.5.0 3/23/2023

            -
            • New parser canonicalUrl if you need to include query strings in canonical link.
            +

            62.5.0 3/23/2023

            +
            • New parser canonicalUrl if you need to include query strings in canonical link.
            canonicalUrl https://scroll.pub/tests/maps.html?canonLinkTest=true -

            62.4.0 3/23/2023

            -
            • SEO fix: metaTags now sets canonical link
            +

            62.4.0 3/23/2023

            +
            • SEO fix: metaTags now sets canonical link
            -

            62.3.0 3/22/2023

            - +

            62.3.0 3/22/2023

            +
            -

            62.2.0 3/15/2023

            -
            • Added copyButtons parser. Use that to give code blocks a copy-to-clipboard button on hover.
            +

            62.2.0 3/15/2023

            +
            • Added copyButtons parser. Use that to give code blocks a copy-to-clipboard button on hover.
            -

            62.1.0 3/13/2023

            -
            • Added 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.
            +

            62.1.0 3/13/2023

            +
            • Added 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.
            -

            62.0.1 3/13/2023

            -
            • fixes bug when using custom grammars with in memory node types.
            +

            62.0.1 3/13/2023

            +
            • fixes bug when using custom grammars with in memory node types.
            -

            62.0.0 3/11/2023

            -
            • Support for in memory file systems. Useful for dynamic websites and future web browser versions and versions with url imports.
            -
            • BREAKING: (no one should be affected). ScrollFolder constructor now requires an argument. You can now pass an object as a second param to use a virtual filesystem.
            • -
            • BREAKING: (no one should be affected). Removed DefaultScrollCompiler export. Instead use new ScrollFolder().defaultScrollCompiler
            +

            62.0.0 3/11/2023

            +
            • Support for in memory file systems. Useful for dynamic websites and future web browser versions and versions with url imports.
            +
            • BREAKING: (no one should be affected). ScrollFolder constructor now requires an argument. You can now pass an object as a second param to use a virtual filesystem.
            • +
            • BREAKING: (no one should be affected). Removed DefaultScrollCompiler export. Instead use new ScrollFolder().defaultScrollCompiler
            -

            61.0.0 3/11/2023

            -
            • BREAKING: (no one should be affected). Removed buildNeeded method only used programmatically by PLDB. Switching that to dynamic generation which is a better pattern.
            +

            61.0.0 3/11/2023

            +
            • BREAKING: (no one should be affected). Removed buildNeeded method only used programmatically by PLDB. Switching that to dynamic generation which is a better pattern.
            -

            60.0.0 3/10/2023

            -
            • Added quickHtml node. A line starting with < will be treated as an html node. So these are the same:
            +

            60.0.0 3/10/2023

            +
            • Added quickHtml node. A line starting with < will be treated as an html node. So these are the same:
            html <hr> <hr> -
            • BREAKING: (no one should be affected). The default catch all node will still report as an error but will now behave as if it's a paragraph (*) node.
            -

            59.6.0 3/10/2023

            -
            • Added Horizontal line parser: ---
            +
            • BREAKING: (no one should be affected). The default catch all node will still report as an error but will now behave as if it's a paragraph (*) node.
            +

            59.6.0 3/10/2023

            +
            • Added Horizontal line parser: ---

            -

            59.5.0 3/9/2023

            -
            • Additional shorter comment syntax: //. Previously it was only comment
            +

            59.5.0 3/9/2023

            +
            • Additional shorter comment syntax: //. Previously it was only comment
            -

            59.4.0 3/7/2023

            -
            • fix relative links when using snippets from multiple folders
            -
            • ability to override the default home link in the default theme
            +

            59.4.0 3/7/2023

            +
            • fix relative links when using snippets from multiple folders
            +
            • ability to override the default home link in the default theme
            -

            59.3.0 3/6/2023

            -
            • CSS fix in default theme so super elements in footnotes don't increase line-height.
            +

            59.3.0 3/6/2023

            +
            • CSS fix in default theme so super elements in footnotes don't increase line-height.
            -

            59.2.0 3/6/2023

            -
            • Default theme change: links are now only underlined on hover.
            +

            59.2.0 3/6/2023

            +
            • Default theme change: links are now only underlined on hover.
            -

            59.1.0 3/6/2023

            -
            • scroll init now creates a .gitignore file and also runs git init.
            +

            59.1.0 3/6/2023

            +
            • scroll init now creates a .gitignore file and also runs git init.
            -

            59.0.0 3/3/2023

            -
            • image parser now supports class and id tags
            • -
            • class tag with just a class will now apply to the whole parent element and not insert a span
            -
            • fix so image tag works in try.scroll.pub
            +

            59.0.0 3/3/2023

            +
            • image parser now supports class and id tags
            • +
            • class tag with just a class will now apply to the whole parent element and not insert a span
            +
            • fix so image tag works in try.scroll.pub
            -

            58.5.1 3/2/2023

            -
            • don't compile linkify node to HTML
            +

            58.5.1 3/2/2023

            +
            • don't compile linkify node to HTML
            -

            58.5.0 3/2/2023

            -
            • you can now disable linkify on a node.
            +

            58.5.0 3/2/2023

            +
            • you can now disable linkify on a node.
            -

            58.4.0 3/1/2023

            -
            • you can now create new loop item providers in extensions by extending abstractItemsProviderNode
            +

            58.4.0 3/1/2023

            +
            • you can now create new loop item providers in extensions by extending abstractItemsProviderNode
            -

            58.3.1 2/28/2023

            -
            • markup directives in indented lists should not compile to anything
            +

            58.3.1 2/28/2023

            +
            • markup directives in indented lists should not compile to anything
            -

            58.3.0 2/28/2023

            -
            • checklists! use [] and [x]
            • -
            • lists - are now indentable
            +

            58.3.0 2/28/2023

            +
            • checklists! use [] and [x]
            • +
            • lists - are now indentable
            -

            Scroll now has checklists!

            +

            Scroll now has checklists!

            -

            -

            -
            • Regular Lists are also now indentable
              • This is a subparticle
                • And this is a subsubparticle
            -

            58.2.3 2/22/2023

            -
            • Windows fix
            +

            +

            +
            • Regular Lists are also now indentable
              • This is a subparticle
                • And this is a subsubparticle
            +

            58.2.3 2/22/2023

            +
            • Windows fix
            -

            58.2.2 2/21/2023

            -
            • Bug fix
            +

            58.2.2 2/21/2023

            +
            • Bug fix
            -

            58.2.1 2/21/2023

            -
            • fix for empty atoms
            +

            58.2.1 2/21/2023

            +
            • fix for empty atoms
            -

            58.2.0 2/21/2023

            -
            • table nodes now make atoms that are just a link links
            +

            58.2.0 2/21/2023

            +
            • table nodes now make atoms that are just a link links
            -

            58.1.0 2/16/2023

            -
            • added loop node type:
            +

            58.1.0 2/16/2023

            +
            • added loop node type:
            loop atoms #2a2d34ff #009ddcff #f26430ff #6761a8ff #009b72ff javascript `<span style="background-color: ${item}; width: 30px; height: 30px; display: inline-block;"> </span>` -

            loop

            -

            58.0.1 2/9/2023

            -
            • made startColumns clear the section stack. Simpler behavior.
            +

            loop

            +

            58.0.1 2/9/2023

            +
            • made startColumns clear the section stack. Simpler behavior.
            -

            58.0.0 2/9/2023

            -
            • BREAKING: (no one should be affected). getFullyExpandedFile is no longer exported. Instead use: new ScrollFile(undefined, filePath).importResults.code
            • -
            • BREAKING: (no one should be affected). Order of params to ScrollFile have changed. absoluteFilePath is now param #2, instaed of #3.
            -
            • mtime fixes for cache builds.
            +

            58.0.0 2/9/2023

            +
            • BREAKING: (no one should be affected). getFullyExpandedFile is no longer exported. Instead use: new ScrollFile(undefined, filePath).importResults.code
            • +
            • BREAKING: (no one should be affected). Order of params to ScrollFile have changed. absoluteFilePath is now param #2, instaed of #3.
            +
            • mtime fixes for cache builds.
            -

            57.0.1 2/8/2023

            -
            • fix permalink regression
            +

            57.0.1 2/8/2023

            +
            • fix permalink regression
            -

            57.0.0 2/8/2023

            -
            • added support for css one liners
            +

            57.0.0 2/8/2023

            +
            • added support for 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 aftertext
            • -
            • the hidden parser can now be used on any aftertext node
            -
            • if there is no permalink on a file the title node won't output an a tag
            -
            • BREAKING: (no one should be affected). If you had put markup directives in your title tags, such as bolds, those will now actually be evaluated.
            • -
            • BREAKING: title 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.
            -

            56.1.0 2/8/2023

            -
            • snippets nodes can now accept multiple groups and also groups can be in different folders. Syntax is [folderPath]/[groupName] For example:
            +
            • title nodes are now proper aftertext nodes and can use all features of aftertext
            • +
            • the hidden parser can now be used on any aftertext node
            +
            • if there is no permalink on a file the title node won't output an a tag
            +
            • BREAKING: (no one should be affected). If you had put markup directives in your title tags, such as bolds, those will now actually be evaluated.
            • +
            • BREAKING: title 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.
            +

            56.1.0 2/8/2023

            +
            • 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 -

            56.0.1 2/7/2023

            -
            • fix bug with images after jtree upgrade
            +

            56.0.1 2/7/2023

            +
            • fix bug with images after jtree upgrade
            -

            56.0.0 2/7/2023

            -
            • BREAKING: upgraded to jtree 66. If you are extending Scroll you may need to migrate extensions.
            +

            56.0.0 2/7/2023

            +
            • BREAKING: upgraded to jtree 66. If you are extending Scroll you may need to migrate extensions.
            -

            55.6.0 2/7/2023

            -
            • tweaks to improve site created by scroll init
            +

            55.6.0 2/7/2023

            +
            • tweaks to improve site created by scroll init
            -

            55.5.0 1/31/2023

            -
            • aboveAsCode and belowAsCode now take an optional number for showing multiple nodes.
            • -
            • default list CSS style has been adjusted slightly to move bullets inline.
            • -
            • New list type: ordered lists:
            +

            55.5.0 1/31/2023

            +
            • aboveAsCode and belowAsCode now take an optional number for showing multiple nodes.
            • +
            • default list CSS style has been adjusted slightly to move bullets inline.
            • +
            • New list type: ordered lists:
            1. One 2. Two 3. Three -
            1. One
            2. -
            3. Two
            4. -
            5. Three
            +
            1. One
            2. +
            3. Two
            4. +
            5. Three
            -

            55.4.1 1/31/2023

            -
            • fix spurious table grammar error message
            +

            55.4.1 1/31/2023

            +
            • fix spurious table grammar error message
            -

            55.4.0 1/30/2023

            -
            • added table parser which supports custom delimiters:
            +

            55.4.0 1/30/2023

            +
            • added table parser which supports custom delimiters:
            table delimiter && @@ -1757,208 +1762,208 @@ name&&score kaia&&400 pemma&&100 -

            55.3.0 1/29/2023

            -
            • the class aftertext directive now inserts a span across the whole element content if no text search is provided.
            +

            55.3.0 1/29/2023

            +
            • the 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.

            -

            55.2.0 1/26/2023

            -
            • upgrade jtree
            +

            This whole text will be blue.

            +

            55.2.0 1/26/2023

            +
            • upgrade jtree
            -

            55.1.0 1/20/2023

            -
            • added replaceJs parser.
            +

            55.1.0 1/20/2023

            +
            • added replaceJs parser.
            -

            55.0.1 1/19/2023

            -
            • fix bug where variables were replacing themselves, leading to possible errors.
            +

            55.0.1 1/19/2023

            +
            • fix bug where variables were replacing themselves, leading to possible errors.
            -

            55.0.0 1/19/2023

            -
            • improve detection of piped input.
            • -
            • improve youTube CORS fix to work whether someone includes www.youtube or not.
            -
            • BREAKING: removed watch command. nodemon can be used for hot reloading. Install with sudo npm install -g nodemon. Then run:
            +

            55.0.0 1/19/2023

            +
            • improve detection of piped input.
            • +
            • improve youTube CORS fix to work whether someone includes www.youtube or not.
            +
            • BREAKING: removed 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:

            +

            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:

            +

            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;"> -

            54.1.0 1/19/2023

            -
            • 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.
            +

            54.1.0 1/19/2023

            +
            • 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.
            -

            54.0.0 1/19/2023

            -
            • link nodes can now have target. This link will open in blank tab.
            +

            54.0.0 1/19/2023

            +
            • 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.
            -
            • fix: non-embed youTube links are converted to proper embed links to fix CORS issues.
            -
            • BREAKING: ~no one should be affected. scrollImageComponent CSS class changed to scrollCaptionedComponent. If you were overwriting the previous class may need to update.
            • -
            • BREAKING: 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 nodes can now have captions.
            +
            • fix: non-embed youTube links are converted to proper embed links to fix CORS issues.
            +
            • BREAKING: ~no one should be affected. scrollImageComponent CSS class changed to scrollCaptionedComponent. If you were overwriting the previous class may need to update.
            • +
            • BREAKING: 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.
            -

            53.0.2 1/18/2023

            -
            • fix: youTube definition was missing a atom type for url.
            +

            53.0.2 1/18/2023

            +
            • fix: youTube definition was missing a atom type for url.
            -

            53.0.1 1/17/2023

            -
            • fix: redirectTo definition was missing a atom type for url.
            +

            53.0.1 1/17/2023

            +
            • fix: redirectTo definition was missing a atom type for url.
            -

            53.0.0 1/17/2023

            -
            • BREAKING: there was undocumented behavior where * 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.
            +

            53.0.0 1/17/2023

            +
            • BREAKING: there was undocumented behavior where * 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.
            -

            52.2.1 1/16/2023

            -
            • fix: a * node with just a link now works correctly. Previously was rendering blank.
            +

            52.2.1 1/16/2023

            +
            • fix: a * node with just a link now works correctly. Previously was rendering blank.
            -

            52.2.0 1/13/2023

            -
            • html now also supports quick oneliners:
            +

            52.2.0 1/13/2023

            +
            • html now also supports quick oneliners:
            html <b>here is some html</b> here is some html -

            52.1.1 1/12/2023

            -
            • fix: getFilesWithTag was including files marked with importOnly
            +

            52.1.1 1/12/2023

            +
            • fix: getFilesWithTag was including files marked with importOnly
            -

            52.1.0 1/12/2023

            -
            • Upgrade JTree.
            +

            52.1.0 1/12/2023

            +
            • Upgrade JTree.
            -

            52.0.0 1/10/2023

            -
            • API usage: new getter buildNeeded returns whether the folder needs to be rebuilt. You can use this to skip unnecessary builds for faster perf.
            -
            • BREAKING: This should not break anyone however behavior has changed. 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.
            +

            52.0.0 1/10/2023

            +
            • API usage: new getter buildNeeded returns whether the folder needs to be rebuilt. You can use this to skip unnecessary builds for faster perf.
            +
            • BREAKING: This should not break anyone however behavior has changed. 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.
            -

            51.0.0 1/9/2023

            -
            • This version introduces the concept of Sections. Headers (#, ## and ?) now start a section, and a blank line ends it. A section will not be split across columns.
            -
            • BREAKING: This slightly changes layouts (for the better, hopefully in all cases) so do a manual inspection of output.
            +

            51.0.0 1/9/2023

            +
            • This version introduces the concept of Sections. Headers (#, ## and ?) now start a section, and a blank line ends it. A section will not be split across columns.
            +
            • BREAKING: This slightly changes layouts (for the better, hopefully in all cases) so do a manual inspection of output.
            -

            50.2.0 1/5/2023

            -
            • fix bug where it was trying to get image dimensions of remote images when building
            -
            • upgrade jtree to get perf improvements
            +

            50.2.0 1/5/2023

            +
            • fix bug where it was trying to get image dimensions of remote images when building
            +
            • upgrade jtree to get perf improvements
            -

            50.1.0 1/5/2023

            -
            • listCommand now much faster (~33% in pldb) because findScrollsInDirRecursive will now skip node_modules folders entirely.
            +

            50.1.0 1/5/2023

            +
            • listCommand now much faster (~33% in pldb) because findScrollsInDirRecursive will now skip node_modules folders entirely.
            -

            50.0.0 1/4/2023

            -
            • made footnotes compile faster
            -
            • BREAKING: simplified footnotes by removing notes parser. Referencing a footnote is done the same way but now footnotes just print immediately like you'd expect.
            +

            50.0.0 1/4/2023

            +
            • made footnotes compile faster
            +
            • BREAKING: simplified footnotes by removing 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]

            +

            For example[1]

            [1] This is an example footnote.

            ^exampleFootnote This is an example footnote. -

            49.1.0 1/4/2023

            -
            • add viewSource parser.
            +

            49.1.0 1/4/2023

            +
            • add viewSource parser.
            -

            49.0.0 1/4/2023

            -
            • BREAKING: renamed footnote and caveat directives to hoverNote to avoid confusion with footnotes.
            • -
            • BREAKING: removed startRuledColumns which doesn't appear to be used anywhere
            -
            • general code cleanup and refactor by splitting big grammar files into separate files.
            +

            49.0.0 1/4/2023

            +
            • BREAKING: renamed footnote and caveat directives to hoverNote to avoid confusion with footnotes.
            • +
            • BREAKING: removed startRuledColumns which doesn't appear to be used anywhere
            +
            • general code cleanup and refactor by splitting big grammar files into separate files.
            -

            48.3.0 1/2/2023

            -
            • added youTube parser for embedding youTube videos with proper responsive sizing.
            +

            48.3.0 1/2/2023

            +
            • added youTube parser for embedding youTube videos with proper responsive sizing.
            -

            48.2.0 1/2/2023

            -
            • simplify default theme by removing ornamental borders
            +

            48.2.0 1/2/2023

            +
            • simplify default theme by removing ornamental borders
            -

            48.1.0 1/2/2023

            -
            • fix: keyboardNav now only cycles through pages with keyboardNav (feed.xml files are excluded, for example)
            • -
            • fix: previous/next buttons are not shown if there is no keyboardNav
            +

            48.1.0 1/2/2023

            +
            • fix: keyboardNav now only cycles through pages with keyboardNav (feed.xml files are excluded, for example)
            • +
            • fix: previous/next buttons are not shown if there is no keyboardNav
            -

            48.0.0 1/1/2023

            -

            This release simplifies and removes things from the default install.

            +

            48.0.0 1/1/2023

            +

            This release simplifies and removes things from the default install.

            -
            • BREAKING: the github parser is now git to make it clearer what it does. The git SVG is now used in the default theme.
            • -
            • BREAKING: removed twitter parser and removed the Twitter link from default theme.
            • -
            • BREAKING: SVGS is no longer exported.
            - -

            47.4.0 12/30/2022

            -
            • rss 2.0 now generated with printFeed, meaning pubDate and lastBuildDate are included.
            +
            • BREAKING: the github parser is now git to make it clearer what it does. The git SVG is now used in the default theme.
            • +
            • BREAKING: removed twitter parser and removed the Twitter link from default theme.
            • +
            • BREAKING: SVGS is no longer exported.
            + +

            47.4.0 12/30/2022

            +
            • rss 2.0 now generated with printFeed, meaning pubDate and lastBuildDate are included.
            -

            47.3.0 12/29/2022

            -
            • upstreamed stumpNoSnippet for advanced use case of PLDB until we have better support for custom grammars when using as a library.
            +

            47.3.0 12/29/2022

            +
            • upstreamed stumpNoSnippet for advanced use case of PLDB until we have better support for custom grammars when using as a library.
            -

            47.2.1 12/29/2022

            -
            • endColumns nodes should not be printed in snippets
            +

            47.2.1 12/29/2022

            +
            • endColumns nodes should not be printed in snippets
            -

            47.2.0 12/29/2022

            -
            • added doNotPrint class to header and footer elements for better printability.
            +

            47.2.0 12/29/2022

            +
            • added doNotPrint class to header and footer elements for better printability.
            -

            47.1.2 12/05/2022

            -
            • character encoding regression fix.
            +

            47.1.2 12/05/2022

            +
            • character encoding regression fix.
            -

            47.1.1 11/30/2022

            -
            • init fixes
            +

            47.1.1 11/30/2022

            +
            • init fixes
            -

            47.1.0 11/29/2022

            -
            • you can now specify number of max columns in startColumns parser
            -
            • fixed body padding regression
            +

            47.1.0 11/29/2022

            +
            • you can now specify number of max columns in startColumns parser
            +
            • fixed body padding regression
            -

            47.0.0 11/28/2022

            -

            This 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.

            +

            47.0.0 11/28/2022

            +

            This 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.

            -
            • BREAKING: removed automatic meta tag generation. You now need to explicitly add a metaTags parser.
            • -
            • BREAKING: removed , , , and tags. Unnecessary. Modern browsers don't need them. HTML never should have had head/body split.
            • -
            • BREAKING: removed SCROLL_CSS export.
            -

            46.2.0 11/27/2022

            -
            • stump parser works now
            +
            • BREAKING: removed automatic meta tag generation. You now need to explicitly add a metaTags parser.
            • +
            • BREAKING: removed , , , and tags. Unnecessary. Modern browsers don't need them. HTML never should have had head/body split.
            • +
            • BREAKING: removed SCROLL_CSS export.
            +

            46.2.0 11/27/2022

            +
            • stump parser works now
            -

            46.1.0 11/27/2022

            -
            • scrollCss works now
            +

            46.1.0 11/27/2022

            +
            • scrollCss works now
            -

            46.0.0 11/27/2022

            -

            This 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.

            +

            46.0.0 11/27/2022

            +

            This 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.

            -
            • BREAKING: removed maxColumns and columnWidth and template
            • -
            • BREAKING: headers and footers are not provided by default. You now must explicitly include them with scrollHeader and scrollFooter. The previous behavior of scrollHeader and scrollFooter has been removed.
            • -
            • BREAKING: columns are not provided by default. You now need to wrap your content in startColumns and endColumns.
            • -
            • BREAKING: CSS is not included by default. You need to use the snippet parser scrollCssTag. The previous behavior of scrollCss has been removed. Also printScrollCss is now scrollCss.
            -

            45.0.0 11/24/2022

            -
            • a whole new way to do footnotes/end notes.
            +
            • BREAKING: removed maxColumns and columnWidth and template
            • +
            • BREAKING: headers and footers are not provided by default. You now must explicitly include them with scrollHeader and scrollFooter. The previous behavior of scrollHeader and scrollFooter has been removed.
            • +
            • BREAKING: columns are not provided by default. You now need to wrap your content in startColumns and endColumns.
            • +
            • BREAKING: CSS is not included by default. You need to use the snippet parser scrollCssTag. The previous behavior of scrollCss has been removed. Also printScrollCss is now scrollCss.
            +

            45.0.0 11/24/2022

            +
            • a whole new way to do footnotes/end notes.
            -

            Footnotes example

            +

            Footnotes example

            -

            Brockton is a city in Massachusetts[2]. It was incorporated in 1881[3].

            -

            Notes

            +

            Brockton is a city in Massachusetts[2]. It was incorporated in 1881[3].

            +

            Notes

            [2] A state in the United States.

            [3] Incorporated as a city in 1881, but as a town in 1821. Wikipedia.

            -

            44.0.1 11/24/2022

            -
            • fix hidden title bug
            +

            44.0.1 11/24/2022

            +
            • fix hidden title bug
            -

            44.0.0 11/24/2022

            -

            This is the title simplification refactor release.

            -
            • new: description parser for use in open graph description generation.
            • -
            • new: optional hidden parser on title nodes for setting title without printing it.
            -
            • BREAKING: Group pages no longer have a title in their HTML by default. Must set manually.
            • -
            • BREAKING: Removed 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.
            • -
            • BREAKING: Removed htmlTitle parser.
            +

            44.0.0 11/24/2022

            +

            This is the title simplification refactor release.

            +
            • new: description parser for use in open graph description generation.
            • +
            • new: optional hidden parser on title nodes for setting title without printing it.
            +
            • BREAKING: Group pages no longer have a title in their HTML by default. Must set manually.
            • +
            • BREAKING: Removed 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.
            • +
            • BREAKING: Removed htmlTitle parser.
            -

            43.1.1 11/22/2022

            -
            • fix aftertext bug where http quick links were not matching.
            +

            43.1.1 11/22/2022

            +
            • fix aftertext bug where http quick links were not matching.
            -

            43.1.0 11/14/2022

            -
            • new: new SVGS export when using as a library.
            +

            43.1.0 11/14/2022

            +
            • new: new SVGS export when using as a library.
            -

            43.0.1 11/14/2022

            -
            • list element (- some item) compiler was generating an extra p tag.
            +

            43.0.1 11/14/2022

            +
            • list element (- some item) compiler was generating an extra p tag.
            -

            43.0.0 11/12/2022

            -
            • New: Linkify! Links like https://breckyunits.com and email addresses like feedback@scroll.pub are now compiled to HTML a tags automatically. Note: if an a tag is detected in the node Linkify will be DISABLED for that node.
            -
            • BREAKING: (no one should be affected) slim chance linkify may insert links where you previously did not want them.
            +

            43.0.0 11/12/2022

            +
            • New: Linkify! Links like https://breckyunits.com and email addresses like feedback@scroll.pub are now compiled to HTML a tags automatically. Note: if an a tag is detected in the node Linkify will be DISABLED for that node.
            +
            • BREAKING: (no one should be affected) slim chance linkify may insert links where you previously did not want them.
            -

            42.0.0 11/09/2022

            -
            • BREAKING: scroll check is now scroll test
            +

            42.0.0 11/09/2022

            +
            • BREAKING: scroll check is now scroll test
            -

            41.0.0 11/08/2022

            -
            • BREAKING: switched from date format of MM-DD-YYYY to YYYY.MM.DD
            +

            41.0.0 11/08/2022

            +
            • BREAKING: switched from date format of MM-DD-YYYY to YYYY.MM.DD
            search ^# (\d+\.\d+\.\d+) (\d+)\-(\d+)\-(\d+) replace # $1 $4.$2.$3 -

            40.0.0 11/05/2022

            -
            • BREAKING: (no one should be affected) caption now extends the thought (*) node.
            +

            40.0.0 11/05/2022

            +
            • BREAKING: (no one should be affected) 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.

            -

            39.0.0 11/03/2022

            -
            • BREAKING: scroll init no longer creates a feed.xml file by default. You can easily add an XML feed manually with the 2 steps below:
            +

            39.0.0 11/03/2022

            +
            • BREAKING: 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 @@ -1967,180 +1972,180 @@ printFeed index comment Add the line below to your posts and/or settings import file. rssFeedUrl feed.xml -

            38.2.0 11/01/2022

            -
            • new dayjs aftertext directive.
            -
            -

            38.1.0 11/01/2022

            -
            • fix group page not having a header.
            -
            -

            38.0.0 10/31/2022

            -
            • add left and right buttons to default theme.
            -
            -

            37.1.1 10/28/2022

            -
            • Fixed bad table regression where table content was not printing
            -
            -

            37.1.0 10/28/2022

            -
            • Documentation improvement
            -
            -

            37.0.0 10/28/2022

            -
            • BREAKING: Removed the original aftertext node in favor of * nodes. Regex [search replace] to upgrade: ^aftertext\n *
            • -
            • BREAKING: Removed basic paragraph node. Regex [search replace] to upgrade: ^paragraph\n *
            • -
            • BREAKING: Removed basic question node. Regex [search replace] to upgrade: ^question ?
            • -
            • BREAKING: Removed basic section node. Regex [search replace] to upgrade: ^section #
            • -
            • BREAKING: Removed basic subsection node. Regex [search replace] to upgrade: ^subsection ##
            • -
            • BREAKING: Removed basic list node.
            • -
            • BREAKING: Removed basic orderedList node.
            • -
            • BREAKING: Removed basic unorderedList node.
            • -
            • BREAKING: Removed support for 🔗 links. Regex [search replace] to upgrade: ([^ ]+)🔗([^ ]+) 2">1
            -
            -

            The 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.

            -

            36.1.0 10/27/2022

            -
            • Now you can leave the "pattern" part blank in link node in aftertext to make the whole line a link.
            -
            • Adjust estimateLines hueristics
            -
            -

            36.0.1 10/24/2022

            -
            • Fix home icon
            -
            -

            36.0.0 10/22/2022

            -
            • BREAKING: simpler CSS and header
            -
            -

            35.1.2 10/12/2022

            -
            • cleanup previous commit
            -
            -

            35.1.1 10/12/2022

            -
            • fix duplicated text in * nodes bug
            -
            -

            35.1.0 10/05/2022

            -
            • Added new better way to do lists.
            +

            38.2.0 11/01/2022

            +
            • new dayjs aftertext directive.
            +
            +

            38.1.0 11/01/2022

            +
            • fix group page not having a header.
            +
            +

            38.0.0 10/31/2022

            +
            • add left and right buttons to default theme.
            +
            +

            37.1.1 10/28/2022

            +
            • Fixed bad table regression where table content was not printing
            +
            +

            37.1.0 10/28/2022

            +
            • Documentation improvement
            +
            +

            37.0.0 10/28/2022

            +
            • BREAKING: Removed the original aftertext node in favor of * nodes. Regex [search replace] to upgrade: ^aftertext\n *
            • +
            • BREAKING: Removed basic paragraph node. Regex [search replace] to upgrade: ^paragraph\n *
            • +
            • BREAKING: Removed basic question node. Regex [search replace] to upgrade: ^question ?
            • +
            • BREAKING: Removed basic section node. Regex [search replace] to upgrade: ^section #
            • +
            • BREAKING: Removed basic subsection node. Regex [search replace] to upgrade: ^subsection ##
            • +
            • BREAKING: Removed basic list node.
            • +
            • BREAKING: Removed basic orderedList node.
            • +
            • BREAKING: Removed basic unorderedList node.
            • +
            • BREAKING: Removed support for 🔗 links. Regex [search replace] to upgrade: ([^ ]+)🔗([^ ]+) 2">1
            +
            +

            The 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.

            +

            36.1.0 10/27/2022

            +
            • Now you can leave the "pattern" part blank in link node in aftertext to make the whole line a link.
            +
            • Adjust estimateLines hueristics
            +
            +

            36.0.1 10/24/2022

            +
            • Fix home icon
            +
            +

            36.0.0 10/22/2022

            +
            • BREAKING: simpler CSS and header
            +
            +

            35.1.2 10/12/2022

            +
            • cleanup previous commit
            +
            +

            35.1.1 10/12/2022

            +
            • fix duplicated text in * nodes bug
            +
            +

            35.1.0 10/05/2022

            +
            • Added new better way to do lists.
            🎉 Added new better way to do lists.
            -

            35.0.0 10/04/2022

            -
            • BREAKING: (no one should be affected) changed return value of api method findScrollsInDirRecursive.
            +

            35.0.0 10/04/2022

            +
            • BREAKING: (no one should be affected) changed return value of api method findScrollsInDirRecursive.
            -

            34.2.0 10/03/2022

            -
            • add redirectTo tag
            +

            34.2.0 10/03/2022

            +
            • add redirectTo tag
            -

            34.1.0 10/02/2022

            -
            • had an idea for a new type of text tag that blinks
            +

            34.1.0 10/02/2022

            +
            • had an idea for a new type of text tag that blinks
            -

            34.0.3 9/30/2022

            -
            • Fix github workflow building.
            +

            34.0.3 9/30/2022

            +
            • Fix github workflow building.
            -

            34.0.2 9/30/2022

            -
            • !
            +

            34.0.2 9/30/2022

            +
            • !
            -

            34.0.1 9/30/2022

            -
            • test fix
            +

            34.0.1 9/30/2022

            +
            • test fix
            -

            34.0.0 9/30/2022

            -
            • add support for recursive building and checking using pipes! scroll list | scroll build
            -
            • BREAKING: (no one should be affected) renamed execute method on ScrollCli class to executeUsersInstructionsFromShell
            +

            34.0.0 9/30/2022

            +
            • add support for recursive building and checking using pipes! scroll list | scroll build
            +
            • BREAKING: (no one should be affected) renamed execute method on ScrollCli class to executeUsersInstructionsFromShell
            -

            33.1.0 9/29/2022

            -
            • remove extraneous atoms and lines printing in CLI
            +

            33.1.0 9/29/2022

            +
            • remove extraneous atoms and lines printing in CLI
            -

            33.0.0 9/29/2022

            -
            • BREAKING: (no one should be affected) removed "migrate" command. was more trouble than it was worth. better to have that as a separate module.
            • -
            • BREAKING: (no one should be affected) where command is now list
            +

            33.0.0 9/29/2022

            +
            • BREAKING: (no one should be affected) removed "migrate" command. was more trouble than it was worth. better to have that as a separate module.
            • +
            • BREAKING: (no one should be affected) where command is now list
            -

            32.0.0 9/27/2022

            -
            • improved 'where' command to scan pwd and skip node_modules folders. much faster and simpler.
            +

            32.0.0 9/27/2022

            +
            • improved 'where' command to scan pwd and skip node_modules folders. much faster and simpler.
            -

            31.5.0 9/9/2022

            -
            • new parsers: ?, # and ##
            +

            31.5.0 9/9/2022

            +
            • new parsers: ?, # and ##
            -

            A Header

            +

            A Header

            -

            A Subheader

            +

            A Subheader

            -

            Have you thought of the most important question?

            +

            Have you thought of the most important question?

            -

            31.4.1 9/3/2022

            -
            • and that is why you always run the tests.
            +

            31.4.1 9/3/2022

            +
            • and that is why you always run the tests.
            -

            31.4.0 9/3/2022

            -
            • New parsers: *, footnote, and readingList
            +

            31.4.0 9/3/2022

            +
            • New parsers: *, footnote, and readingList
            -

            This 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.

            * 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! -

            31.3.0 9/3/2022

            -
            • Fixed bad regression where only the first atom of a replacement line was getting replaced.
            +

            31.3.0 9/3/2022

            +
            • Fixed bad regression where only the first atom of a replacement line was getting replaced.
            -

            31.2.0 9/2/2022

            -
            • added openGraphImage node
            +

            31.2.0 9/2/2022

            +
            • added openGraphImage node
            -

            31.1.0 9/1/2022

            -
            • replace now supports multiline strings
            -
            • fixed broken links bug if using keyboard nav without groups
            +

            31.1.0 9/1/2022

            +
            • replace now supports multiline strings
            +
            • fixed broken links bug if using keyboard nav without groups
            -

            31.0.0 8/31/2022

            -
            • BREAKING: upgraded to jtree 56. This is not likely to break anyone. However, if you are extending Scroll with your own nodeTypes you will need to make sure that your abstract nodes (and only your abstract nodes) have an id that begins with abstract. You can then remove all occurrences of the parser abstract from your grammar node definitions.
            +

            31.0.0 8/31/2022

            +
            • BREAKING: upgraded to jtree 56. This is not likely to break anyone. However, if you are extending Scroll with your own nodeTypes you will need to make sure that your abstract nodes (and only your abstract nodes) have an id that begins with abstract. You can then remove all occurrences of the parser abstract from your grammar node definitions.
            -

            30.1.1 8/30/2022

            -
            • Improve header message thanks to dg's feedback
            +

            30.1.1 8/30/2022

            +
            • Improve header message thanks to dg's feedback
            -

            30.1.0 8/29/2022

            -
            • Perf: ~2x as fast as v30.1
            +

            30.1.0 8/29/2022

            +
            • Perf: ~2x as fast as v30.1
            -

            30.0.0 8/29/2022

            -
            • Perf: ~2x as fast as v29
            -
            • BREAKING: If using getFullyExpandedFile(str) replace with getFullyExpandedFile(str).code
            • -
            • BREAKING: If using any ScrollFile programatically, a few undocumented getters may have changed.
            +

            30.0.0 8/29/2022

            +
            • Perf: ~2x as fast as v29
            +
            • BREAKING: If using getFullyExpandedFile(str) replace with getFullyExpandedFile(str).code
            • +
            • BREAKING: If using any ScrollFile programatically, a few undocumented getters may have changed.
            -

            29.0.0 8/28/2022

            -
            • BREAKING: if using programatically instead of ScrollPage use ScrollFile
            +

            29.0.0 8/28/2022

            +
            • BREAKING: if using programatically instead of ScrollPage use ScrollFile
            -

            28.3.2 8/27/2022

            -
            • fixed bug with open graph image tags
            +

            28.3.2 8/27/2022

            +
            • fixed bug with open graph image tags
            -

            28.3.1 8/27/2022

            -
            • fixed minor grammar typo and added test
            +

            28.3.1 8/27/2022

            +
            • fixed minor grammar typo and added test
            -

            28.3.0 8/27/2022

            -
            • added author and kpiTable node types
            +

            28.3.0 8/27/2022

            +
            • added author and kpiTable node types
            -

            28.2.0 8/26/2022

            -
            • export getFullyExpandedFile
            +

            28.2.0 8/26/2022

            +
            • export getFullyExpandedFile
            -

            28.1.0 8/26/2022

            -
            • imports can now be recursive
            +

            28.1.0 8/26/2022

            +
            • imports can now be recursive
            -

            28.0.0 8/26/2022

            -

            This is a major update that radically simplifies Scroll and adds significant new capabilities.

            +

            28.0.0 8/26/2022

            +

            This is a major update that radically simplifies Scroll and adds significant new capabilities.

            -

            From 3 file types to 1

            +

            From 3 file types to 1

            -

            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.

            -

            Imports and variables

            +

            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.

            +

            Imports and variables

            -

            Use [filepath] to import one scroll file into another. Use replace and replaceDefault for variables.

            -

            Add your own Grammar extensions directly in your Scroll files

            +

            Use [filepath] to import one scroll file into another. Use replace and replaceDefault for variables.

            +

            Add your own Grammar extensions directly in your Scroll files

            -

            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).

            -

            Unlimited Tags and Tag Pages

            +

            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).

            +

            Unlimited Tags and Tag Pages

            -

            Add files to one or more tags and then customize how each tag page prints. No more magic or implicit creation of collection pages.

            -

            Multiple Compiler Passes

            +

            Add files to one or more tags and then customize how each tag page prints. No more magic or implicit creation of collection pages.

            +

            Multiple Compiler Passes

            -

            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.

            -

            Change list

            +

            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.

            +

            Change list

            -
            • BREAKING: The git setting is renamed to viewSourceBaseUrl
            • -
            • BREAKING: The sourceLink setting is renamed to viewSourceUrl
            • -
            • BREAKING: removed skipIndexPage. Instead you now opt-in to group pages like this: groups index.html
            • -
            • BREAKING: removed scroll.settings concept. Use settings.scroll now.
            • -
            • BREAKING: footer is now scrollFooter and header is now scrollHeader
            • -
            • BREAKING: removed ignoreGrammarFiles. Custom grammar extensions must now be explicitly imported and/or be in .scroll files.
            • -
            • BREAKING: changed link text from "Article source" to "View source"
            • -
            • BREAKING: css setting is now scrollCss
            • -
            • BREAKING: DefaultScrollScriptCompiler is now DefaultScrollCompiler
            • -
            • BREAKING: removed buildSinglePages, buildIndexPage, buildSnippetsPage, buildRssFeed, and buildCssFile. Everything done by buildFiles now. See 'full.scroll', index.scroll, feed.scroll, and style.scroll in tests/kitchenSink for how to implement those in new pattern.
            • -
            • BREAKING: in default theme CSS some class names have changed:
            +
            • BREAKING: The git setting is renamed to viewSourceBaseUrl
            • +
            • BREAKING: The sourceLink setting is renamed to viewSourceUrl
            • +
            • BREAKING: removed skipIndexPage. Instead you now opt-in to group pages like this: groups index.html
            • +
            • BREAKING: removed scroll.settings concept. Use settings.scroll now.
            • +
            • BREAKING: footer is now scrollFooter and header is now scrollHeader
            • +
            • BREAKING: removed ignoreGrammarFiles. Custom grammar extensions must now be explicitly imported and/or be in .scroll files.
            • +
            • BREAKING: changed link text from "Article source" to "View source"
            • +
            • BREAKING: css setting is now scrollCss
            • +
            • BREAKING: DefaultScrollScriptCompiler is now DefaultScrollCompiler
            • +
            • BREAKING: removed buildSinglePages, buildIndexPage, buildSnippetsPage, buildRssFeed, and buildCssFile. Everything done by buildFiles now. See 'full.scroll', index.scroll, feed.scroll, and style.scroll in tests/kitchenSink for how to implement those in new pattern.
            • +
            • BREAKING: in default theme CSS some class names have changed:
            scrollArticleDateComponent => scrollDateComponent scrollArticlePageComponent => scrollFilePageComponent scrollSingleArticleTitle => scrollFilePageTitle @@ -2148,53 +2153,53 @@ scrollArticleSourceLinkComponent => scrollFileViewSourceUrlComponent scrollIndexPageComponent => scrollGroupPageComponent scrollIndexPageFileContainerComponent => scrollGroupPageFileContainerComponent -
            • just calling ScrollScript Scroll again unless it becomes confusing
            -
            • keyboardNav will now use the first group a file belongs to if prev and next are not supplied
            -

            Updating custom CSS

            +
            • just calling ScrollScript Scroll again unless it becomes confusing
            +
            • keyboardNav will now use the first group a file belongs to if prev and next are not supplied
            +

            Updating custom CSS

            comment Put this in a file named style.scroll buildCss style.css gazetteCSS -

            27.1.1 8/24/2022

            -
            • only activate keyboard shortcuts if no element has focus
            +

            27.1.1 8/24/2022

            +
            • only activate keyboard shortcuts if no element has focus
            -

            27.1.0 8/24/2022

            -
            • added new cli command: scroll where
            +

            27.1.0 8/24/2022

            +
            • added new cli command: scroll where
            -

            27.0.1 8/23/2022

            -
            • mutability fix
            +

            27.0.1 8/23/2022

            +
            • mutability fix
            -

            27.0.0 8/23/2022

            -
            • added keyboardNav node
            -
            • BREAKING: all permalink lines in .scroll files need .html. Run scroll migrate to find and update automatically.
            +

            27.0.0 8/23/2022

            +
            • added keyboardNav node
            +
            • BREAKING: all permalink lines in .scroll files need .html. Run scroll migrate to find and update automatically.
            -

            26.1.0 8/23/2022

            -
            • export SCROLL_CSS for tryscroll app
            -
            • now calling the language ScrollScript instead of Scrolldown
            +

            26.1.0 8/23/2022

            +
            • export SCROLL_CSS for tryscroll app
            +
            • now calling the language ScrollScript instead of Scrolldown
            -

            26.0.0 8/23/2022

            -
            • (potentially) breaking: scrolldown.grammar is no longer built/checked in and SCROLLDOWNGRAMMARFILENAME no longer exported.
            +

            26.0.0 8/23/2022

            +
            • (potentially) breaking: scrolldown.grammar is no longer built/checked in and SCROLLDOWNGRAMMARFILENAME no longer exported.
            -

            25.6.0 8/19/2022

            -
            • simpler API for programmatic usage: new ScrollPage('title Hello world')
            +

            25.6.0 8/19/2022

            +
            • simpler API for programmatic usage: new ScrollPage('title Hello world')
            -

            25.5.1 7/22/2022

            -
            • minor grammar fix
            +

            25.5.1 7/22/2022

            +
            • minor grammar fix
            -

            25.5.0 7/22/2022

            -
            • path fixes for Windows thanks to @celtic-coder
            +

            25.5.0 7/22/2022

            +
            • path fixes for Windows thanks to @celtic-coder
            -

            25.4.0 7/14/2022

            -
            • 50% faster builds
            +

            25.4.0 7/14/2022

            +
            • 50% faster builds
            -

            25.3.2 7/14/2022

            -
            • added cacheing for 40% faster builds
            +

            25.3.2 7/14/2022

            +
            • added cacheing for 40% faster builds
            -

            25.3.1 7/14/2022

            -
            • fixed links in treeTable
            +

            25.3.1 7/14/2022

            +
            • fixed links in treeTable
            -

            25.3.0 7/14/2022

            -
            • added treeTable
            +

            25.3.0 7/14/2022

            +
            • added treeTable
            table delimiter particles @@ -2224,33 +2229,33 @@ print "Hello world" -

            25.2.1 7/01/2022

            -
            • fixed broken links in feed.xml
            +

            25.2.1 7/01/2022

            +
            • fixed broken links in feed.xml
            -

            25.2.0 6/22/2022

            -
            • added htmlTitle and sourceLink parsers so an article can override the defaults
            +

            25.2.0 6/22/2022

            +
            • added htmlTitle and sourceLink parsers so an article can override the defaults
            -

            25.1.0 6/19/2022

            -
            • if scroll has an rss feed add a tag to built pages
            +

            25.1.0 6/19/2022

            +
            • if scroll has an rss feed add a tag to built pages
            -

            25.0.0 6/15/2022

            -
            • on single article pages, the header will now span across all columns.
            +

            25.0.0 6/15/2022

            +
            • on single article pages, the header will now span across all columns.
            -

            24.9.0 6/15/2022

            -
            • added "css" setting. Set css split to write CSS to scroll.css instead of inline, or css none to not generate CSS.
            -
            • removed extra blank lines in snippets.html generation
            +

            24.9.0 6/15/2022

            +
            • added "css" setting. Set css split to write CSS to scroll.css instead of inline, or css none to not generate CSS.
            +
            • removed extra blank lines in snippets.html generation
            -

            24.8.0 6/15/2022

            -
            • if "baseUrl" is set building will also generate an RSS "feed.xml"
            +

            24.8.0 6/15/2022

            +
            • if "baseUrl" is set building will also generate an RSS "feed.xml"
            -

            24.7.0 6/13/2022

            -
            • fix when using Scroll programmatically image sizeOf check will use correct folder
            -
            • add param to specify index/snippets page when using programmatically
            +

            24.7.0 6/13/2022

            +
            • fix when using Scroll programmatically image sizeOf check will use correct folder
            +
            • add param to specify index/snippets page when using programmatically
            -

            24.6.0 6/10/2022

            -
            • added wrap parser for advanced custom wraps in aftertext.
            +

            24.6.0 6/10/2022

            +
            • added 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.

            Some !simple! and *advanced* usages. An #absolute link# and @@@a relative link@@@. Show some ++added text++ or some --deleted text--. inlineMarkup ! em inlineMarkup * b @@ -2258,40 +2263,40 @@ inlineMarkup @@@ a href="potato.html" inlineMarkup ++ span style="color:green" inlineMarkup -- span style="color:red; text-decoration: line-through;" -

            24.5.0 6/10/2022

            -
            • added wrapsOn parser to aftertext.
            +

            24.5.0 6/10/2022

            +
            • added 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.

            Support for traditional *bold*, `code`, and _italics_ in aftertext with the parser `wrapsOn`. -

            24.4.0 6/08/2022

            -
            • if your scroll has an article(s) with "endSnippet", scroll will create "snippets.html".
            +

            24.4.0 6/08/2022

            +
            • if your scroll has an article(s) with "endSnippet", scroll will create "snippets.html".
            -

            24.3.1 5/25/2022

            -
            • fix bug where images were stuck at 35ch even when the browser sized columns wider
            +

            24.3.1 5/25/2022

            +
            • fix bug where images were stuck at 35ch even when the browser sized columns wider
            -

            24.3.0 2/16/2022

            -

            This tiny release adds some ways to include more caveats and context around atoms and references.

            -
            • added 'caveat' directive to aftertext for adding caveats around parts of text
            • -
            • added 'note' directive to aftertext links for providing more context around included links
            +

            24.3.0 2/16/2022

            +

            This tiny release adds some ways to include more caveats and context around atoms and references.

            +
            • added 'caveat' directive to aftertext for adding caveats around parts of text
            • +
            • added 'note' directive to aftertext links for providing more context around included links
            -

            Caveat Example

            +

            Caveat Example

            -

            This is a great idea.

            +

            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. -

            Link Quote Example

            +

            Link Quote Example

            -

            This report showed the treatment had a big impact.

            +

            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. -

            24.2.0 1/18/2022

            -
            • added 'id' directive to aftertext for adding ids to paragraphs

            • -
            • added 'loremIpsum' nodeType to help in testing and exploring
            +

            24.2.0 1/18/2022

            +
            • added 'id' directive to aftertext for adding ids to paragraphs

            • +
            • added 'loremIpsum' nodeType to help in testing and exploring
            -

            Example demonstrating the above:

            +

            Example demonstrating the above:

            aftertext Click here to go to the middle paragraph. link #middleParagraph Click here @@ -2303,17 +2308,17 @@ id middleParagraph loremIpsum 20 -

            24.1.1 1/13/2022

            -
            • fix bug where migrator was not replacing 🔗 links in paragraphs when upgrading to aftertext
            • -
            • fix typo in release notes
            +

            24.1.1 1/13/2022

            +
            • fix bug where migrator was not replacing 🔗 links in paragraphs when upgrading to aftertext
            • +
            • fix typo in release notes
            -

            24.1.0 1/13/2022

            -
            • added migrate command to automate migrations when there are breaking changes
            -
            • added background color and styling to inline code elements in default theme
            +

            24.1.0 1/13/2022

            +
            • added migrate command to automate migrations when there are breaking changes
            +
            • added background color and styling to inline code elements in default theme
            -

            24.0.0 1/11/2022

            -
            • if a table has a column name ending in "Link", that will be used to link the matching column. See example below.
            -
            • if you have tables with a column ending in "Link" beware the new behavior
            +

            24.0.0 1/11/2022

            +
            • if a table has a column name ending in "Link", that will be used to link the matching column. See example below.
            +
            • if you have tables with a column ending in "Link" beware the new behavior
            table delimiter | @@ -2327,22 +2332,22 @@ Wikipedia -
            • the first paragraph of an article no longer prints a dateline. Use aftertext instead. See example below.
            -

            By default the article's date will be used but you can also provide a custom date.

            +
            • the first paragraph of an article no longer prints a dateline. Use aftertext instead. See example below.
            +

            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.

            -

            23.2.0 12/22/2021

            -
            • add "matchAll" and "match" support to aftertext for more advanced matching options
            • -
            • add "class" markup directive to aftertext
            • -
            • add "css" node for easier insertion of CSS
            -
            • fix bug in aftertext when 2 tags started at same index
            • -
            • make basic dateline work in browser
            -
            -

            Can you show an example of the new advanced aftertext features?

            -
            -

            How much wood can a woodchuck chuck if a woodchuck could chuck wood?

            +

            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.

            +

            23.2.0 12/22/2021

            +
            • add "matchAll" and "match" support to aftertext for more advanced matching options
            • +
            • add "class" markup directive to aftertext
            • +
            • add "css" node for easier insertion of CSS
            +
            • fix bug in aftertext when 2 tags started at same index
            • +
            • make basic dateline work in browser
            +
            +

            Can you show an example of the new advanced aftertext features?

            +
            +

            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 @@ -2359,126 +2364,126 @@ border: 1px dashed red; padding: 5px; } -

            23.1.0 12/21/2021

            -
            • add dateline node to aftertext.
            +

            23.1.0 12/21/2021

            +
            • add dateline node to aftertext.
            -

            23.0.0 12/09/2021

            -
            • add aftertext node type, with bold, italics, underline, link (& quick link), email, code and strikethrough parsers
            • -
            • add belowAsCode and aboveAsCode
            • -
            • split base grammar into files for easier extensibility
            +

            23.0.0 12/09/2021

            +
            • add aftertext node type, with bold, italics, underline, link (& quick link), email, code and strikethrough parsers
            • +
            • add belowAsCode and aboveAsCode
            • +
            • split base grammar into files for easier extensibility
            -

            Can you show an example of aftertext?

            +

            Can you show an example of aftertext?

            -

            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:

            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 -

            22.4.0 11/25/2021

            -
            • add basic caption support to images
            +

            22.4.0 11/25/2021

            +
            • add basic caption support to images

            This is a caption

            blog/screenshot.png caption This is a caption -

            22.3.0 08/23/2021

            -
            • columnWidth to set a custom column width per article or folder
            • -
            • maxColumns can be set globally in settings
            +

            22.3.0 08/23/2021

            +
            • columnWidth to set a custom column width per article or folder
            • +
            • maxColumns can be set globally in settings
            -

            22.2.0 08/23/2021

            -
            • integrated design feedback into default theme for better readability
            +

            22.2.0 08/23/2021

            +
            • integrated design feedback into default theme for better readability
            -

            22.1.0 07/23/2021

            -
            • you can now ignore custom grammar files in a dir with ignoreGrammarFiles
            +

            22.1.0 07/23/2021

            +
            • you can now ignore custom grammar files in a dir with ignoreGrammarFiles
            -

            22.0.0 07/09/2021

            -
            • scroll.settings file is now optional and you can use scroll to build a single page.
            • -
            • you can now set 'header' and/or 'footer' on articles.
            +

            22.0.0 07/09/2021

            +
            • scroll.settings file is now optional and you can use scroll to build a single page.
            • +
            • you can now set 'header' and/or 'footer' on articles.
            -

            21.4.0 07/08/2021

            -
            • you can now set 'maxColumns' on articles.
            +

            21.4.0 07/08/2021

            +
            • you can now set 'maxColumns' on articles.
            -

            21.3.0 07/07/2021

            -
            • if all articles have 'skipIndexPage', 'index.html' will not be built
            +

            21.3.0 07/07/2021

            +
            • if all articles have 'skipIndexPage', 'index.html' will not be built
            -

            21.2.0 07/06/2021

            -
            • internal CSS changes
            +

            21.2.0 07/06/2021

            +
            • internal CSS changes
            -

            21.0.0 06/21/2021

            -
            • built in support for custom grammars!
            -
            • internal nodejs API changes: Article is no longer exported and ScrollBuilder is now ScrollFolder
            +

            21.0.0 06/21/2021

            +
            • built in support for custom grammars!
            +
            • internal nodejs API changes: Article is no longer exported and ScrollBuilder is now ScrollFolder
            -

            20.0.0 06/21/2021

            -
            • new question nodetype. Simply compiles to an h4 for now but more semantic this way.
            • -
            • new section nodetype. Simply compiles to an h3 for now but more semantic this way.
            • -
            • new subsection nodetype. Simply compiles to an h4 for now but more semantic this way.
            -
            • title2-title6 have been removed. use question, section and subsection instead.
            +

            20.0.0 06/21/2021

            +
            • new question nodetype. Simply compiles to an h4 for now but more semantic this way.
            • +
            • new section nodetype. Simply compiles to an h3 for now but more semantic this way.
            • +
            • new subsection nodetype. Simply compiles to an h4 for now but more semantic this way.
            +
            • title2-title6 have been removed. use question, section and subsection instead.
            -

            Why the new question nodes?

            +

            Why the new question nodes?

            -

            Question and answer structures are literally older than the Socratic Method. Such a common semantic pattern deserves it's own parsers.

            -

            How do I migrate from title# nodes?

            +

            Question and answer structures are literally older than the Socratic Method. Such a common semantic pattern deserves it's own parsers.

            +

            How do I migrate from title# nodes?

            -

            The below regex may help.

            +

            The below regex may help.

            Find ^title\d (.+\?) ReplaceWith question $1 Find ^title\d (.+) ReplaceWith section $1 -

            19.3.1 06/20/2021

            -
            • show the version in footer
            -
            • fix title in single pages without a title
            +

            19.3.1 06/20/2021

            +
            • show the version in footer
            +
            • fix title in single pages without a title
            -

            19.3.0 06/20/2021

            -
            • fix bug where readme.scroll could be overwritten by init
            +

            19.3.0 06/20/2021

            +
            • fix bug where readme.scroll could be overwritten by init
            -

            19.2.0 06/17/2021

            -
            • improved styling for tables
            +

            19.2.0 06/17/2021

            +
            • improved styling for tables
            -

            19.1.0 06/17/2021

            -
            • fix bug with http links
            • -
            • simpler article padding and changed scroll title to h2 from h1
            +

            19.1.0 06/17/2021

            +
            • fix bug with http links
            • +
            • simpler article padding and changed scroll title to h2 from h1
            -

            19.0.0 06/17/2021

            -
            • ability to override header and footer
            +

            19.0.0 06/17/2021

            +
            • ability to override header and footer
            -

            18.4.0 06/17/2021

            -
            • improved alignment of images
            +

            18.4.0 06/17/2021

            +
            • improved alignment of images
            -

            18.3.0 06/16/2021

            -
            • og meta tags for social media sharing
            +

            18.3.0 06/16/2021

            +
            • og meta tags for social media sharing
            -

            18.2.0 06/16/2021

            -
            • title now links to "index.html". less magic and works much better locally
            +

            18.2.0 06/16/2021

            +
            • title now links to "index.html". less magic and works much better locally
            -

            18.1.1 06/16/2021

            -
            • fix regression where 2 columns on mobile were not downsizing to 1
            +

            18.1.1 06/16/2021

            +
            • fix regression where 2 columns on mobile were not downsizing to 1
            -

            18.1.0 06/16/2021

            -
            • short articles now are put into 1 or 2 columns
            +

            18.1.0 06/16/2021

            +
            • short articles now are put into 1 or 2 columns
            -

            18.0.0 06/15/2021

            -
            • build is now ~46% faster
            -
            • refactored html generation in preparation for easier extending and theming
            +

            18.0.0 06/15/2021

            +
            • build is now ~46% faster
            +
            • refactored html generation in preparation for easier extending and theming
            -

            17.5.0 06/05/2021

            -
            • fixed numerous bugs in importing RSS feeds and added examples
            +

            17.5.0 06/05/2021

            +
            • fixed numerous bugs in importing RSS feeds and added examples
            -

            17.4.0 06/04/2021

            -
            • typography adjustments
            -
            • fixed overlapping social icons up top on mobile. just keep git link
            +

            17.4.0 06/04/2021

            +
            • typography adjustments
            +
            • fixed overlapping social icons up top on mobile. just keep git link
            -

            17.3.0 06/03/2021

            -
            • images now link to the full size image
            +

            17.3.0 06/03/2021

            +
            • images now link to the full size image
            -

            17.2.2 06/02/2021

            -
            • fixed safari-only bug not painting overflowing code blocks on single pages
            +

            17.2.2 06/02/2021

            +
            • fixed safari-only bug not painting overflowing code blocks on single pages
            -

            17.2.1 05/25/2021

            -
            • fixed bug where sequential links were not getting parsed
            +

            17.2.1 05/25/2021

            +
            • fixed bug where sequential links were not getting parsed
            -

            17.2.0 05/25/2021

            -
            • tables can now break on single pages for higher information density
            +

            17.2.0 05/25/2021

            +
            • tables can now break on single pages for higher information density
            -

            17.1.0 05/25/2021

            -
            • pipeTable
            +

            17.1.0 05/25/2021

            +
            • pipeTable
            @@ -2489,123 +2494,123 @@
            whatBecause it's awesome!
            -

            17.0.0 05/25/2021

            -
            • tabTable and commaTable
            -
            • table is now spaceTable
            -
            • do not crash if an empty row in a table
            +

            17.0.0 05/25/2021

            +
            • tabTable and commaTable
            +
            • table is now spaceTable
            +
            • do not crash if an empty row in a table
            -

            16.2.0 05/24/2021

            -
            • do not crash if an image is not found
            +

            16.2.0 05/24/2021

            +
            • do not crash if an image is not found
            -

            16.1.0 05/24/2021

            -
            • building a site is now ~2.4x faster 🏎
            +

            16.1.0 05/24/2021

            +
            • building a site is now ~2.4x faster 🏎
            -

            16.0.0 05/22/2021

            -
            • rename scrollSettings.map to scroll.settings
            +

            16.0.0 05/22/2021

            +
            • rename scrollSettings.map to scroll.settings
            -

            15.0.0 05/21/2021

            -
            • Scroll will detect and emit image sizes during build to reduce layout shifts.
            +

            15.0.0 05/21/2021

            +
            • Scroll will detect and emit image sizes during build to reduce layout shifts.
            -

            14.3.0 05/21/2021

            -
            • Scroll is now somewhat usable as an NPM module.
            +

            14.3.0 05/21/2021

            +
            • Scroll is now somewhat usable as an NPM module.
            -

            14.2.0 05/20/2021

            -
            • added html head meta viewport tag for better mobile experience.
            +

            14.2.0 05/20/2021

            +
            • added html head meta viewport tag for better mobile experience.
            -

            14.1.0 05/20/2021

            -
            • added doctype tag
            • -
            • added html head meta description tag
            +

            14.1.0 05/20/2021

            +
            • added doctype tag
            • +
            • added html head meta description tag
            -

            14.0.0 05/19/2021

            -
            • removed links nodeType
            • -
            • fixed bug where sometimes permalinks were still using title and not filename
            +

            14.0.0 05/19/2021

            +
            • removed links nodeType
            • +
            • fixed bug where sometimes permalinks were still using title and not filename
            -

            13.3.0 05/18/2021

            -
            • html and image node types
            +

            13.3.0 05/18/2021

            +
            • html and image node types
            -

            To use an image node:

            +

            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:

            +

            QuickParagraphs are now an error. When you want to drop in some HTML, do so with HTML node:

            html <b>anything goes here</b> -

            13.2.0 05/18/2021

            -
            • Added scroll check command
            +

            13.2.0 05/18/2021

            +
            • Added scroll check command
            -

            13.1.0 05/18/2021

            -
            • 🔗links in lists as well as paragraphs
            +

            13.1.0 05/18/2021

            +
            • 🔗links in lists as well as paragraphs
            -

            13.0.0 05/17/2021

            -
            • 🔗links in paragraph nodes.
            • -
            • skipIndexPage nodeType
            +

            13.0.0 05/17/2021

            +
            • 🔗links in paragraph nodes.
            • +
            • skipIndexPage nodeType
            -

            How do I use the new single atom links?

            +

            How do I use the new single atom links?

            -

            For single atom links in paragraph nodes only (for now) you can now do:

            +

            For 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.

            +

            Below is a regex for migrating existing *.scroll files.

            <a href="https://([^"]+)">([^ ]+)</a> $2🔗$1 -

            How do I use the 🔗link tag with multiatom links?

            +

            How do I use the 🔗link tag with multiatom links?

            -

            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:

            -
            • 1. Link just one atom. If you need more, perhaps camelCase or snake_case your atoms together into one concept.
            • -
            • 2. Repeat the link twice foo 🔗link bar 🔗link
            • -
            • 3. Use <a> tags.
            • -
            • 4. Extend the ScrollScript grammar for your site.
            -

            Can I not include a page in the index page?

            -

            Now you can! Sometimes you just want to publish an independent page without including it in the index. To do that, just add skipIndexPage.

            +

            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:

            +
            • 1. Link just one atom. If you need more, perhaps camelCase or snake_case your atoms together into one concept.
            • +
            • 2. Repeat the link twice foo 🔗link bar 🔗link
            • +
            • 3. Use <a> tags.
            • +
            • 4. Extend the ScrollScript grammar for your site.
            +

            Can I not include a page in the index page?

            +

            Now you can! Sometimes you just want to publish an independent page without including it in the index. To do that, just add skipIndexPage.

            -

            12.1.0 05/14/2021

            -
            • chat nodeType
            +

            12.1.0 05/14/2021

            +
            • chat nodeType
            You can now do dialogues
            Cool!
            -

            12.0.0 05/12/2021

            -
            • scroll create is now scroll init
            • -
            • Removed export command
            -
            • removed example.com folder. Less code and now flat.
            -
            -

            11.0.0 05/11/2021

            -
            • list, orderedList, and links node types
            • -
            • codeWithLanguageNode
            -
            • HTML escaped in code blocks
            -
            -

            10.0.0 05/10/2021

            -
            • table nodeType for SSVs with linkify
            • -
            • Better docs in ScrollScript grammar
            -
            • Removed list nodeType
            • -
            • Removed link nodeType
            -
            • Windows return character fix
            • -
            • multiline support in subheader nodeTypes
            -
            -

            9.0.0 05/05/2021

            -
            • ScrollScript now has a quote nodeType.
            -
            • Code block format bug fixes.
            • -
            • Styling improvements
            -
            -

            8.0.0 04/10/2021

            -
            • Scroll now just builds files. No web server needed.
            -
            -

            7.0.0 04/03/2021

            -
            • Scroll the language is now called Scrolldown (thanks FB!).
            -
            • Bug fixes.
            -
            • Better perf.
            -
            -

            6.0.0 03/08/2021

            -
            • By popular request, Scroll now also publishes each article to its own page.
            • -
            • Fewer links. Do less. KISS.
            • -
            • Better perf.
            • -
            • "permalink" nodeType
            -
            -

            5.0.0 02/28/2021

            -
            • Changed name of everything from dumbdown to Scroll per user feedback
            -
            • File extension of articles needs to be "scroll" and not "dd" now.
            -
            -

            4.2.0 02/22/2021

            -
            • Fixed paragraph parsing and rendering
            -
            -

            4.1.0 02/22/2021

            -
            • "git" scrollSetting for article source links.
            +

            12.0.0 05/12/2021

            +
            • scroll create is now scroll init
            • +
            • Removed export command
            +
            • removed example.com folder. Less code and now flat.
            +
            +

            11.0.0 05/11/2021

            +
            • list, orderedList, and links node types
            • +
            • codeWithLanguageNode
            +
            • HTML escaped in code blocks
            +
            +

            10.0.0 05/10/2021

            +
            • table nodeType for SSVs with linkify
            • +
            • Better docs in ScrollScript grammar
            +
            • Removed list nodeType
            • +
            • Removed link nodeType
            +
            • Windows return character fix
            • +
            • multiline support in subheader nodeTypes
            +
            +

            9.0.0 05/05/2021

            +
            • ScrollScript now has a quote nodeType.
            +
            • Code block format bug fixes.
            • +
            • Styling improvements
            +
            +

            8.0.0 04/10/2021

            +
            • Scroll now just builds files. No web server needed.
            +
            +

            7.0.0 04/03/2021

            +
            • Scroll the language is now called Scrolldown (thanks FB!).
            +
            • Bug fixes.
            +
            • Better perf.
            +
            +

            6.0.0 03/08/2021

            +
            • By popular request, Scroll now also publishes each article to its own page.
            • +
            • Fewer links. Do less. KISS.
            • +
            • Better perf.
            • +
            • "permalink" nodeType
            +
            +

            5.0.0 02/28/2021

            +
            • Changed name of everything from dumbdown to Scroll per user feedback
            +
            • File extension of articles needs to be "scroll" and not "dd" now.
            +
            +

            4.2.0 02/22/2021

            +
            • Fixed paragraph parsing and rendering
            +
            +

            4.1.0 02/22/2021

            +
            • "git" scrollSetting for article source links.
            -

            +

            - +
            \ No newline at end of file diff --git a/releaseNotes.json b/releaseNotes.json index def6c64d4..bec911404 100644 --- a/releaseNotes.json +++ b/releaseNotes.json @@ -1,4 +1,11 @@ [ + { + "version": "150.0.0", + "releaseDate": "11/13/2024", + "bugFixes": 0, + "newFeatures": 1, + "breakingChanges": 1 + }, { "version": "149.0.0", "releaseDate": "11/13/2024", diff --git a/releaseNotes.scroll b/releaseNotes.scroll index 608837968..a3e909448 100644 --- a/releaseNotes.scroll +++ b/releaseNotes.scroll @@ -22,6 +22,12 @@ ciBadges.scroll br thinColumns +📦 150.0.0 11/13/2024 +🎉 added `concepts` parser for loading concepts in a file into a table +⚠️ BREAKING: (no one should be affected) nearly all Scroll code is now available to Scroll in the browser. Some internal APIs may have changed if using Scroll programmatically. + +This is prep work for the major release coming imminently which brings the full power of PPS to the browser, including ability to write Parsers, fully user Scrollsets, and more, dynamically, clientside in browser. + 📦 149.0.0 11/13/2024 🎉 `parsers.parsers` now ships with Scroll! Syntax highlighting, autocomplete, and other tools for writing parsers in try.scroll.pub. - Note: compiling these Parsers still requires desktop Scroll. Not everything runs in browser...yet diff --git a/releaseNotes.tsv b/releaseNotes.tsv index bfdd45c28..b7a45195f 100644 --- a/releaseNotes.tsv +++ b/releaseNotes.tsv @@ -1,4 +1,5 @@ version releaseDate bugFixes newFeatures breakingChanges +150.0.0 11/13/2024 0 1 1 149.0.0 11/13/2024 0 1 1 148.3.1 11/12/2024 1 0 0 148.3.0 11/12/2024 0 1 0 diff --git a/releaseNotes.txt b/releaseNotes.txt index 07aeb3766..dfd2bdded 100644 --- a/releaseNotes.txt +++ b/releaseNotes.txt @@ -25,6 +25,13 @@ Download as CSV | TSV | JSON [Image Omitted] https://github.com/breck7/scroll/actions/workflows/didTheTestsPass.yml undefined +150.0.0 11/13/2024 +================== +🎉 added `concepts` parser for loading concepts in a file into a table +⚠️ BREAKING: (no one should be affected) nearly all Scroll code is now available to Scroll in the browser. Some internal APIs may have changed if using Scroll programmatically. + +This is prep work for the major release coming imminently which brings the full power of PPS to the browser, including ability to write Parsers, fully user Scrollsets, and more, dynamically, clientside in browser. + 149.0.0 11/13/2024 ================== 🎉 `parsers.parsers` now ships with Scroll! Syntax highlighting, autocomplete, and other tools for writing parsers in try.scroll.pub. @@ -567,14 +574,14 @@ date,year,title,permalink,authors,tags,wordCount,minutes 11/13/2024,2024,Settings,settings.html,,,0,0 11/13/2024,2024,Scroll Prompt,scrollPrompt.html,,,1026,5.1 11/13/2024,2024,Scroll Roadmap,roadmap.html,,main,162,0.8 -11/13/2024,2024,Scroll Release Notes,releaseNotes.html,,main,14550,72.8 -11/13/2024,2024,Readme Prompt,readmePrompt.html,,,19340,96.7 +11/13/2024,2024,Scroll Release Notes,releaseNotes.html,,main,14630,73.2 +11/13/2024,2024,Readme Prompt,readmePrompt.html,,,19420,97.1 11/13/2024,2024,Scroll is a language for scientists of all ages,index.html,,,166,0.8 11/13/2024,2024,Particles LeetSheet,particlesLeetsheet.html,,,124,0.6 11/13/2024,2024,Parser Usage,parserUsage.html,,,270,1.4 -11/13/2024,2024,Parser Prompt,parserPrompt.html,,,17604,88 +11/13/2024,2024,Parser Prompt,parserPrompt.html,,,18916,94.6 11/13/2024,2024,Parsers LeetSheet,parserLeetsheet.html,,,299,1.5 -11/13/2024,2024,Scroll LeetSheet,leetsheet.html,,,872,4.4 +11/13/2024,2024,Scroll LeetSheet,leetsheet.html,,,877,4.4 11/13/2024,2024,Header,header.html,,,0,0 11/13/2024,2024,Scroll FAQ,faq.html,,main,3307,16.5 11/13/2024,2024,Download Scroll.pub,download.html,,,49,0.2 @@ -3214,4 +3221,4 @@ Cool! ================ 🎉 "git" scrollSetting for article source links. -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/releaseNotesMeasures.tsv b/releaseNotesMeasures.tsv index 24e489376..50e5bfab6 100644 --- a/releaseNotesMeasures.tsv +++ b/releaseNotesMeasures.tsv @@ -1,6 +1,6 @@ Name Values Coverage Question Example Type Source SortIndex IsComputed IsRequired IsConceptDelimiter Cue -version 571 100% What is the semantic version number? 149.0.0 string 1 true true 📦 -releaseDate 571 100% 11/13/2024 string 1.1 true true -bugFixes 571 100% How many bug fixes in this release? 0 number 1.2 true -newFeatures 571 100% How many new features in this release? 1 number 1.2 true -breakingChanges 571 100% How many breaking changes in this release? 1 number 1.2 true \ No newline at end of file +version 572 100% What is the semantic version number? 150.0.0 string 1 true true 📦 +releaseDate 572 100% 11/13/2024 string 1.1 true true +bugFixes 572 100% How many bug fixes in this release? 0 number 1.2 true +newFeatures 572 100% How many new features in this release? 1 number 1.2 true +breakingChanges 572 100% How many breaking changes in this release? 1 number 1.2 true \ No newline at end of file diff --git a/roadmap.html b/roadmap.html index 72adfcf75..8ba953840 100644 --- a/roadmap.html +++ b/roadmap.html @@ -3,12 +3,12 @@ Scroll Roadmap - + - + @@ -76,7 +76,7 @@ - +
            \ No newline at end of file diff --git a/roadmap.txt b/roadmap.txt index d3dad354e..3657d3196 100644 --- a/roadmap.txt +++ b/roadmap.txt @@ -38,4 +38,4 @@ In addition to the above, Scroll is written in Parsers and will get all the plan ⁂ -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 diff --git a/scroll.js b/scroll.js index e53ea5403..bc53f1fa4 100755 --- a/scroll.js +++ b/scroll.js @@ -27,17 +27,7 @@ const scrollKeywords = { replace: "replace", replaceJs: "replaceJs", replaceNodejs: "replaceNodejs", - footer: "footer", - buildConcepts: "buildConcepts", - buildMeasures: "buildMeasures", - buildHtml: "buildHtml", - buildPdf: "buildPdf" -} - -const makeLodashOrderByParams = str => { - const part1 = str.split(" ") - const part2 = part1.map(col => (col.startsWith("-") ? "desc" : "asc")) - return [part1.map(col => col.replace(/^\-/, "")), part2] + footer: "footer" } class FileInterface { @@ -85,134 +75,9 @@ class ScrollFileSystem extends ParticleFileSystem { return this.folderCache[folderPath] } } - -const removeBlanks = data => data.map(obj => Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== ""))) const defaultScrollParser = new ParticleFileSystem().getParser(Disk.getFiles(path.join(__dirname, "parsers")).filter(file => file.endsWith(PARSERS_FILE_EXTENSION))) const DefaultScrollParser = defaultScrollParser.parser // todo: remove? -// todo: tags is currently matching partial substrings -const getFilesWithTag = (tag, files) => files.filter(file => file.scrollProgram.buildsHtml && file.scrollProgram.tags.includes(tag)) - -// todo: clean this up -const getCueAtoms = rootParserProgram => - rootParserProgram - .filter(particle => particle.getLine().endsWith("Parser") && !particle.getLine().startsWith("abstract")) - .map(particle => particle.get("cue") || particle.getLine()) - .map(line => line.replace(/Parser$/, "")) - -const measureCache = new Map() -const parseMeasures = parser => { - if (measureCache.get(parser)) return measureCache.get(parser) - // Generate a fake program with one of every of the available parsers. Then parse it. Then we can easily access the meta data on the parsers - const dummyProgram = new parser( - Array.from( - new Set( - getCueAtoms(parser.cachedHandParsersProgramRoot) // is there a better method name than this? - ) - ).join("\n") - ) - // Delete any particles that are not measures - dummyProgram.filter(particle => !particle.isMeasure).forEach(particle => particle.destroy()) - dummyProgram.forEach(particle => { - // add nested measures - Object.keys(particle.definition.cueMapWithDefinitions).forEach(key => particle.appendLine(key)) - }) - // Delete any nested particles that are not measures - dummyProgram.topDownArray.filter(particle => !particle.isMeasure).forEach(particle => particle.destroy()) - const measures = dummyProgram.topDownArray.map(particle => { - return { - Name: particle.measureName, - Values: 0, - Coverage: 0, - Question: particle.definition.description, - Example: particle.definition.getParticle("example")?.subparticlesToString() || "", - Type: particle.typeForWebForms, - Source: particle.sourceDomain, - //Definition: parsedProgram.root.filename + ":" + particle.lineNumber - SortIndex: particle.sortIndex, - IsComputed: particle.isComputed, - IsRequired: particle.isMeasureRequired, - IsConceptDelimiter: particle.isConceptDelimiter, - Cue: particle.definition.get("cue") - } - }) - measureCache.set(parser, lodash.sortBy(measures, "SortIndex")) - return measureCache.get(parser) -} - -const addMeasureStats = (concepts, measures) => - measures.map(measure => { - let Type = false - concepts.forEach(concept => { - const value = concept[measure.Name] - if (value === undefined || value === "") return - measure.Values++ - - if (!Type) { - measure.Example = value.toString().replace(/\n/g, " ") - measure.Type = typeof value - Type = true - } - }) - measure.Coverage = Math.floor((100 * measure.Values) / concepts.length) + "%" - return measure - }) - -// note that this is currently global, assuming there wont be -// name conflicts in computed measures in a single scroll -const measureFnCache = {} -const computeMeasure = (parsedProgram, measureName, concept, concepts) => { - if (!measureFnCache[measureName]) { - // a bit hacky but works?? - const particle = parsedProgram.appendLine(measureName) - measureFnCache[measureName] = particle.computeValue - particle.destroy() - } - return measureFnCache[measureName](concept, measureName, parsedProgram, concepts) -} - -const parseConcepts = (parsedProgram, measures) => { - // Todo: might be a perf/memory/simplicity win to have a "segment" method in ScrollSDK, where you could - // virtually split a Particle into multiple segments, and then query on those segments. - // So we would "segment" on "id ", and then not need to create a bunch of new objects, and the original - // already parsed lines could then learn about/access to their respective segments. - const conceptDelimiter = measures.filter(measure => measure.IsConceptDelimiter)[0] - if (!conceptDelimiter) return [] - const concepts = parsedProgram.split(conceptDelimiter.Cue || conceptDelimiter.Name) - concepts.shift() // Remove the part before "id" - return concepts.map(concept => { - const row = {} - measures.forEach(measure => { - const measureName = measure.Name - const measureKey = measure.Cue || measureName.replace(/_/g, " ") - if (!measure.IsComputed) row[measureName] = concept.getParticle(measureKey)?.measureValue ?? "" - else row[measureName] = computeMeasure(parsedProgram, measureName, concept, concepts) - }) - return row - }) -} - -const arrayToCSV = (data, delimiter = ",") => { - if (!data.length) return "" - - // Extract headers - const headers = Object.keys(data[0]) - const csv = data.map(row => - headers - .map(fieldName => { - const fieldValue = row[fieldName] - // Escape commas if the value is a string - if (typeof fieldValue === "string" && fieldValue.includes(delimiter)) { - return `"${fieldValue.replace(/"/g, '""')}"` // Escape double quotes and wrap in double quotes - } - return fieldValue - }) - .join(delimiter) - ) - csv.unshift(headers.join(delimiter)) // Add header row at the top - return csv.join("\n") -} - class ScrollFile { constructor(codeAtStart, absoluteFilePath = "", fileSystem = new ScrollFileSystem({})) { this.fileSystem = fileSystem @@ -250,13 +115,6 @@ class ScrollFile { this.scrollProgram.setFile(this) } - get parsersRequiringExternals() { - const { parser } = this - // todo: could be cleaned up a bit - if (!parser.parsersRequiringExternals) parser.parsersRequiringExternals = parser.cachedHandParsersProgramRoot.filter(particle => particle.copyFromExternal).map(particle => particle.atoms[0]) - return parser.parsersRequiringExternals - } - // todo: speed this up and do a proper release. also could add more metrics like this. get lastCommitTime() { if (this._lastCommitTime === undefined) { @@ -276,116 +134,13 @@ class ScrollFile { return true } - _buildFileType(extension) { - const { fileSystem, scrollProgram, folderPath, filename, filePath } = this - const capitalized = lodash.capitalize(extension) - const buildKeyword = "build" + capitalized - if (!this.has(buildKeyword)) return - const { permalink } = scrollProgram - const outputFiles = this.get(buildKeyword)?.split(" ") || [""] - outputFiles.forEach(name => { - const link = name || permalink.replace(".html", "." + extension) - try { - fileSystem.writeProduct(path.join(folderPath, link), scrollProgram.compileTo(capitalized)) - this.log(`💾 Built ${link} from ${filename}`) - } catch (err) { - console.error(`Error while building '${filePath}' with extension '${extension}'`) - throw err - } - }) - } - - _copyExternalFiles(externalFilesCopied = {}) { - // If this file uses a parser that has external requirements, - // copy those from external folder into the destination folder. - const { parsersRequiringExternals, scrollProgram, folderPath, fileSystem, filename } = this - const { parserIdIndex } = scrollProgram - if (!externalFilesCopied[folderPath]) externalFilesCopied[folderPath] = {} - parsersRequiringExternals.forEach(parserId => { - if (externalFilesCopied[folderPath][parserId]) return - if (!parserIdIndex[parserId]) return - parserIdIndex[parserId].map(particle => { - const externalFiles = particle.copyFromExternal.split(" ") - externalFiles.forEach(name => { - const newPath = path.join(folderPath, name) - fileSystem.writeProduct(newPath, Disk.read(path.join(EXTERNALS_PATH, name))) - this.log(`💾 Copied external file needed by ${filename} to ${name}`) - }) - }) - if (parserId !== "scrollThemeParser") - // todo: generalize when not to cache - externalFilesCopied[folderPath][parserId] = true - }) - } - log(message) { if (this.logger) this.logger.log(message) } - // todo: cleanup - async buildOne() { - await this.build() // Run any build steps - this._buildFileType("parsers") - this._buildConceptsAndMeasures() // todo: call this buildDelimited? - this._buildFileType("csv") - this._buildFileType("tsv") - this._buildFileType("json") - } - async buildAll() { - await this.buildOne() - this.buildTwo() - } - - buildTwo(externalFilesCopied = {}) { - if (this.has(scrollKeywords.buildHtml)) this._copyExternalFiles(externalFilesCopied) - this._buildFileType("js") - this._buildFileType("txt") - this._buildFileType("html") - this._buildFileType("rss") - this._buildFileType("css") - if (this.has(scrollKeywords.buildPdf)) this.buildPdf() - } - - buildPdf() { - const { scrollProgram, filename } = this - const outputFile = scrollProgram.filenameNoExtension + ".pdf" - // relevant source code for chrome: https://github.com/chromium/chromium/blob/a56ef4a02086c6c09770446733700312c86f7623/components/headless/command_handler/headless_command_switches.cc#L22 - const command = `/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --headless --disable-gpu --no-pdf-header-footer --default-background-color=00000000 --no-pdf-background --print-to-pdf="${outputFile}" "${scrollProgram.permalink}"` - // console.log(`Node.js is running on architecture: ${process.arch}`) - try { - const output = require("child_process").execSync(command, { stdio: "ignore" }) - this.log(`💾 Built ${outputFile} from ${filename}`) - } catch (error) { - console.error(error) - } - } - - _buildConceptsAndMeasures() { - const { fileSystem, folderPath, scrollProgram, filename } = this - // If this proves useful maybe make slight adjustments to Scroll lang to be more imperative. - if (!this.has(scrollKeywords.buildConcepts)) return - const { permalink } = scrollProgram - scrollProgram.findParticles(scrollKeywords.buildConcepts).forEach(particle => { - const files = particle.getAtomsFrom(1) - if (!files.length) files.push(permalink.replace(".html", ".csv")) - const sortBy = particle.get("sortBy") - files.forEach(link => { - fileSystem.writeProduct(path.join(folderPath, link), this.compileConcepts(link, sortBy)) - this.log(`💾 Built concepts in ${filename} to ${link}`) - }) - }) - - if (!this.has(scrollKeywords.buildMeasures)) return - scrollProgram.findParticles(scrollKeywords.buildMeasures).forEach(particle => { - const files = particle.getAtomsFrom(1) - if (!files.length) files.push(permalink.replace(".html", ".csv")) - const sortBy = particle.get("sortBy") - files.forEach(link => { - fileSystem.writeProduct(path.join(folderPath, link), this.compileMeasures(link, sortBy)) - this.log(`💾 Built measures in ${filename} to ${link}`) - }) - }) + // todo: remove + await scrollProgram.buildAll() } getFileFromId(id) { @@ -396,20 +151,6 @@ class ScrollFile { return this.fileSystem.getScrollFilesInFolder(this.folderPath) } - _concepts - get concepts() { - if (this._concepts) return this._concepts - this._concepts = parseConcepts(this.scrollProgram, this.measures) - return this._concepts - } - - _measures - get measures() { - if (this._measures) return this._measures - this._measures = parseMeasures(this.parser) - return this._measures - } - get parsersBundle() { let code = `parsers/atomTypes.parsers @@ -439,36 +180,6 @@ parsers/errors.parsers` return this.scrollProgram.getFormatted(this.codeAtStart) } - _compileArray(filename, arr) { - const parts = filename.split(".") - const format = parts.pop() - if (format === "json") return JSON.stringify(removeBlanks(arr), null, 2) - if (format === "js") return `const ${parts[0]} = ` + JSON.stringify(removeBlanks(arr), null, 2) - if (format === "csv") return arrayToCSV(arr) - if (format === "tsv") return arrayToCSV(arr, "\t") - if (format === "particles") return particles.toString() - return particles.toString() - } - - compileConcepts(filename = "csv", sortBy = "") { - if (!sortBy) return this._compileArray(filename, this.concepts) - const orderBy = makeLodashOrderByParams(sortBy) - return this._compileArray(filename, lodash.orderBy(this.concepts, orderBy[0], orderBy[1])) - } - - _withStats - get measuresWithStats() { - if (!this._withStats) this._withStats = addMeasureStats(this.concepts, this.measures) - return this._withStats - } - - compileMeasures(filename = "csv", sortBy = "") { - const withStats = this.measuresWithStats - if (!sortBy) return this._compileArray(filename, withStats) - const orderBy = makeLodashOrderByParams(sortBy) - return this._compileArray(filename, lodash.orderBy(withStats, orderBy[0], orderBy[1])) - } - evalMacros(code, codeAtStart, absolutePath) { // note: the 2 params above are not used in this method, but may be used in user eval code. (todo: cleanup) const regex = /^(replace|footer$)/gm @@ -588,6 +299,8 @@ parsers/errors.parsers` } getFilesByTags(tags, limit) { + // todo: tags is currently matching partial substrings + const getFilesWithTag = (tag, files) => files.filter(file => file.scrollProgram.buildsHtml && file.scrollProgram.tags.includes(tag)) if (typeof tags === "string") tags = tags.split(" ") if (!tags || !tags.length) return this.allHtmlFiles @@ -620,9 +333,6 @@ parsers/errors.parsers` return lodash.sortBy(arr, file => file.file.timestamp).reverse() } - async build() { - return this.scrollProgram.build() - } } const isUserPipingInput = () => { @@ -808,9 +518,11 @@ footer.scroll` const externalFilesCopied = {} for (const file of toBuild) { file.logger = this - await file.buildOne() + await file.scrollProgram.buildOne() + } + for (const file of toBuild) { + await file.scrollProgram.buildTwo(externalFilesCopied) } - toBuild.forEach(file => file.buildTwo(externalFilesCopied)) const seconds = (Date.now() - start) / 1000 this.log(``) const outputExtensions = Object.keys(fileSystem.productCache).map(filename => filename.split(".").pop()) diff --git a/tests/a-review-of-my-sink.html b/tests/a-review-of-my-sink.html index 860f0acfd..037ad0bb0 100644 --- a/tests/a-review-of-my-sink.html +++ b/tests/a-review-of-my-sink.html @@ -3,12 +3,12 @@ A review of my sink - + - + diff --git a/tests/about.html b/tests/about.html index 9a85c2791..bfa8b6989 100644 --- a/tests/about.html +++ b/tests/about.html @@ -3,12 +3,12 @@ About the Kitchen Sink Blog - + - + diff --git a/tests/all.html b/tests/all.html index 8f58a9e8d..c40a8026d 100644 --- a/tests/all.html +++ b/tests/all.html @@ -69,7 +69,7 @@ Canada -

            Today is Wed Nov 13 2024 14:59:45 GMT+0000 (Coordinated Universal Time)

            +

            Today is Wed Nov 13 2024 16:43:32 GMT+0000 (Coordinated Universal Time)

            1+1 = 2

            January 11, 2019 was a great day

            There are 283 in my list.

            diff --git a/tests/buildDelimited.html b/tests/buildDelimited.html index a050c4cad..b39628e1d 100644 --- a/tests/buildDelimited.html +++ b/tests/buildDelimited.html @@ -10,7 +10,7 @@ - +
            diff --git a/tests/cloc.html b/tests/cloc.html index 8620fca10..df91a54c8 100644 --- a/tests/cloc.html +++ b/tests/cloc.html @@ -11,7 +11,7 @@
            -
            sepal_length sepal_width
            +
            @@ -24,21 +24,21 @@ - - - + + + - + - + - + - + - + @@ -88,11 +88,11 @@ - + - - - + + +
            files language
            22 JavaScript81679030718118142900871570
            107 Parsers327328 056775971
            129
            130 Scroll18211826 050695090
            12 CSS0 1
            283
            284 SUM1058391208676310564909886837
            diff --git a/tests/concepts.html b/tests/concepts.html new file mode 100644 index 000000000..c4f45cbdc --- /dev/null +++ b/tests/concepts.html @@ -0,0 +1,41 @@ + + + + +
            +

            Concepts

            + + + + + + + + + + + + + + + + + + + + + + + +
            nameemailphonebirthdaynotes
            Jack Doejohn.doe@example.com+1 (555) 123-45672/23/84Daughter - Samantha.
            Jill Smithjill@gmail.com+1 (555) 123-45621/23/80
            + + + + + + + + +
            + + \ No newline at end of file diff --git a/tests/concepts.scroll b/tests/concepts.scroll new file mode 100644 index 000000000..69453e10b --- /dev/null +++ b/tests/concepts.scroll @@ -0,0 +1,20 @@ +buildHtml + +../microlangs/contacts.parsers +theme gazette +mediumColumns 1 +printTitle +concepts + printTable +tableSearch + +👤 Jack Doe +phone +1 (555) 123-4567 +email john.doe@example.com +birthday 2/23/84 +notes Daughter - Samantha. + +👤 Jill Smith +phone +1 (555) 123-4562 +email jill@gmail.com +birthday 1/23/80 diff --git a/tests/debugging.html b/tests/debugging.html index 9fe2d59c5..0582d996c 100644 --- a/tests/debugging.html +++ b/tests/debugging.html @@ -76,7 +76,7 @@ - +
    \ No newline at end of file diff --git a/tests/defsForm.html b/tests/defsForm.html index 548490028..0a2f95024 100644 --- a/tests/defsForm.html +++ b/tests/defsForm.html @@ -268,7 +268,7 @@ return this.readFile(fullpath) } log(message) { - // console.log(message) + this.file.log ? this.file.log(message) : "" } async fetchBrowser(url) { const content = localStorage.getItem(url) @@ -319,6 +319,12 @@ getFromParserId(parserId) { return this.parserIdIndex[parserId]?.[0].content } + get fileSystem() { + return this.file.fileSystem + } + get filePath() { + return this.file.filePath + } get folderPath() { return this.file.folderPath } @@ -581,6 +587,280 @@ .replace(/\n+$/, "") return trimmed === "" ? trimmed : trimmed + "\n" // End non blank Scroll files in a newline character POSIX style for better working with tools like git } + get parser() { + return this.constructor + } + get parsersRequiringExternals() { + const { parser } = this + // todo: could be cleaned up a bit + if (!parser.parsersRequiringExternals) parser.parsersRequiringExternals = parser.cachedHandParsersProgramRoot.filter(particle => particle.copyFromExternal).map(particle => particle.atoms[0]) + return parser.parsersRequiringExternals + } + _copyExternalFiles(externalFilesCopied = {}) { + if (!this.isNodeJs()) return + // If this file uses a parser that has external requirements, + // copy those from external folder into the destination folder. + const { parsersRequiringExternals, folderPath, fileSystem, filename, parserIdIndex, path } = this + const { Disk } = require("scrollsdk/products/Disk.node.js") + if (!externalFilesCopied[folderPath]) externalFilesCopied[folderPath] = {} + parsersRequiringExternals.forEach(parserId => { + if (externalFilesCopied[folderPath][parserId]) return + if (!parserIdIndex[parserId]) return + parserIdIndex[parserId].map(particle => { + const externalFiles = particle.copyFromExternal.split(" ") + externalFiles.forEach(name => { + const newPath = path.join(folderPath, name) + fileSystem.writeProduct(newPath, Disk.read(path.join(this.externalsPath, name))) + this.log(`💾 Copied external file needed by ${filename} to ${name}`) + }) + }) + if (parserId !== "scrollThemeParser") + // todo: generalize when not to cache + externalFilesCopied[folderPath][parserId] = true + }) + } + _buildFileType(extension) { + const { fileSystem, folderPath, filename, filePath, path } = this + const capitalized = this.lodash.capitalize(extension) + const buildKeyword = "build" + capitalized + if (!this.has(buildKeyword)) return + const { permalink } = this + const outputFiles = this.get(buildKeyword)?.split(" ") || [""] + outputFiles.forEach(name => { + const link = name || permalink.replace(".html", "." + extension) + try { + fileSystem.writeProduct(path.join(folderPath, link), this.compileTo(capitalized)) + this.log(`💾 Built ${link} from ${filename}`) + } catch (err) { + console.error(`Error while building '${filePath}' with extension '${extension}'`) + throw err + } + }) + } + async buildPdf() { + if (!this.isNodeJs()) return "Only works in Node currently." + const { filename } = this + const outputFile = this.filenameNoExtension + ".pdf" + // relevant source code for chrome: https://github.com/chromium/chromium/blob/a56ef4a02086c6c09770446733700312c86f7623/components/headless/command_handler/headless_command_switches.cc#L22 + const command = `/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --headless --disable-gpu --no-pdf-header-footer --default-background-color=00000000 --no-pdf-background --print-to-pdf="${outputFile}" "${this.permalink}"` + // console.log(`Node.js is running on architecture: ${process.arch}`) + try { + const output = require("child_process").execSync(command, { stdio: "ignore" }) + this.log(`💾 Built ${outputFile} from ${filename}`) + } catch (error) { + console.error(error) + } + } + async buildOne() { + // todo: cleanup + // todo: iterate over buildFile particles directly. not this hard coded order. + await this.build() + this._buildFileType("parsers") + this._buildConceptsAndMeasures() // todo: call this buildDelimited? + this._buildFileType("csv") + this._buildFileType("tsv") + this._buildFileType("json") + } + async buildTwo(externalFilesCopied = {}) { + // todo: iterate over buildFile particles directly. not this hard coded order. + if (this.has("buildHtml")) this._copyExternalFiles(externalFilesCopied) + this._buildFileType("js") + this._buildFileType("txt") + this._buildFileType("html") + this._buildFileType("rss") + this._buildFileType("css") + if (this.has("buildPdf")) this.buildPdf() + } + _buildConceptsAndMeasures() { + const { fileSystem, folderPath, filename, path } = this + // If this proves useful maybe make slight adjustments to Scroll lang to be more imperative. + if (!this.has("buildConcepts")) return + const { permalink } = this + this.findParticles("buildConcepts").forEach(particle => { + const files = particle.getAtomsFrom(1) + if (!files.length) files.push(permalink.replace(".html", ".csv")) + const sortBy = particle.get("sortBy") + files.forEach(link => { + fileSystem.writeProduct(path.join(folderPath, link), this.compileConcepts(link, sortBy)) + this.log(`💾 Built concepts in ${filename} to ${link}`) + }) + }) + if (!this.has("buildMeasures")) return + this.findParticles("buildMeasures").forEach(particle => { + const files = particle.getAtomsFrom(1) + if (!files.length) files.push(permalink.replace(".html", ".csv")) + const sortBy = particle.get("sortBy") + files.forEach(link => { + fileSystem.writeProduct(path.join(folderPath, link), this.compileMeasures(link, sortBy)) + this.log(`💾 Built measures in ${filename} to ${link}`) + }) + }) + } + _compileArray(filename, arr) { + const removeBlanks = data => data.map(obj => Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== ""))) + const parts = filename.split(".") + const format = parts.pop() + if (format === "json") return JSON.stringify(removeBlanks(arr), null, 2) + if (format === "js") return `const ${parts[0]} = ` + JSON.stringify(removeBlanks(arr), null, 2) + if (format === "csv") return this.arrayToCSV(arr) + if (format === "tsv") return this.arrayToCSV(arr, "\t") + if (format === "particles") return particles.toString() + return particles.toString() + } + makeLodashOrderByParams(str) { + const part1 = str.split(" ") + const part2 = part1.map(col => (col.startsWith("-") ? "desc" : "asc")) + return [part1.map(col => col.replace(/^\-/, "")), part2] + } + arrayToCSV(data, delimiter = ",") { + if (!data.length) return "" + // Extract headers + const headers = Object.keys(data[0]) + const csv = data.map(row => + headers + .map(fieldName => { + const fieldValue = row[fieldName] + // Escape commas if the value is a string + if (typeof fieldValue === "string" && fieldValue.includes(delimiter)) { + return `"${fieldValue.replace(/"/g, '""')}"` // Escape double quotes and wrap in double quotes + } + return fieldValue + }) + .join(delimiter) + ) + csv.unshift(headers.join(delimiter)) // Add header row at the top + return csv.join("\n") + } + compileConcepts(filename = "csv", sortBy = "") { + const {lodash} = this + if (!sortBy) return this._compileArray(filename, this.concepts) + const orderBy = this.makeLodashOrderByParams(sortBy) + return this._compileArray(filename, lodash.orderBy(this.concepts, orderBy[0], orderBy[1])) + } + _withStats + get measuresWithStats() { + if (!this._withStats) this._withStats = this.addMeasureStats(this.concepts, this.measures) + return this._withStats + } + addMeasureStats(concepts, measures){ + return measures.map(measure => { + let Type = false + concepts.forEach(concept => { + const value = concept[measure.Name] + if (value === undefined || value === "") return + measure.Values++ + if (!Type) { + measure.Example = value.toString().replace(/\n/g, " ") + measure.Type = typeof value + Type = true + } + }) + measure.Coverage = Math.floor((100 * measure.Values) / concepts.length) + "%" + return measure + }) + } + parseMeasures(parser) { + if (!Particle.measureCache) + Particle.measureCache = new Map() + const measureCache = Particle.measureCache + if (measureCache.get(parser)) return measureCache.get(parser) + const {lodash} = this + // todo: clean this up + const getCueAtoms = rootParserProgram => + rootParserProgram + .filter(particle => particle.getLine().endsWith("Parser") && !particle.getLine().startsWith("abstract")) + .map(particle => particle.get("cue") || particle.getLine()) + .map(line => line.replace(/Parser$/, "")) + // Generate a fake program with one of every of the available parsers. Then parse it. Then we can easily access the meta data on the parsers + const dummyProgram = new parser( + Array.from( + new Set( + getCueAtoms(parser.cachedHandParsersProgramRoot) // is there a better method name than this? + ) + ).join("\n") + ) + // Delete any particles that are not measures + dummyProgram.filter(particle => !particle.isMeasure).forEach(particle => particle.destroy()) + dummyProgram.forEach(particle => { + // add nested measures + Object.keys(particle.definition.cueMapWithDefinitions).forEach(key => particle.appendLine(key)) + }) + // Delete any nested particles that are not measures + dummyProgram.topDownArray.filter(particle => !particle.isMeasure).forEach(particle => particle.destroy()) + const measures = dummyProgram.topDownArray.map(particle => { + return { + Name: particle.measureName, + Values: 0, + Coverage: 0, + Question: particle.definition.description, + Example: particle.definition.getParticle("example")?.subparticlesToString() || "", + Type: particle.typeForWebForms, + Source: particle.sourceDomain, + //Definition: parsedProgram.root.filename + ":" + particle.lineNumber + SortIndex: particle.sortIndex, + IsComputed: particle.isComputed, + IsRequired: particle.isMeasureRequired, + IsConceptDelimiter: particle.isConceptDelimiter, + Cue: particle.definition.get("cue") + } + }) + measureCache.set(parser, lodash.sortBy(measures, "SortIndex")) + return measureCache.get(parser) + } + _concepts + get concepts() { + if (this._concepts) return this._concepts + this._concepts = this.parseConcepts(this, this.measures) + return this._concepts + } + _measures + get measures() { + if (this._measures) return this._measures + this._measures = this.parseMeasures(this.parser) + return this._measures + } + parseConcepts(parsedProgram, measures){ + // Todo: might be a perf/memory/simplicity win to have a "segment" method in ScrollSDK, where you could + // virtually split a Particle into multiple segments, and then query on those segments. + // So we would "segment" on "id ", and then not need to create a bunch of new objects, and the original + // already parsed lines could then learn about/access to their respective segments. + const conceptDelimiter = measures.filter(measure => measure.IsConceptDelimiter)[0] + if (!conceptDelimiter) return [] + const concepts = parsedProgram.split(conceptDelimiter.Cue || conceptDelimiter.Name) + concepts.shift() // Remove the part before "id" + return concepts.map(concept => { + const row = {} + measures.forEach(measure => { + const measureName = measure.Name + const measureKey = measure.Cue || measureName.replace(/_/g, " ") + if (!measure.IsComputed) row[measureName] = concept.getParticle(measureKey)?.measureValue ?? "" + else row[measureName] = this.computeMeasure(parsedProgram, measureName, concept, concepts) + }) + return row + }) + } + computeMeasure(parsedProgram, measureName, concept, concepts){ + // note that this is currently global, assuming there wont be. name conflicts in computed measures in a single scroll + if (!Particle.measureFnCache) Particle.measureFnCache = {} + const measureFnCache = Particle.measureFnCache + if (!measureFnCache[measureName]) { + // a bit hacky but works?? + const particle = parsedProgram.appendLine(measureName) + measureFnCache[measureName] = particle.computeValue + particle.destroy() + } + return measureFnCache[measureName](concept, measureName, parsedProgram, concepts) + } + compileMeasures(filename = "csv", sortBy = "") { + const withStats = this.measuresWithStats + if (!sortBy) return this._compileArray(filename, withStats) + const orderBy = this.makeLodashOrderByParams(sortBy) + return this._compileArray(filename, this.lodash.orderBy(withStats, orderBy[0], orderBy[1])) + } + async buildAll() { + await this.buildOne() + this.buildTwo() + } toRss() { const { title, canonicalUrl } = this return ` @@ -747,7 +1027,7 @@ javascript getErrors() { const errors = super.getErrors() - let requiredMeasureNames = this.parent.file.measures.filter(measure => measure.isMeasureRequired).map(measure => measure.Name).filter(name => name !== "id") + let requiredMeasureNames = this.root.measures.filter(measure => measure.isMeasureRequired).map(measure => measure.Name).filter(name => name !== "id") if (!requiredMeasureNames.length) return errors let next = this.next while (requiredMeasureNames.length && next.cue !== "id" && next.index !== 0) { diff --git a/tests/dependencies.html b/tests/dependencies.html index 3cd3dc727..a53913e6e 100644 --- a/tests/dependencies.html +++ b/tests/dependencies.html @@ -3,12 +3,12 @@ Dependencies - + - + @@ -50,7 +50,7 @@ - +
    \ No newline at end of file diff --git a/tests/disk.html b/tests/disk.html index f0b83dca3..322cc4284 100644 --- a/tests/disk.html +++ b/tests/disk.html @@ -15,787 +15,792 @@ a-review-of-my-sink.scroll file 586 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z aParser.scroll file 241 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z about.scroll file 451 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z all.scroll file 50 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z autoTitle.scroll file 149 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z background.scroll file 41 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z browserstack.node.js file 2521 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z buildDelimited.csv file 209 -2024-11-13T14:59:46.205Z +2024-11-13T16:43:32.617Z buildDelimited.json file 802 -2024-11-13T14:59:46.205Z +2024-11-13T16:43:32.617Z buildDelimited.scroll file 149 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z buildDelimited.tsv file 209 -2024-11-13T14:59:46.205Z +2024-11-13T16:43:32.617Z buttons.scroll file 133 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z center.scroll file 114 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z cloc.scroll file 68 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z clocLangs.txt file 215 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z codeMirror.css file 9413 -2024-11-13T14:59:47.661Z +2024-11-13T16:43:34.061Z comments.scroll file 25 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z + +concepts.scroll +file +305 +2024-11-13T16:43:09.941Z contacts.csv file 161 -2024-11-13T14:59:46.201Z +2024-11-13T16:43:32.617Z contacts.json file 295 -2024-11-13T14:59:46.201Z +2024-11-13T16:43:32.617Z contacts.scroll file 374 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z contacts.tsv file 161 -2024-11-13T14:59:46.201Z +2024-11-13T16:43:32.617Z content.scroll file 174 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z css.css file 29 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z css.scroll file 50 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z customMarkups.scroll file 377 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z dark.scroll file 38 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z datatables.css file 57644 -2024-11-13T14:59:46.237Z +2024-11-13T16:43:32.673Z datatables.js file 697329 -2024-11-13T14:59:46.241Z +2024-11-13T16:43:32.677Z dayjs.min.js file 14556 -2024-11-13T14:59:46.237Z +2024-11-13T16:43:32.673Z debugging.scroll file 155 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z defs.parsers file 825 -2024-11-13T14:59:46.193Z +2024-11-13T16:43:32.605Z defs.scroll file 233 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z defsForm.scroll file 166 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z dependencies.scroll file 446 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z disk.scroll file 75 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z edit.html file 1780 -2024-11-13T14:59:47.677Z +2024-11-13T16:43:34.085Z edit.scroll file 72 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z extension.parsers file 162 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z favicon.html file 814 -2024-11-13T14:59:47.677Z +2024-11-13T16:43:34.085Z favicon.scroll file 45 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z feed.rss file 705 -2024-11-13T14:59:47.677Z +2024-11-13T16:43:34.085Z feed.scroll file 70 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z fetchTest.scroll file 129 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z footer.scroll file 97 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z forms.html file -28535 -2024-11-13T14:59:47.677Z +40818 +2024-11-13T16:43:34.085Z forms.scroll file 955 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z full.html file 6317 -2024-11-13T14:59:47.657Z +2024-11-13T16:43:34.061Z full.scroll file 52 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z gazette.css file 9471 -2024-11-13T14:59:46.213Z +2024-11-13T16:43:32.629Z gazette.html file 1210 -2024-11-13T14:59:47.657Z +2024-11-13T16:43:34.061Z gazette.scroll file 44 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z hakon.html file 187 -2024-11-13T14:59:47.653Z +2024-11-13T16:43:34.057Z hakon.scroll file 81 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z haml.html file 469 -2024-11-13T14:59:47.653Z +2024-11-13T16:43:34.057Z haml.scroll file 264 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z haml.txt file 70 -2024-11-13T14:59:47.653Z +2024-11-13T16:43:34.057Z header.scroll file 100 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z heatrix.html file 10668 -2024-11-13T14:59:47.653Z +2024-11-13T16:43:34.053Z heatrix.scroll file 531 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z html.html file 205 -2024-11-13T14:59:47.649Z +2024-11-13T16:43:34.053Z html.scroll file 94 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z htmlInclude.html file 65 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z index.html file -43473 -2024-11-13T14:59:47.649Z +43891 +2024-11-13T16:43:34.053Z index.scroll file 89 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z inline.html file 9776 -2024-11-13T14:59:46.341Z +2024-11-13T16:43:32.745Z inline.scroll file 93 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z inspector.css file 779 -2024-11-13T14:59:46.337Z +2024-11-13T16:43:32.745Z inspector.html file 1082 -2024-11-13T14:59:46.341Z +2024-11-13T16:43:32.745Z inspector.scroll file 62 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z iris.html file 1051 -2024-11-13T14:59:46.337Z +2024-11-13T16:43:32.741Z iris.scroll file 67 -2024-11-13T14:59:25.517Z +2024-11-13T16:43:09.941Z javascript.html file 170 -2024-11-13T14:59:46.337Z +2024-11-13T16:43:32.741Z javascript.js file 46 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z javascript.scroll file 56 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z jquery-3.7.1.min.js file 87533 -2024-11-13T14:59:46.237Z +2024-11-13T16:43:32.673Z json.html file 1690 -2024-11-13T14:59:46.337Z +2024-11-13T16:43:32.741Z json.scroll file 122 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z keyboardNav.html file 739 -2024-11-13T14:59:46.337Z +2024-11-13T16:43:32.741Z keyboardNav.scroll file 52 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z leaflet.css file 14272 -2024-11-13T14:59:46.313Z +2024-11-13T16:43:32.721Z leaflet.js file 141941 -2024-11-13T14:59:46.313Z +2024-11-13T16:43:32.721Z lists.html file 237 -2024-11-13T14:59:46.337Z +2024-11-13T16:43:32.741Z lists.scroll file 84 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z maps.html file 14310 -2024-11-13T14:59:46.337Z +2024-11-13T16:43:32.741Z maps.scroll file 1432 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z markups.html file 473 -2024-11-13T14:59:46.313Z +2024-11-13T16:43:32.717Z markups.scroll file 351 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z meta.csv file 1899 -2024-11-13T14:59:46.193Z +2024-11-13T16:43:32.601Z meta.scroll file 117 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z music.html file 299 -2024-11-13T14:59:46.309Z +2024-11-13T16:43:32.717Z music.scroll file 74 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z openGraphImages.html file 2076 -2024-11-13T14:59:46.309Z +2024-11-13T16:43:32.717Z openGraphImages.scroll file 303 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z optionalImport.html file 698 -2024-11-13T14:59:46.305Z +2024-11-13T16:43:32.713Z optionalImport.scroll file 131 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z posts.html file 5438 -2024-11-13T14:59:46.305Z +2024-11-13T16:43:32.713Z posts.scroll file 542 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z prompt.txt file 583 -2024-11-13T14:59:46.257Z +2024-11-13T16:43:32.689Z push.html file 263 -2024-11-13T14:59:46.285Z +2024-11-13T16:43:32.705Z push.scroll file 134 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z python.html file 113 -2024-11-13T14:59:46.281Z +2024-11-13T16:43:32.705Z python.py file 12 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z python.scroll file 39 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z python.txt file 12 -2024-11-13T14:59:46.281Z +2024-11-13T16:43:32.705Z qrcodes.html file 5755 -2024-11-13T14:59:46.281Z +2024-11-13T16:43:32.705Z qrcodes.scroll file 53 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z redirectTest.scroll file 22 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z relativeSnippets.html file 7468 -2024-11-13T14:59:46.269Z +2024-11-13T16:43:32.697Z relativeSnippets.scroll file 51 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z roboto.css file 707 -2024-11-13T14:59:46.209Z +2024-11-13T16:43:32.621Z roboto.html file 1207 -2024-11-13T14:59:46.265Z +2024-11-13T16:43:32.693Z roboto.scroll file 42 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z script.html file 176 -2024-11-13T14:59:46.261Z +2024-11-13T16:43:32.693Z script.js file 86 -2024-11-13T14:59:46.261Z +2024-11-13T16:43:32.693Z script.scroll file 134 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z scroll.test.js file 9488 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z scrollLibs.js file 950139 -2024-11-13T14:59:46.321Z +2024-11-13T16:43:32.725Z scrollVersion.html file 216 -2024-11-13T14:59:46.261Z +2024-11-13T16:43:32.689Z scrollVersion.scroll file 43 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z settings.scroll file 151 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z sipOfCoffee.m4a file 45809 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z sitemap.scroll file 63 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z sitemap.txt file -2300 -2024-11-13T14:59:46.261Z +2333 +2024-11-13T16:43:32.689Z slideshowDemo.scroll file 127 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z snippets.html file 792 -2024-11-13T14:59:46.261Z +2024-11-13T16:43:32.689Z snippets.scroll file 65 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z source.scroll file 400 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.941Z sparkline.js file 6973 -2024-11-13T14:59:46.221Z +2024-11-13T16:43:32.633Z spirit.mp4 file 153185 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z stampTest.scroll file 193 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z stopwatch.html file 678 -2024-11-13T14:59:46.241Z +2024-11-13T16:43:32.681Z stopwatch.scroll file 88 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z stump.html file 88 -2024-11-13T14:59:46.241Z +2024-11-13T16:43:32.677Z stump.scroll file 38 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z style.css file 0 -2024-11-13T14:59:46.241Z +2024-11-13T16:43:32.677Z style.scroll file 133 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z subfolder directory 4096 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z tableDates.html file 850 -2024-11-13T14:59:46.241Z +2024-11-13T16:43:32.677Z tableDates.scroll file 137 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z tableSearch.js file 7018 -2024-11-13T14:59:46.241Z +2024-11-13T16:43:32.677Z tables.html file 13440 -2024-11-13T14:59:46.233Z +2024-11-13T16:43:32.669Z tables.scroll file 1403 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z tables.txt file 2756 -2024-11-13T14:59:46.225Z +2024-11-13T16:43:32.637Z tabularData.html file 7348 -2024-11-13T14:59:46.217Z +2024-11-13T16:43:32.633Z tabularData.scroll file 1047 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z tabularData.txt file 922 -2024-11-13T14:59:46.213Z +2024-11-13T16:43:32.629Z testOutput directory 4096 -2024-11-13T14:59:45.805Z +2024-11-13T16:43:32.209Z theScroll.html file 3830 -2024-11-13T14:59:46.209Z +2024-11-13T16:43:32.621Z theScroll.scroll file 27 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z themes.html file 542 -2024-11-13T14:59:46.209Z +2024-11-13T16:43:32.621Z themes.scroll file 165 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z top-sinks.scroll file 725 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z tufte.css file 7559 -2024-11-13T14:59:46.205Z +2024-11-13T16:43:32.621Z tufte.html file 1204 -2024-11-13T14:59:46.205Z +2024-11-13T16:43:32.621Z tufte.scroll file 40 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z video.html file 246 -2024-11-13T14:59:46.205Z +2024-11-13T16:43:32.621Z video.scroll file 74 -2024-11-13T14:59:25.521Z +2024-11-13T16:43:09.945Z diff --git a/tests/favicon.html b/tests/favicon.html index 80a986909..c7b4e3ff8 100644 --- a/tests/favicon.html +++ b/tests/favicon.html @@ -3,12 +3,12 @@ Favicon - + - + diff --git a/tests/feed.rss b/tests/feed.rss index 27fd3455f..6e83af654 100644 --- a/tests/feed.rss +++ b/tests/feed.rss @@ -4,7 +4,7 @@ Feed https://scroll.pub/tests/ Kitchen sink test site. - Wed, 13 Nov 2024 14:59:47 +0000 + Wed, 13 Nov 2024 16:43:34 +0000 en-us A review of my sink diff --git a/tests/forms.html b/tests/forms.html index 2746f5228..d490071c5 100644 --- a/tests/forms.html +++ b/tests/forms.html @@ -305,7 +305,7 @@ return this.readFile(fullpath) } log(message) { - // console.log(message) + this.file.log ? this.file.log(message) : "" } async fetchBrowser(url) { const content = localStorage.getItem(url) @@ -356,6 +356,12 @@ getFromParserId(parserId) { return this.parserIdIndex[parserId]?.[0].content } + get fileSystem() { + return this.file.fileSystem + } + get filePath() { + return this.file.filePath + } get folderPath() { return this.file.folderPath } @@ -618,6 +624,280 @@ .replace(/\n+$/, "") return trimmed === "" ? trimmed : trimmed + "\n" // End non blank Scroll files in a newline character POSIX style for better working with tools like git } + get parser() { + return this.constructor + } + get parsersRequiringExternals() { + const { parser } = this + // todo: could be cleaned up a bit + if (!parser.parsersRequiringExternals) parser.parsersRequiringExternals = parser.cachedHandParsersProgramRoot.filter(particle => particle.copyFromExternal).map(particle => particle.atoms[0]) + return parser.parsersRequiringExternals + } + _copyExternalFiles(externalFilesCopied = {}) { + if (!this.isNodeJs()) return + // If this file uses a parser that has external requirements, + // copy those from external folder into the destination folder. + const { parsersRequiringExternals, folderPath, fileSystem, filename, parserIdIndex, path } = this + const { Disk } = require("scrollsdk/products/Disk.node.js") + if (!externalFilesCopied[folderPath]) externalFilesCopied[folderPath] = {} + parsersRequiringExternals.forEach(parserId => { + if (externalFilesCopied[folderPath][parserId]) return + if (!parserIdIndex[parserId]) return + parserIdIndex[parserId].map(particle => { + const externalFiles = particle.copyFromExternal.split(" ") + externalFiles.forEach(name => { + const newPath = path.join(folderPath, name) + fileSystem.writeProduct(newPath, Disk.read(path.join(this.externalsPath, name))) + this.log(`💾 Copied external file needed by ${filename} to ${name}`) + }) + }) + if (parserId !== "scrollThemeParser") + // todo: generalize when not to cache + externalFilesCopied[folderPath][parserId] = true + }) + } + _buildFileType(extension) { + const { fileSystem, folderPath, filename, filePath, path } = this + const capitalized = this.lodash.capitalize(extension) + const buildKeyword = "build" + capitalized + if (!this.has(buildKeyword)) return + const { permalink } = this + const outputFiles = this.get(buildKeyword)?.split(" ") || [""] + outputFiles.forEach(name => { + const link = name || permalink.replace(".html", "." + extension) + try { + fileSystem.writeProduct(path.join(folderPath, link), this.compileTo(capitalized)) + this.log(`💾 Built ${link} from ${filename}`) + } catch (err) { + console.error(`Error while building '${filePath}' with extension '${extension}'`) + throw err + } + }) + } + async buildPdf() { + if (!this.isNodeJs()) return "Only works in Node currently." + const { filename } = this + const outputFile = this.filenameNoExtension + ".pdf" + // relevant source code for chrome: https://github.com/chromium/chromium/blob/a56ef4a02086c6c09770446733700312c86f7623/components/headless/command_handler/headless_command_switches.cc#L22 + const command = `/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --headless --disable-gpu --no-pdf-header-footer --default-background-color=00000000 --no-pdf-background --print-to-pdf="${outputFile}" "${this.permalink}"` + // console.log(`Node.js is running on architecture: ${process.arch}`) + try { + const output = require("child_process").execSync(command, { stdio: "ignore" }) + this.log(`💾 Built ${outputFile} from ${filename}`) + } catch (error) { + console.error(error) + } + } + async buildOne() { + // todo: cleanup + // todo: iterate over buildFile particles directly. not this hard coded order. + await this.build() + this._buildFileType("parsers") + this._buildConceptsAndMeasures() // todo: call this buildDelimited? + this._buildFileType("csv") + this._buildFileType("tsv") + this._buildFileType("json") + } + async buildTwo(externalFilesCopied = {}) { + // todo: iterate over buildFile particles directly. not this hard coded order. + if (this.has("buildHtml")) this._copyExternalFiles(externalFilesCopied) + this._buildFileType("js") + this._buildFileType("txt") + this._buildFileType("html") + this._buildFileType("rss") + this._buildFileType("css") + if (this.has("buildPdf")) this.buildPdf() + } + _buildConceptsAndMeasures() { + const { fileSystem, folderPath, filename, path } = this + // If this proves useful maybe make slight adjustments to Scroll lang to be more imperative. + if (!this.has("buildConcepts")) return + const { permalink } = this + this.findParticles("buildConcepts").forEach(particle => { + const files = particle.getAtomsFrom(1) + if (!files.length) files.push(permalink.replace(".html", ".csv")) + const sortBy = particle.get("sortBy") + files.forEach(link => { + fileSystem.writeProduct(path.join(folderPath, link), this.compileConcepts(link, sortBy)) + this.log(`💾 Built concepts in ${filename} to ${link}`) + }) + }) + if (!this.has("buildMeasures")) return + this.findParticles("buildMeasures").forEach(particle => { + const files = particle.getAtomsFrom(1) + if (!files.length) files.push(permalink.replace(".html", ".csv")) + const sortBy = particle.get("sortBy") + files.forEach(link => { + fileSystem.writeProduct(path.join(folderPath, link), this.compileMeasures(link, sortBy)) + this.log(`💾 Built measures in ${filename} to ${link}`) + }) + }) + } + _compileArray(filename, arr) { + const removeBlanks = data => data.map(obj => Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== ""))) + const parts = filename.split(".") + const format = parts.pop() + if (format === "json") return JSON.stringify(removeBlanks(arr), null, 2) + if (format === "js") return `const ${parts[0]} = ` + JSON.stringify(removeBlanks(arr), null, 2) + if (format === "csv") return this.arrayToCSV(arr) + if (format === "tsv") return this.arrayToCSV(arr, "\t") + if (format === "particles") return particles.toString() + return particles.toString() + } + makeLodashOrderByParams(str) { + const part1 = str.split(" ") + const part2 = part1.map(col => (col.startsWith("-") ? "desc" : "asc")) + return [part1.map(col => col.replace(/^\-/, "")), part2] + } + arrayToCSV(data, delimiter = ",") { + if (!data.length) return "" + // Extract headers + const headers = Object.keys(data[0]) + const csv = data.map(row => + headers + .map(fieldName => { + const fieldValue = row[fieldName] + // Escape commas if the value is a string + if (typeof fieldValue === "string" && fieldValue.includes(delimiter)) { + return `"${fieldValue.replace(/"/g, '""')}"` // Escape double quotes and wrap in double quotes + } + return fieldValue + }) + .join(delimiter) + ) + csv.unshift(headers.join(delimiter)) // Add header row at the top + return csv.join("\n") + } + compileConcepts(filename = "csv", sortBy = "") { + const {lodash} = this + if (!sortBy) return this._compileArray(filename, this.concepts) + const orderBy = this.makeLodashOrderByParams(sortBy) + return this._compileArray(filename, lodash.orderBy(this.concepts, orderBy[0], orderBy[1])) + } + _withStats + get measuresWithStats() { + if (!this._withStats) this._withStats = this.addMeasureStats(this.concepts, this.measures) + return this._withStats + } + addMeasureStats(concepts, measures){ + return measures.map(measure => { + let Type = false + concepts.forEach(concept => { + const value = concept[measure.Name] + if (value === undefined || value === "") return + measure.Values++ + if (!Type) { + measure.Example = value.toString().replace(/\n/g, " ") + measure.Type = typeof value + Type = true + } + }) + measure.Coverage = Math.floor((100 * measure.Values) / concepts.length) + "%" + return measure + }) + } + parseMeasures(parser) { + if (!Particle.measureCache) + Particle.measureCache = new Map() + const measureCache = Particle.measureCache + if (measureCache.get(parser)) return measureCache.get(parser) + const {lodash} = this + // todo: clean this up + const getCueAtoms = rootParserProgram => + rootParserProgram + .filter(particle => particle.getLine().endsWith("Parser") && !particle.getLine().startsWith("abstract")) + .map(particle => particle.get("cue") || particle.getLine()) + .map(line => line.replace(/Parser$/, "")) + // Generate a fake program with one of every of the available parsers. Then parse it. Then we can easily access the meta data on the parsers + const dummyProgram = new parser( + Array.from( + new Set( + getCueAtoms(parser.cachedHandParsersProgramRoot) // is there a better method name than this? + ) + ).join("\n") + ) + // Delete any particles that are not measures + dummyProgram.filter(particle => !particle.isMeasure).forEach(particle => particle.destroy()) + dummyProgram.forEach(particle => { + // add nested measures + Object.keys(particle.definition.cueMapWithDefinitions).forEach(key => particle.appendLine(key)) + }) + // Delete any nested particles that are not measures + dummyProgram.topDownArray.filter(particle => !particle.isMeasure).forEach(particle => particle.destroy()) + const measures = dummyProgram.topDownArray.map(particle => { + return { + Name: particle.measureName, + Values: 0, + Coverage: 0, + Question: particle.definition.description, + Example: particle.definition.getParticle("example")?.subparticlesToString() || "", + Type: particle.typeForWebForms, + Source: particle.sourceDomain, + //Definition: parsedProgram.root.filename + ":" + particle.lineNumber + SortIndex: particle.sortIndex, + IsComputed: particle.isComputed, + IsRequired: particle.isMeasureRequired, + IsConceptDelimiter: particle.isConceptDelimiter, + Cue: particle.definition.get("cue") + } + }) + measureCache.set(parser, lodash.sortBy(measures, "SortIndex")) + return measureCache.get(parser) + } + _concepts + get concepts() { + if (this._concepts) return this._concepts + this._concepts = this.parseConcepts(this, this.measures) + return this._concepts + } + _measures + get measures() { + if (this._measures) return this._measures + this._measures = this.parseMeasures(this.parser) + return this._measures + } + parseConcepts(parsedProgram, measures){ + // Todo: might be a perf/memory/simplicity win to have a "segment" method in ScrollSDK, where you could + // virtually split a Particle into multiple segments, and then query on those segments. + // So we would "segment" on "id ", and then not need to create a bunch of new objects, and the original + // already parsed lines could then learn about/access to their respective segments. + const conceptDelimiter = measures.filter(measure => measure.IsConceptDelimiter)[0] + if (!conceptDelimiter) return [] + const concepts = parsedProgram.split(conceptDelimiter.Cue || conceptDelimiter.Name) + concepts.shift() // Remove the part before "id" + return concepts.map(concept => { + const row = {} + measures.forEach(measure => { + const measureName = measure.Name + const measureKey = measure.Cue || measureName.replace(/_/g, " ") + if (!measure.IsComputed) row[measureName] = concept.getParticle(measureKey)?.measureValue ?? "" + else row[measureName] = this.computeMeasure(parsedProgram, measureName, concept, concepts) + }) + return row + }) + } + computeMeasure(parsedProgram, measureName, concept, concepts){ + // note that this is currently global, assuming there wont be. name conflicts in computed measures in a single scroll + if (!Particle.measureFnCache) Particle.measureFnCache = {} + const measureFnCache = Particle.measureFnCache + if (!measureFnCache[measureName]) { + // a bit hacky but works?? + const particle = parsedProgram.appendLine(measureName) + measureFnCache[measureName] = particle.computeValue + particle.destroy() + } + return measureFnCache[measureName](concept, measureName, parsedProgram, concepts) + } + compileMeasures(filename = "csv", sortBy = "") { + const withStats = this.measuresWithStats + if (!sortBy) return this._compileArray(filename, withStats) + const orderBy = this.makeLodashOrderByParams(sortBy) + return this._compileArray(filename, this.lodash.orderBy(withStats, orderBy[0], orderBy[1])) + } + async buildAll() { + await this.buildOne() + this.buildTwo() + } toRss() { const { title, canonicalUrl } = this return ` @@ -784,7 +1064,7 @@ javascript getErrors() { const errors = super.getErrors() - let requiredMeasureNames = this.parent.file.measures.filter(measure => measure.isMeasureRequired).map(measure => measure.Name).filter(name => name !== "id") + let requiredMeasureNames = this.root.measures.filter(measure => measure.isMeasureRequired).map(measure => measure.Name).filter(name => name !== "id") if (!requiredMeasureNames.length) return errors let next = this.next while (requiredMeasureNames.length && next.cue !== "id" && next.index !== 0) { diff --git a/tests/full.html b/tests/full.html index f28fc6e47..776ab8fd8 100644 --- a/tests/full.html +++ b/tests/full.html @@ -250,7 +250,7 @@ Canada -

    Today is Wed Nov 13 2024 14:59:45 GMT+0000 (Coordinated Universal Time)

    +

    Today is Wed Nov 13 2024 16:43:32 GMT+0000 (Coordinated Universal Time)

    1+1 = 2

    January 11, 2019 was a great day

    There are 283 in my list.

    diff --git a/tests/index.html b/tests/index.html index da4b3ac99..63fb6f425 100644 --- a/tests/index.html +++ b/tests/index.html @@ -3,12 +3,12 @@ Index - + - + @@ -101,7 +101,7 @@ 0 Source -Instructions: Below are the files in a blog. I want you to read them, and then perform the following tasks, and give me your results in the format of a git patch so I can easily apply your changes on my local computer and commit them. Tasks: The Files: Source https://scroll.pub/tests/ Kitchen sink test site. Wed, 13 Nov 2024 14:59:46 +0000 en-us A review of my sink https://scroll.pub/tests/a-review-of-my-sink.html Invalid Date Tabular data test https://scroll.pub/tests/tabularData.html Invalid Date Top Sinks https://scroll.pub/tests/top-sinks.html Invalid Date +Instructions: Below are the files in a blog. I want you to read them, and then perform the following tasks, and give me your results in the format of a git patch so I can easily apply your changes on my local computer and commit them. Tasks: The Files: Source https://scroll.pub/tests/ Kitchen sink test site. Wed, 13 Nov 2024 16:43:32 +0000 en-us A review of my sink https://scroll.pub/tests/a-review-of-my-sink.html Invalid Date Tabular data test https://scroll.pub/tests/tabularData.html Invalid Date Top Sinks https://scroll.pub/tests/top-sinks.html Invalid Date 11/13/2024 107 0.5 @@ -119,9 +119,9 @@ 0.1 Sitemap -https://scroll.pub/video.html https://scroll.pub/tufte.html https://scroll.pub/themes.html https://scroll.pub/theScroll.html https://scroll.pub/tabularData.html https://scroll.pub/tables.html https://scroll.pub/tableDates.html https://scroll.pub/style.html https://scroll.pub/stump.html https://scroll.pub/stopwatch.html https://scroll.pub/stampTest.html https://scroll.pub/source.html https://scroll.pub/snippets.html https://scroll.pub/slideshowDemo.html https://scroll.pub/settings.html https://scroll.pub/scrollVersion.html https://scroll.pub/script.html https://scroll.pub/roboto.html https://scroll.pub/relativeSnippets.html https://scroll.pub/redirectTest.html https://scroll.pub/qrcodes.html https://scroll.pub/python.html https://scroll.pub/push.html https://scroll.pub/posts.html https://scroll.pub/optionalImport.html https://scroll.pub/openGraphImages.html https://scroll.pub/music.html https://scroll.pub/meta.html https://scroll.pub/markups.html https://scroll.pub/maps.html https://scroll.pub/lists.html https://scroll.pub/keyboardNav.html https://scroll.pub/json.html https://scroll.pub/javascript.html https://scroll.pub/iris.html https://scroll.pub/inspector.html https://scroll.pub/inline.html https://scroll.pub/index.html https://scroll.pub/html.html https://scroll.pub/heatrix.html https://scroll.pub/haml.html https://scroll.pub/hakon.html https://scroll.pub/gazette.html https://scroll.pub/full.html https://scroll.pub/forms.html https://scroll.pub/footer.html https://scroll.pub/fetchTest.html https://scroll.pub/feed.html https://scroll.pub/favicon.html https://scroll.pub/edit.html https://scroll.pub/disk.html https://scroll.pub/dependencies.html https://scroll.pub/defsForm.html https://scroll.pub/defs.html https://scroll.pub/debugging.html https://scroll.pub/dark.html https://scroll.pub/customMarkups.html https://scroll.pub/css.html https://scroll.pub/contacts.html https://scroll.pub/comments.html https://scroll.pub/cloc.html https://scroll.pub/center.html https://scroll.pub/buttons.html https://scroll.pub/buildDelimited.html https://scroll.pub/background.html https://scroll.pub/autoTitle.html https://scroll.pub/all.html https://scroll.pub/about.html https://scroll.pub/aParser.html https://scroll.pub/a-review-of-my-sink.html https://scroll.pub/top-sinks.html +https://scroll.pub/video.html https://scroll.pub/tufte.html https://scroll.pub/themes.html https://scroll.pub/theScroll.html https://scroll.pub/tabularData.html https://scroll.pub/tables.html https://scroll.pub/tableDates.html https://scroll.pub/style.html https://scroll.pub/stump.html https://scroll.pub/stopwatch.html https://scroll.pub/stampTest.html https://scroll.pub/source.html https://scroll.pub/snippets.html https://scroll.pub/slideshowDemo.html https://scroll.pub/settings.html https://scroll.pub/scrollVersion.html https://scroll.pub/script.html https://scroll.pub/roboto.html https://scroll.pub/relativeSnippets.html https://scroll.pub/redirectTest.html https://scroll.pub/qrcodes.html https://scroll.pub/python.html https://scroll.pub/push.html https://scroll.pub/posts.html https://scroll.pub/optionalImport.html https://scroll.pub/openGraphImages.html https://scroll.pub/music.html https://scroll.pub/meta.html https://scroll.pub/markups.html https://scroll.pub/maps.html https://scroll.pub/lists.html https://scroll.pub/keyboardNav.html https://scroll.pub/json.html https://scroll.pub/javascript.html https://scroll.pub/iris.html https://scroll.pub/inspector.html https://scroll.pub/inline.html https://scroll.pub/index.html https://scroll.pub/html.html https://scroll.pub/heatrix.html https://scroll.pub/haml.html https://scroll.pub/hakon.html https://scroll.pub/gazette.html https://scroll.pub/full.html https://scroll.pub/forms.html https://scroll.pub/footer.html https://scroll.pub/fetchTest.html https://scroll.pub/feed.html https://scroll.pub/favicon.html https://scroll.pub/edit.html https://scroll.pub/disk.html https://scroll.pub/dependencies.html https://scroll.pub/defsForm.html https://scroll.pub/defs.html https://scroll.pub/debugging.html https://scroll.pub/dark.html https://scroll.pub/customMarkups.html https://scroll.pub/css.html https://scroll.pub/contacts.html https://scroll.pub/concepts.html https://scroll.pub/comments.html https://scroll.pub/cloc.html https://scroll.pub/center.html https://scroll.pub/buttons.html https://scroll.pub/buildDelimited.html https://scroll.pub/background.html https://scroll.pub/autoTitle.html https://scroll.pub/all.html https://scroll.pub/about.html https://scroll.pub/aParser.html https://scroll.pub/a-review-of-my-sink.html https://scroll.pub/top-sinks.html 11/13/2024 -360 +365 1.8 Settings @@ -131,7 +131,7 @@ 0 Scroll Version -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 11/13/2024 6 0 @@ -245,7 +245,7 @@ 0 Iris -sepal_length,sepal_width,petal_length,petal_width,species 5.1,3.5,1.4,0.2,setosa 5,3.4,1.5,0.2,setosa 6.2,2.8,4.8,1.8,virginica 5.6,2.7,4.2,1.3,versicolor 6.2,3.4,5.4,2.3,virginica 4.9,2.5,4.5,1.7,virginica 6.1,3,4.9,1.8,virginica 5.3,3.7,1.5,0.2,setosa 5.6,2.8,4.9,2,virginica 7.7,3.8,6.7,2.2,virginica +sepal_length,sepal_width,petal_length,petal_width,species 5.6,2.7,4.2,1.3,versicolor 5,3.4,1.5,0.2,setosa 5.3,3.7,1.5,0.2,setosa 6.2,3.4,5.4,2.3,virginica 5.6,2.8,4.9,2,virginica 6.1,3,4.9,1.8,virginica 7.7,3.8,6.7,2.2,virginica 5.1,3.5,1.4,0.2,setosa 6.2,2.8,4.8,1.8,virginica 4.9,2.5,4.5,1.7,virginica 11/13/2024 92 0.5 @@ -305,7 +305,7 @@ 0.1 Footer -Built with Scroll v149.0.0 +Built with Scroll v150.0.0 11/13/2024 6 0 @@ -317,7 +317,7 @@ 0 Feed -Feed https://scroll.pub/tests/ Kitchen sink test site. Wed, 13 Nov 2024 14:59:46 +0000 en-us A review of my sink https://scroll.pub/tests/a-review-of-my-sink.html Invalid Date Tabular data test https://scroll.pub/tests/tabularData.html Invalid Date Top Sinks https://scroll.pub/tests/top-sinks.html Invalid Date +Feed https://scroll.pub/tests/ Kitchen sink test site. Wed, 13 Nov 2024 16:43:32 +0000 en-us A review of my sink https://scroll.pub/tests/a-review-of-my-sink.html Invalid Date Tabular data test https://scroll.pub/tests/tabularData.html Invalid Date Top Sinks https://scroll.pub/tests/top-sinks.html Invalid Date 11/13/2024 58 0.3 @@ -335,13 +335,13 @@ 0 Disk -[{"name":"a-review-of-my-sink.scroll","type":"file","size":586,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"aParser.scroll","type":"file","size":241,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"about.scroll","type":"file","size":451,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"all.scroll","type":"file","size":50,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"autoTitle.scroll","type":"file","size":149,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"background.scroll","type":"file","size":41,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"browserstack.node.js","type":"file","size":2521,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"buildDelimited.csv","type":"file","size":209,"lastModified":"2024-11-13T14:59:46.205Z"},{"name":"buildDelimited.json","type":"file","size":802,"lastModified":"2024-11-13T14:59:46.205Z"},{"name":"buildDelimited.scroll","type":"file","size":149,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"buildDelimited.tsv","type":"file","size":209,"lastModified":"2024-11-13T14:59:46.205Z"},{"name":"buttons.scroll","type":"file","size":133,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"center.scroll","type":"file","size":114,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"cloc.scroll","type":"file","size":68,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"clocLangs.txt","type":"file","size":215,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"comments.scroll","type":"file","size":25,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"contacts.csv","type":"file","size":161,"lastModified":"2024-11-13T14:59:46.201Z"},{"name":"contacts.json","type":"file","size":295,"lastModified":"2024-11-13T14:59:46.201Z"},{"name":"contacts.scroll","type":"file","size":374,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"contacts.tsv","type":"file","size":161,"lastModified":"2024-11-13T14:59:46.201Z"},{"name":"content.scroll","type":"file","size":174,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"css.css","type":"file","size":29,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"css.scroll","type":"file","size":50,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"customMarkups.scroll","type":"file","size":377,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"dark.scroll","type":"file","size":38,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"datatables.css","type":"file","size":57644,"lastModified":"2024-11-13T14:59:46.237Z"},{"name":"datatables.js","type":"file","size":697329,"lastModified":"2024-11-13T14:59:46.241Z"},{"name":"dayjs.min.js","type":"file","size":14556,"lastModified":"2024-11-13T14:59:46.237Z"},{"name":"debugging.scroll","type":"file","size":155,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"defs.parsers","type":"file","size":825,"lastModified":"2024-11-13T14:59:46.193Z"},{"name":"defs.scroll","type":"file","size":233,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"defsForm.scroll","type":"file","size":166,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"dependencies.scroll","type":"file","size":446,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"disk.scroll","type":"file","size":75,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"edit.scroll","type":"file","size":72,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"extension.parsers","type":"file","size":162,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"favicon.scroll","type":"file","size":45,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"feed.scroll","type":"file","size":70,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"fetchTest.scroll","type":"file","size":129,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"footer.scroll","type":"file","size":97,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"forms.scroll","type":"file","size":955,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"full.scroll","type":"file","size":52,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"gazette.css","type":"file","size":9471,"lastModified":"2024-11-13T14:59:46.213Z"},{"name":"gazette.scroll","type":"file","size":44,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"hakon.scroll","type":"file","size":81,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"haml.scroll","type":"file","size":264,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"header.scroll","type":"file","size":100,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"heatrix.scroll","type":"file","size":531,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"html.scroll","type":"file","size":94,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"htmlInclude.html","type":"file","size":65,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"index.scroll","type":"file","size":89,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"inline.html","type":"file","size":9776,"lastModified":"2024-11-13T14:59:46.341Z"},{"name":"inline.scroll","type":"file","size":93,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"inspector.css","type":"file","size":779,"lastModified":"2024-11-13T14:59:46.337Z"},{"name":"inspector.html","type":"file","size":1082,"lastModified":"2024-11-13T14:59:46.341Z"},{"name":"inspector.scroll","type":"file","size":62,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"iris.html","type":"file","size":1051,"lastModified":"2024-11-13T14:59:46.337Z"},{"name":"iris.scroll","type":"file","size":67,"lastModified":"2024-11-13T14:59:25.517Z"},{"name":"javascript.html","type":"file","size":170,"lastModified":"2024-11-13T14:59:46.337Z"},{"name":"javascript.js","type":"file","size":46,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"javascript.scroll","type":"file","size":56,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"jquery-3.7.1.min.js","type":"file","size":87533,"lastModified":"2024-11-13T14:59:46.237Z"},{"name":"json.html","type":"file","size":1690,"lastModified":"2024-11-13T14:59:46.337Z"},{"name":"json.scroll","type":"file","size":122,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"keyboardNav.html","type":"file","size":739,"lastModified":"2024-11-13T14:59:46.337Z"},{"name":"keyboardNav.scroll","type":"file","size":52,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"leaflet.css","type":"file","size":14272,"lastModified":"2024-11-13T14:59:46.313Z"},{"name":"leaflet.js","type":"file","size":141941,"lastModified":"2024-11-13T14:59:46.313Z"},{"name":"lists.html","type":"file","size":237,"lastModified":"2024-11-13T14:59:46.337Z"},{"name":"lists.scroll","type":"file","size":84,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"maps.html","type":"file","size":14310,"lastModified":"2024-11-13T14:59:46.337Z"},{"name":"maps.scroll","type":"file","size":1432,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"markups.html","type":"file","size":473,"lastModified":"2024-11-13T14:59:46.313Z"},{"name":"markups.scroll","type":"file","size":351,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"meta.csv","type":"file","size":1899,"lastModified":"2024-11-13T14:59:46.193Z"},{"name":"meta.scroll","type":"file","size":117,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"music.html","type":"file","size":299,"lastModified":"2024-11-13T14:59:46.309Z"},{"name":"music.scroll","type":"file","size":74,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"openGraphImages.html","type":"file","size":2076,"lastModified":"2024-11-13T14:59:46.309Z"},{"name":"openGraphImages.scroll","type":"file","size":303,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"optionalImport.html","type":"file","size":698,"lastModified":"2024-11-13T14:59:46.305Z"},{"name":"optionalImport.scroll","type":"file","size":131,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"posts.html","type":"file","size":5438,"lastModified":"2024-11-13T14:59:46.305Z"},{"name":"posts.scroll","type":"file","size":542,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"prompt.txt","type":"file","size":583,"lastModified":"2024-11-13T14:59:46.257Z"},{"name":"push.html","type":"file","size":263,"lastModified":"2024-11-13T14:59:46.285Z"},{"name":"push.scroll","type":"file","size":134,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"python.html","type":"file","size":113,"lastModified":"2024-11-13T14:59:46.281Z"},{"name":"python.py","type":"file","size":12,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"python.scroll","type":"file","size":39,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"python.txt","type":"file","size":12,"lastModified":"2024-11-13T14:59:46.281Z"},{"name":"qrcodes.html","type":"file","size":5755,"lastModified":"2024-11-13T14:59:46.281Z"},{"name":"qrcodes.scroll","type":"file","size":53,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"redirectTest.scroll","type":"file","size":22,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"relativeSnippets.html","type":"file","size":7468,"lastModified":"2024-11-13T14:59:46.269Z"},{"name":"relativeSnippets.scroll","type":"file","size":51,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"roboto.css","type":"file","size":707,"lastModified":"2024-11-13T14:59:46.209Z"},{"name":"roboto.html","type":"file","size":1207,"lastModified":"2024-11-13T14:59:46.265Z"},{"name":"roboto.scroll","type":"file","size":42,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"script.html","type":"file","size":176,"lastModified":"2024-11-13T14:59:46.261Z"},{"name":"script.js","type":"file","size":86,"lastModified":"2024-11-13T14:59:46.261Z"},{"name":"script.scroll","type":"file","size":134,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"scroll.test.js","type":"file","size":9488,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"scrollLibs.js","type":"file","size":950139,"lastModified":"2024-11-13T14:59:46.321Z"},{"name":"scrollVersion.html","type":"file","size":216,"lastModified":"2024-11-13T14:59:46.261Z"},{"name":"scrollVersion.scroll","type":"file","size":43,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"settings.scroll","type":"file","size":151,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"sipOfCoffee.m4a","type":"file","size":45809,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"sitemap.scroll","type":"file","size":63,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"sitemap.txt","type":"file","size":2300,"lastModified":"2024-11-13T14:59:46.261Z"},{"name":"slideshowDemo.scroll","type":"file","size":127,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"snippets.html","type":"file","size":792,"lastModified":"2024-11-13T14:59:46.261Z"},{"name":"snippets.scroll","type":"file","size":65,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"source.scroll","type":"file","size":400,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"sparkline.js","type":"file","size":6973,"lastModified":"2024-11-13T14:59:46.221Z"},{"name":"spirit.mp4","type":"file","size":153185,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"stampTest.scroll","type":"file","size":193,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"stopwatch.html","type":"file","size":678,"lastModified":"2024-11-13T14:59:46.241Z"},{"name":"stopwatch.scroll","type":"file","size":88,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"stump.html","type":"file","size":88,"lastModified":"2024-11-13T14:59:46.241Z"},{"name":"stump.scroll","type":"file","size":38,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"style.css","type":"file","size":0,"lastModified":"2024-11-13T14:59:46.241Z"},{"name":"style.scroll","type":"file","size":133,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"subfolder","type":"directory","size":4096,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"tableDates.html","type":"file","size":850,"lastModified":"2024-11-13T14:59:46.241Z"},{"name":"tableDates.scroll","type":"file","size":137,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"tableSearch.js","type":"file","size":7018,"lastModified":"2024-11-13T14:59:46.241Z"},{"name":"tables.html","type":"file","size":13440,"lastModified":"2024-11-13T14:59:46.233Z"},{"name":"tables.scroll","type":"file","size":1403,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"tables.txt","type":"file","size":2756,"lastModified":"2024-11-13T14:59:46.225Z"},{"name":"tabularData.html","type":"file","size":7348,"lastModified":"2024-11-13T14:59:46.217Z"},{"name":"tabularData.scroll","type":"file","size":1047,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"tabularData.txt","type":"file","size":922,"lastModified":"2024-11-13T14:59:46.213Z"},{"name":"testOutput","type":"directory","size":4096,"lastModified":"2024-11-13T14:59:45.805Z"},{"name":"theScroll.html","type":"file","size":3830,"lastModified":"2024-11-13T14:59:46.209Z"},{"name":"theScroll.scroll","type":"file","size":27,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"themes.html","type":"file","size":542,"lastModified":"2024-11-13T14:59:46.209Z"},{"name":"themes.scroll","type":"file","size":165,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"top-sinks.scroll","type":"file","size":725,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"tufte.css","type":"file","size":7559,"lastModified":"2024-11-13T14:59:46.205Z"},{"name":"tufte.html","type":"file","size":1204,"lastModified":"2024-11-13T14:59:46.205Z"},{"name":"tufte.scroll","type":"file","size":40,"lastModified":"2024-11-13T14:59:25.521Z"},{"name":"video.html","type":"file","size":246,"lastModified":"2024-11-13T14:59:46.205Z"},{"name":"video.scroll","type":"file","size":74,"lastModified":"2024-11-13T14:59:25.521Z"}] +[{"name":"a-review-of-my-sink.scroll","type":"file","size":586,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"aParser.scroll","type":"file","size":241,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"about.scroll","type":"file","size":451,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"all.scroll","type":"file","size":50,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"autoTitle.scroll","type":"file","size":149,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"background.scroll","type":"file","size":41,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"browserstack.node.js","type":"file","size":2521,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"buildDelimited.csv","type":"file","size":209,"lastModified":"2024-11-13T16:43:32.617Z"},{"name":"buildDelimited.json","type":"file","size":802,"lastModified":"2024-11-13T16:43:32.617Z"},{"name":"buildDelimited.scroll","type":"file","size":149,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"buildDelimited.tsv","type":"file","size":209,"lastModified":"2024-11-13T16:43:32.617Z"},{"name":"buttons.scroll","type":"file","size":133,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"center.scroll","type":"file","size":114,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"cloc.scroll","type":"file","size":68,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"clocLangs.txt","type":"file","size":215,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"comments.scroll","type":"file","size":25,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"concepts.scroll","type":"file","size":305,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"contacts.csv","type":"file","size":161,"lastModified":"2024-11-13T16:43:32.617Z"},{"name":"contacts.json","type":"file","size":295,"lastModified":"2024-11-13T16:43:32.617Z"},{"name":"contacts.scroll","type":"file","size":374,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"contacts.tsv","type":"file","size":161,"lastModified":"2024-11-13T16:43:32.617Z"},{"name":"content.scroll","type":"file","size":174,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"css.css","type":"file","size":29,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"css.scroll","type":"file","size":50,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"customMarkups.scroll","type":"file","size":377,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"dark.scroll","type":"file","size":38,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"datatables.css","type":"file","size":57644,"lastModified":"2024-11-13T16:43:32.673Z"},{"name":"datatables.js","type":"file","size":697329,"lastModified":"2024-11-13T16:43:32.677Z"},{"name":"dayjs.min.js","type":"file","size":14556,"lastModified":"2024-11-13T16:43:32.673Z"},{"name":"debugging.scroll","type":"file","size":155,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"defs.parsers","type":"file","size":825,"lastModified":"2024-11-13T16:43:32.605Z"},{"name":"defs.scroll","type":"file","size":233,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"defsForm.scroll","type":"file","size":166,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"dependencies.scroll","type":"file","size":446,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"disk.scroll","type":"file","size":75,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"edit.scroll","type":"file","size":72,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"extension.parsers","type":"file","size":162,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"favicon.scroll","type":"file","size":45,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"feed.scroll","type":"file","size":70,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"fetchTest.scroll","type":"file","size":129,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"footer.scroll","type":"file","size":97,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"forms.scroll","type":"file","size":955,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"full.scroll","type":"file","size":52,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"gazette.css","type":"file","size":9471,"lastModified":"2024-11-13T16:43:32.629Z"},{"name":"gazette.scroll","type":"file","size":44,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"hakon.scroll","type":"file","size":81,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"haml.scroll","type":"file","size":264,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"header.scroll","type":"file","size":100,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"heatrix.scroll","type":"file","size":531,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"html.scroll","type":"file","size":94,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"htmlInclude.html","type":"file","size":65,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"index.scroll","type":"file","size":89,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"inline.html","type":"file","size":9776,"lastModified":"2024-11-13T16:43:32.745Z"},{"name":"inline.scroll","type":"file","size":93,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"inspector.css","type":"file","size":779,"lastModified":"2024-11-13T16:43:32.745Z"},{"name":"inspector.html","type":"file","size":1082,"lastModified":"2024-11-13T16:43:32.745Z"},{"name":"inspector.scroll","type":"file","size":62,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"iris.html","type":"file","size":1051,"lastModified":"2024-11-13T16:43:32.741Z"},{"name":"iris.scroll","type":"file","size":67,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"javascript.html","type":"file","size":170,"lastModified":"2024-11-13T16:43:32.741Z"},{"name":"javascript.js","type":"file","size":46,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"javascript.scroll","type":"file","size":56,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"jquery-3.7.1.min.js","type":"file","size":87533,"lastModified":"2024-11-13T16:43:32.673Z"},{"name":"json.html","type":"file","size":1690,"lastModified":"2024-11-13T16:43:32.741Z"},{"name":"json.scroll","type":"file","size":122,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"keyboardNav.html","type":"file","size":739,"lastModified":"2024-11-13T16:43:32.741Z"},{"name":"keyboardNav.scroll","type":"file","size":52,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"leaflet.css","type":"file","size":14272,"lastModified":"2024-11-13T16:43:32.721Z"},{"name":"leaflet.js","type":"file","size":141941,"lastModified":"2024-11-13T16:43:32.721Z"},{"name":"lists.html","type":"file","size":237,"lastModified":"2024-11-13T16:43:32.741Z"},{"name":"lists.scroll","type":"file","size":84,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"maps.html","type":"file","size":14310,"lastModified":"2024-11-13T16:43:32.741Z"},{"name":"maps.scroll","type":"file","size":1432,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"markups.html","type":"file","size":473,"lastModified":"2024-11-13T16:43:32.717Z"},{"name":"markups.scroll","type":"file","size":351,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"meta.csv","type":"file","size":1899,"lastModified":"2024-11-13T16:43:32.601Z"},{"name":"meta.scroll","type":"file","size":117,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"music.html","type":"file","size":299,"lastModified":"2024-11-13T16:43:32.717Z"},{"name":"music.scroll","type":"file","size":74,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"openGraphImages.html","type":"file","size":2076,"lastModified":"2024-11-13T16:43:32.717Z"},{"name":"openGraphImages.scroll","type":"file","size":303,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"optionalImport.html","type":"file","size":698,"lastModified":"2024-11-13T16:43:32.713Z"},{"name":"optionalImport.scroll","type":"file","size":131,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"posts.html","type":"file","size":5438,"lastModified":"2024-11-13T16:43:32.713Z"},{"name":"posts.scroll","type":"file","size":542,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"prompt.txt","type":"file","size":583,"lastModified":"2024-11-13T16:43:32.689Z"},{"name":"push.html","type":"file","size":263,"lastModified":"2024-11-13T16:43:32.705Z"},{"name":"push.scroll","type":"file","size":134,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"python.html","type":"file","size":113,"lastModified":"2024-11-13T16:43:32.705Z"},{"name":"python.py","type":"file","size":12,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"python.scroll","type":"file","size":39,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"python.txt","type":"file","size":12,"lastModified":"2024-11-13T16:43:32.705Z"},{"name":"qrcodes.html","type":"file","size":5755,"lastModified":"2024-11-13T16:43:32.705Z"},{"name":"qrcodes.scroll","type":"file","size":53,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"redirectTest.scroll","type":"file","size":22,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"relativeSnippets.html","type":"file","size":7468,"lastModified":"2024-11-13T16:43:32.697Z"},{"name":"relativeSnippets.scroll","type":"file","size":51,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"roboto.css","type":"file","size":707,"lastModified":"2024-11-13T16:43:32.621Z"},{"name":"roboto.html","type":"file","size":1207,"lastModified":"2024-11-13T16:43:32.693Z"},{"name":"roboto.scroll","type":"file","size":42,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"script.html","type":"file","size":176,"lastModified":"2024-11-13T16:43:32.693Z"},{"name":"script.js","type":"file","size":86,"lastModified":"2024-11-13T16:43:32.693Z"},{"name":"script.scroll","type":"file","size":134,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"scroll.test.js","type":"file","size":9488,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"scrollLibs.js","type":"file","size":950139,"lastModified":"2024-11-13T16:43:32.725Z"},{"name":"scrollVersion.html","type":"file","size":216,"lastModified":"2024-11-13T16:43:32.689Z"},{"name":"scrollVersion.scroll","type":"file","size":43,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"settings.scroll","type":"file","size":151,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"sipOfCoffee.m4a","type":"file","size":45809,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"sitemap.scroll","type":"file","size":63,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"sitemap.txt","type":"file","size":2333,"lastModified":"2024-11-13T16:43:32.689Z"},{"name":"slideshowDemo.scroll","type":"file","size":127,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"snippets.html","type":"file","size":792,"lastModified":"2024-11-13T16:43:32.689Z"},{"name":"snippets.scroll","type":"file","size":65,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"source.scroll","type":"file","size":400,"lastModified":"2024-11-13T16:43:09.941Z"},{"name":"sparkline.js","type":"file","size":6973,"lastModified":"2024-11-13T16:43:32.633Z"},{"name":"spirit.mp4","type":"file","size":153185,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"stampTest.scroll","type":"file","size":193,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"stopwatch.html","type":"file","size":678,"lastModified":"2024-11-13T16:43:32.681Z"},{"name":"stopwatch.scroll","type":"file","size":88,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"stump.html","type":"file","size":88,"lastModified":"2024-11-13T16:43:32.677Z"},{"name":"stump.scroll","type":"file","size":38,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"style.css","type":"file","size":0,"lastModified":"2024-11-13T16:43:32.677Z"},{"name":"style.scroll","type":"file","size":133,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"subfolder","type":"directory","size":4096,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"tableDates.html","type":"file","size":850,"lastModified":"2024-11-13T16:43:32.677Z"},{"name":"tableDates.scroll","type":"file","size":137,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"tableSearch.js","type":"file","size":7018,"lastModified":"2024-11-13T16:43:32.677Z"},{"name":"tables.html","type":"file","size":13440,"lastModified":"2024-11-13T16:43:32.669Z"},{"name":"tables.scroll","type":"file","size":1403,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"tables.txt","type":"file","size":2756,"lastModified":"2024-11-13T16:43:32.637Z"},{"name":"tabularData.html","type":"file","size":7348,"lastModified":"2024-11-13T16:43:32.633Z"},{"name":"tabularData.scroll","type":"file","size":1047,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"tabularData.txt","type":"file","size":922,"lastModified":"2024-11-13T16:43:32.629Z"},{"name":"testOutput","type":"directory","size":4096,"lastModified":"2024-11-13T16:43:32.209Z"},{"name":"theScroll.html","type":"file","size":3830,"lastModified":"2024-11-13T16:43:32.621Z"},{"name":"theScroll.scroll","type":"file","size":27,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"themes.html","type":"file","size":542,"lastModified":"2024-11-13T16:43:32.621Z"},{"name":"themes.scroll","type":"file","size":165,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"top-sinks.scroll","type":"file","size":725,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"tufte.css","type":"file","size":7559,"lastModified":"2024-11-13T16:43:32.621Z"},{"name":"tufte.html","type":"file","size":1204,"lastModified":"2024-11-13T16:43:32.621Z"},{"name":"tufte.scroll","type":"file","size":40,"lastModified":"2024-11-13T16:43:09.945Z"},{"name":"video.html","type":"file","size":246,"lastModified":"2024-11-13T16:43:32.621Z"},{"name":"video.scroll","type":"file","size":74,"lastModified":"2024-11-13T16:43:09.945Z"}] 11/13/2024 -2026 -10.1 +2040 +10.2 Dependencies -This file requires these files: =============================== file /home/runner/work/scroll/scroll/tests/header.scroll /home/runner/work/scroll/scroll/tests/settings.scroll /home/runner/work/scroll/scroll/tests/extension.parsers /home/runner/work/scroll/scroll/microlangs/changes.parsers /home/runner/work/scroll/scroll/tests/footer.scroll ../particles.png ../style.css contacts.csv [Image Omitted] Built with Scroll v149.0.0 +This file requires these files: =============================== file /home/runner/work/scroll/scroll/tests/header.scroll /home/runner/work/scroll/scroll/tests/settings.scroll /home/runner/work/scroll/scroll/tests/extension.parsers /home/runner/work/scroll/scroll/microlangs/changes.parsers /home/runner/work/scroll/scroll/tests/footer.scroll ../particles.png ../style.css contacts.csv [Image Omitted] Built with Scroll v150.0.0 11/13/2024 60 0.3 @@ -359,7 +359,7 @@ 0 Debug tools tests -Debug tools tests ================= The sum of 1+1 is 2 Pass 1 - codeAtStart ======== buildHtml replace TITLE Debug tools tests replaceJs SUM 1+1 title TITLE theme gazette printTitle The sum of 1+1 is SUM printSourceStack footer.scroll Pass 2 - codeAfterImportPass ======== buildHtml replace TITLE Debug tools tests replaceJs SUM 1+1 title TITLE theme gazette printTitle The sum of 1+1 is SUM printSourceStack imported footer.scroll exists true center emailButton feedback@scroll.pub downloadButton download.html editButton scrollVersionLink Pass 3 - codeAfterMacroPass ======== buildHtml title Debug tools tests theme gazette printTitle The sum of 1+1 is 2 printSourceStack imported footer.scroll exists true center emailButton feedback@scroll.pub downloadButton download.html editButton scrollVersionLink Built with Scroll v149.0.0 +Debug tools tests ================= The sum of 1+1 is 2 Pass 1 - codeAtStart ======== buildHtml replace TITLE Debug tools tests replaceJs SUM 1+1 title TITLE theme gazette printTitle The sum of 1+1 is SUM printSourceStack footer.scroll Pass 2 - codeAfterImportPass ======== buildHtml replace TITLE Debug tools tests replaceJs SUM 1+1 title TITLE theme gazette printTitle The sum of 1+1 is SUM printSourceStack imported footer.scroll exists true center emailButton feedback@scroll.pub downloadButton download.html editButton scrollVersionLink Pass 3 - codeAfterMacroPass ======== buildHtml title Debug tools tests theme gazette printTitle The sum of 1+1 is 2 printSourceStack imported footer.scroll exists true center emailButton feedback@scroll.pub downloadButton download.html editButton scrollVersionLink Built with Scroll v150.0.0 11/13/2024 119 0.6 @@ -388,6 +388,12 @@ 34 0.2 +Concepts +Concepts ======== name,email,phone,birthday,notes Jack Doe,john.doe@example.com,+1 (555) 123-4567,2/23/84,Daughter - Samantha. Jill Smith,jill@gmail.com,+1 (555) 123-4562,1/23/80, +11/13/2024 +33 +0.2 + Comments 11/13/2024 @@ -395,7 +401,7 @@ 0 Cloc -files,language,blank,comment,code 22,JavaScript,8167,9030,71811 107,Parsers,327,0,5677 129,Scroll,1821,0,5069 12,CSS,245,87,3755 2,SVG,0,0,226 2,JSON,0,0,109 4,YAML,6,3,65 2,Markdown,17,0,37 1,Text,0,0,8 1,HTML,0,0,5 1,Python,0,0,1 283,SUM,10583,9120,86763 +files,language,blank,comment,code 22,JavaScript,8142,9008,71570 107,Parsers,328,0,5971 130,Scroll,1826,0,5090 12,CSS,245,87,3755 2,SVG,0,0,226 2,JSON,0,0,109 4,YAML,6,3,65 2,Markdown,17,0,37 1,Text,0,0,8 1,HTML,0,0,5 1,Python,0,0,1 284,SUM,10564,9098,86837 11/13/2024 65 0.3 @@ -455,7 +461,7 @@ 0.3 Top Sinks -Top Sinks ========= by Breck Yunits https://breckyunits.com Breck Yunits 283 in database $0 budget 3 countries sinkManufacturer|country Blue|USA Red|Canada sinkManufacturer|country Blue|USA Red|Canada sinkManufacturer|country Blue|USA Red|Canada Today is Wed Nov 13 2024 14:59:45 GMT+0000 (Coordinated Universal Time) 1+1 = 2 January 11, 2019 was a great day There are 283 in my list. This file is in dir: /home/runner/work/scroll/scroll/tests +Top Sinks ========= by Breck Yunits https://breckyunits.com Breck Yunits 283 in database $0 budget 3 countries sinkManufacturer|country Blue|USA Red|Canada sinkManufacturer|country Blue|USA Red|Canada sinkManufacturer|country Blue|USA Red|Canada Today is Wed Nov 13 2024 16:43:32 GMT+0000 (Coordinated Universal Time) 1+1 = 2 January 11, 2019 was a great day There are 283 in my list. This file is in dir: /home/runner/work/scroll/scroll/tests 01/11/2019 76 0.4 @@ -470,6 +476,6 @@
    -
    +
    \ No newline at end of file diff --git a/tests/iris.html b/tests/iris.html index 04c972b49..37b8b1453 100644 --- a/tests/iris.html +++ b/tests/iris.html @@ -12,16 +12,22 @@ species - 4.9 -2.5 -4.5 -1.7 + 6.2 +3.4 +5.4 +2.3 virginica -7.7 -3.8 -6.7 -2.2 +5 +3.4 +1.5 +0.2 +setosa + +5.6 +2.8 +4.9 +2 virginica 6.2 @@ -30,47 +36,41 @@ 1.8 virginica -6.1 -3 -4.9 -1.8 -virginica - 5.3 3.7 1.5 0.2 setosa -5 -3.4 -1.5 -0.2 -setosa - -6.2 -3.4 -5.4 -2.3 +6.1 +3 +4.9 +1.8 virginica -5.1 -3.5 -1.4 -0.2 -setosa - 5.6 2.7 4.2 1.3 versicolor -5.6 -2.8 -4.9 -2 +4.9 +2.5 +4.5 +1.7 +virginica + +7.7 +3.8 +6.7 +2.2 virginica + +5.1 +3.5 +1.4 +0.2 +setosa diff --git a/tests/json.html b/tests/json.html index 5e57f6894..75bbf6477 100644 --- a/tests/json.html +++ b/tests/json.html @@ -3,7 +3,7 @@ + - + diff --git a/tests/openGraphImages.html b/tests/openGraphImages.html index 54c4c141f..9424e1111 100644 --- a/tests/openGraphImages.html +++ b/tests/openGraphImages.html @@ -3,12 +3,12 @@ Open Graph Images - + - + diff --git a/tests/posts.html b/tests/posts.html index aafe21145..669576b64 100644 --- a/tests/posts.html +++ b/tests/posts.html @@ -3,12 +3,12 @@ Posts - + - + diff --git a/tests/prompt.txt b/tests/prompt.txt index 3d25edbe3..05036bfa8 100644 --- a/tests/prompt.txt +++ b/tests/prompt.txt @@ -8,7 +8,7 @@ The Files: Source https://scroll.pub/tests/ Kitchen sink test site. - Wed, 13 Nov 2024 14:59:46 +0000 + Wed, 13 Nov 2024 16:43:32 +0000 en-us A review of my sink diff --git a/tests/relativeSnippets.html b/tests/relativeSnippets.html index 5c1db633c..22da52c76 100644 --- a/tests/relativeSnippets.html +++ b/tests/relativeSnippets.html @@ -3,12 +3,12 @@ Relative Snippets - + - + @@ -84,7 +84,7 @@ Canada -

    Today is Wed Nov 13 2024 14:59:45 GMT+0000 (Coordinated Universal Time)

    +

    Today is Wed Nov 13 2024 16:43:32 GMT+0000 (Coordinated Universal Time)

    1+1 = 2

    January 11, 2019 was a great day

    There are 283 in my list.

    diff --git a/tests/scrollVersion.html b/tests/scrollVersion.html index 0f5531a25..24b1bc188 100644 --- a/tests/scrollVersion.html +++ b/tests/scrollVersion.html @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/tests/sitemap.txt b/tests/sitemap.txt index 7298dbcc5..c4f625db3 100644 --- a/tests/sitemap.txt +++ b/tests/sitemap.txt @@ -57,6 +57,7 @@ https://scroll.pub/dark.html https://scroll.pub/customMarkups.html https://scroll.pub/css.html https://scroll.pub/contacts.html +https://scroll.pub/concepts.html https://scroll.pub/comments.html https://scroll.pub/cloc.html https://scroll.pub/center.html diff --git a/tests/subfolder/aTestPost.html b/tests/subfolder/aTestPost.html index 67ec78d9a..64ce60025 100644 --- a/tests/subfolder/aTestPost.html +++ b/tests/subfolder/aTestPost.html @@ -3,12 +3,12 @@ This is _a_ test - + - + diff --git a/tests/tabularData.html b/tests/tabularData.html index 0dd8dbbde..c5196a86d 100644 --- a/tests/tabularData.html +++ b/tests/tabularData.html @@ -3,12 +3,12 @@ Tabular data test - + - + diff --git a/tests/top-sinks.html b/tests/top-sinks.html index 8a8641f07..21aac5160 100644 --- a/tests/top-sinks.html +++ b/tests/top-sinks.html @@ -3,12 +3,12 @@ Top Sinks - + - + @@ -77,7 +77,7 @@ Canada -

    Today is Wed Nov 13 2024 14:59:45 GMT+0000 (Coordinated Universal Time)

    +

    Today is Wed Nov 13 2024 16:43:32 GMT+0000 (Coordinated Universal Time)

    1+1 = 2

    January 11, 2019 was a great day

    There are 283 in my list.

    diff --git a/tests/top-sinks.txt b/tests/top-sinks.txt index b9b615c92..4964ee9a0 100644 --- a/tests/top-sinks.txt +++ b/tests/top-sinks.txt @@ -18,7 +18,7 @@ sinkManufacturer|country Blue|USA Red|Canada -Today is Wed Nov 13 2024 14:59:45 GMT+0000 (Coordinated Universal Time) +Today is Wed Nov 13 2024 16:43:32 GMT+0000 (Coordinated Universal Time) 1+1 = 2 diff --git a/tutorial.html b/tutorial.html index ade9871ad..c3788651b 100644 --- a/tutorial.html +++ b/tutorial.html @@ -3,12 +3,12 @@ Scroll Tutorial - + - + @@ -286,7 +286,7 @@ - +
    \ No newline at end of file diff --git a/tutorial.txt b/tutorial.txt index 0f398a6f3..c9ab01a64 100644 --- a/tutorial.txt +++ b/tutorial.txt @@ -227,4 +227,4 @@ You probably also can see that the Parsers code is powerful but has lots of shar While the documentation on Parsers evolves, feel free to get in touch for help in adding your own parsers. -Built with Scroll v149.0.0 +Built with Scroll v150.0.0