From 19844b03943ef5d699f4f4b1a8f67a9de136aa0f Mon Sep 17 00:00:00 2001 From: Kuba Sunderland-Ober Date: Wed, 27 May 2026 19:31:16 +0200 Subject: [PATCH 1/9] Remove the obsolete experiments folder. This contained the very early experimental site from years ago. --- experiments/TEST.md | 1 - experiments/_config.yml | 21 -- experiments/_data/meta/categories.json | 17 -- experiments/_features/index.md | 1 - experiments/_includes/breadcrumbs.html | 11 -- experiments/_includes/lazyload.html | 11 -- experiments/_includes/toc.html | 182 ------------------ experiments/_intro/index.md | 1 - experiments/_layouts/default.html | 62 ------ .../customcontrols/ccCOMCreatable.png | Bin 5747 -> 0 bytes .../customcontrols/ccClassIdAttribute.png | Bin 3292 -> 0 bytes .../customcontrols/ccClassIdInsert.png | Bin 1572 -> 0 bytes .../ccCustomControlAttribute.png | Bin 2217 -> 0 bytes .../customcontrols/ccGridButtonImage.png | Bin 8368 -> 0 bytes .../customcontrols/ccICustomControl.png | Bin 9560 -> 0 bytes .../customcontrols/ccSampleProject.png | Bin 48510 -> 0 bytes .../_samples/customcontrols/defining.md | 103 ---------- .../_samples/customcontrols/formdesigner.md | 9 - experiments/_samples/customcontrols/index.md | 19 -- .../_samples/customcontrols/painting.md | 86 --------- .../propertysheetandserialization.md | 71 ------- experiments/_samples/index.md | 23 --- .../_samples/packages/createpackage.md | 85 -------- .../packages/importpackagefromfile.md | 31 --- .../packages/importpackagefromtwinserv.md | 33 ---- experiments/_samples/packages/index.md | 17 -- .../_samples/packages/updatepackage.md | 27 --- experiments/_samples/webview2/index.md | 46 ----- experiments/_samples/webview2/reentrancy.md | 21 -- .../_samples/webview2/userdatafolder.md | 19 -- experiments/assets/lazysizes.min.js | 3 - experiments/assets/treeview.css | 79 -------- .../images/twinBASICIconTransparent.png | Bin 5515 -> 0 bytes experiments/index.md | 49 ----- .../lcheck-fixture/site/assets/script.js | 1 - .../lcheck-fixture/site/assets/style.css | 1 - .../site/good-dir-noindex/other.html | 2 - .../lcheck-fixture/site/good-dir/index.html | 3 - .../lcheck-fixture/site/good-fallback.html | 2 - .../lcheck-fixture/site/good-fragments.html | 4 - experiments/lcheck-fixture/site/good.html | 3 - experiments/lcheck-fixture/site/index.html | 63 ------ .../lcheck-fixture/site/subdir/image.png | 1 - .../lcheck-fixture/site/subdir/nested.html | 4 - experiments/samples.md | 20 -- experiments/sitemap.xml | 30 --- 46 files changed, 1162 deletions(-) delete mode 100644 experiments/TEST.md delete mode 100644 experiments/_config.yml delete mode 100644 experiments/_data/meta/categories.json delete mode 100644 experiments/_features/index.md delete mode 100644 experiments/_includes/breadcrumbs.html delete mode 100644 experiments/_includes/lazyload.html delete mode 100644 experiments/_includes/toc.html delete mode 100644 experiments/_intro/index.md delete mode 100644 experiments/_layouts/default.html delete mode 100644 experiments/_samples/customcontrols/ccCOMCreatable.png delete mode 100644 experiments/_samples/customcontrols/ccClassIdAttribute.png delete mode 100644 experiments/_samples/customcontrols/ccClassIdInsert.png delete mode 100644 experiments/_samples/customcontrols/ccCustomControlAttribute.png delete mode 100644 experiments/_samples/customcontrols/ccGridButtonImage.png delete mode 100644 experiments/_samples/customcontrols/ccICustomControl.png delete mode 100644 experiments/_samples/customcontrols/ccSampleProject.png delete mode 100644 experiments/_samples/customcontrols/defining.md delete mode 100644 experiments/_samples/customcontrols/formdesigner.md delete mode 100644 experiments/_samples/customcontrols/index.md delete mode 100644 experiments/_samples/customcontrols/painting.md delete mode 100644 experiments/_samples/customcontrols/propertysheetandserialization.md delete mode 100644 experiments/_samples/index.md delete mode 100644 experiments/_samples/packages/createpackage.md delete mode 100644 experiments/_samples/packages/importpackagefromfile.md delete mode 100644 experiments/_samples/packages/importpackagefromtwinserv.md delete mode 100644 experiments/_samples/packages/index.md delete mode 100644 experiments/_samples/packages/updatepackage.md delete mode 100644 experiments/_samples/webview2/index.md delete mode 100644 experiments/_samples/webview2/reentrancy.md delete mode 100644 experiments/_samples/webview2/userdatafolder.md delete mode 100644 experiments/assets/lazysizes.min.js delete mode 100644 experiments/assets/treeview.css delete mode 100644 experiments/images/twinBASICIconTransparent.png delete mode 100644 experiments/index.md delete mode 100644 experiments/lcheck-fixture/site/assets/script.js delete mode 100644 experiments/lcheck-fixture/site/assets/style.css delete mode 100644 experiments/lcheck-fixture/site/good-dir-noindex/other.html delete mode 100644 experiments/lcheck-fixture/site/good-dir/index.html delete mode 100644 experiments/lcheck-fixture/site/good-fallback.html delete mode 100644 experiments/lcheck-fixture/site/good-fragments.html delete mode 100644 experiments/lcheck-fixture/site/good.html delete mode 100644 experiments/lcheck-fixture/site/index.html delete mode 100644 experiments/lcheck-fixture/site/subdir/image.png delete mode 100644 experiments/lcheck-fixture/site/subdir/nested.html delete mode 100644 experiments/samples.md delete mode 100644 experiments/sitemap.xml diff --git a/experiments/TEST.md b/experiments/TEST.md deleted file mode 100644 index 7ee5cf0b..00000000 --- a/experiments/TEST.md +++ /dev/null @@ -1 +0,0 @@ -Another test 😅 diff --git a/experiments/_config.yml b/experiments/_config.yml deleted file mode 100644 index 39503867..00000000 --- a/experiments/_config.yml +++ /dev/null @@ -1,21 +0,0 @@ -url: twinbasic.github.io -title: twinBASIC Documentation -baseurl: / -remote_theme: pages-themes/slate@v0.2.0 -markdown: redcarpet -redcarpet: - extensions: ["no_intra_emphasis", "tables", "autolink", "strikethrough", "with_toc_data", "disable_indented_code_blocks"] -defaults: - - scope: - path: "" - values: - layout: default -plugins: -- jekyll-remote-theme -collections: - intro: - output: true - features: - output: true - samples: - output: true \ No newline at end of file diff --git a/experiments/_data/meta/categories.json b/experiments/_data/meta/categories.json deleted file mode 100644 index 88f662b9..00000000 --- a/experiments/_data/meta/categories.json +++ /dev/null @@ -1,17 +0,0 @@ -[ - { - "category": "customcontrols", - "title": "Custom Controls", - "description": "Using custom controls in twinBASIC" - }, - { - "category": "packages", - "title": "Packages", - "description": "Using packages in twinBASIC and TWINPACK server." - }, - { - "category": "webview2", - "title": "WebView2", - "description": "Using WebView2 as a control in twinBASIC" - } -] \ No newline at end of file diff --git a/experiments/_features/index.md b/experiments/_features/index.md deleted file mode 100644 index e70fd889..00000000 --- a/experiments/_features/index.md +++ /dev/null @@ -1 +0,0 @@ -This is tB features main page. \ No newline at end of file diff --git a/experiments/_includes/breadcrumbs.html b/experiments/_includes/breadcrumbs.html deleted file mode 100644 index 7abfb8da..00000000 --- a/experiments/_includes/breadcrumbs.html +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/experiments/_includes/lazyload.html b/experiments/_includes/lazyload.html deleted file mode 100644 index e1ef20eb..00000000 --- a/experiments/_includes/lazyload.html +++ /dev/null @@ -1,11 +0,0 @@ -{% comment %} - See: https://ranvir.xyz/blog/lazy-loading-your-images-in-jekyll-blog-improving-page-speed/ -{% endcomment %} - -{% if include.image_src %} - - - - - {{include.image_title}} -{% endif %} \ No newline at end of file diff --git a/experiments/_includes/toc.html b/experiments/_includes/toc.html deleted file mode 100644 index 3cff42f1..00000000 --- a/experiments/_includes/toc.html +++ /dev/null @@ -1,182 +0,0 @@ -{% capture tocWorkspace %} - {% comment %} - Copyright (c) 2017 Vladimir "allejo" Jimenez - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - {% endcomment %} - {% comment %} - Version 1.2.0 - https://github.com/allejo/jekyll-toc - - "...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe - - Usage: - {% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %} - - Parameters: - * html (string) - the HTML of compiled markdown generated by kramdown in Jekyll - - Optional Parameters: - * sanitize (bool) : false - when set to true, the headers will be stripped of any HTML in the TOC - * class (string) : '' - a CSS class assigned to the TOC - * id (string) : '' - an ID to assigned to the TOC - * h_min (int) : 1 - the minimum TOC header level to use; any header lower than this value will be ignored - * h_max (int) : 6 - the maximum TOC header level to use; any header greater than this value will be ignored - * ordered (bool) : false - when set to true, an ordered list will be outputted instead of an unordered list - * item_class (string) : '' - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level - * submenu_class (string) : '' - add custom class(es) for each child group of headings; has support for '%level%' placeholder which is the current "submenu" heading level - * base_url (string) : '' - add a base url to the TOC links for when your TOC is on another page than the actual content - * anchor_class (string) : '' - add custom class(es) for each anchor element - * skip_no_ids (bool) : false - skip headers that do not have an `id` attribute - - Output: - An ordered or unordered list representing the table of contents of a markdown block. This snippet will only - generate the table of contents and will NOT output the markdown given to it - {% endcomment %} - - {% capture newline %} - {% endcapture %} - {% assign newline = newline | rstrip %} - - {% capture deprecation_warnings %}{% endcapture %} - - {% if include.baseurl %} - {% capture deprecation_warnings %}{{ deprecation_warnings }}{{ newline }}{% endcapture %} - {% endif %} - - {% if include.skipNoIDs %} - {% capture deprecation_warnings %}{{ deprecation_warnings }}{{ newline }}{% endcapture %} - {% endif %} - - {% capture jekyll_toc %}{% endcapture %} - {% assign orderedList = include.ordered | default: false %} - {% assign baseURL = include.base_url | default: include.baseurl | default: '' %} - {% assign skipNoIDs = include.skip_no_ids | default: include.skipNoIDs | default: false %} - {% assign minHeader = include.h_min | default: 1 %} - {% assign maxHeader = include.h_max | default: 6 %} - {% assign nodes = include.html | strip | split: ' maxHeader %} - {% continue %} - {% endif %} - - {% assign _workspace = node | split: '' | first }}>{% endcapture %} - {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %} - - {% if include.item_class and include.item_class != blank %} - {% capture listItemClass %} class="{{ include.item_class | replace: '%level%', currLevel | split: '.' | join: ' ' }}"{% endcapture %} - {% endif %} - - {% if include.submenu_class and include.submenu_class != blank %} - {% assign subMenuLevel = currLevel | minus: 1 %} - {% capture subMenuClass %} class="{{ include.submenu_class | replace: '%level%', subMenuLevel | split: '.' | join: ' ' }}"{% endcapture %} - {% endif %} - - {% capture anchorBody %}{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}{% endcapture %} - - {% if htmlID %} - {% capture anchorAttributes %} href="{% if baseURL %}{{ baseURL }}{% endif %}#{{ htmlID }}"{% endcapture %} - - {% if include.anchor_class %} - {% capture anchorAttributes %}{{ anchorAttributes }} class="{{ include.anchor_class | split: '.' | join: ' ' }}"{% endcapture %} - {% endif %} - - {% capture listItem %}{{ anchorBody }}{% endcapture %} - {% elsif skipNoIDs == true %} - {% continue %} - {% else %} - {% capture listItem %}{{ anchorBody }}{% endcapture %} - {% endif %} - - {% if currLevel > lastLevel %} - {% capture jekyll_toc %}{{ jekyll_toc }}<{{ listModifier }}{{ subMenuClass }}>{% endcapture %} - {% elsif currLevel < lastLevel %} - {% assign repeatCount = lastLevel | minus: currLevel %} - - {% for i in (1..repeatCount) %} - {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %} - {% endfor %} - - {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %} - {% else %} - {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %} - {% endif %} - - {% capture jekyll_toc %}{{ jekyll_toc }}{{ listItem }}{% endcapture %} - - {% assign lastLevel = currLevel %} - {% assign firstHeader = false %} - {% endfor %} - - {% assign repeatCount = minHeader | minus: 1 %} - {% assign repeatCount = lastLevel | minus: repeatCount %} - {% for i in (1..repeatCount) %} - {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %} - {% endfor %} - - {% if jekyll_toc != '' %} - {% assign rootAttributes = '' %} - {% if include.class and include.class != blank %} - {% capture rootAttributes %} class="{{ include.class | split: '.' | join: ' ' }}"{% endcapture %} - {% endif %} - - {% if include.id and include.id != blank %} - {% capture rootAttributes %}{{ rootAttributes }} id="{{ include.id }}"{% endcapture %} - {% endif %} - - {% if rootAttributes %} - {% assign nodes = jekyll_toc | split: '>' %} - {% capture jekyll_toc %}<{{ listModifier }}{{ rootAttributes }}>{{ nodes | shift | join: '>' }}>{% endcapture %} - {% endif %} - {% endif %} -{% endcapture %}{% assign tocWorkspace = '' %}{{ deprecation_warnings }}{{ jekyll_toc -}} diff --git a/experiments/_intro/index.md b/experiments/_intro/index.md deleted file mode 100644 index ff5dd5c4..00000000 --- a/experiments/_intro/index.md +++ /dev/null @@ -1 +0,0 @@ -This is tB introduction \ No newline at end of file diff --git a/experiments/_layouts/default.html b/experiments/_layouts/default.html deleted file mode 100644 index adfcfa59..00000000 --- a/experiments/_layouts/default.html +++ /dev/null @@ -1,62 +0,0 @@ -{% comment %} The HTML has been copied from https://github.com/pages-themes/slate/blob/master/_layouts/default.html {% endcomment %} - - - - - - - - - - -{% seo %} - {% include head-custom.html %} - - - - - - - - - - -
-
- {% if site.github.is_project_page %} - View on GitHub - {% endif %} - -

