:header[:p({align:"left"})[:a(.#the-joy-of-secst)[SECST] Markup Language] :p({align:"right"})[:a(https://github.com/anywhichway/secst)[GitHub]]] :footer[:p({align:"left"})[Copyright 2022, AnyWhichWay LLC]] :section[ :h[The Joy of SECST] :abbr[SECST] (:strong[S]emantic, :strong[E]xtensible, :strong[C]omputational, :strong[S]tyleable, :strong[T]agged) is a more expressive, but easy to learn and use, alternative to Markdown. It provides these features and more: :ul[ - Support for almost all HTML tags :a(.#tags)[and then some...], with :a(.#theme)[themes and styles]. - :a(.#tables-of-contents)[Table of contents], :a(.#footnotes)[footnote], :a(.#hashtags)[hashtag] and :a(.#mentions)[social media] support. - Reactive :a(.#values-and-formulas)[formulas and data import] that are as simple as Excel formulas, e.g. :code[:value[2 * 2]] = :value[2 * 2]. - SEO optimization via server rendering with JSON-LD :a(.#structured-data)[structured data] for both content generation and layout. ] Use SECST to joyfully create compelling, interactive HTML documents. This is the source for the introduction above: :code({language:"secst"})[ :abbr[SECST] (:strong[S]emantic, :strong[E]xtensible, :strong[C]omputational, :strong[S]tyleable, :strong[T]agged) is a more expressive, but easy to learn and use, alternative to Markdown. It provides these features and more: :ul[ - Support for almost all HTML tags :a(.#tags)[and then some...], with :a(.#theme)[themes and styles]. - :a(.#tables-of-contents)[Table of contents], :a(.#footnotes)[footnote], :a(.#hashtags)[hashtag] and :a(.#mentions)[social media] support. - Reactive :a(.#values-and-formulas)[formulas and data import] that are as simple as Excel formulas, e.g. :code[:value[2 * 2]] = :value[2 * 2]. - SEO optimization via server rendering with JSON-LD :a(.#structured-data)[structured data] for both content generation and layout. ] Use SECST to joyfully create compelling, interactive HTML documents. ] ] :section[ :toc(toggle)[Table Of Contents] ] :section[ :h[About This Guide] The SECST language, reference HTML transpiler and runtime support implementations are currently in :strong[ALPHA]. Most, but not all, documented features are implemented, testing is far from complete and resource sizes have not been fully optimized. This site's navigation, footnotes, computations, special styles like :kbd[Key] formatting and imported data are built entirely using SECST markup. You can tap on the icon next to a heading to access a table of contents at any time. You can goto the top of the guide by tapping of SECST in the top left corner. This guide is comprehensive, which may make it a little overwhelming. However, SECST has been designed so that you can start using it just a few tags and capabilities at a time. The following order of learning is suggested: :ol[ :li[Use tags that support markup similar to :a(.#basic-markdown)[Markdown].] :li[Start leveraging attributes like :code[align] on :a(.#images)[img].] :li[Try :a(.#theme)[themes or styles].] :li[If you are into music, math, or chemistry try :a(.#sheet-music)[:code[sheetMusic]] or :a(.#latex)[:code[Latex]].] :li[Add some simple :a(.#values-and-formulas)[values and formulas].] - Anything else that gives you joy! ] For gentle overviews see the Medium and Hackernoon articles: :ul[ :li[:a(https://medium.com/@anywhichway/the-joy-of-secst-markup-333d16263225?sk=2f2c7ea14e3086e093b00ca7bec5252d)[Medium:The Joy of SECST Markup]] :li[:a(https://hackernoon.com/the-joy-of-using-secst-markup)[Hackernoon:The Joy of Using SECST Markup]] ] ] :section[ :h[Why Another Language] :dl[ :dt[Semantic Tag] :dd[A tag that has meaning beyond that used to facilitate document layout and style.] :dd[:code[] for bold is not semantic, but :code[] for indicating importance and rendering as bold is semantic.] ] :section[ :h[HTML and Markdown Issues] :ul[ :li[HTML is verbose as a result of the need for matching open and close named tags.] :li[Markdown's goal is simplicity, for which it sacrifices a lot of expressive power. This sacrifice is the result of a non-uniform, non-semantic syntax used to support its simplicity.] :li[Ensuring that HTML documents are meaningful for textual analysis or supportive of assistive software is hard.] :li[Markdown is not semantic, you must learn the different annotations to format your document and the resulting HTML is not necessarily meaningful to textual analysis or assistive software. When Markdown initially had a very limited number of ways to format documents, its syntax was a benefit, for some it is now becoming a burden.] :li[Some Markdown syntax is invisible, e.g. spaces for line breaks] :li[The built-in self creating document navigation capabilities of HTML and Markdown are limited.] :li[Using HTML's computational capabilities, i.e. JavaScript, requires programming skills.] :li[Markdown provides no intrinsic computational capability. You must use something like Jupyter Notebook to support computation.] :li[Markdown provides no way to bundle assets for delivery. HTML supports asset bundling through the use of data URLs, but it is rather obscure and not automatic.] :li[Both HTML and Markdown are require specialized programming skills to extend.] :li[HTML's legacy allows the creation of documents with security flaws.] ] ] :section[ :h[SECST Benefits] :ul[ :li[A consistent, uniform compact representation. Where SECST can become verbose, it has shorthand notation similar to Markdown.] :li[Semantic tags, which make it easier to learn and remember than Markdown and encourages more meaningful documents than straight HTML. Many tags are named after their semantic HTML counterparts to make SECST easier to learn, maintain, and extend.] :li[Enforcement of required attributes and valid values for proper behavior or accessibility reasons.] :li[Extensive, built-in :a(.#tables-of-contents)[document navigation] for tables of contents and footnotes (more than Markdown).] :li[Using SECST's built-in :a({href:"#values-and-formulas"})[computational capability] for math and text expressions is no harder than writing Excel formulas.] :li[A predominantly declarative extension technique make SECTS easier to extend than HTML. Expertise in programming custom elements is not required.] :li[Asset bundling via the use of the attribute :code[static] on :code[audio], :code[img], :code[video] and :code[value] tags.] :li[SECST is easier to extend than Markdown. Expertise in parsers or regular expressions is not required.] :li[SECST is translated to safe HTML constructs to limit the chance of XSS and other attacks.] ] ] ] :section[ :h[When To Use SECST] If you only need basic Markdown, then SECST is probably not for you. If you need extended Markdown, then SECST may be a good option. If you need more than Markdown, then SECST may be your only option short of HTML, CSS, and JavaScript so long as you are focused on interactive document authoring. If you are building an application use Svelte, VUE, React or some other framework. :section[ :h[Basic Markdown] See :a[https://www.markdownguide.org/basic-syntax/]. :table[ :thead[ Document Item | Markdown | SECST | Example ] :tr[ headings | :td[:code[h# heading text]] :td[:code[h#[heading text]]] :td[] ] :tr[ bold | :td[:code[**text**]] :td[:code[:strong[text]]] :td[:strong[text]] ] :tr[ italics | :td[:code[*text*]] :td[:code[:em[text]]] :td[:em[text]] ] :tr[ blockquote | :td[:code[> quote text]] :td[:code[:blockquote[quote text]]] :td[] ] :tr[ nested blockquote | :td[:code[> quote text] :kbd[Enter] :code[>> nested quote text]] :td[:code[:blockquote[quote text :blockquote[nested quote text]]]] :td[] ] :tr[ code | :td[:code['the code']] :td[:code[:code[the code]]] :td[:code[the code]] ] :tr[ horizontal rule | :td[:code[***]] :td[:code[:hr]] :td[] ] :tr[ newline | a new line | :td[a new line or :code[:br]] :td[] ] :tr[ paragraph | two new lines, i.e. an empty line | :td[two new lines or :code[:p[...]]] :td[] ] ] Where SECST can become un-necessarily verbose, e.g. lists items and table cells, it has shorthand notation similar to Markdown. Also see :a({href:"#lists"})[Lists], :a({href:"#code"})[Code], :a({href:"#links"})[Links], :a({href:"#images"})[Images]. ] :section[ :h[Extended Markdown] See :a[https://www.markdownguide.org/extended-syntax/]. :table[ :thead[ Document Item | Markdown | SECST | Example ] :tr[ :td[:a(.#footnotes)[footnotes]] :td[:code[[number]]] :td[:code[:footnote[number] or :footnote[] for automatic numbering]] :td[] ] :tr[ heading ids | :td[:code[# My Heading {#my-id}]] :td[:code[:h1(#my-id)[My Heading]]] :td[] ] :tr[ definition lists | :td[see :a({href:"#definition-lists"})[definition lists]] :td[] :td[] ] :tr[ strikethrough | :td[:code[~~struck out~~]] :td[:code[:strike[struck out]]] :td[:strike[struck out]] ] :tr[ task lists | :td[see :a({href:"#task-lists"})[task lists]] :td[] :td[] ] :tr[ emojis | :td[:code[:]:code[emoji-name:]] :td[:code[:emoji[emoji-name]]] :td[:emoji[smile]] ] :tr[ highlight | :td[:code[==marked words==]] :td[:code[:mark[marked words]]] :td[:mark[marked words]] ] :tr[ subscript | :td[:code[H~2~O]] :td[:code[H:sub[2]0]] :td[H:sub[2]0] ] :tr[ superscript | :td[:code[X^2^]] :td[:code[X:sup[2]]] :td[X:sup[2]] ] :tr[ automatic URL linking | :td[:code[https://my.url.com]] :td[:code[:a[https://my.url.com]]] ] ] ] :section[ :h[Markdown Gaps] :ul[ :li[:a({href:"#hashtags"})[hashtags]] :li[:a({href:"#audio"})[audio]] :li[:a({href:"#video"})[video]] :li[:ins[inserted] and :del[deleted], see :a({href:"inserted-and-deleted"})[inserted and deleted]] :li[:a({href:"#tables-of-contents"})[tables of contents]] :li[:a({href:"#social-media-and-other-mentions"})[social media and other mentions]] ] ] ] :section[ :h[Authoring] Authors write documents using semantic tags with the format :code[[]] or :code[()[]]. For example: :ul[ :li[:code[:strong[bolded important content]] produces :strong[bolded important content]] :li[:code[:em[italicized emphasized content]] produces :em[italicized emphasized content]] ] :section[ :h[Markup Tags With HTML Names] Almost every semantic tag supported by HTML5 is one of the :a({href:"#tags"})[tags supported by SECST]. Most non-semantic tags are excluded from SECST, e.g. :code[
] and :code[]. Exceptions are :code[
], :code[], :code[
    ], :code[
      ] and :code[