{{ site.title | default: site.github.repository_name }}

-

{{ site.description | default: site.github.project_tagline }}

- - {% include breadcrumbs.html %} - - {% if site.show_downloads %} -
- Download this project as a .zip file - Download this project as a tar.gz file -
- {% endif %} -
-
- - -
-
- {% include toc.html html=content %} - {{ content }} -
-
- - - - - \ No newline at end of file diff --git a/experiments/_samples/customcontrols/ccCOMCreatable.png b/experiments/_samples/customcontrols/ccCOMCreatable.png deleted file mode 100644 index 778b168e205be828cf27ac9e92ea129f837d0ef1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5747 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 diff --git a/experiments/_samples/customcontrols/ccClassIdAttribute.png b/experiments/_samples/customcontrols/ccClassIdAttribute.png deleted file mode 100644 index 0182a5280cafe8afa36e86eac2992a6a8b2dfa39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3292 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 diff --git a/experiments/_samples/customcontrols/ccGridButtonImage.png b/experiments/_samples/customcontrols/ccGridButtonImage.png deleted file mode 100644 index 1fc23423669e1524a3041f94cbe4981a4a0cddca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8368 zcma)i2UHW$x^9pnhTa4zQUnDe5RfiPi-I6Z5Rl%B0gQkY>AfieN-rY4hZ+dIOI50b z-lY?I=;e*)+;{H1XT5jVU0IXK$}Y2K@BNkkp9xccp+o^@27^E#if76&4G@Un5Ab_{ zlmz(3iqIYcryKUly6-`tn>>FHf@d1sJHVgUot~*ZxxNIZB?1#;9Oy1UAP&$on7rnP z6x_60IO}UO_MNN3^{w@!d3(`6;d~VF2AiSDG#siu>bjg|yej21#L9=%>`uZ2Ec4xr z?4**RLNkiwLe$MrQx;{=^<~ZuBGN!RY8?kw#2uT_((taTYTEmXaWEC??l0ZxqA6Rc zm&NW1R@!-JiYmrSyG6e-7j*eH{+`c8rgy*aG>W)7hZO<282$Cp1&^QV1Zo|P~ zqU=Fn3lx`nA!(??ZB;4v@>^_f= zj({sJY39j^r#JihmJVrxqU0)b7B)}0`n+t}Y_hL$wtsQ%{B+w*0FI}rx*OV5=zVrF%X;D;0;QLoQ zPN>!^?V@}vFwSj7*2dz`zvZIduMP3c?)k?&`gQ*d^`=^={>e$*T@}UjYc<6q>Z3OH z2#^wZp}Rms0iJ=v-E5qkoGfN1>a#!4>r2|kP+->J8?2*;i#EbUTvMIWxAutCl$dS=iNJgMRVcrWyId)%{eEA zBAx7G-ug8D^Xw{+w+KdfGEr$;?Sj+G!t;6zoi|&Lozou?!-csgEWJ+lmY(q%H+o79 zNSnq91f)%CVuh!w>;5c{sNKw(DxEyk_twL>M>z%*%f3BBE~(jG^zC^hR7M!#of=&P z&4uo*d+&>Eoc1{`)A&sW$vL_VbV#LZ zE#=^ypHvxfC{l!wKm4pORe|lUX{-p>txI2lzb+A(!XB|W-Lm@rsxixvd>pLXRJ@uI z>@eVyA$m1lL`Aysg{Wk4{@Hu1DOOtT;S0ns%)5JQ7u4v8z7;rzPU%}tESnf>ThX?G z3$~Vo?X|*>*a==+58j6X7-dt|9EiXh32gl?yKIUKTC-fIGiyUs730F{Ou;;+du|99 z(U8S;ueTnOt;&4bQ)8Ly>dzXFtkEywJ8M0kDc^gzbS3Wg>`|28_uz7T%F|`H2yV6| z8Kmv^r{l4hS^c<;r)xbw-MZq1jIEd^Kd`+9yVoO(*qk@xgO_M+@)vz1!!7}GF zq30HNqtO+m$r-Gtpc`=2SzE zBeuIFygF!_5nGNNwnl}FHYU1$`#Q1W@O$K~Y)$NZH?_YR=iL8-K?;*;X&BfDrAYLi zq-oPoFUrI@9#}Z%`+s`*y?x!0?TG!*glQ;s{7$QORD1dfEp0I0?mgK{&#i4gV8mJz za*ZxHW=Qb0^%*WrUeIa+KWb9B+}+-ji_(z zw7nJY(_eM#ZoOREPRi3!Vd;|dOg9*{$+H!!7WKVDylbJwm(B|x6^!5x=&bo%A7XTS z{ac7MEl>JEW)Vs~H4GF83ZzzI-_?u`4Fwk;_>s5M_W+aofY&*`(lDhnrlMm8XCwR6 z#+jj3jZ80iR=ThJBJKz>i@IM@yo7KDzj75Ct}Xkvzc}H#UsO0NKDE9ruKcrvwMpcB zohiqAIPOl5G)cMI7sXplUiRa%)YFfdP?kBdrari;h|!Qu^xHtbUfa}3@$+@MxY>A; zGZCco=h|)mb7U)6kG*86p=U=A`>uA<(f8`{&Z+;+C0CUg;>~hFnhnL?%Xx-F!kL=- z$q@4>d_!C$tz^Y-M4az?$n3jh({-s0Z%VFB@u|bu*SF*`x0Ehgv3|UTOkLtnkZkw( z^1pP;xADEalRaL$_&9CPEFRC)CfPJ}48qi+rfW?WNiXYzhGf=R{*?OSAC?-?E!`r# zMZQ?y+jD(arY^dIf0d(z*MF06pzx4XUEnk(z>UY%gM+Ah)A9H?pMlIUh!u&frXr5h-ebZD56eIP9C@M zhu^hCJ$#_rYE<(nv`Y<9R}{9;Udof9D;yPO)x4Mhqh}-$fx|XG-p!DVbysJE)5|N_ z)6oRA$Q%9xi-NX*Q2z(yp^#awj%3i*GBITRO1M-AW7 z>N72dVj zRy2YtHT*JIA1OeM4!Ud!nqz3EXFxt4bq|k@=A7{BTA=1w$ZOi!s?o#YVmg{Z8Q~~% zdq+I?fjff&>z3Y45WSXP0k1E0`omPU8+l+55tRi5?Q7D);Nr%`l|%)Mb6tB^TTFbzX`rfM+0|Mq3J4VJmoj?!jC9# z(9qEEq|+N>OBxO*xMPexaFuc!fx69K3CoiN`jx9z@AF`~PE%DkVY?IWRXf|Yis*fQwlMcv z2!nHrwf??UX*VE!N{sk@WG*y{qJ(K0WUrQ2>2Pk0G8kq-Q*V;OueH^@hRle#=h)JS$CkLnQA0aS|UKUso@>i`;Zt}M96XDv)S2u|$c$@HFnRXbCx|Vq@ z&)6!cM4APujCDeJy|W(&v&L)JMYc3MHO1k{vxwXSOz&Ijc1A9;hA&|mkh05buOlS| z$rrS-MV;MkzXu@}4Ku0RMqBrLz|e2NO?&*~@+ zwl>qf-m#0^iC^XB;)jqpMvN3_*%g&2{?!b8h@#BYJJamO@WUZ+W0b^T&8!J89Zhzq zUyAuhYIQA!5tVA=Ogl zWG4Ufm05-Gh?#0Xj3qC1kr-9!R zj#5=N`K_YuRlLI!NUD{?(DCeg*@dbvTN5=kdp4N(VT%` z#M_ewDu7j7bYF3u`~OI?Hoj|@pvM_Af=$*hoPFE4@0L(LJa&`jM~Hw0KT%1X!B>K> zBSM6x3`<_rOBDKDn##j^VKA6(+rKfd8EsawOxR+%0~?{0t1P^n38>kpz6b8jQn1G2 z#+0Hu4XdJ!qaI|1Er(Yr}*xHgwAg7e;n9Dw#*Xe&aom$M(Ubrw4W1`$`$(3-}$D3{DW~iJ|>dOdx zAs8Q<xex5BdP7>t_Nd#bZ z(E`G_xTNv!roKQX-8~JEFS4Yid6KOh2J}jXm-aU8&@TPn+2LnLTz26`%hV<1a`c(X zK>`Pa!aurf(jONTR6}ovJ9GZ6b~U;try`Y4s1JBxP3c4Jo!;7r_wQ|p&rV7{cW_5Z z<$Y3+y6B14(Urbg+dBbOLq9a!+!i0Gs|Y!4@KTQM3=iX#(oiYl2OACHVfrmbmy4su zi!YPa@(Pml*nmrG7iyQ4HQqj@%9CYXnD-`w;4RVd+B-q@VSN`Qiix4iDqm>(!%c?Ha;Ly0*t0|jD5sAAI-7Jz;o zSTIaIFnSiqm^K43F#W0Qu1f5YZqzn9XTg3OzwUZF+4};g+X;8+pZI0)QY-AVa>U&C z8#D=WM+JX=WvxV~Hdj?2)F%iGB%{|1a(waP`a7}Y4|OB09ysx$=qEwcA^u~R%7lb9 z?Lde1|F(&y_Ri5( zty4M9oBWZysJ&Bn{d%dfNcZj1zJW^rvD-a|_^<8%3v%PDXiS*YZvpmtkwq56xl3UX zFbR#Ul=t?Fv`g_*knm~$L_=&$b-Jj1$u5X}%Tq);FWf=d+&8<@677DS+#-WET4SNx z#@SI%62v6M)7_~8|T(GE=X|H+m&M`#h3T2NPFkUF5+4L8|IE&< zT<*Rb^I!FV+VB)U?(}WFG|h2dbZ_!F*i$7KG}W~uKFX5$4ZfUmF=w%cjGf-fVc7IU z3iWO{>j5-GN^Z>Ms-consJXLutg~}Mj`o+`IJ%e1(=crF>o?ftMTOC%kM#GthQ4b+ zGzj-o<}2f9Pp27-v`S+*-)bSaEE;SER{1;rEToP8Qr;j-yOjNJ#Xie222T&DBUfjHw#G*FUblQ0S5Bhe)0)aK15lUKsLP@=PtVuu*=d z4J}PPzU>erzxGALEK{RJb&+OpMT|nPhX8GEOMF$6$-sJm&MdF=zsT~)XW*x3qH?lL z^-3%yC~au)`a^@h-G>;idSvU>P_-gqCbM2!vH2?4z80WOf_j~jMTz+M-DUI0dAt() zj}jrF#qT2<`GLFkGF+!;S36W6))pgoHS^yU8)AJ7|M?3Ny_TbpHbvB2Fyh5>8AA#yiAXGSogHGPd<;zD3+%%k z08*GFwffn$Qic?QwJR;^*zot7M@5zdyD2w2gm`vKk*`1KY3=$KFIuX#z2~E7EkB!p z+IxAr^#Djb%t8C(`rE>Ttw@zR;aC{u{(3Q`yI%Ax?{4+RP4o*F$8%e2q#Fk|9>6~bZtqTpD}}kpOH$z)l+75lDo1Lx^5v1c+Afep`BIpr z-w9~zF&vZJRdvp*v2cED)FQMY-De5F3y%3D!Ax;JD~0y|){h!>A)m9zx{7}a%Xefk z{r0EKoR7zQ@r%+i zrR4bpWO4kqT*Rn8#vC6(Ajdy`JOMS6)ka)7*h7z?>RIg%l7fNl4~!r+PkW`df#dPI z%kHvd;Orww6G(L+AYxW3H`-jzc?E+_o1d4)Dh&U6z&gxSYB~LQ2lFzexk*PS;kl2| z@J@iX?VfaTRFsC97JR4mn0XLjVAj_|k2dz3MR#8mirr%H3PH^cnRBe@_&}Rc-`IGC zeM%E@!Y)myZ4+TPA>mi{&I~JJxPf{=#Wg{}C}*bF1_n>~=&l8@B>@`#P%)T*_V;-I zhPdtm4fU<~4447e*<)(g;bJ1V9Cmj?>q!ec3N=3|NZ@7w-*G|(vs_$SeB{Zo%xbO2S_ z)soKWKlL(T4*@v*=4q9iyh0pmZqJNkWo+$rYJ1O6*?=K77?Cl(X6A$OoB8$#y^T{$ zlCgTeZyK~)qeAS1t_l{@!W&*@6fYj#eoO=fGp;f9n^gLvI#q!CIy7(jK1q2*%Ex?R7d(c`9hfuXn&zUYED}cOg;1uA3 zV&^NBm2$as7j~#%UNKV)%GBUsizI?0Ium4h|-oqZc_VF@n^dW234yD;`vYa$Phb+84{I(SX zg#BUCn`@XQ0VkJRJ)#eR1;w{s^WJE`5%_s{`NB0(FrX7=LZg>m;s(_quzVDFOYj!D$b85{9k?_9d-jq$h4`Ykc^|34GanI?+V zp^h&-B6xAy*rL1W%J(zN^DR>}&7izq3%o6!^Z7ntr8xcI5M6vtD}0P9z9{hPte59- zvHq998v5n>bG5q98;cu8wrEr7gYM&?RERM5~2OunS4ng>#e}avwK*Ud50-GrYc3nQGkNkL)iAFYWah z5hxbAUtt7(e^a&z9XLBajov4ahPl{zb9D}d|?(Tl-ptFo#;k+M$1Z>vy-G$t&C&}p@w@Nn6pW|Y$#H`vh z>**I`_;0;+c#;nSvKv(yUmcyk?O%=C%)fSZ-DPjQWWEASa_7b6L9F@S-ViO|uL}y4 zZhy>pzO37i>O_O?_0U#DfG-^yB3J~c|B##W|6Q** zF={&_!p2o7Cs9^RNb4A@aY|c~HF0@E;iR5*zvyloVD^bP*kwSV`~2WO1aqpPPV-Y# zuupmQ>iCkEgDHXRE%LjQ6<6H+fR%*H?UPaBqB&mM9ik%&N~+uN@8jFU}@0v z8brh7%F~x|Mu0^&D6(7k_E!E2x}^Az`7lq#FHO15)gx8nXNe$nCnQ~|`PqkDLl8EFehd|`$ha1|uaUk_%?-mDP7NbT zTGVs6069wF;~{SgZ7^tqn(Q5X)d5txg1+9gI>=^VaR~OLU9PX}(!^K);lpT}TnAw_ zx{FBN`}^>W_AgCp!P7?gC84#|lc%)T zeA{{BvtxAhhIV)UX!KM9DM7}6V`0=?yczI%fa2eG0sa-%b*9VA?3frGQKcSvg@xrY w{VRNXeGK;aa)nk1F;#*+X|esUIsHr7jUwphGlGUvpgYjBCof>d3MT&l2fXwgH~;_u diff --git a/experiments/_samples/customcontrols/ccICustomControl.png b/experiments/_samples/customcontrols/ccICustomControl.png deleted file mode 100644 index 6c5dbc52096c80b2cf27c839fdd25539a52dbf4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9560 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 A-~a#s diff --git a/experiments/_samples/customcontrols/defining.md b/experiments/_samples/customcontrols/defining.md deleted file mode 100644 index 6c0c0ba8..00000000 --- a/experiments/_samples/customcontrols/defining.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Defining a custom control -category: customcontrols -order: 2 ---- - -# Defining a CustomControl - -A CustomControl is simply an ordinary twinBASIC class, with a few extra attributes and requirements. - -{% include toc.html content=page.content skip_toc=page.skip_toc%} - -_**TIP: It is highly advisable to look at and experiment with the sample project provided with twinBASIC before trying to implement your own CustomControl.**_ - -{% include lazyload.html image_src="ccSampleProject.png" image_title="CustomControl Sample Project" %} - -*** - -## CustomControl() attribute - -{% include lazyload.html image_src="ccCustomControlAttribute.png" image_title="CustomControl attribute" %} - -This is a required attribute for all CustomControls. You must provide the relative path to an image file within your project that can be used to identify your control in the form designer toolbox. We recommend that you put the image file in the Miscellaneous folder in your project. - -{% include lazyload.html image_src="ccGridButtonImage.png" image_title="CustomControl GridImage Folder" %} - -*** - -## ClassId() attribute - -{% include lazyload.html image_src="ccClassIdAttribute.png" image_title="CustomControl ClassId Attribute" %} - -This is a required attribute for all CustomControls. You must provide a unique CLSID (GUID) in order for the form engine to work with your control. - -_**TIP: if you enter ` [ ClassId () ] ` twinBASIC helps you out - just press the 'insert a randomly generated GUID' text:**_ - -{% include lazyload.html image_src="ccClassIdInsert.png" image_title="CustomControl ClassId auto-generate" %} - -*** - -## COMCreatable() attribute - -{% include lazyload.html image_src="ccCOMCreatable.png" image_title="CustomControl COMCreatable attribute" %} - -This is an optional attribute, but it is usually advisable to set this attribute to False, as you don't need to instantiate CustomControls from external COM environments. - -*** - -## Must implement ICustomControl - -{% include lazyload.html image_src="ccICustomControl.png" image_title="CustomControl ICustomControl interface" %} - -All CustomControls *must* implement CustomControls.ICustomControl. This interface currently has 3 methods that you must implement: - -``` -Sub Initialize(ByVal Context As CustomControlContext) -``` - -This method is called when your control is attached to a form. You must store the provided Context object in a class field as it offers a `Repaint()` method for informing the form engine that something in your control has changed and needs to be repainted. - -``` -Sub Destroy() -``` - -This method is called when your control is detached from a form. This allows an opportunity to break circular references so that your object instance can be destructed properly. The implementation for this can often be left empty provided you don't create circular references in objects. - -``` -Sub Paint(ByVal Canvas As Canvas) -``` - -This is the most interesting part for a CustomControl. As such, it gets its own section, see [Painting / drawing to your control](painting.html) - -*** - -## Minimum set of properties - -As twinBASIC doesn't yet support inheritance, you must expose a set of common properties (class fields) for all CustomControls: - -``` -Public Name As String -Public Left As CustomControls.PixelCount -Public Top As CustomControls.PixelCount -Public Width As CustomControls.PixelCount -Public Height As CustomControls.PixelCount -Public Anchors As Anchors = New Anchors -Public Dock As CustomControls.DockMode -Public Visible As Boolean -``` - -The form designer and the form engine work with these properties, so it is important to include them in your CustomControl class. - -Note that the form designer works with pixel values which are not DPI-scaled. So the Left/Top/Width/Height properties of your control do not reflect DPI scaling. For example, if your control has a width of 50 pixels, then at DPI 150%, then the actual drawing width is 75 pixels ( see [Painting / drawing to your control](painting.html) ). -*** - -## Must have a serialization constructor - -CustomControls *must* offer a serialization constructor: - -``` -Public Sub New(Serializer As SerializationInfo) -``` - -The passed in Serializer object offers a `Deserialize()` method that you call in order to load the properties that have been set for your control via the form designer. See [Property Sheet & Object Serialization](propertysheetandserialization.html) for further information. \ No newline at end of file diff --git a/experiments/_samples/customcontrols/formdesigner.md b/experiments/_samples/customcontrols/formdesigner.md deleted file mode 100644 index 6d6508fd..00000000 --- a/experiments/_samples/customcontrols/formdesigner.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Form Designer -category: customcontrols -order: 3 ---- - - -# Notes about the form designer -For the painting of controls in the form designer, CustomControl instances are instantiated and then release immediately after painting has finished. \ No newline at end of file diff --git a/experiments/_samples/customcontrols/index.md b/experiments/_samples/customcontrols/index.md deleted file mode 100644 index 1d216470..00000000 --- a/experiments/_samples/customcontrols/index.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Introduction -category: customcontrols -order: 1 ---- - -### Introduction - -twinBASIC now offers experimental support for CustomControls. CustomControls are implemented using the BASIC language, allowing implementers to design controls directly from the twinBASIC environment. - -A few highlights; -- completely custom drawn controls, with no external or third-party dependencies (tiny footprint) -- support 32-bit RGBA for full alpha-transparency -- support high-DPI modes (per-monitor), requiring little thought whilst designing new controls -- full debugging support via the usual twinBASIC integrated debugger -- designed for efficiency so that supporting complex controls with hundreds of elements (e.g. a DataGrid with 100's of cells) is easily possible -- designed for flexibility, allowing for curved corners, multiple borders, background gradients and much more -- the form engine supports anchoring and docking without any considerations needed for CustomControl implementers -- simple property sheet synchronization via the built-in form designer \ No newline at end of file diff --git a/experiments/_samples/customcontrols/painting.md b/experiments/_samples/customcontrols/painting.md deleted file mode 100644 index 325f5f28..00000000 --- a/experiments/_samples/customcontrols/painting.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: Painting custom controls -category: customcontrols -order: 3 ---- - -# Painting / drawing to your control -### The ICustomControl.Paint method -This is by far the most important method of a CustomControl. It tells the form engine exactly how you want it to render your control. - -_**TIP: It is highly advisable to look at and experiment with the sample project provided with twinBASIC before trying to implement your own CustomControl.**_ - - Private Sub OnPaint(ByVal Canvas As CustomControls.Canvas) _ - Implements ICustomControl.Paint - -You are passed a Canvas object that offers the following methods: - - Canvas.Width As Long [Propert-Get] - Canvas.Height As Long [Propert-Get] - Canvas.Dpi As Long [Propert-Get] - Canvas.DpiScaleFactor As Double [Propert-Get] - Canvas.AddElement(Descriptor As ElementDescriptor) - -`Canvas.Width` and `Canvas.Height` are the absolute pixel sizes that your control is drawing to. Unlike your controls Width/Height properties that are not DPI-scaled, the `Canvas.Width` and `Canvas.Height` values **are** DPI-scaled. - -The `Canvas.Dpi` property represents the DPI setting in Windows. If no DPI scaling is in effect, this value is 96. For example, if you have scaling set at 150% on your monitor, then the `Canvas.Dpi` property will be 144. - -The `Canvas.DpiScaleFactor` property gives a floating point value representing the DPI scaling percentage. A value of 1 indicates no scaling. For example, if you have scaling set at 150% on your monitor, then the `Canvas.DpiScaleFactor` property will be 1.5. - -The `Canvas.AddElement` method is used for adding elements to your control. An *element* is considered to be something that the form-engine will render for you. For example, you might have a grid control that displays 100 cells at a time. Each of those cells would be an *element*. Elements can overlap each over (allowing for opacity/transparency). The form engine draws them in the order that you call AddElement, meaning that the last element added will have the highest z-order. -*** -### AddElement(ElementDescriptor) -The AddElement method takes a single argument; an ElementDescriptor. ElementDescriptor is a UDT that defines exactly how the element will be drawn and how it reacts to events like mouse clicks. - - Public Type ElementDescriptor - OnClick As LongPtr ' event function callback pointer - OnDblClick As LongPtr ' event function callback pointer - OnMouseDown As LongPtr ' event function callback pointer - OnMouseUp As LongPtr ' event function callback pointer - OnMouseEnter As LongPtr ' event function callback pointer - OnMouseLeave As LongPtr ' event function callback pointer - OnMouseMove As LongPtr ' event function callback pointer - OnScrollH As LongPtr ' event function callback pointer - OnScrollV As LongPtr ' event function callback pointer - Left As Long ' pixel offset (control relative, DPI scaled) - Top As Long ' pixel offset (control relative, DPI scaled) - Width As Long ' pixel width (DPI scaled) - Height As Long ' pixel width (DPI scaled) - Cursor As MousePointerConstants ' cursor/pointer icon - TrackingIdX As LongLong ' for tracking this element, passed to events - TrackingIdY As LongLong ' for tracking this element, passed to events - Text As String ' the text to render - TextRenderingOptions As TextRendering ' options to customize text rendering (object) - BackgroundFill As Fill ' options to customize back fill rendering (object) - Corners As Corners ' options to customize corner rendering (object) - Borders As Borders ' options to customize border rendering (object) - End Type -*** -### Tips -- Each time your OnPaint method is called, you start with a blank canvas. - -- Left/Top/Width/Height can legitimately be outside of the canvas area. For example, negative Left/Top, or a Width/Height past the Canvas.Width/Canvas.Height has no ill-effects. The form engine will clip everything appropriately for you, allowing for much simpler designing of your control. - -- You should put thought into making the Paint routine efficient. Try not to instantiate COM objects, and when drawing multiple similar elements, try to re-use ElementDescriptors by setting up common properties outside of loops (see WaynesGrid for examples of this) - -- TrackingIdX and TrackingIdY are important when you have multiple elements within a control. The two values, when combined, should uniquely represent the element, and must be maintained if your Paint routine is called again. This is needed for supporting events. For example, in a grid control, each cell would have a TrackingIdX / TrackingIdY value associated with it, given the X/Y co-ordinates of the cell. - -- Currently, only mouse events are provided, but focus events are coming soon, as well as keyboard events. - -- You can use class-based event handlers by simply using the `AddressOf MyEvent` which is now possible to use even on class members. You can see this used frequently in the samples, such as WaynesGrid. All mouse events have the following format: -``` -Class MyCustomControl - ... - Private Sub MyClickEvent(ByRef EventInfo As MouseEvent) - MsgBox "You clicked me!" - End Sub - - Private Sub OnPaint(ByVal Canvas As CustomControls.Canvas) _ - Implements ICustomControl.Paint - Dim MyDescriptor As ElementDescriptor - MyDescriptor.OnClick = AddressOf MyClickEvent - End Sub -``` -EventInfo (MouseEvent) provides mouse information such as the relative X/Y position of the mouse, plus the TrackingX/Y values discussed earlier. - -- When you call Canvas.AddElement, your element goes into a render pipeline. It is **not** immediately painted to the screen. The render pipeline is compared to the previous render pipeline that was provided by you in the last OnPaint call, and the tB form engine will only redraw areas of the control that have changed. This allows for efficient painting of controls whilst not needing to be concerned about the finer details of how to do partial repainting. \ No newline at end of file diff --git a/experiments/_samples/customcontrols/propertysheetandserialization.md b/experiments/_samples/customcontrols/propertysheetandserialization.md deleted file mode 100644 index e19ca53d..00000000 --- a/experiments/_samples/customcontrols/propertysheetandserialization.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Property Sheets and Serialization -category: customcontrols -order: 5 ---- - -# Property Sheet & Object Serialization -The form designer property sheet will pickup any **_public_** custom properties (fields) that you expose via your CustomControl class. For example, adding a field `Public MyField As Long` will then automatically show up in the control property sheet in the form designer: - -![CustomControl MyField propertySheet](https://www.twinbasic.com/images/wiki/ccMyFieldPropertySheet1a.png) - -This is then persisted to your project as properties inside your form JSON structure: - -![CustomControl MyField JSON](https://www.twinbasic.com/images/wiki/ccMyFieldJson1a.png) - -The key to making this work is your serialization constructor, which might look something like this: - - Public Sub New(Serializer As SerializationInfo) - If Not Serializer.Deserialize(Me) Then - InitializeDefaultValues ' you implement this - End If - End Sub -If `Deserialize(Me)` returns `True`, then your class properties were synchronized with the properties set via the form designer. If it returns `False` then the control has just been added to the form, and this gives you an opportunity to setup any suitable default values for your custom public properties. The form designer notices default values you set within the serialization constructor, so that your property sheet is kept in-sync. -*** -### Default Values -An alternative method for setting up default values is to inline them into the class field definition: - -![CustomControl MyField = 42](https://www.twinbasic.com/images/wiki/ccMyFieldPropertySheet1b.png) - -The `Deserialize(Me)` call inside your serialization constructor will overwrite the property value if the control is being synchronized from the persisted property sheet data. -*** -### Enumerations -Enumerations that you define in your twinBASIC project are supported. Simply expose a class field with the enumeration: - -![CustomControl enumeration property sheet example](https://www.twinbasic.com/images/wiki/ccMyEnumFieldPropertySheet.png) - -Note: Enumerations are persisted to the form JSON structure as strings, so bare this in mind when making changes/updates to a CustomControl so that you don't introduce breaking changes by renaming an enumeration value. -*** -### Objects -Class objects that you define in your twinBASIC project are supported. You ***must*** supply a ClassId attribute for any exposed object, so that the serialization can identify it. - -![CustomControl class property sheet example](https://www.twinbasic.com/images/wiki/ccMyFieldClass.png) -*** -### Arrays -Arrays are supported. The form designer allows for adding new elements, removing elements, and re-ordering of elements (via drag/drop). - -![CustomControl array property sheet example](https://www.twinbasic.com/images/wiki/ccMyFieldArray.png) -*** -### Property Get / Let -Custom property procedures are supported. You will find that using Property Get / Let procedures is required if you want property changes to trigger repainting of your control. - -![CustomControl custom property example](https://www.twinbasic.com/images/wiki/ccMyFieldCustomProperty.png) - -Note that _**private**_ fields and properties do not form part of the serialization, and so will not appear on the property sheet. -*** -### Avoid Variants -The serialization does not support Variants or generic Objects. Always use strongly-typed datatypes. -*** -### Events -Events that you define in your class will be exposed in the Events property sheet: - -![CustomControl attribute](https://www.twinbasic.com/images/wiki/ccEvents.png) - -At the moment, the form-designer doesn't yet support code-behind-forms, so this feature is not yet complete. -*** -### Tips -- If you make changes to your CustomControl class, such as exposing new properties or changing how a control is drawn, these changes will get reflected immediately to any open form designers. Form designers will show a 'resync' button when you return to them, once pressed the changes will be apparent. - -- The serialization happens via JSON when running in the IDE, but via a binary format when running in a compiled DLL/EXE. The `SerializationInfo` object that is passed to your serialization constructor is a different implementation when running in the IDE, but this should be transparent to you as a CustomControl implementer. - -- When making changes or updates to a CustomControl always consider backwards compatibility. For example, if you rename an exposed property, the old property values stored via the property sheet won't be deserialized to your new property. \ No newline at end of file diff --git a/experiments/_samples/index.md b/experiments/_samples/index.md deleted file mode 100644 index 5bfa5029..00000000 --- a/experiments/_samples/index.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -permalink: /samples/index.html ---- -This is tB samples main page. - -

Table of Contents

- -{% assign mydocs = site.samples | group_by: 'category' %} -{% for cat in mydocs %} -{% assign catdata = site.data.meta.categories | where:"category", cat.name | first %} -{% if catdata %} -

{{ catdata.title }}

-

{{ catdata.description }}

-{% else %} -

{{ cat.name }}

-{% endif %} -
    - {% assign items = cat.items | sort: 'order' %} - {% for item in items %} -
  • {{ item.title }}
  • - {% endfor %} -
-{% endfor %} \ No newline at end of file diff --git a/experiments/_samples/packages/createpackage.md b/experiments/_samples/packages/createpackage.md deleted file mode 100644 index c4ea8419..00000000 --- a/experiments/_samples/packages/createpackage.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: Creating a TWINPACK package -category: packages -order: 1 ---- - -### Creating a TWINPACK package - -To create a new TWINPACK package, navigate to the twinBASIC activity panel and choose the option labelled 'Package': - -Create Package -
-
- -Once you've created the project, you should find the extra 'TWINBASIC PACKAGE MANAGER' panel in the main Explorer activity panel: - -Create Package -
-
- -You should now edit the Namespace, Description, Licence and Visibility properties appropriately by using the package manager 'EDIT' links, which will take you to the individual settings in the `Settings` file. Once you've edited them, remember to close (and save) the `Settings` file in order for your changes to be reflected in the package manager panel. - -- **Namespace:** this is the symbol that will be used to group your components in projects that reference your package. For example, a package that provides a series of different dialog classes might use the namespace `Dialogs`. -- **Description:** this is the descriptive text that will appear in the `Settings`->`References` list. If you plan to share this package, it is wise to think carefully about the description so that others can find your package easily through TWINSERV. -- **Licence:** this short text appears in the `Settings`->`References` list, alongside the Description. If you plan to share this package, it is important that you enter this field, and the value you enter here should appropriately match the content of the LICENCE.md file (e.g. 'MIT', 'LGPL' etc). -- **Visibility:** determines whether the package is visible to only you (PRIVATE) or everyone (PUBLIC). The value set here only takes effect when you use the 'PUBLISH THIS PACKAGE' button to publish your package in the package manager service, TWINSERV. - -*If you don't plan to publish your package on TWINSERV, then you don't need to fill in the **Licence** or **Visibility** fields.* - -You can now create components (Class, Module, Interface) in your project as normal, and when you are finished, it's time to finalize the package. You have two options; - -
- -### OPTION 1 - Finalize the package into a TWINPACK file - -Use this option if you want to just create a local TWINPACK file that you can use in other projects. For this, the build process is the same as any ordinary twinBASIC build... just hit the Build button in the TWINBASIC panel: - -Create Package -
-
- -You'll see the build output notification in the `DEBUG CONSOLE`, as seen above. - -Job done. See [Importing a package from a TWINPACK file](https://github.com/WaynePhillipsEA/twinbasic/wiki/twinBASIC-Packages-Importing-a-package-from-a-TWINPACK-file) for referencing and using the TWINPACK file in other twinBASIC projects. - -
- -### OPTION 2 - Publish the package directly to the package manager service (TWINSERV) - -If you're publishing your package onto TWINSERV, you don't need to create the TWINPACK file manually. Just use the 'PUBLISH THIS PACKAGE' button: - -Create Package -
-
- -***Publishing packages onto TWINSERV requires you to first create a publisher account. If you haven't done so, you'll be prompted to do so at this stage.*** - -You will then be prompted to confirm the package details: - -Create Package -
-
- -After pressing `YES`, the package will be uploaded to TWINSERV. Check the `DEBUG CONSOLE` for completion notices: - -Create Package -
-
- - If the package got uploaded successfully, it should be available via TWINSERV within a few moments. If you've created a `PUBLIC` package, others will be able to see and download it at this point. - -See [Importing a package from TWINSERV](https://github.com/WaynePhillipsEA/twinbasic/wiki/twinBASIC-Packages-Importing-a-package-from-TWINSERV) for referencing and using the uploaded packages. - -
-
- -### Special files LICENCE.md and CHANGELOG.md - -When you create a new package project, you'll see two additional files created for you in the project filesystem: - -Create Package -
-
- -If you're publishing a `PUBLIC` package to the package manager service, it is important that you edit these two files before publishing. These are both markdown files, and will in future become more accessible to users that are considering using your package from TWINSERV. \ No newline at end of file diff --git a/experiments/_samples/packages/importpackagefromfile.md b/experiments/_samples/packages/importpackagefromfile.md deleted file mode 100644 index d3ff7754..00000000 --- a/experiments/_samples/packages/importpackagefromfile.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Importing a package from a TWINPACK file -category: packages -order: 3 ---- - -### Importing a package from a TWINPACK file - -To import a package directly from a TWINPACK file (instead of using TWINSERV), follow these steps. - -- open the project from which you want to use a package -- open the `Settings` file within it -- navigate to the References section -- select the 'TWINPACK PACKAGES' button -- press the 'Import from file...' button: -Create Package -
-
- -- choose the TWINPACK file you want to import, and then it should appear in the references list (ticked): -Create Package -
-
- -- close and save the `Settings` file to restart the compiler - -Now you're ready to use the package! In the example shown above I added a reference to the TwinLib64 package, and I can now confirm that I can access components from the TwinLib64 package in my code: - -Create Package -
-
\ No newline at end of file diff --git a/experiments/_samples/packages/importpackagefromtwinserv.md b/experiments/_samples/packages/importpackagefromtwinserv.md deleted file mode 100644 index d763b3e4..00000000 --- a/experiments/_samples/packages/importpackagefromtwinserv.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Import a package from TWINSERV -category: packages -order: 4 ---- - -### Importing a package from TWINSERV - -Open the project from which you want to use a package, open the `Settings` file within it and navigate to the References section. Select the 'TWINPACK PACKAGES' button, and all packages that are on the server should be shown: - -Create Package -
-
- -If you tick one of the available packages, it will be downloaded and imported into the project: - -Create Package -
-
- -Once you're finished, save and close the Settings file which will cause the compiler to be restarted. Now you're ready to use the package! In the example shown above I added a reference to the TwinLib64 package, and I can now confirm that I can access components from the TwinLib64 package in my code: - -Create Package -
-
- -Note: I have a couple of PRIVATE packages that I have published, which are only available to me when I am signed in. If you are not already signed in, you will see a warning link that you can click to login: - -Create Package -
-
- -After logging in, press the 'TWINPACK PACKAGES' button again to refresh the list. \ No newline at end of file diff --git a/experiments/_samples/packages/index.md b/experiments/_samples/packages/index.md deleted file mode 100644 index 36d0fc82..00000000 --- a/experiments/_samples/packages/index.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: What's a package? -category: packages -order: 1 ---- - -### What's a package? - -In twinBASIC, a *package* is a collection of components that you can reference from another twinBASIC project. The components can be modules, classes or interfaces. - -A twinBASIC package is distributed as a TWINPACK file that contains everything needed by the components in that package. A project that references a TWINPACK package, imports the whole package into the file system of the root project, resulting in no external dependencies. - -With TWINPACK packages you group common components together into their own namespace whilst allowing for convenient code reuse without any of the problems often associated with using external DLL libraries. - -twinBASIC comes complete with a package manager service called TWINSERV, allowing you to easily share and distribute TWINPACK packages to other twinBASIC developers. - -Please be aware that TWINPACK files currently contain the full sourcecode of your packaged components. It is planned that we will in future allow for creating binary (compiled) TWINPACK files for developers that hold an Ultimate edition licence of twinBASIC. \ No newline at end of file diff --git a/experiments/_samples/packages/updatepackage.md b/experiments/_samples/packages/updatepackage.md deleted file mode 100644 index 7721a4f4..00000000 --- a/experiments/_samples/packages/updatepackage.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Updating a package -category: packages -order: 5 ---- - -### Updating a package - -#### NOTE: at the moment, the twinBASIC VS Code extension does not notify you about package updates that are available on TWINSERV. This feature is planned, and will be available soon. - -If you find an updated package is available on TWINSERV, you must first remove the old package from your project by deselecting it: - -Deselect a Package -
-
-
- -You will then be prompted to remove it from the filesystem: - -Deselect a Package -
-
-
- -Select YES. Now, you can add the updated package to your project as usual. See [Importing a package from TWINSERV](https://github.com/WaynePhillipsEA/twinbasic/wiki/twinBASIC-Packages-Importing-a-package-from-TWINSERV). - -#### Don't forget to close the Settings file and save the changes! (which will in turn cause a restart of the compiler). diff --git a/experiments/_samples/webview2/index.md b/experiments/_samples/webview2/index.md deleted file mode 100644 index 2a19c758..00000000 --- a/experiments/_samples/webview2/index.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Getting started -category: webview2 -order: 1 ---- - -### Getting Started - -#### Package requirements - -To create projects that use WebView2, your projects must include both the `WinNativeForms` package and the `WebView2` package in your projects. - -Both of these packages can be added through the `Project` > `References` menu option, and selecting the `TWINPACK PACKAGES` button. Ensure both packages are ticked, and then close and save the Settings file and restart the compiler. - -Create Package -
-
- -Once you've added the package references, you should find that the WebView2 control is now available to you in the form designer: - -Create Package -
-
- -#### Create a WebView2 control on a form - -We use the WebView2 control just like any ordinary control: - -Create Package -
-
- -#### WebView2 control properties - -There are lots of WebView2 properties and events to experiment with. - -Create Package -
-
-Note that toggling any property will show extra information at the bottom of the properties list to give you a little bit more information. For further information on a particular property, try searching the official WebView2 documentation - -## Samples - -If you prefer to start with a sample, have a look at `Sample 0. WebView2 Examples`, available in the new-project dialog: - -Create Package diff --git a/experiments/_samples/webview2/reentrancy.md b/experiments/_samples/webview2/reentrancy.md deleted file mode 100644 index db1706f5..00000000 --- a/experiments/_samples/webview2/reentrancy.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Information about re-entrancy -category: webview2 -order: 3 ---- - -## Information about re-entrancy - -The WebView2 API is very particular about not allowing for re-entrancy from its events (see Threading model for WebView2 apps). This means that when we process events such as `NavigationCompleted` we are ordinarily prohibited from doing anything with the WebView2 object model before returning from that event. So for example, you couldn't navigate to a new URL from within the `NavigivationCompleted` event itself. - -To work around these limitations, our WebView2 implementation defers all event handling by retriggering events through the form message loop. This allows events to be handled and execution control returns to WebView2 immediately, and then our deferred event gets triggered once WebView2 returns to the main message loop. - -Due to the design of our implementation, for the most part you can forget about the re-entrancy limitations imposed by the WebView2 API. However, if you use the `AddObject` feature of WebView2 which allows you to expose a twinBASIC class instance to javascript, then you need to be aware that there are two modes available for the `AddObject` feature. - -#### AddObject(ObjectInstance As Object, UseDeferredInvoke As Boolean) - -If you pass `True` to the `UseDeferredInvoke` parameter of the `AddObject` call, then calls that come in to your class instance from javascript will be treated **asynchronously** and so you cannot return a value to javascript. This is great for event notifications. - -If you pass `False` to the `UseDeferredInvoke` parameter of the `AddObject` call, then calls that come in to your class instance from javascript will be treated **synchronously** and so you can return a value to be consumed by javascript, but you MUST ensure that you don't cause re-entrancy, so you MUST NOT make calls back into the WebView2 control methods and properties. Be warned: if you do make calls back into the WebView2 control when you're not using `UseDeferredInvoke`, then you will cause deadlocks leading to your application becoming unstable and sometimes lingering in the task manager after shutdown. - -Note that it is perfectly acceptable to add two separate objects, one for asynchronous event handling (using `UseDeferredInvoke:=True`) and another for synchronous properties (using `UseDeferredInvoke:=False`). \ No newline at end of file diff --git a/experiments/_samples/webview2/userdatafolder.md b/experiments/_samples/webview2/userdatafolder.md deleted file mode 100644 index 0c400f0f..00000000 --- a/experiments/_samples/webview2/userdatafolder.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Customize the UserDataFolder -category: webview2 -order: 2 ---- - -## Customize the UserDataFolder - -At runtime, WebView2 needs a working folder for storing data used during the session.  By default, a folder will be created in the same folder as your executable file, called `.WebView2` (e.g. `MyApp.Exe.WebView2`).  If this folder cannot be created, the WebView2 control will not work (you can catch the controls Error event to determine this at runtime). - -This default behaviour is not always appropriate.  For example, if you're creating an Addin for Microsoft Access, then you almost certainly will not be allowed to create a folder called `MSACCESS.EXE.WebView2` in the Office sub folder of your systems Program Files folder. - -It is HIGHLY recommended that you override the default behaviour, and instead provide a path that is considered to be safe to use for storing such data. To override the UserDataFolder path at runtime, handle the Create event of the WebView2 control.  See the example in `Sample 9. ActiveX Control WebView2 + Monaco` here, where we use the `%APPDATA%\Local` system path: - -Create Package -
-
- -Set the `EnvironmentOptions.UserDataFolder` property to a string containing the output path to use (folder will be created if necessary). \ No newline at end of file diff --git a/experiments/assets/lazysizes.min.js b/experiments/assets/lazysizes.min.js deleted file mode 100644 index 35b726aa..00000000 --- a/experiments/assets/lazysizes.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! lazysizes - v5.3.2 */ - -!function(e){var t=function(u,D,f){"use strict";var k,H;if(function(){var e;var t={lazyClass:"lazyload",loadedClass:"lazyloaded",loadingClass:"lazyloading",preloadClass:"lazypreload",errorClass:"lazyerror",autosizesClass:"lazyautosizes",fastLoadedClass:"ls-is-cached",iframeLoadMode:0,srcAttr:"data-src",srcsetAttr:"data-srcset",sizesAttr:"data-sizes",minSize:40,customMedia:{},init:true,expFactor:1.5,hFac:.8,loadMode:2,loadHidden:true,ricTimeout:0,throttleDelay:125};H=u.lazySizesConfig||u.lazysizesConfig||{};for(e in t){if(!(e in H)){H[e]=t[e]}}}(),!D||!D.getElementsByClassName){return{init:function(){},cfg:H,noSupport:true}}var O=D.documentElement,i=u.HTMLPictureElement,P="addEventListener",$="getAttribute",q=u[P].bind(u),I=u.setTimeout,U=u.requestAnimationFrame||I,o=u.requestIdleCallback,j=/^picture$/i,r=["load","error","lazyincluded","_lazyloaded"],a={},G=Array.prototype.forEach,J=function(e,t){if(!a[t]){a[t]=new RegExp("(\\s|^)"+t+"(\\s|$)")}return a[t].test(e[$]("class")||"")&&a[t]},K=function(e,t){if(!J(e,t)){e.setAttribute("class",(e[$]("class")||"").trim()+" "+t)}},Q=function(e,t){var a;if(a=J(e,t)){e.setAttribute("class",(e[$]("class")||"").replace(a," "))}},V=function(t,a,e){var i=e?P:"removeEventListener";if(e){V(t,a)}r.forEach(function(e){t[i](e,a)})},X=function(e,t,a,i,r){var n=D.createEvent("Event");if(!a){a={}}a.instance=k;n.initEvent(t,!i,!r);n.detail=a;e.dispatchEvent(n);return n},Y=function(e,t){var a;if(!i&&(a=u.picturefill||H.pf)){if(t&&t.src&&!e[$]("srcset")){e.setAttribute("srcset",t.src)}a({reevaluate:true,elements:[e]})}else if(t&&t.src){e.src=t.src}},Z=function(e,t){return(getComputedStyle(e,null)||{})[t]},s=function(e,t,a){a=a||e.offsetWidth;while(a49?function(){o(t,{timeout:n});if(n!==H.ricTimeout){n=H.ricTimeout}}:te(function(){I(t)},true);return function(e){var t;if(e=e===true){n=33}if(a){return}a=true;t=r-(f.now()-i);if(t<0){t=0}if(e||t<9){s()}else{I(s,t)}}},ie=function(e){var t,a;var i=99;var r=function(){t=null;e()};var n=function(){var e=f.now()-a;if(e0;if(r&&Z(i,"overflow")!="visible"){a=i.getBoundingClientRect();r=C>a.left&&pa.top-1&&g500&&O.clientWidth>500?500:370:H.expand;k._defEx=u;f=u*H.expFactor;c=H.hFac;A=null;if(w2&&h>2&&!D.hidden){w=f;N=0}else if(h>1&&N>1&&M<6){w=u}else{w=_}}if(l!==n){y=innerWidth+n*c;z=innerHeight+n;s=n*-1;l=n}a=d[t].getBoundingClientRect();if((b=a.bottom)>=s&&(g=a.top)<=z&&(C=a.right)>=s*c&&(p=a.left)<=y&&(b||C||p||g)&&(H.loadHidden||x(d[t]))&&(m&&M<3&&!o&&(h<3||N<4)||W(d[t],n))){R(d[t]);r=true;if(M>9){break}}else if(!r&&m&&!i&&M<4&&N<4&&h>2&&(v[0]||H.preloadAfterLoad)&&(v[0]||!o&&(b||C||p||g||d[t][$](H.sizesAttr)!="auto"))){i=v[0]||d[t]}}if(i&&!r){R(i)}}};var a=ae(t);var S=function(e){var t=e.target;if(t._lazyCache){delete t._lazyCache;return}L(e);K(t,H.loadedClass);Q(t,H.loadingClass);V(t,B);X(t,"lazyloaded")};var i=te(S);var B=function(e){i({target:e.target})};var T=function(e,t){var a=e.getAttribute("data-load-mode")||H.iframeLoadMode;if(a==0){e.contentWindow.location.replace(t)}else if(a==1){e.src=t}};var F=function(e){var t;var a=e[$](H.srcsetAttr);if(t=H.customMedia[e[$]("data-media")||e[$]("media")]){e.setAttribute("media",t)}if(a){e.setAttribute("srcset",a)}};var s=te(function(t,e,a,i,r){var n,s,o,l,u,f;if(!(u=X(t,"lazybeforeunveil",e)).defaultPrevented){if(i){if(a){K(t,H.autosizesClass)}else{t.setAttribute("sizes",i)}}s=t[$](H.srcsetAttr);n=t[$](H.srcAttr);if(r){o=t.parentNode;l=o&&j.test(o.nodeName||"")}f=e.firesLoad||"src"in t&&(s||n||l);u={target:t};K(t,H.loadingClass);if(f){clearTimeout(c);c=I(L,2500);V(t,B,true)}if(l){G.call(o.getElementsByTagName("source"),F)}if(s){t.setAttribute("srcset",s)}else if(n&&!l){if(d.test(t.nodeName)){T(t,n)}else{t.src=n}}if(r&&(s||l)){Y(t,{src:n})}}if(t._lazyRace){delete t._lazyRace}Q(t,H.lazyClass);ee(function(){var e=t.complete&&t.naturalWidth>1;if(!f||e){if(e){K(t,H.fastLoadedClass)}S(u);t._lazyCache=true;I(function(){if("_lazyCache"in t){delete t._lazyCache}},9)}if(t.loading=="lazy"){M--}},true)});var R=function(e){if(e._lazyRace){return}var t;var a=n.test(e.nodeName);var i=a&&(e[$](H.sizesAttr)||e[$]("sizes"));var r=i=="auto";if((r||!m)&&a&&(e[$]("src")||e.srcset)&&!e.complete&&!J(e,H.errorClass)&&J(e,H.lazyClass)){return}t=X(e,"lazyunveilread").detail;if(r){re.updateElem(e,true,e.offsetWidth)}e._lazyRace=true;M++;s(e,t,r,i,a)};var r=ie(function(){H.loadMode=3;a()});var o=function(){if(H.loadMode==3){H.loadMode=2}r()};var l=function(){if(m){return}if(f.now()-e<999){I(l,999);return}m=true;H.loadMode=3;a();q("scroll",o,true)};return{_:function(){e=f.now();k.elements=D.getElementsByClassName(H.lazyClass);v=D.getElementsByClassName(H.lazyClass+" "+H.preloadClass);q("scroll",a,true);q("resize",a,true);q("pageshow",function(e){if(e.persisted){var t=D.querySelectorAll("."+H.loadingClass);if(t.length&&t.forEach){U(function(){t.forEach(function(e){if(e.complete){R(e)}})})}}});if(u.MutationObserver){new MutationObserver(a).observe(O,{childList:true,subtree:true,attributes:true})}else{O[P]("DOMNodeInserted",a,true);O[P]("DOMAttrModified",a,true);setInterval(a,999)}q("hashchange",a,true);["focus","mouseover","click","load","transitionend","animationend"].forEach(function(e){D[P](e,a,true)});if(/d$|^c/.test(D.readyState)){l()}else{q("load",l);D[P]("DOMContentLoaded",a);I(l,2e4)}if(k.elements.length){t();ee._lsFlush()}else{a()}},checkElems:a,unveil:R,_aLSL:o}}(),re=function(){var a;var n=te(function(e,t,a,i){var r,n,s;e._lazysizesWidth=i;i+="px";e.setAttribute("sizes",i);if(j.test(t.nodeName||"")){r=t.getElementsByTagName("source");for(n=0,s=r.length;n summary::before{ - content : '−'; -} \ No newline at end of file diff --git a/experiments/images/twinBASICIconTransparent.png b/experiments/images/twinBASICIconTransparent.png deleted file mode 100644 index 133242d0b3b05630a7b122234fb5d3b6113adf1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5515 zcmXw72{@GB+kP!E$uP*$SVux5TQ#DTF@r)Sm7Q!MjjbbHRk8gIT&Gd?WMFJ=b31jbKzxE9bGX) z!8p6zcY>BaD);9lPr6>XYAv>JF#Lg5oC&9}i;cMTKJ69GmaZ=SUR{HF<)iPS8Putu z4BsAF!w!^dZ2x8$v%fISDW9&Ynr7@muh#zO8;)=fC}9l$EqLw*cg9E&^-D} z$rA@@-C0%My~k5ViH5RfhvLN!6yhSLw?6DmZn||**Po^zjAt2BuH04SV!s#WJXYEG zh*)=@bt^kefxK9%7FuJ}w?I@3WMB7S6CNa98fR1T4gDZzb6n>9YCk{MzRBJA_eVLo zM_C&POQV*v>Os))lSMy7Cnpgi3RgF3+v@^O&u(}a5rVbsh3@36cAEBsW8rWxJg)=o zF+VvCuabadzvl&uyAY&wnE7S#d#QB~2syp=FX?jrV3FixIVD>18LUBvymigJ@g78? zle;&BzvE=@?Q~Ph*VX%$)Or0&SIokAgds@4QC~;9&r3-`4R1s}5rvFzKtrrQ;N zU;Xz$-3mG7YoZMB4neYurwEh$HHMk_&+`==y)UT6^rQ@YIT*1w-Yv2~wd~tynoVzU zNoUJ;qz6}Vy!mM3e`LNQHiX+Tc0x(n)%Ekm^GlDc1bdH>kL;GO?V9$f zF@~48_2%e^8Kq49S`)seKl83q=o7p3;bXgh>oWbeS1Pz?EOq5S^{8GEj!^NPZ^%D| z{)=OAoZWbDur1Mf$HzjiFAmT6P$)?CRGKp`hQhAa)Oyoq&**pB)QWyAO&k!r-Tvwh ztQoEHa}A5t*D2DklEUxd0GtfjzOk-s%k3=ZZsv2lkXdWEQNsig5V+I!!g z1|xviA@8J$%;na<;~q7JlFf>x>dhYzk?{V(s9;{~x-)PE@Z&f-Olx=nXL*G;`Qra*`s#kAsLJ*SUd(N^V)E zG@XMFkAvk9d)pr)Sm$tGRe{giJ4fbwkw4i`>|b6kjK1t`WiE|KR|X`3edjdW*1sab z7Uf=RO%w^*KAyDRf&9q|l;xh)tq&k?i-KWQ)cYP`;7oPS#}JNUM?5GxHxYjx#?nH+ z1dbB(l>-Np5;~#ZP`^n+utsA7t^_TA25y6p(MWA*&Ape{~C$**7l%f9|sLBgk5I z6uSyL`Nl~QZ)8)&pJ*i<%ue3&j3y{tBs~IiMHs9fB-@;2&RZwk2EN{=T=`m^3e)P3D#=-oC?76jpFE#4tqdN=& zE4ic0PbI3gsnd^xo*+d^tL)L;Tr9lNJOc)rxIan$+~1s%W!J*5KwvvA?-5=SqOvo5N67 zwAFQHOzWSZNLbyNp7A&nS|I|Llf^p#MS>drK1OEY=0vgIz7SZ+XY~3I90&WlS%nF; zmm*<<#*x?}WSw2>8N<*6(@ML8Y1(Jf0>cCpaFfSH2@nGW;G{MH(ZMsq-P?vN3`ej& z`{M@B5fmllaDmfWg`qs3Ymr&rz35F=N3koNDCahldc~2fU8-Og!%9v?l zFVz^v*cnmr%1AscY&!!JYU)SGK{LalBC!f;|4y#3$AaxvtJ(kLkL$cqB_f+I8Ju)} zkkH@&G{QHoJSLBWU4L5lHKv*V9vI*OGhY{Y4klsT(oC9!-B-*JFiQ?Q4eHYM024ak z_FY{|9u(EB#&Ee+(I;qi0Bb`+sN>aTW=8EAEdzqkD0c1|!`Z}h7I$xrbs`Jn5Ug_3 zN|~>trP5#RR2T#f3TAJU#iId)^G#x zV(+(uALjDNo6>~- zcJL0{SSlp0h1Y>FO56lLm_EldNA3h&rtEn(zd(w3Vm{5PoXt^S>% z!_4p&EqHz;JOUAjro{BT_%3^w8-(?46Caziz7UYWGRfa-E22RXM1>Y`9}nkOz(LQx z8~7huaGt+Qk!JUdso;>%2IdMqUh?T&p??vW?%-zFcz^&|U zzN>w8EiR&t?%rTRj#X40M~W#Zr9i3r{+%}4fHY8%5{E&K-iq_8zOGqy>#Dx5%l|f+ zd*0%y!4K*X!dHG|G6m6x4FbUKcj`v?iZZ{|B1UnJNhy?xghrecL<61wIGOe0bK~d9Y zWP(1~_-EI7JHy*UL1jN>#uj}Z9I%@JCe*r)1aVa@>(-rS!i^`H?y1rF4FxKk{5 z&C#uhiAjV5f@aV1YHS{XBgNNzbGC=y1O067)5TW3U*`!FBJepOL@RkZ-Yv>R8hPI2 z01b}|py$7+V&a_Y(TVInS0>aAeZD@LRz=}R$AQJ4Wkvs17i5_5_scTG72pLE9I#Aq z$f-}$tm0SzP!jnf(ErkuZw?a*03Ie`t_uRalS;nx4=~q3FILg1y5wHO-19T{wL%9d z#+5D^%<3@^x!uQ-G<91L3HKP032d3bZ~O;ckG8`ksLf7kz8iTu5+F+4_gb?jAUxIA zJ~V)WA_8VEc^F_=&DTUZ1GsfO@ywe5Uz7%$<}M|hfbyv5oiH&M1i3l-Y%uXpq^R61 z0(eesDB}QUW;g0Q`%3{-w5{9vpO&xF*aJWkE`I3vw|n2xWc6#EB<1=FQ?N#NlcH5Sn{-Ni#J0hn0Owitp1cDmwrdBN$u_S%sI@m*W{ zbRP%2#sX2t&fQH;ocY)&GL=$+fpo$JX%RC6O(Y_jMT*}YEJe%m;kfmd`tJWZi_&rA z&-S_%k9z)W0)ac3AmSiz{RfWH=?DEE5u?@V0kek#-i$e6pUvDoQ7R^YJK1H$hINCX zkb+97p1(!#lT59%a<)QnaxsgPEQyl!9HZhT3G_LB+`!??dnBpGF+KIw{_*yyh9rs- zPXbXAC<>7fM2pxsSrHh{{82eaff8fbw3v&pQ6UB~kW%;bfNUf{Sh_Weu9gI&9Z@&( z%L3RmCyFY5gvdf!YX`e@u>?tze(w$j zr0cQt^5lFMbmd?Rf6FTFV|j~9X}2Fru!zbB%zF($mk&gBZvNDYRuD{Y%oev|ktn+w zvUe&E)wuZgaozfa;{)}dPD3Z-Bd3)bQr4g46Dl@;wI{?jBxD~UQzJ4gK_f7*G`}0& z_o>C@uP=eCps~f7rWb*qNzP9neQAa^9S?cqcQ512Hs_-?v?)L}o%uYhr;q0m`d-$AQSc!-9vUGoE2Wy$Z@)b=@bz?f6p$pcfxvDf=G2>c!TN24DDlv=K$>vNQ+E zjyn>3M{I+E=~kMmjA;bE?B7~i)Xq&+q9Fm={ob%Y9HF+H!1PDB{Ija!Q)oE{24Y0{#FXNl(sRZGnyJ~tqEj}13e!U@uB&!TPxj_-vcDnI>D@)gd6-ZJR{&SdE&fLjmO-L*hLGuj@+Ai&u( z%uikNjMgL;bL~`VZ1gGPhQ!-ZtNC78l#ug#q6n({SXq^4nqSSegAd)Eq)B5tEpb`0 zac3iTEwcTE)lk32tuvG}@>irdHV$q~O>0=RN#(K=xA1@z2hkOtlj1vTeRNzGHnovj_jEHW{-Cn&?N+_M0KzRv zRQv>SsZUPgtBR$V#Hj_ck8lTyVt7;4zDXq?8RP@9lN6Oe&4L~`l_O*%YM||hmW_h9%G-DU_TTh^k zC*CfhykZbM-^sC3H>@5+pI^EP?nLSNX9z+C73fjzJD)x3v;h0v9Flr5Yw|05wN1>Q z|Hiz(oU4~Vzsrb$zr_!pL`N8H>zIin{^*FnW!q5$|2+B&;WRISl3Lq%#KXa>>}6)` z6q99vY@5If*3zV@s>Jm${LB)fX@Jb1-S9RN@ZbJ2Q^w7kYrF75IX74T!`&>Eu4H<> zU0z7ke%iX*Z^vXmhW^a!14WGy`Ge?6Ozv5-&J}6WwJKw;(gllUA1tb6*|N`;rZ7^K zyk49D14K;A?RxP+t+!YIGa1^x+SZdPrq_@BM~YfdR)RbHd!~%>sIHEAJ}%nb#2cj2 zwW1q7E~CoLP0lsQE8OGh5&=)jC8EL&~AmZGI=7U{~r zUQ(0CYGQ|WYu3)v`$i(30JfG^xxaBB@$c{-3$$qx`EP4?h-SH$MDT8|q(c3lFs<+{ zZzP~uFSM)#LukB557!oPkGvm#(xZA2^r?z$1#@t(L&W*U^emBc)&6sbL)cH1Xo(!k zTaNG4H5kkKYfZ@^EA}IRYiJqzP|mN2i6PnMESICGJLY_>bBWK^H4FZ+FmJ~q`kR#i z0)-b)hVQ0{<86UGrvY0@Nr;8?d_)3aOm0YyeU;m|ysB1X2(a;zqIKca~NfR-S z&G&K?aCw;IztPI|Mf9#QkpEmkYD0kBV+9QpR^Wh3g*p{UvW#X(h|2=S)QVW5N>Q%c zgV%ui4po?V$$gyT2{8g}BVTg)-NV01kJZ3UuhtYjZgX}UZ+ig6UJ$V*j)jGJeJ_lj zn0+m=kp=E!Q*TYmhX0hunoP`0pOoRl+0Ch;D{BH%reAr#tkNeTM1)EuX;$TQ0tbqn z{?3H2z9PRA{i6ML=@AlQZctB)$74_UeM!xW?}|9syCUmh{Z?A>b+K`G3tB7lwpVPT zQ}W;6?3D&y+fx~hq7Qcw+jx8vY_W|nv4k$s83KQTh4yZ1{Z703UyuAYnfa%fzV2n6 J5}aN5{{d_Iym$Zr diff --git a/experiments/index.md b/experiments/index.md deleted file mode 100644 index 657ad78b..00000000 --- a/experiments/index.md +++ /dev/null @@ -1,49 +0,0 @@ -# Work in progress... -Check back soon. The site is under active construction, please don't enter without a hard hat. - -

Table of Contents

- -{% assign mydocs = site.samples | group_by: 'category' %} -{% for cat in mydocs %} -{% assign catdata = site.data.meta.categories | where:"category", cat.name | first %} -{% if catdata %} -

{{ catdata.title }}

-

{{ catdata.description }}

-{% else %} -

{{ cat.name }}

-{% endif %} -
    - {% assign items = cat.items | sort: 'order' %} - {% for item in items %} -
  • {{ item.title }}
  • - {% endfor %} -
-{% endfor %} - -
    -{% assign mydocs = site.samples | group_by: 'category' %} -{% for cat in mydocs %} -
  • -{% assign catdata = site.data.meta.categories | where:"category", cat.name | first %} -
    -{% if catdata %} - {{ catdata.title }} -

    {{ catdata.description }}

    -
    -{% else %} - {{ cat.name }} -{% endif %} -{% assign items = cat.items | sort: 'order' %} - -
    -
  • -{% endfor %} -
\ No newline at end of file diff --git a/experiments/lcheck-fixture/site/assets/script.js b/experiments/lcheck-fixture/site/assets/script.js deleted file mode 100644 index 172f1ae6..00000000 --- a/experiments/lcheck-fixture/site/assets/script.js +++ /dev/null @@ -1 +0,0 @@ -// noop diff --git a/experiments/lcheck-fixture/site/assets/style.css b/experiments/lcheck-fixture/site/assets/style.css deleted file mode 100644 index 6f5b686d..00000000 --- a/experiments/lcheck-fixture/site/assets/style.css +++ /dev/null @@ -1 +0,0 @@ -body { color: black; } diff --git a/experiments/lcheck-fixture/site/good-dir-noindex/other.html b/experiments/lcheck-fixture/site/good-dir-noindex/other.html deleted file mode 100644 index f6486613..00000000 --- a/experiments/lcheck-fixture/site/good-dir-noindex/other.html +++ /dev/null @@ -1,2 +0,0 @@ - -no index here diff --git a/experiments/lcheck-fixture/site/good-dir/index.html b/experiments/lcheck-fixture/site/good-dir/index.html deleted file mode 100644 index 40c4b3a1..00000000 --- a/experiments/lcheck-fixture/site/good-dir/index.html +++ /dev/null @@ -1,3 +0,0 @@ - -dir index -

Dir Anchor

diff --git a/experiments/lcheck-fixture/site/good-fallback.html b/experiments/lcheck-fixture/site/good-fallback.html deleted file mode 100644 index 6c656bbc..00000000 --- a/experiments/lcheck-fixture/site/good-fallback.html +++ /dev/null @@ -1,2 +0,0 @@ - -fallback diff --git a/experiments/lcheck-fixture/site/good-fragments.html b/experiments/lcheck-fixture/site/good-fragments.html deleted file mode 100644 index 1fd6c7d4..00000000 --- a/experiments/lcheck-fixture/site/good-fragments.html +++ /dev/null @@ -1,4 +0,0 @@ - -frag -

Known

-legacy diff --git a/experiments/lcheck-fixture/site/good.html b/experiments/lcheck-fixture/site/good.html deleted file mode 100644 index 6312e989..00000000 --- a/experiments/lcheck-fixture/site/good.html +++ /dev/null @@ -1,3 +0,0 @@ - -good -

good

diff --git a/experiments/lcheck-fixture/site/index.html b/experiments/lcheck-fixture/site/index.html deleted file mode 100644 index fd7f87e2..00000000 --- a/experiments/lcheck-fixture/site/index.html +++ /dev/null @@ -1,63 +0,0 @@ - - - -fixture root - - - - - - -

Fixture

- -

Plain hrefs

-OK file -BROKEN: missing file - -

Fallback extension (only good-fallback.html exists)

-OK via fallback .html -BROKEN: no missing-fallback.html - -

Trailing slash forces directory resolution

-BROKEN: good.html is a file, not a dir -BROKEN: good-fallback resolves to .html via fallback, not via dir - -

Directory with index.html (both forms should be OK)

-OK dir with index -OK dir with index (no slash) - -

Directory without index.html, but `.` in --index-files

-OK: accepts dir itself -OK: same, via dir fallback - -

Missing dirs

-BROKEN: dir does not exist -BROKEN: not a file, not a dir, no fallback - -

Fragments

-OK: same-page fragment -BROKEN: same-page bad fragment -OK: cross-page known fragment -BROKEN: cross-page bad fragment -OK: dir-link with fragment -BROKEN: dir-link bad fragment - -

Relative and absolute paths

-OK relative subdir -OK absolute via root-dir -BROKEN absolute - -

External and skipped schemes

-SKIP: http -SKIP: mailto -SKIP: js -SKIP: tel - -

Images

-OK -BROKEN - -

Image srcset

-srcset mixed - - diff --git a/experiments/lcheck-fixture/site/subdir/image.png b/experiments/lcheck-fixture/site/subdir/image.png deleted file mode 100644 index 7838a96f..00000000 --- a/experiments/lcheck-fixture/site/subdir/image.png +++ /dev/null @@ -1 +0,0 @@ -fake png \ No newline at end of file diff --git a/experiments/lcheck-fixture/site/subdir/nested.html b/experiments/lcheck-fixture/site/subdir/nested.html deleted file mode 100644 index 1c22b823..00000000 --- a/experiments/lcheck-fixture/site/subdir/nested.html +++ /dev/null @@ -1,4 +0,0 @@ - -nested -up and over -BROKEN: missing from subdir diff --git a/experiments/samples.md b/experiments/samples.md deleted file mode 100644 index d31386a6..00000000 --- a/experiments/samples.md +++ /dev/null @@ -1,20 +0,0 @@ -This is tB samples main page. - -

Table of Contents

- -{% assign mydocs = site.samples | group_by: 'category' %} -{% for cat in mydocs %} -{% assign catdata = site.data.meta.categories | where:"category", cat.name | first %} -{% if catdata %} -

{{ catdata.title }}

-

{{ catdata.description }}

-{% else %} -

{{ cat.name }}

-{% endif %} -
    - {% assign items = cat.items | sort: 'order' %} - {% for item in items %} -
  • {{ item.title }}
  • - {% endfor %} -
-{% endfor %} \ No newline at end of file diff --git a/experiments/sitemap.xml b/experiments/sitemap.xml deleted file mode 100644 index eaa99877..00000000 --- a/experiments/sitemap.xml +++ /dev/null @@ -1,30 +0,0 @@ ---- -layout: ---- - - - - {% for page in site.pages %} - {% if page.url contains '.xml' or page.url contains 'assets' %}{% else %} - - {{ site.url }}{{ page.url }} - monthly - 1.0 - - {% endif %} - {% endfor %} - {% for page in site.posts %} - - {{ site.url }}{{ page.url | replace: 'index.html', '' }} - monthly - 1.0 - - {% endfor %} - {% for page in site.without-plugin %} - - {{ site.url }}{{ page.url | replace: 'index.html', '' }} - monthly - 1.0 - - {% endfor %} - \ No newline at end of file From d7403885fd28c36b61d50ac3a27e0dbfb4f383e9 Mon Sep 17 00:00:00 2001 From: Kuba Sunderland-Ober Date: Wed, 27 May 2026 19:29:02 +0200 Subject: [PATCH 2/9] Finish the tbdocs cutover - remove Jekyll support. --- .github/workflows/checks.yml | 2 +- .github/workflows/jekyll-gh-pages.yml | 2 +- WIP.OldJekyll.md | 162 ++ WIP.md | 180 +- builder/FUTURE-WORK.md | 6 +- builder/PLAN-1.md | 12 +- builder/PLAN-10.md | 38 +- builder/PLAN-11.md | 10 +- builder/PLAN-2.md | 14 +- builder/PLAN-3.md | 4 +- builder/PLAN-4.md | 4 +- builder/PLAN-5.md | 28 +- builder/PLAN-6.md | 10 +- builder/PLAN-7.md | 12 +- builder/PLAN-8.md | 22 +- builder/PLAN-9.md | 56 +- builder/PLAN.md | 8 +- builder/README.md | 85 +- builder/assets/README.md | 61 +- builder/offline.mjs | 4 +- builder/one-offs/_assign_nav_order.mjs | 219 --- builder/one-offs/_comment_test.mjs | 8 - builder/one-offs/_dtest.mjs | 4 - builder/one-offs/_hardbreak_test.mjs | 10 - builder/one-offs/_iframe_test.mjs | 11 - builder/one-offs/_ktest.rb | 9 - builder/one-offs/_ktest_namespace.rb | 8 - builder/one-offs/_ktest_states.rb | 50 - builder/one-offs/_ptest.mjs | 11 - builder/one-offs/_q.mjs | 18 - builder/one-offs/_qtest.mjs | 10 - builder/one-offs/_shiki_test.mjs | 16 - builder/package.json | 4 +- builder/{index.mjs => tbdocs.mjs} | 2 +- docs/.gitignore | 8 - .../Images/af-vector-crop-tool.png | Bin .../Images/af-vector-studio.png | Bin .../Images/choose-workflow.png | Bin .../Images/compare-changes.png | Bin .../Images/confirm-merge.png | Bin .../Images/create-pull-request.png | Bin .../Images/environment-variables.png | Bin .../Images/merge-pull-request.png | Bin .../Images/run-workflow.png | Bin .../_Images/af-vector-crop-tool.af | Bin .../_Images/af-vector-studio.af | Bin .../_Images/choose-workflow.af | Bin .../_Images/compare-changes.af | Bin .../_Images/confirm-merge.af | Bin .../_Images/create-pull-request.af | Bin .../_Images/merge-pull-request.af | Bin .../_Images/run-workflow.af | Bin docs/Gemfile | 33 - docs/Gemfile.lock | 181 -- docs/_config.yml | 167 +- docs/_includes/book-chapter-body.html | 175 -- docs/_includes/components/aux_nav.html | 44 - docs/_includes/components/breadcrumbs.html | 35 - docs/_includes/components/children_nav.html | 40 - docs/_includes/components/footer.html | 49 - docs/_includes/components/nav/links.html | 66 - docs/_includes/components/site_nav.html | 52 - docs/_includes/css/activation.scss.liquid | 132 -- docs/_includes/footer_custom.html | 6 - docs/_includes/head.html | 47 - docs/_includes/head_custom.html | 3 - docs/_includes/head_seo.html | 39 - docs/_includes/title.html | 8 - docs/_includes/vendor/anchor_headings.html | 18 - docs/_layouts/book-combined.html | 12 - docs/_plugins/anchor-headings-fast.rb | 133 -- docs/_plugins/book-chapter-transform.rb | 187 --- docs/_plugins/book-href-rewrite.rb | 382 ----- docs/_plugins/book-resolve-chapters.rb | 171 -- docs/_plugins/book-sort.rb | 138 -- docs/_plugins/breadcrumbs-precompute.rb | 125 -- docs/_plugins/build-info.rb | 43 - docs/_plugins/build-phase-timing.rb | 80 - docs/_plugins/children-precompute.rb | 164 -- docs/_plugins/html-compress.md | 184 --- docs/_plugins/html-compress.rb | 166 -- docs/_plugins/jekyll-gfm-admonitions-patch.rb | 212 --- docs/_plugins/jekyll-local-diagram/LICENSE | 21 - docs/_plugins/jekyll-local-diagram/README.md | 100 -- .../jekyll-local-diagram/cfg/puppeteer.json | 1 - .../lib/jekyll-local-diagram.rb | 84 - docs/_plugins/jekyll-relative-links-patch.rb | 172 -- docs/_plugins/nav-integrity-check.rb | 134 -- docs/_plugins/nav-levels-precompute.rb | 269 --- docs/_plugins/nav-path.rb | 39 - docs/_plugins/nav-tree-precompute.rb | 191 --- docs/_plugins/offlinify.md | 498 ------ docs/_plugins/offlinify.rb | 1460 ----------------- docs/_plugins/pdfify.md | 157 -- docs/_plugins/pdfify.rb | 303 ---- docs/_plugins/seo-precompute.rb | 188 --- docs/_plugins/twinbasic.rb | 306 ---- docs/_profile/build.rb | 18 - docs/_profile/profile.rb | 59 - docs/_sass/custom/_twinbasic-dark.scss | 187 --- docs/_sass/custom/_twinbasic-light.scss | 173 -- docs/_sass/custom/admonitions.scss | 75 - docs/_sass/custom/custom.scss | 41 - docs/build.bat | 2 +- docs/profile-rbspy.bat | 11 - docs/profile-rubyprof.bat | 1 - docs/serve.bat | 4 +- docs/serve.mjs | 99 ++ 108 files changed, 503 insertions(+), 8290 deletions(-) create mode 100644 WIP.OldJekyll.md delete mode 100644 builder/one-offs/_assign_nav_order.mjs delete mode 100644 builder/one-offs/_comment_test.mjs delete mode 100644 builder/one-offs/_dtest.mjs delete mode 100644 builder/one-offs/_hardbreak_test.mjs delete mode 100644 builder/one-offs/_iframe_test.mjs delete mode 100644 builder/one-offs/_ktest.rb delete mode 100644 builder/one-offs/_ktest_namespace.rb delete mode 100644 builder/one-offs/_ktest_states.rb delete mode 100644 builder/one-offs/_ptest.mjs delete mode 100644 builder/one-offs/_q.mjs delete mode 100644 builder/one-offs/_qtest.mjs delete mode 100644 builder/one-offs/_shiki_test.mjs rename builder/{index.mjs => tbdocs.mjs} (99%) rename docs/{Miscellaneous => Documentation}/Images/af-vector-crop-tool.png (100%) rename docs/{Miscellaneous => Documentation}/Images/af-vector-studio.png (100%) rename docs/{Miscellaneous => Documentation}/Images/choose-workflow.png (100%) rename docs/{Miscellaneous => Documentation}/Images/compare-changes.png (100%) rename docs/{Miscellaneous => Documentation}/Images/confirm-merge.png (100%) rename docs/{Miscellaneous => Documentation}/Images/create-pull-request.png (100%) rename docs/{Miscellaneous => Documentation}/Images/environment-variables.png (100%) rename docs/{Miscellaneous => Documentation}/Images/merge-pull-request.png (100%) rename docs/{Miscellaneous => Documentation}/Images/run-workflow.png (100%) rename docs/{Miscellaneous => Documentation}/_Images/af-vector-crop-tool.af (100%) rename docs/{Miscellaneous => Documentation}/_Images/af-vector-studio.af (100%) rename docs/{Miscellaneous => Documentation}/_Images/choose-workflow.af (100%) rename docs/{Miscellaneous => Documentation}/_Images/compare-changes.af (100%) rename docs/{Miscellaneous => Documentation}/_Images/confirm-merge.af (100%) rename docs/{Miscellaneous => Documentation}/_Images/create-pull-request.af (100%) rename docs/{Miscellaneous => Documentation}/_Images/merge-pull-request.af (100%) rename docs/{Miscellaneous => Documentation}/_Images/run-workflow.af (100%) delete mode 100644 docs/Gemfile delete mode 100644 docs/Gemfile.lock delete mode 100644 docs/_includes/book-chapter-body.html delete mode 100644 docs/_includes/components/aux_nav.html delete mode 100644 docs/_includes/components/breadcrumbs.html delete mode 100644 docs/_includes/components/children_nav.html delete mode 100644 docs/_includes/components/footer.html delete mode 100644 docs/_includes/components/nav/links.html delete mode 100644 docs/_includes/components/site_nav.html delete mode 100644 docs/_includes/css/activation.scss.liquid delete mode 100644 docs/_includes/footer_custom.html delete mode 100644 docs/_includes/head.html delete mode 100644 docs/_includes/head_custom.html delete mode 100644 docs/_includes/head_seo.html delete mode 100644 docs/_includes/title.html delete mode 100644 docs/_includes/vendor/anchor_headings.html delete mode 100644 docs/_layouts/book-combined.html delete mode 100644 docs/_plugins/anchor-headings-fast.rb delete mode 100644 docs/_plugins/book-chapter-transform.rb delete mode 100644 docs/_plugins/book-href-rewrite.rb delete mode 100644 docs/_plugins/book-resolve-chapters.rb delete mode 100644 docs/_plugins/book-sort.rb delete mode 100644 docs/_plugins/breadcrumbs-precompute.rb delete mode 100644 docs/_plugins/build-info.rb delete mode 100644 docs/_plugins/build-phase-timing.rb delete mode 100644 docs/_plugins/children-precompute.rb delete mode 100644 docs/_plugins/html-compress.md delete mode 100644 docs/_plugins/html-compress.rb delete mode 100644 docs/_plugins/jekyll-gfm-admonitions-patch.rb delete mode 100644 docs/_plugins/jekyll-local-diagram/LICENSE delete mode 100644 docs/_plugins/jekyll-local-diagram/README.md delete mode 100644 docs/_plugins/jekyll-local-diagram/cfg/puppeteer.json delete mode 100644 docs/_plugins/jekyll-local-diagram/lib/jekyll-local-diagram.rb delete mode 100644 docs/_plugins/jekyll-relative-links-patch.rb delete mode 100644 docs/_plugins/nav-integrity-check.rb delete mode 100644 docs/_plugins/nav-levels-precompute.rb delete mode 100644 docs/_plugins/nav-path.rb delete mode 100644 docs/_plugins/nav-tree-precompute.rb delete mode 100644 docs/_plugins/offlinify.md delete mode 100644 docs/_plugins/offlinify.rb delete mode 100644 docs/_plugins/pdfify.md delete mode 100644 docs/_plugins/pdfify.rb delete mode 100644 docs/_plugins/seo-precompute.rb delete mode 100644 docs/_plugins/twinbasic.rb delete mode 100644 docs/_profile/build.rb delete mode 100644 docs/_profile/profile.rb delete mode 100644 docs/_sass/custom/_twinbasic-dark.scss delete mode 100644 docs/_sass/custom/_twinbasic-light.scss delete mode 100644 docs/_sass/custom/admonitions.scss delete mode 100644 docs/_sass/custom/custom.scss delete mode 100644 docs/profile-rbspy.bat delete mode 100644 docs/profile-rubyprof.bat create mode 100644 docs/serve.mjs diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index b2b300cf..0a7a1b76 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -38,7 +38,7 @@ jobs: npm ci npm ci --prefix builder - name: Build with tbdocs - run: node builder/index.mjs --src docs + run: node builder/tbdocs.mjs --src docs - name: Check links (check_links.mjs) # Three passes run in parallel via /sep/: # 1. Online (_site/): --fallback-extensions html mirrors GitHub Pages' diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/jekyll-gh-pages.yml index 96f36742..a5871f92 100644 --- a/.github/workflows/jekyll-gh-pages.yml +++ b/.github/workflows/jekyll-gh-pages.yml @@ -56,7 +56,7 @@ jobs: # deploys to kubao.github.io/twinBASIC-docs/, both bits move # so the page advertises its own URL rather than the config'd # production host). - run: node builder/index.mjs --src docs --url '${{ steps.pages.outputs.origin }}' --baseurl '${{ steps.pages.outputs.base_path }}' + run: node builder/tbdocs.mjs --src docs --url '${{ steps.pages.outputs.origin }}' --baseurl '${{ steps.pages.outputs.base_path }}' - name: Check links and site integrity # Three passes run in parallel via /sep/: # 1. Online (_site/): --fallback-extensions html mirrors GitHub Pages' diff --git a/WIP.OldJekyll.md b/WIP.OldJekyll.md new file mode 100644 index 00000000..2d8bc5db --- /dev/null +++ b/WIP.OldJekyll.md @@ -0,0 +1,162 @@ +# twinBASIC Documentation — Jekyll-Era Working Notes + +Historic engineering notes from the era when the documentation site was built with Jekyll + just-the-docs. Kept as archeology: the actual Ruby source set (`docs/_plugins/`, `docs/_includes/`, `docs/_layouts/`, `docs/_sass/`, `docs/Gemfile`, `docs/Gemfile.lock`) and the Jekyll profilers (`profile-rbspy.bat`, `profile-rubyprof.bat`, `_profile/`) were deleted from the tree in the Ruby-removal follow-up to the Phase 10 cutover. The contents survive in git history; search for `Phase 10` to find the cutover, and for the Ruby-removal follow-up that landed alongside the [Documentation Development](docs/Documentation/) page split. + +The build pipeline itself is now `tbdocs`, the Node.js static site generator under [builder/](builder/). The day-to-day Working Notes for the live site are in [WIP.md](WIP.md); this file is the engineering record of *how the Jekyll site worked*, *why it was replaced*, and *what was learned in the optimisation passes that preceded the port*. + +## Historical note + +The site was originally built with Jekyll + just-the-docs. The Jekyll source set (`docs/_plugins/`, `docs/_includes/`, `docs/_layouts/`, `docs/_sass/`, `docs/Gemfile`) was retired in the Phase 10 cutover commit; the directories were kept for one release cycle as reference and then deleted in a follow-up cleanup commit. Search the git log for `Phase 10` to find both commits. + +## Migration notes + +- `_site-new/` is no longer used. Run `rm -rf docs/_site-new/` on first sync after the cutover. +- The eight `verify-phase{N}.mjs` harnesses were retired in the same cutover commit. Regression detection now relies on `scripts/check_links.mjs` (expanded into a site-integrity checker; see [docs/check.bat](docs/check.bat)). +- The diff and verify harnesses (`_triage.mjs`, `_diff.mjs`, `_diff_all.mjs`, `_audit_accepted.mjs`, `_sitemap_diff.mjs`, `_spot.mjs`, `verify-phase{1..8}.mjs`, `accepted-divergences.mjs`) were retired in the Phase 10 cutover commit. They asserted byte-equivalence with Jekyll, which is no longer the acceptance bar. + +## Phase 11 — parity update + +Phase 11 (see [builder/PLAN-11.md](builder/PLAN-11.md)) landed the output-changing follow-ups that the Phase 3-9 byte-vs-Jekyll discipline had deferred. Five independent PRs, all shipped: + +- **B2 — Shiki theme generated from `.theme` source.** Shipped. `scripts/extract_theme_colors.py` and `builder/assets/css/rouge.css` are gone; `builder/highlight-theme.mjs` parses the vendored `builder/themes/Light.theme` + `Dark.theme` files and emits `_site/assets/css/tb-highlight.css` at build time. Per-span class names switched from Rouge tokens (`k`, `s`, `mi`) to a palette scheme (`c1`, `c2`, …). `builder/highlight.mjs` shrank from ~470 lines to ~190 — the per-language Rouge-quirk overrides folded into the scope-to-Symbol table. +- **B1 — Mermaid `.mmd` → `.svg` automation.** Shipped. `builder/mermaid.mjs` runs before Phase 1's discover, walks `docs/assets/images/mmd/*.mmd`, and invokes `mmdc` (via `npx --no-install` rooted at `builder/`) for any source whose `.svg` sibling is missing or older. The `.mmd` is now the canonical input; the SVG is a build artifact. Adds `@mermaid-js/mermaid-cli` as a devDependency in `builder/package.json`. The PDF render step already pulls in `puppeteer` at the repo root (and CI runs `npx puppeteer browsers install chrome --install-deps`), so `mermaid.mjs` reuses that cached Chrome via `PUPPETEER_EXECUTABLE_PATH` — no second Chrome download. A missing `mmdc` (e.g. someone never ran `npm install` in `builder/`) or a missing Chrome cache downgrades to a graceful warning; the existing on-disk SVG is retained and the build continues. +- **B5 — Server-side copy-code button.** Shipped. `builder/highlight.mjs` emits the `