From 33ec613a0f5682653159c4bf2e45a9cdc785df08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 11 Feb 2022 16:52:20 +0100 Subject: [PATCH 01/53] Add fullpage support --- package.json | 2 ++ src/elm/Lia/Markdown/Code/Update.elm | 20 ++++++++++++++ src/elm/Lia/Markdown/Code/View.elm | 26 +++++++++---------- src/elm/Lia/Markdown/Config.elm | 4 +-- src/elm/Lia/Markdown/Update.elm | 17 ++++++++++-- src/elm/Lia/Script.elm | 8 ++++++ src/elm/Lia/Update.elm | 7 +++++ src/elm/Lia/View.elm | 24 ++++++++++++++++- src/elm/Main.elm | 3 ++- src/elm/Model.elm | 3 ++- src/elm/Update.elm | 1 + src/elm/View.elm | 21 ++++++++++----- src/scss/03_elements/_elements.code.scss | 1 + src/scss/05_components/_components.quiz.scss | 1 + src/scss/05_components/_components.slide.scss | 4 +-- src/scss/main.scss | 2 ++ src/typescript/liascript/index.ts | 2 ++ 17 files changed, 118 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 25b0a6ca9..c8608fa23 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,8 @@ "watch:app": "npx parcel serve src/entry/app/index.html --open", "build:indexeddb": "npm run clean && npx parcel build --no-source-maps --public-url . src/entry/indexeddb/index.html", "watch:indexeddb": "npx parcel serve src/entry/indexeddb/index.html --open", + "build:pdf": "npm run clean && npx parcel build --no-source-maps --public-url . src/entry/pdf/index.html", + "watch:pdf": "npx parcel serve src/entry/pdf/index.html --open", "watch:base": "npx parcel serve src/entry/base/index.html", "build:base": "npm run clean && npx parcel build --no-source-maps --public-url . src/entry/base/index.html", "build:dev": "npm run clean && npx parcel build --no-source-maps --public-url . src/entry/dev/index.html && npm run sw", diff --git a/src/elm/Lia/Markdown/Code/Update.elm b/src/elm/Lia/Markdown/Code/Update.elm index c73fa6c23..e7197eba5 100644 --- a/src/elm/Lia/Markdown/Code/Update.elm +++ b/src/elm/Lia/Markdown/Code/Update.elm @@ -1,6 +1,7 @@ module Lia.Markdown.Code.Update exposing ( Msg(..) , handle + , runAll , update ) @@ -38,6 +39,25 @@ handle = Handle +runAll : Maybe Int -> Scripts a -> Model -> Return Model msg sub +runAll sectionID scripts model = + model.evaluate + |> Array.foldl + (\_ ( id, return ) -> + let + ret = + execute sectionID scripts return.value id + in + ( id + 1 + , ret + |> Return.batchEvents return.events + |> Return.batchCmd [ return.command ] + ) + ) + ( 0, Return.val model ) + |> Tuple.second + + restore : Maybe Int -> JE.Value -> Model -> Return Model msg sub restore sectionID json model = case diff --git a/src/elm/Lia/Markdown/Code/View.elm b/src/elm/Lia/Markdown/Code/View.elm index d45e84208..dcf8d5c8d 100644 --- a/src/elm/Lia/Markdown/Code/View.elm +++ b/src/elm/Lia/Markdown/Code/View.elm @@ -137,7 +137,7 @@ viewCode executable lang theme running errors id_1 id_2 file attr = , A11y_Widget.label <| file.name ++ " " - ++ (if file.visible then + ++ (if True then codeMinimize lang else @@ -146,7 +146,7 @@ viewCode executable lang theme running errors id_1 id_2 file attr = ] [ btnIcon { title = - if file.visible then + if True then codeMinimize lang else @@ -162,7 +162,7 @@ viewCode executable lang theme running errors id_1 id_2 file attr = ) id_2 , icon = - if file.visible then + if True then "icon-plus" else @@ -175,11 +175,11 @@ viewCode executable lang theme running errors id_1 id_2 file attr = , Html.div [ Attr.classList [ ( "lia-accordion__content", True ) - , ( "active", file.visible ) + , ( "active", True ) ] ] [ Html.div [ Attr.class "lia-code__input" ] - [ if file.visible && executable then + [ if True && executable then btnIcon { title = if file.fullscreen then @@ -225,6 +225,7 @@ toStyle visible pix = else "0px" , Attr.style "transition" "min-height 0.25s ease-out" + , Attr.style "break-inside" "avoid" ] @@ -292,16 +293,15 @@ evaluate executable theme attr running ( id_1, id_2 ) file errors = total_lines = lines file.code + -- XXX: Changed to comply with pdf max_lines = - if file.fullscreen then - total_lines - - else if total_lines > 16 then - 16 - - else - total_lines + --if file.fullscreen then + total_lines + --else if total_lines > 16 then + -- 16 + --else + -- total_lines readOnly = if executable then if running then diff --git a/src/elm/Lia/Markdown/Config.elm b/src/elm/Lia/Markdown/Config.elm index 6e8401756..b22b9605d 100644 --- a/src/elm/Lia/Markdown/Config.elm +++ b/src/elm/Lia/Markdown/Config.elm @@ -14,7 +14,7 @@ import Lia.Markdown.Inline.Types exposing (Inlines) import Lia.Markdown.Inline.View exposing (viewer) import Lia.Markdown.Update exposing (Msg(..)) import Lia.Section exposing (Section, SubSection(..)) -import Lia.Settings.Types exposing (Mode, Settings) +import Lia.Settings.Types exposing (Mode(..), Settings) import Lia.Sync.Types as Sync import Session exposing (Screen) import Translations exposing (Lang) @@ -38,7 +38,7 @@ init lang translations settings sync screen section id media = inline lang translations settings screen section.effect_model id media sync in Config - settings.mode + Textbook (viewer config >> List.map (Html.map Script)) section settings.editor diff --git a/src/elm/Lia/Markdown/Update.elm b/src/elm/Lia/Markdown/Update.elm index e616f1c76..0be1e71d8 100644 --- a/src/elm/Lia/Markdown/Update.elm +++ b/src/elm/Lia/Markdown/Update.elm @@ -442,8 +442,21 @@ previousEffect sync globals sound = initEffect : Sync.State -> Definition -> Bool -> Bool -> Section -> Return Section Msg Msg -initEffect sync globals run_all_javascript sound = - update sync globals (UpdateEffect sound (Effect.init run_all_javascript)) +initEffect sync globals run_all_javascript sound section = + let + return = + update sync globals (UpdateEffect sound (Effect.init run_all_javascript)) section + + return2 = + return.value.code_model + |> Code.runAll (Just section.id) section.effect_model.javascript + |> Return.mapVal (\v -> { section | code_model = v }) + |> Return.mapEvents "code" section.id + |> updateScript + in + return2 + |> Return.batchEvents return.events + |> Return.batchCmd [ return.command ] subHandle : Scripts SubSection -> JE.Value -> SubSection -> Return SubSection Msg Msg diff --git a/src/elm/Lia/Script.elm b/src/elm/Lia/Script.elm index 328f745d1..b70561d29 100644 --- a/src/elm/Lia/Script.elm +++ b/src/elm/Lia/Script.elm @@ -14,6 +14,7 @@ module Lia.Script exposing , subscriptions , update , view + , viewFullPage ) {-| This module defines the basic interface to LiaScript. In order to implement @@ -391,6 +392,13 @@ init = Lia.Model.init +{-| Alias for global LiaScript view defined in `Lia.View.viewFullPage` +-} +viewFullPage : Screen -> Model -> List (Html Msg) +viewFullPage = + Lia.View.viewFullPage + + {-| Alias for global LiaScript view defined in `Lia.View.view` -} view : Screen -> Bool -> Model -> Html Msg diff --git a/src/elm/Lia/Update.elm b/src/elm/Lia/Update.elm index a7fe65822..da372fd10 100644 --- a/src/elm/Lia/Update.elm +++ b/src/elm/Lia/Update.elm @@ -345,6 +345,13 @@ update session msg model = (set_active_section { model | to_do = [] }) UpdateMarkdown |> Return.batchEvents (Service.Slide.initialize model.section_active :: model.to_do) + |> Return.batchEvent + (if model.section_active < Array.length model.sections then + Service.Script.exec 100 <| "window.LIA.goto(" ++ String.fromInt (model.section_active + 1) ++ ")" + + else + Event.none + ) ( JumpToFragment id, Just sec ) -> if (model.settings.mode == Textbook) || sec.effect_model.visible == id then diff --git a/src/elm/Lia/View.elm b/src/elm/Lia/View.elm index 7cbd70477..df510f342 100644 --- a/src/elm/Lia/View.elm +++ b/src/elm/Lia/View.elm @@ -1,8 +1,9 @@ -module Lia.View exposing (view) +module Lia.View exposing (view, viewFullPage) import Accessibility.Key as A11y_Key import Accessibility.Landmark as A11y_Landmark import Accessibility.Widget as A11y_Widget +import Array exposing (Array) import Const import Dict exposing (Dict) import Html exposing (Html) @@ -47,6 +48,27 @@ view screen hasIndex model = (viewIndex hasIndex model :: viewSlide screen model) +viewFullPage : Screen -> Model -> List (Html Msg) +viewFullPage screen model = + model.sections + |> Array.toList + |> List.indexedMap (viewSection screen model) + + +viewSection screen model section_active sec = + Config.init + model.translation + ( model.langCodeOriginal, model.langCode ) + model.settings + model.sync + screen + sec + section_active + model.media + |> Markdown.view + |> Html.map UpdateMarkdown + + {-| **@private:** Display the side section that contains the document search, table of contents and the home button. -} diff --git a/src/elm/Main.elm b/src/elm/Main.elm index 8cd4e23b2..721004a45 100644 --- a/src/elm/Main.elm +++ b/src/elm/Main.elm @@ -65,6 +65,7 @@ type alias Flags = , hasShareAPI : Bool , hasIndex : Bool , syncSupport : List String + , fullPage : Maybe Bool } @@ -88,7 +89,7 @@ init flags url key = let model = Session flags.hasShareAPI key flags.screen - >> Model 0 flags.hasIndex Nothing Index.init Nothing + >> Model (Maybe.withDefault False flags.fullPage) 0 flags.hasIndex Nothing Index.init Nothing courseUrl = { url | query = Maybe.map link url.query } diff --git a/src/elm/Model.elm b/src/elm/Model.elm index 9a5234acb..575826fd4 100644 --- a/src/elm/Model.elm +++ b/src/elm/Model.elm @@ -50,7 +50,8 @@ import Session exposing (Session) -} type alias Model = - { size : Float + { fullPage : Bool + , size : Float , hasIndex : Bool , code : Maybe String , index : Index.Model diff --git a/src/elm/Update.elm b/src/elm/Update.elm index 2081e5ce4..c58e1d980 100644 --- a/src/elm/Update.elm +++ b/src/elm/Update.elm @@ -9,6 +9,7 @@ port module Update exposing -- UPDATE +import Array exposing (Array) import Browser import Browser.Events import Browser.Navigation as Navigation diff --git a/src/elm/View.elm b/src/elm/View.elm index fb3d1f6af..c33fb1178 100644 --- a/src/elm/View.elm +++ b/src/elm/View.elm @@ -22,12 +22,21 @@ view model = , body = case model.state of Running -> - [ model.lia - |> Lia.Script.view - model.session.screen - model.hasIndex - |> Html.map LiaScript - ] + if model.fullPage then + [ model.lia + |> Lia.Script.viewFullPage + model.session.screen + |> Html.div [] + |> Html.map LiaScript + ] + + else + [ model.lia + |> Lia.Script.view + model.session.screen + model.hasIndex + |> Html.map LiaScript + ] Idle -> [ Html.map UpdateIndex <| Index.view model.session model.lia.settings model.index diff --git a/src/scss/03_elements/_elements.code.scss b/src/scss/03_elements/_elements.code.scss index a1bfdb0d7..7f21c595f 100644 --- a/src/scss/03_elements/_elements.code.scss +++ b/src/scss/03_elements/_elements.code.scss @@ -43,6 +43,7 @@ flex-direction: column; &__input { + break-inside: avoid; align-items: center; background-color: rgba(var(--lia-white), 0.1); border-radius: $global-radius; diff --git a/src/scss/05_components/_components.quiz.scss b/src/scss/05_components/_components.quiz.scss index 35ecce991..0cfe1565e 100644 --- a/src/scss/05_components/_components.quiz.scss +++ b/src/scss/05_components/_components.quiz.scss @@ -1,5 +1,6 @@ .lia-quiz { margin-bottom: 2rem; + break-inside: avoid; /* quiz elements */ diff --git a/src/scss/05_components/_components.slide.scss b/src/scss/05_components/_components.slide.scss index c02681531..2a645e053 100644 --- a/src/scss/05_components/_components.slide.scss +++ b/src/scss/05_components/_components.slide.scss @@ -26,7 +26,7 @@ &__content { height: 100%; - margin-top: calc(#{$header-height-mobile}); + //margin-top: calc(#{$header-height-mobile}); max-width: 144rem; overflow: auto; padding: 0 3rem; @@ -34,7 +34,7 @@ width: 100%; @include breakpoint("md") { - margin: calc(#{$header-height-desktop}) 0 2rem; + // margin: calc(#{$header-height-desktop}) 0 2rem; } } } diff --git a/src/scss/main.scss b/src/scss/main.scss index c0a5beb6c..ad8b2cb84 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -175,3 +175,5 @@ page-break-after: avoid; } } + + diff --git a/src/typescript/liascript/index.ts b/src/typescript/liascript/index.ts index 2eb5ca328..e4a98c8fd 100644 --- a/src/typescript/liascript/index.ts +++ b/src/typescript/liascript/index.ts @@ -40,6 +40,7 @@ export class LiaScript { connector: Connector, allowSync: boolean = false, debug: boolean = false, + fullPage: boolean = false, courseUrl: string | null = null, script: string | null = null ) { @@ -58,6 +59,7 @@ export class LiaScript { hasShareAPI: Share.isSupported(), hasIndex: connector.hasIndex(), syncSupport: Sync.supported(allowSync), + fullPage: fullPage, }, }) From 58d31a8ea061e8e6f7f8f764222ec36f99ff25d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 11 Feb 2022 20:55:22 +0100 Subject: [PATCH 02/53] forgot to add entry for PDF --- src/entry/pdf/index.html | 79 ++++++++++++++++++++++++++++++++++++++++ src/entry/pdf/index.ts | 13 +++++++ 2 files changed, 92 insertions(+) create mode 100644 src/entry/pdf/index.html create mode 100644 src/entry/pdf/index.ts diff --git a/src/entry/pdf/index.html b/src/entry/pdf/index.html new file mode 100644 index 000000000..44df5c435 --- /dev/null +++ b/src/entry/pdf/index.html @@ -0,0 +1,79 @@ + + + + + Lia + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/entry/pdf/index.ts b/src/entry/pdf/index.ts new file mode 100644 index 000000000..d9205f097 --- /dev/null +++ b/src/entry/pdf/index.ts @@ -0,0 +1,13 @@ +import LiaScript from '../../typescript/liascript/index' + +import('../../typescript/connectors/Base/index').then(function (Base) { + let debug = false + + var app = new LiaScript( + document.body, + new Base.Connector(), + false, // allowSync + false, // debug + true // fullPage + ) +}) From ba1c99355e906aad491ccb12c37b883df07871a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 11 Feb 2022 20:55:45 +0100 Subject: [PATCH 03/53] Improve printing for code and output --- src/elm/Lia/Markdown/Code/View.elm | 24 +++++++++++---------- src/scss/03_elements/_elements.code.scss | 5 +++-- src/scss/main.scss | 27 ++++++++++++++++++++++++ src/typescript/webcomponents/editor.ts | 1 + 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/elm/Lia/Markdown/Code/View.elm b/src/elm/Lia/Markdown/Code/View.elm index dcf8d5c8d..4d679c1ef 100644 --- a/src/elm/Lia/Markdown/Code/View.elm +++ b/src/elm/Lia/Markdown/Code/View.elm @@ -331,15 +331,15 @@ evaluate executable theme attr running ( id_1, id_2 ) file errors = |> Params.get "data-theme" |> Maybe.withDefault theme |> Editor.theme - , Editor.maxLines - (if max_lines > 16 then - -1 - else - max_lines - ) - , Editor.readOnly readOnly - , Editor.highlightActiveLine (not readOnly) + --, Editor.maxLines + -- (if max_lines > 16 then + -- -1 + -- else + -- max_lines + -- ) + , Editor.readOnly True + , Editor.highlightActiveLine False , attr |> Params.get "data-tabsize" |> Maybe.andThen String.toInt @@ -367,10 +367,12 @@ evaluate executable theme attr running ( id_1, id_2 ) file errors = executable , Editor.useSoftTabs False , Editor.annotations errors - , Editor.enableBasicAutocompletion executable - , Editor.enableLiveAutocompletion executable - , Editor.enableSnippets executable + + --, Editor.enableBasicAutocompletion executable + --, Editor.enableLiveAutocompletion executable + --, Editor.enableSnippets executable , Editor.extensions [ "language_tools" ] + , Editor.useWrapMode True ] ) [] diff --git a/src/scss/03_elements/_elements.code.scss b/src/scss/03_elements/_elements.code.scss index 7f21c595f..c9b8fc57a 100644 --- a/src/scss/03_elements/_elements.code.scss +++ b/src/scss/03_elements/_elements.code.scss @@ -89,16 +89,17 @@ } .ace_editor { - max-height: calc( + /*max-height: calc( var(--max-editor-line-count) * ( calc(var(--global-font-size, 1.5rem) * var(--font-size-multiplier)) * 1.47 ) ) !important; + */ font-size: calc( var(--global-font-size, 1.5rem) * var(--font-size-multiplier) ) !important; - height: auto !important; + //height: auto !important; } diff --git a/src/scss/main.scss b/src/scss/main.scss index ad8b2cb84..5e2db1b89 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -177,3 +177,30 @@ } + + + + +.lia-accordion__toggle { + visibility: hidden; + width: 5px !important; +} + +.lia-effect__circle { + display: none; +} + +.lia-code-terminal__input { + display: none; +} + +.ace_editor { + max-height: none !important; + height: none !important; +} + +.lia-code-terminal__output { + white-space: pre-wrap; +} + + diff --git a/src/typescript/webcomponents/editor.ts b/src/typescript/webcomponents/editor.ts index f5dce067a..87b182a23 100644 --- a/src/typescript/webcomponents/editor.ts +++ b/src/typescript/webcomponents/editor.ts @@ -136,6 +136,7 @@ customElements.define( maxLines: this.model.maxLines, fontSize: this.model.fontSize, fontFamily: this.model.fontFamily, + highlightGutterLine: false, }) if (!this.model.showCursor) { From 8f0b766ca2c6119927e01d2252859914c7d62c9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 11 Feb 2022 21:36:24 +0100 Subject: [PATCH 04/53] Remove focus from first element --- src/typescript/liascript/service/Slide.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/typescript/liascript/service/Slide.ts b/src/typescript/liascript/service/Slide.ts index dd6554a6f..db65ad216 100644 --- a/src/typescript/liascript/service/Slide.ts +++ b/src/typescript/liascript/service/Slide.ts @@ -69,7 +69,7 @@ function scrollUp() { // The first element within a slide is in LiaScript the header, in order to // improve accessibility this element is put in focus to offer a general // starting point for keyboard navigation. - if (main.children.length > 0) (main.children[0] as HTMLElement).focus() + // if (main.children.length > 0) (main.children[0] as HTMLElement).focus() } } From cd14762d6b48a1a48e030fee891f2de7ca8f752d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 11 Feb 2022 21:40:30 +0100 Subject: [PATCH 05/53] Improve make multimedia links --- src/elm/Lia/Markdown/Inline/View.elm | 105 +++++++++++++-------------- 1 file changed, 52 insertions(+), 53 deletions(-) diff --git a/src/elm/Lia/Markdown/Inline/View.elm b/src/elm/Lia/Markdown/Inline/View.elm index 54f88671c..1799de113 100644 --- a/src/elm/Lia/Markdown/Inline/View.elm +++ b/src/elm/Lia/Markdown/Inline/View.elm @@ -385,10 +385,9 @@ reference config ref attr = |> figure config title_ width "image" Audio alt_ ( tube, url_ ) title_ -> - figure config title_ Nothing "audio" <| - Html.div [] - [ printLink config alt_ title_ url_ - , if tube then + Html.a [ Attr.href url_ ] + [ figure config title_ Nothing "audio" <| + if tube then Html.iframe (Attr.src url_ :: Attr.attribute "loading" "lazy" @@ -401,7 +400,7 @@ reference config ref attr = ) [] - else + else Html.audio (Attr.controls True :: Attr.attribute "preload" "none" @@ -410,34 +409,32 @@ reference config ref attr = |> CList.addWhen (alt config alt_) ) [ Html.source [ Attr.src url_ ] [] ] - ] + ] Movie alt_ ( tube, url_ ) title_ -> - if tube then - figure config title_ Nothing "iframe" <| - Html.div [ Attr.class "lia-iframe-wrapper" ] - [ printLink config alt_ title_ url_ - , Html.iframe - (Attr.src url_ - :: Attr.attribute "allowfullscreen" "" - :: Attr.attribute "loading" "lazy" - :: Attr.attribute "allow" "accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" - :: toAttribute attr - |> CList.addWhen (title config title_) - |> CList.addWhen (alt config alt_) - ) - (viewer config alt_) - ] - - else - figure config title_ Nothing "movie" <| - -- This fixes if multiple videos appear on different sites, but on the same - -- position, then only the attributes are changed, which does not affect the - -- video at all. By using Html.Keyed the system is forced to update the - -- entire video tag. - Html.div [] - [ printLink config alt_ title_ url_ - , Html.Keyed.node "div" + Html.a [ Attr.href url_ ] + [ if tube then + figure config title_ Nothing "iframe" <| + Html.div [ Attr.class "lia-iframe-wrapper" ] + [ Html.iframe + (Attr.src url_ + :: Attr.attribute "allowfullscreen" "" + :: Attr.attribute "loading" "lazy" + :: Attr.attribute "allow" "accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" + :: toAttribute attr + |> CList.addWhen (title config title_) + |> CList.addWhen (alt config alt_) + ) + (viewer config alt_) + ] + + else + figure config title_ Nothing "movie" <| + -- This fixes if multiple videos appear on different sites, but on the same + -- position, then only the attributes are changed, which does not affect the + -- video at all. By using Html.Keyed the system is forced to update the + -- entire video tag. + Html.Keyed.node "div" [ Attr.class "lia-video-wrapper" ] [ ( url_ , Html.video @@ -450,24 +447,24 @@ reference config ref attr = [ Html.source [ Attr.src url_ ] [] ] ) ] - ] - - Embed alt_ url title_ -> - Html.figure [ Attr.class "lia-figure", Attr.style "height" "auto", Attr.style "width" "100%" ] <| - [ Html.div [ Attr.class "lia-figure__media" ] <| - case title_ of - Just sub -> - [ printLink config alt_ title_ url - , oembed config.oEmbed url - , sub - |> viewer config - |> Html.figcaption [ Attr.class "lia-figure__caption" ] - ] + ] - Nothing -> - [ printLink config alt_ title_ url - , oembed config.oEmbed url - ] + Embed _ url title_ -> + Html.a [ Attr.href url ] + [ Html.figure [ Attr.class "lia-figure", Attr.style "height" "auto", Attr.style "width" "100%" ] <| + [ Html.div [ Attr.class "lia-figure__media" ] <| + case title_ of + Just sub -> + [ oembed config.oEmbed url + , sub + |> viewer config + |> Html.figcaption [ Attr.class "lia-figure__caption" ] + ] + + Nothing -> + [ oembed config.oEmbed url + ] + ] ] Preview_Lia url -> @@ -481,11 +478,11 @@ reference config ref attr = [] QR_Link url title_ -> - [ url - |> QRCode.fromString - |> Result.map (QRCode.toSvg [ A11y_Widget.label <| Translations.qrCode config.lang ++ ": " ++ url ]) - |> Result.withDefault (Html.text (Translations.qrErr config.lang)) - ] + [ [ url + |> QRCode.fromString + |> Result.map (QRCode.toSvg [ A11y_Widget.label <| Translations.qrCode config.lang ++ ": " ++ url ]) + |> Result.withDefault (Html.text (Translations.qrErr config.lang)) + ] |> Html.a (Attr.href url :: Attr.style "width" "300px" @@ -495,6 +492,8 @@ reference config ref attr = |> CList.addWhen (title config title_) ) |> figure config title_ (Just 300) "image" + ] + |> Html.a [ Attr.href url ] printLink : Config sub -> Inlines -> Maybe Inlines -> String -> Html (Msg sub) From f6ea0337b44c2a8023450ddec92be36d7331825f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 11 Feb 2022 21:41:40 +0100 Subject: [PATCH 06/53] improved gallery preview --- src/scss/main.scss | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/scss/main.scss b/src/scss/main.scss index 5e2db1b89..a13a47862 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -202,5 +202,3 @@ .lia-code-terminal__output { white-space: pre-wrap; } - - From 786c1e90989c055efb8a01102343c49645f8704f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 11 Feb 2022 23:48:41 +0100 Subject: [PATCH 07/53] fix: avoid break of code-accordion --- src/scss/main.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/scss/main.scss b/src/scss/main.scss index a13a47862..5d62bbdbb 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -202,3 +202,7 @@ .lia-code-terminal__output { white-space: pre-wrap; } + +.lia-accordion__item { + break-inside: avoid; +} From 9ea588482e5830a80f7c056641b71e5238acf222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Sat, 12 Feb 2022 13:47:54 +0100 Subject: [PATCH 08/53] Add orphans to code --- src/scss/main.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/scss/main.scss b/src/scss/main.scss index 5d62bbdbb..2d6c44f74 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -205,4 +205,6 @@ .lia-accordion__item { break-inside: avoid; + orphans: 5; } + From f86314dca52dd97a58a046684c836b6b1e99202e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Sat, 12 Feb 2022 18:31:48 +0100 Subject: [PATCH 09/53] improve: Code printing with title attached --- src/scss/main.scss | 46 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/src/scss/main.scss b/src/scss/main.scss index 2d6c44f74..be5b851ae 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -86,8 +86,17 @@ * Used to hide elements on printing */ +<<<<<<< HEAD .lia-print-only { display: none; +======= +table, ul, ol, figure, blockquote { + break-inside: avoid; +} + +.lia-quiz { + break-inside: avoid; +>>>>>>> 06519957 (improve: Code printing with title attached) } @media print { @@ -194,17 +203,46 @@ display: none; } +.lia-code-terminal__output { + white-space: pre-wrap; +} + +.lia-accordion__item { + break-inside: avoid; + orphans: 5; +} + +.lia-accordion__item { + break-inside: avoid; + orphans: 3; + widows: 3; +} + .ace_editor { max-height: none !important; height: none !important; + min-height: unset !important; + break-inside: auto !important; + orphans: 3; + widows: 3; } -.lia-code-terminal__output { - white-space: pre-wrap; +.ace_text-input { + break-inside: auto !important; + orphans: 3; + widows: 3; } -.lia-accordion__item { +label { + page-break-after: avoid; +} + +.lia-code-terminal__output { break-inside: avoid; - orphans: 5; } + +main { + orphans: 3; + widows: 3; +} From 740bef52da2b57238f06430c0392c6dad7bfc674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Sat, 12 Feb 2022 18:33:30 +0100 Subject: [PATCH 10/53] removed toolbox from images --- src/elm/Lia/Markdown/Chart/View.elm | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/elm/Lia/Markdown/Chart/View.elm b/src/elm/Lia/Markdown/Chart/View.elm index d780549ca..9c6061673 100644 --- a/src/elm/Lia/Markdown/Chart/View.elm +++ b/src/elm/Lia/Markdown/Chart/View.elm @@ -1544,15 +1544,7 @@ toolbox : -> ( String, JE.Value ) toolbox position config = ( "toolbox" - , JE.object - [ ( "bottom", JE.int 8 ) - , ( "left" - , position - |> Maybe.withDefault "center" - |> JE.string - ) - , feature config - ] + , JE.null ) From 5bccc4a9d54edd72e56a0079c293b7fdadfba782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 25 Feb 2022 14:10:19 +0100 Subject: [PATCH 11/53] rebase: to LiaScript 0.10.1 --- src/entry/pdf/index.ts | 4 +- src/scss/main.scss | 205 +++++++++++++++++------------------------ 2 files changed, 87 insertions(+), 122 deletions(-) diff --git a/src/entry/pdf/index.ts b/src/entry/pdf/index.ts index d9205f097..2d7558a69 100644 --- a/src/entry/pdf/index.ts +++ b/src/entry/pdf/index.ts @@ -1,9 +1,9 @@ -import LiaScript from '../../typescript/liascript/index' +import * as Lia from '../../typescript/liascript/index' import('../../typescript/connectors/Base/index').then(function (Base) { let debug = false - var app = new LiaScript( + var app = new Lia.LiaScript( document.body, new Base.Connector(), false, // allowSync diff --git a/src/scss/main.scss b/src/scss/main.scss index be5b851ae..35e732c08 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -86,163 +86,128 @@ * Used to hide elements on printing */ -<<<<<<< HEAD .lia-print-only { display: none; -======= -table, ul, ol, figure, blockquote { - break-inside: avoid; } -.lia-quiz { - break-inside: avoid; ->>>>>>> 06519957 (improve: Code printing with title attached) -} - -@media print { - - .lia-print-only { - display: inline-block !important; - position: absolute; - z-index: 1000; - padding: 1rem; - background-color: white; - } - - .lia-print-only::before { - content: "↪︎ "; - } - - .lia-slide { - height: unset !important; - } - - .lia-toc, - .lia-support-menu--open, - .lia-slide__footer, - .lia-quiz__control, - .lia-code-control, - .lia-plot__switch, - .lia-table__sort, - .lia-code__min-max, - #lia-toolbar-nav { - display: none !important; - width: 0 !important; - } - main, - .lia-canvas, - .lia-slide { - width: unset !important; - height: unset !important; - overflow: hidden !important; - margin-top: unset !important; - } - .lia-code-terminal__output { - height: fit-content !important; - max-height: 800px !important; - } +.lia-print-only { + display: inline-block !important; + position: absolute; + z-index: 1000; + padding: 1rem; + background-color: white; +} - table, - ul, - ol, - figure, - blockquote, - .lia-quiz, - .lia-code-terminal__output { - break-inside: avoid; - } +.lia-print-only::before { + content: "↪︎ "; +} - .lia-gallery { - flex-flow: wrap; - } +.lia-slide { + height: unset !important; +} - .lia-lightbox__icon { - display: none; - } +.lia-toc, +.lia-support-menu--open, +.lia-slide__footer, +.lia-quiz__control, +.lia-code-control, +.lia-plot__switch, +.lia-table__sort, +.lia-code__min-max, +#lia-toolbar-nav { + display: none !important; + width: 0 !important; +} - .lia-table-responsive { - max-height: fit-content !important; - } +main, +.lia-canvas, +.lia-slide { + width: unset !important; + height: unset !important; + overflow: hidden !important; + margin-top: unset !important; +} - .ace_gutter-active-line { - background-color: unset !important; - } +.lia-code-terminal__output { + height: fit-content !important; + max-height: 800px !important; +} - .ace_hidden-cursors { - opacity: 0; - } +table, +ul, +ol, +figure, +blockquote, +.lia-quiz, +.lia-code-terminal__output { + break-inside: avoid; +} - .ace_text-input { - break-inside: auto !important; - orphans: 3; - widows: 3; - } +.lia-gallery { + flex-flow: wrap; +} - label { - page-break-after: avoid; - } +.lia-lightbox__icon { + display: none; } +.lia-table-responsive { + max-height: fit-content !important; +} +.ace_gutter-active-line { + background-color: unset !important; +} +.ace_hidden-cursors { + opacity: 0; +} +.ace_text-input { + break-inside: auto !important; + orphans: 3; + widows: 3; +} +label { + page-break-after: avoid; +} .lia-accordion__toggle { - visibility: hidden; - width: 5px !important; + visibility: hidden; + width: 5px !important; } .lia-effect__circle { - display: none; + display: none; } .lia-code-terminal__input { - display: none; + display: none; } .lia-code-terminal__output { - white-space: pre-wrap; + white-space: pre-wrap; } .lia-accordion__item { - break-inside: avoid; - orphans: 5; -} - -.lia-accordion__item { - break-inside: avoid; - orphans: 3; - widows: 3; + break-inside: avoid; + orphans: 3; + widows: 3; } .ace_editor { - max-height: none !important; - height: none !important; - min-height: unset !important; - break-inside: auto !important; - orphans: 3; - widows: 3; -} - -.ace_text-input { - break-inside: auto !important; - orphans: 3; - widows: 3; -} - -label { - page-break-after: avoid; + max-height: none !important; + height: none !important; + min-height: unset !important; + break-inside: auto !important; + orphans: 3; + widows: 3; } -.lia-code-terminal__output { - break-inside: avoid; -} - - main { - orphans: 3; - widows: 3; -} + orphans: 3; + widows: 3; +} \ No newline at end of file From 46005f3aa129356e53f803255ff8caed539b1de1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Wed, 9 Mar 2022 16:30:16 +0100 Subject: [PATCH 12/53] Add rules to show inline-effects --- src/scss/main.scss | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/scss/main.scss b/src/scss/main.scss index 35e732c08..016083063 100644 --- a/src/scss/main.scss +++ b/src/scss/main.scss @@ -91,7 +91,7 @@ } - +/* .lia-print-only { display: inline-block !important; position: absolute; @@ -99,6 +99,7 @@ padding: 1rem; background-color: white; } +*/ .lia-print-only::before { content: "↪︎ "; @@ -132,7 +133,7 @@ main, .lia-code-terminal__output { height: fit-content !important; - max-height: 800px !important; + max-height: 600px !important; } table, @@ -207,6 +208,14 @@ label { widows: 3; } +span { + + &.lia-effect--inline, + &.hide { + display: inline-block !important; + } +} + main { orphans: 3; widows: 3; From 0c812893ed04708ac8c201b0e587ce3b2e4de89c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Mon, 30 May 2022 13:17:44 +0200 Subject: [PATCH 13/53] fix: compilation issues --- src/elm/Lia/Update.elm | 1 + src/elm/Lia/View.elm | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/elm/Lia/Update.elm b/src/elm/Lia/Update.elm index 82f222194..6d844c5bb 100644 --- a/src/elm/Lia/Update.elm +++ b/src/elm/Lia/Update.elm @@ -26,6 +26,7 @@ import Return exposing (Return) import Service.Console import Service.Database import Service.Event as Event exposing (Event) +import Service.Script import Service.Slide import Session exposing (Session) import Translations exposing (Lang(..)) diff --git a/src/elm/Lia/View.elm b/src/elm/Lia/View.elm index d9d385688..67536f6de 100644 --- a/src/elm/Lia/View.elm +++ b/src/elm/Lia/View.elm @@ -65,7 +65,7 @@ viewSection screen model section_active sec = sec section_active model.media - |> Markdown.view + |> Markdown.view False True |> Html.map UpdateMarkdown From 4fd0621f794530d2240e3572cbb32dcf86a5d4cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Wed, 2 Nov 2022 14:20:04 +0100 Subject: [PATCH 14/53] fix pdf view --- src/entry/pdf/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/entry/pdf/index.ts b/src/entry/pdf/index.ts index 2d7558a69..456ccb04e 100644 --- a/src/entry/pdf/index.ts +++ b/src/entry/pdf/index.ts @@ -4,7 +4,6 @@ import('../../typescript/connectors/Base/index').then(function (Base) { let debug = false var app = new Lia.LiaScript( - document.body, new Base.Connector(), false, // allowSync false, // debug From d51554f68ef1d071e0f50048bebe605a9325ec84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Wed, 2 Nov 2022 14:42:02 +0100 Subject: [PATCH 15/53] Make Textbook-mode default --- src/elm/Lia/Model.elm | 2 +- src/elm/Lia/Settings/Json.elm | 42 +++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/elm/Lia/Model.elm b/src/elm/Lia/Model.elm index 3e45972a0..b53afb7d5 100644 --- a/src/elm/Lia/Model.elm +++ b/src/elm/Lia/Model.elm @@ -111,7 +111,7 @@ init : Bool -> Bool -> JE.Value -> { support : List String, enabled : Bool } -> init hasShareApi openTOC settings backends url readme origin anchor = let default = - Settings.init hasShareApi Settings.Presentation + Settings.init hasShareApi Settings.Textbook in { url = url , repositoryUrl = repo readme diff --git a/src/elm/Lia/Settings/Json.elm b/src/elm/Lia/Settings/Json.elm index 49d67e77c..860da5964 100644 --- a/src/elm/Lia/Settings/Json.elm +++ b/src/elm/Lia/Settings/Json.elm @@ -24,17 +24,19 @@ fromModel model = fromMode : Mode -> JE.Value -fromMode mode = - JE.string <| - case mode of - Textbook -> - "Textbook" +fromMode _ = + {- JE.string <| + case mode of + Textbook -> + "Textbook" - Presentation -> - "Presentation" + Presentation -> + "Presentation" - Slides -> - "Slides" + Slides -> + "Slides" + -} + JE.string "Textbook" settings : Settings -> Bool -> Mode -> String -> Bool -> String -> Int -> Bool -> String -> Bool -> Settings @@ -75,16 +77,18 @@ toModel model = toMode : String -> JD.Decoder Mode -toMode str = - case str of - "Textbook" -> - JD.succeed Textbook +toMode _ = + {- case str of + "Textbook" -> + JD.succeed Textbook - "Presentation" -> - JD.succeed Presentation + "Presentation" -> + JD.succeed Presentation - "Slides" -> - JD.succeed Slides + "Slides" -> + JD.succeed Slides - _ -> - JD.fail "unknown presentation mode" + _ -> + JD.fail "unknown presentation mode" + -} + JD.succeed Textbook From c6a42fb4eb6e477a4414187e7408de865420a998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 22 Nov 2022 16:06:21 +0100 Subject: [PATCH 16/53] Added timeout to first slide --- src/elm/Lia/Update.elm | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/elm/Lia/Update.elm b/src/elm/Lia/Update.elm index 6d844c5bb..7c9835186 100644 --- a/src/elm/Lia/Update.elm +++ b/src/elm/Lia/Update.elm @@ -348,7 +348,18 @@ update session msg model = |> Return.batchEvents (Service.Slide.initialize model.section_active :: model.to_do) |> Return.batchEvent (if model.section_active < Array.length model.sections then - Service.Script.exec 100 <| "window.LIA.goto(" ++ String.fromInt (model.section_active + 1) ++ ")" + Service.Script.exec + (if model.section_active == 0 then + -- Add timeout so that first slide, so that scripts can be loaded + 5000 + + else + 100 + ) + <| + "window.LIA.goto(" + ++ String.fromInt (model.section_active + 1) + ++ ")" else Event.none From 092ad7af270e4eb89e96a36722fafe9d73a22b66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 14 Feb 2023 18:19:45 +0100 Subject: [PATCH 17/53] Remove sync-backends to shrink export --- src/typescript/liascript/service/Sync.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/typescript/liascript/service/Sync.ts b/src/typescript/liascript/service/Sync.ts index d18e8e744..3ee0f4f2a 100644 --- a/src/typescript/liascript/service/Sync.ts +++ b/src/typescript/liascript/service/Sync.ts @@ -46,6 +46,7 @@ const Service = { } switch (event.message.param.backend) { + /* case 'beaker': if (!Beaker) { Beaker = await import('../../sync/Beaker/index') @@ -93,7 +94,7 @@ const Service = { sync = new PubNub.Sync(cbConnection, elmSend) break - + */ default: log.error('could not load =>', event.message) } From 9ea39f6e70a0b59c5d54de056ed1ebbe6af3be11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 26 Sep 2023 10:07:49 +0200 Subject: [PATCH 18/53] feat: Add skip Navigation Link --- src/elm/Lia/Script.elm | 6 ++++ src/elm/Lia/Update.elm | 20 +++++++++++++ src/elm/Lia/View.elm | 19 +++++++++++-- src/elm/Update.elm | 31 ++++++++++++++------ src/scss/04_objects/_object.canvas.scss | 38 +++++++++++++++++++------ 5 files changed, 95 insertions(+), 19 deletions(-) diff --git a/src/elm/Lia/Script.elm b/src/elm/Lia/Script.elm index a7f7fba1f..55a5ec32a 100644 --- a/src/elm/Lia/Script.elm +++ b/src/elm/Lia/Script.elm @@ -11,6 +11,7 @@ module Lia.Script exposing , load_slide , pages , parse_section + , skip_to_main_content , subscriptions , update , view @@ -74,6 +75,11 @@ load_slide session force = Load force >> Lia.Update.update session +skip_to_main_content : Session -> Model -> Return Model Msg Markdown.Msg +skip_to_main_content session = + Lia.Update.update session Focus + + {-| To be called if the course is has been downloaded and preprocessed, and should now be displayed for the first time. It determines the active section, creates a `search_index` for local referenced links, and creates connector event, that diff --git a/src/elm/Lia/Update.elm b/src/elm/Lia/Update.elm index 72917f609..1961bbfe9 100644 --- a/src/elm/Lia/Update.elm +++ b/src/elm/Lia/Update.elm @@ -95,11 +95,31 @@ type Msg | TTSReplay Bool | Media ( String, Maybe Int, Maybe Int ) | Pane SplitPane.Msg + | Focus update : Session -> Msg -> Model -> Return Model Msg Markdown.Msg update session msg model = case msg of + Focus -> + let + settings = + model.settings + in + { model + | settings = + { settings + | table_of_contents = + if session.screen.width <= Const.globalBreakpoints.sm then + False + + else + settings.table_of_contents + } + } + |> Return.val + |> Return.batchEvent (Service.Slide.initialize model.section_active) + Load force idx -> let settings = diff --git a/src/elm/Lia/View.elm b/src/elm/Lia/View.elm index 19a593b56..94f068392 100644 --- a/src/elm/Lia/View.elm +++ b/src/elm/Lia/View.elm @@ -48,7 +48,18 @@ view : Screen -> Bool -> Model -> Html Msg view screen hasIndex model = Html.div (Settings.design model.settings) - (viewIndex hasIndex model :: viewSlide screen model) + (Html.a + [ Attr.class "lia-skip-nav" + , model.section_active + |> (+) 1 + |> String.fromInt + |> (++) "#" + |> Attr.href + ] + [ Html.text "skip navigation" ] + :: viewIndex hasIndex model + :: viewSlide screen model + ) viewFullPage : Screen -> Model -> List (Html Msg) @@ -117,7 +128,11 @@ viewIndex hasIndex model = --|> Html.map Script , if hasIndex then Html.div [ Attr.class "lia-toc__bottom" ] - [ Index.bottom model.translation model.settings.table_of_contents Home ] + [ Index.bottom + model.translation + model.settings.table_of_contents + Home + ] else Html.text "" diff --git a/src/elm/Update.elm b/src/elm/Update.elm index 905ff1a63..6c90d69fe 100644 --- a/src/elm/Update.elm +++ b/src/elm/Update.elm @@ -233,27 +233,42 @@ update msg model = LinkClicked urlRequest -> case urlRequest of Browser.Internal url -> - ( model - , case ( url.query, model.session.url.query ) of + case ( url.query, model.session.url.query ) of ( Just newCourseURL, Just oldCourseURL ) -> - if newCourseURL /= oldCourseURL || url.fragment /= Just "" then - url + if newCourseURL == oldCourseURL && url.fragment == model.session.url.fragment then + let + return = + Lia.Script.skip_to_main_content model.session model.lia + in + ( { model | lia = return.value } + , batch LiaScript return + ) + + else if newCourseURL /= oldCourseURL || url.fragment /= Just "" then + ( model + , url |> Url.toString |> Navigation.load + ) else - Cmd.none + ( model + , Cmd.none + ) ( Nothing, Just oldCourseURL ) -> - { url | query = Just oldCourseURL } + ( model + , { url | query = Just oldCourseURL } |> Url.toString |> Navigation.load + ) _ -> - url + ( model + , url |> Url.toString |> Navigation.load - ) + ) Browser.External href -> ( model, Navigation.load href ) diff --git a/src/scss/04_objects/_object.canvas.scss b/src/scss/04_objects/_object.canvas.scss index 7130bd274..d98d5362f 100644 --- a/src/scss/04_objects/_object.canvas.scss +++ b/src/scss/04_objects/_object.canvas.scss @@ -29,7 +29,27 @@ $slide-margin-left-textbook: 19rem !default; width: 100vw; overflow-x: hidden; - @include breakpoint("sm", "max") { + .lia-skip-nav { + position: absolute; + z-index: 1000; + + padding: 0.5rem 1.5rem; + background-color: rgb(var(--color-background)); + border: 1px solid rgb(var(--color-border)); + transition: transform 325ms ease-in; + + left: 50%; + transform: translate(-50%, -120%); + top: 1rem; + } + + .lia-skip-nav:focus { + left: 50%; + transform: translate(-50%, 0%); + top: 1rem; + } + + @include breakpoint('sm', 'max') { /* push support-menu-toggler to the right if toc is open, prevent that buttons overlay each other */ &.lia-toc--visible #lia-btn-support { @@ -52,7 +72,7 @@ $slide-margin-left-textbook: 19rem !default; } } - @include breakpoint("sm") { + @include breakpoint('sm') { &.lia-toc--visible { left: $toc-width-desktop; width: calc(100% - #{$toc-width-desktop}); @@ -76,14 +96,14 @@ $slide-margin-left-textbook: 19rem !default; } } - @include breakpoint("md") { + @include breakpoint('md') { &.lia-toc--visible.lia-mode--presentation .lia-slide__content, &.lia-toc--visible.lia-mode--textbook .lia-slide__content { //width: auto; } } - @include breakpoint("lg") { + @include breakpoint('lg') { flex-direction: row; &.lia-support--visible { @@ -98,7 +118,7 @@ $slide-margin-left-textbook: 19rem !default; height: calc(100vh - 14.2rem + 7rem); } - @include breakpoint("lg") { + @include breakpoint('lg') { .lia-header { right: $notes-width-desktop; } @@ -116,11 +136,11 @@ $slide-margin-left-textbook: 19rem !default; max-width: calc(71.1rem + #{$slide-margin-left-textbook} + 3rem); padding-left: 3rem !important; - @include breakpoint("sm") { + @include breakpoint('sm') { margin: 1.25rem 0 2rem; } - @include breakpoint("md") { + @include breakpoint('md') { margin: 4.5rem 0 2rem; } } @@ -130,7 +150,7 @@ $slide-margin-left-textbook: 19rem !default; justify-content: center; } - @include breakpoint("md") { + @include breakpoint('md') { .lia-slide__content { padding-left: $slide-margin-left-textbook; } @@ -147,7 +167,7 @@ $slide-margin-left-textbook: 19rem !default; max-width: 124.6rem; } - @include breakpoint("lg") { + @include breakpoint('lg') { .lia-slide__content { // margin-left: calc(#{$slide-margin-left-presentation} - 3rem); } From be0e68c70eb6c2d8b5925bfc9793f9a6bff22d06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 26 Sep 2023 10:11:42 +0200 Subject: [PATCH 19/53] Version bump to 0.12.8 --- README.md | 7 ++++++- package-lock.json | 4 ++-- package.json | 2 +- src/typescript/liascript/init.ts | 2 +- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 89f801b59..50ce5a685 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ author: André Dietrich email: LiaScript@web.de -version: 0.12.7 +version: 0.12.8 language: en narrator: UK English Male @@ -296,6 +296,11 @@ This will apply the following four patches: ## Version-Changes +**0.12.0** (26/09/2023) + +- improve: Add "skip-navigation" link to tabulator order, which will only appear + in keyboard navigation + **0.12.7** (22/09/2023) - feat: Add `@style` macro, which reduces the need for adding custom styles. diff --git a/package-lock.json b/package-lock.json index 9a2e9c5d1..549c9281f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "liascript", - "version": "0.12.7", + "version": "0.12.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "liascript", - "version": "0.12.7", + "version": "0.12.8", "license": "BSD-3-Clause", "dependencies": { "pako": "^2.1.0" diff --git a/package.json b/package.json index e7edfde81..06c7ed255 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "liascript", - "version": "0.12.7", + "version": "0.12.8", "author": "André Dietrich", "license": "BSD-3-Clause", "description": "An extended Markdown interpreter for the creation of interactive online courses.", diff --git a/src/typescript/liascript/init.ts b/src/typescript/liascript/init.ts index f65489028..99ba4c1ce 100644 --- a/src/typescript/liascript/init.ts +++ b/src/typescript/liascript/init.ts @@ -7,7 +7,7 @@ export function initGlobals() { } if (!window.LIA.version) { - window.LIA.version = '0.12.6' + window.LIA.version = '0.12.8' } if (!window.LIA.eventSemaphore) { From e634f39b01e5af1bbeeb7253cd95ba0fc6239e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 10 Oct 2023 19:04:03 +0200 Subject: [PATCH 20/53] improve: scrom connects - now store result on undefined LMS state --- src/typescript/connectors/SCORM1.2/index.ts | 68 +++++++------------- src/typescript/connectors/SCORM2004/index.ts | 51 ++++++++++----- 2 files changed, 56 insertions(+), 63 deletions(-) diff --git a/src/typescript/connectors/SCORM1.2/index.ts b/src/typescript/connectors/SCORM1.2/index.ts index efc10fb27..e0f8f3eee 100644 --- a/src/typescript/connectors/SCORM1.2/index.ts +++ b/src/typescript/connectors/SCORM1.2/index.ts @@ -55,7 +55,7 @@ IF YOU ARE AN ELABORATE AND EXPERIENCED SCORM DEVELOPER? And you want to help us, to extend this service, please contact us via LiaScript@web.de -Hava fun ;-)` +Have fun ;-)` ) if (window.top && window.top.API) { @@ -97,18 +97,16 @@ Hava fun ;-)` init() { if (this.scorm) { - LOG('Initialize ', this.scorm.LMSInitialize('')) - // store state information only in normal mode - let mode = this.scorm.LMSGetValue('cmi.core.lesson_mode') - this.active = mode === 'normal' - - LOG( - 'Running in', - mode, - 'mode, results will ', - this.active ? '' : 'NOT', - 'be stored!' + let mode = this.scorm.LMSGetValue('cmi.core.lesson_mode') || 'unknown' + this.active = mode === 'normal' || mode === 'unknown' + + WARN( + 'Running in "' + + mode + + '" mode, results will ' + + (this.active ? '' : 'NOT') + + ' be stored!' ) LOG('open location ...') @@ -120,19 +118,12 @@ Hava fun ;-)` // if no location has been stored so far, this is the first visit if (this.location === null) { this.slide(0) - - // store all data as interactions with an sequential id - let id = 0 - id = this.initFirst('quiz', id) - id = this.initFirst('survey', id) - id = this.initFirst('task', id) - } else { - // restore the current state from the interactions - let id = 0 - id = this.initSecond('quiz', id) - id = this.initSecond('survey', id) - id = this.initSecond('task', id) } + // restore the current state from the interactions + let id = 0 + id = this.initSecond('quiz', id) + id = this.initSecond('survey', id) + id = this.initSecond('task', id) // calculate the new/old scoring value window['SCORE'] = 0 @@ -140,26 +131,6 @@ Hava fun ;-)` } } - /** - * This is helper that populates any kind of states with sequential ids as - * interactions within the backend. - * @param key - * @param id - * @returns the last sequence id - */ - initFirst(key: 'quiz' | 'survey' | 'task', id: number) { - for (let slide = 0; slide < this.db[key].length; slide++) { - this.id[key].push([]) - - for (let i = 0; i < this.db[key][slide].length; i++) { - //this.setInteraction(id, `${key}:${slide}-${i}`) - this.id[key][slide].push(id) - id++ - } - } - return id - } - /** * If the data has already been stored it is loaded with this method and the * sequential ids are restored to the `this.id` look-up table. @@ -246,13 +217,18 @@ Hava fun ;-)` * the course is now ready. If so, we will open the last visited slide. */ open(_uri: string, _version: number, _slide: number) { - if (this.location !== null) window.LIA.goto(this.location) + if (this.location !== null) { + const location = this.location + setTimeout(function () { + window['LIA'].goto(location) + }, 500) + } } slide(id: number): void { this.location = id - if (this.scorm) { + if (this.scorm && this.active) { this.scorm.LMSSetValue('cmi.core.lesson_location', JSON.stringify(id)) this.scorm.LMSCommit('') } diff --git a/src/typescript/connectors/SCORM2004/index.ts b/src/typescript/connectors/SCORM2004/index.ts index 29861b5cc..d5bbd3d3a 100644 --- a/src/typescript/connectors/SCORM2004/index.ts +++ b/src/typescript/connectors/SCORM2004/index.ts @@ -211,38 +211,42 @@ class Connector extends Base.Connector { LOG('Initialize ', this.scorm.Initialize('')) // store state information only in normal mode - let mode = this.scorm.GetValue('cmi.mode') - this.active = mode === 'normal' || !!window['ACTIVE'] + let mode = this.scorm.GetValue('cmi.mode') || 'undefined' + this.active = mode === 'normal' || mode === 'undefined' WARN( - `Running in "${ - mode || (window['ACTIVE'] ? 'always active' : 'unknown') - }" mode, results will${this.active ? ' ' : ' NOT '}be stored!` + 'Running in "' + + mode + + '" mode, results will ' + + (this.active ? '' : 'NOT') + + ' be stored!' ) - this.scaled_passing_score = Utils.jsonParse( - this.scorm.GetValue('cmi.scaled_passing_score') - ) + if (this.active) { + this.scaled_passing_score = Utils.jsonParse( + this.scorm.GetValue('cmi.scaled_passing_score') + ) - if (window['ACTIVE']) { if (!this.scaled_passing_score) { this.scaled_passing_score = window['MASTERY_SCORE'] || null } if (this.scorm.GetValue('cmi.completion_status') === null) { - this.scorm.SetValue('cmi.completion_status', 'incomplete') + this.write('cmi.completion_status', 'incomplete') } - } - LOG('open location ...') - this.location = Utils.jsonParse(this.scorm.GetValue('cmi.location')) - LOG('... ', this.location) + LOG('open location ...') + this.location = Utils.jsonParse(this.scorm.GetValue('cmi.location')) + LOG('... ', this.location) + } // if no location has been stored so far, this is the first visit if (this.location === null) { this.slide(0) + } - // store all data as interactions with an sequential id + const interactionsStored = this.countInteractions() + if (interactionsStored === 0 || interactionsStored === null) { let id = 0 id = this.initFirst('quiz', id) id = this.initFirst('survey', id) @@ -281,6 +285,14 @@ class Connector extends Base.Connector { return id } + countInteractions(): number | null { + if (!this.scorm) return null + + let value = parseInt(this.scorm.GetValue('cmi.interactions._count')) + + return value ? value : null + } + /** * If the data has already been stored it is loaded with this method and the * sequential ids are restored to the `this.id` look-up table. @@ -313,7 +325,12 @@ class Connector extends Base.Connector { * the course is now ready. If so, we will open the last visited slide. */ open(_uri: string, _version: number, _slide: number) { - if (this.location !== null) window.LIA.goto(this.location) + if (this.location !== null) { + const location = this.location + setTimeout(function () { + window['LIA'].goto(location) + }, 500) + } } /** @@ -435,7 +452,7 @@ class Connector extends Base.Connector { * @param data */ write(uri: CMIElement, data: string): void { - if (this.scorm) { + if (this.scorm && this.active) { LOG('write: ', uri, data) if (this.scorm.SetValue(uri, data) === 'false') { From 3184424150e0738f3d8ce0d01b77397a42d497e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 10 Oct 2023 19:08:22 +0200 Subject: [PATCH 21/53] scrom: initial store only in active mode --- src/typescript/connectors/SCORM2004/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/typescript/connectors/SCORM2004/index.ts b/src/typescript/connectors/SCORM2004/index.ts index d5bbd3d3a..7875b20d0 100644 --- a/src/typescript/connectors/SCORM2004/index.ts +++ b/src/typescript/connectors/SCORM2004/index.ts @@ -246,7 +246,10 @@ class Connector extends Base.Connector { } const interactionsStored = this.countInteractions() - if (interactionsStored === 0 || interactionsStored === null) { + if ( + this.active && + (interactionsStored === 0 || interactionsStored === null) + ) { let id = 0 id = this.initFirst('quiz', id) id = this.initFirst('survey', id) From 4add3d32140d8cc1d2c7a80975c8afbdc665b3a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 17 Oct 2023 18:49:57 +0200 Subject: [PATCH 22/53] chore: Update scrom1.2 build --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 06c7ed255..0b267c2ae 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "build:dev": "npm run clean && npx parcel build --no-source-maps --public-url . src/entry/dev/index.html && npm run sw", "watch:dev": "npx parcel serve src/entry/dev/index.html --open", "build:preview": "npx parcel build --no-source-maps --public-url . src/typescript/webcomponents/preview-lia.ts", - "build:scorm1.2": "npm run clean && ./node_modules/parcel/lib/bin.js build --no-source-maps --public-url . src/entry/scorm1.2/index.html", + "build:scorm1.2": "npm run clean && npx parcel build --no-source-maps --public-url . src/entry/scorm1.2/index.html", "watch:scorm1.2": "npx parcel serve src/entry/scorm1.2/index.html", "build:scorm2004": "npm run clean && ./node_modules/parcel/lib/bin.js build --no-source-maps --public-url . src/entry/scorm2004/index.html", "watch:scorm2004": "npx parcel serve src/entry/scorm2004/index.html", From 4c5b295a4cf5ef58c9880989e4663933c2acaa21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 17 Oct 2023 19:05:45 +0200 Subject: [PATCH 23/53] fix: Multi-Quiz restore from backend --- src/elm/Lia/Markdown/Quiz/Json.elm | 1 + 1 file changed, 1 insertion(+) diff --git a/src/elm/Lia/Markdown/Quiz/Json.elm b/src/elm/Lia/Markdown/Quiz/Json.elm index c0939eaf4..34758575b 100644 --- a/src/elm/Lia/Markdown/Quiz/Json.elm +++ b/src/elm/Lia/Markdown/Quiz/Json.elm @@ -132,5 +132,6 @@ toState = [ Block.toState |> JD.map Block_State , Vector.toState |> JD.map Vector_State , Matrix.toState |> JD.map Matrix_State + , Multi.toState |> JD.map Multi_State , JD.field "Generic" JD.value |> JD.andThen (\_ -> JD.succeed Generic_State) ] From eae19e7e016b5ff360d1281394c36237f846343c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Oct 2023 17:06:41 +0000 Subject: [PATCH 24/53] chore(deps-dev): bump @babel/traverse from 7.22.20 to 7.23.2 Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.22.20 to 7.23.2. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse) --- updated-dependencies: - dependency-name: "@babel/traverse" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 549c9281f..a04df3460 100644 --- a/package-lock.json +++ b/package-lock.json @@ -207,12 +207,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -369,13 +369,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -661,9 +661,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1972,19 +1972,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", - "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", + "@babel/generator": "^7.23.0", "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.19", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2086,13 +2086,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { From 61d28afb0f05097900577b170db63aea2cda329b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 17 Oct 2023 20:07:18 +0200 Subject: [PATCH 25/53] refac: Improved SCORM1.2 integration --- src/typescript/connectors/SCORM1.2/index.ts | 90 +++++++++++++-------- 1 file changed, 58 insertions(+), 32 deletions(-) diff --git a/src/typescript/connectors/SCORM1.2/index.ts b/src/typescript/connectors/SCORM1.2/index.ts index e0f8f3eee..07dbd2bf9 100644 --- a/src/typescript/connectors/SCORM1.2/index.ts +++ b/src/typescript/connectors/SCORM1.2/index.ts @@ -18,7 +18,7 @@ class Connector extends Base.Connector { /** * To simplify the handling of state data, these are preserved and loaded by - * this db, which is also replicated as a scorm interaction. The state is + * this db, which is also replicated as a scorm objective. The state is * stored as the associated learner_response (type "long-fill-in") */ private db: { @@ -113,17 +113,29 @@ Have fun ;-)` this.location = Utils.jsonParse( this.scorm.LMSGetValue('cmi.core.lesson_location') ) - LOG('... ', this.location) + LOG('... ', this.location || 0) // if no location has been stored so far, this is the first visit if (this.location === null) { this.slide(0) } - // restore the current state from the interactions + let id = 0 - id = this.initSecond('quiz', id) - id = this.initSecond('survey', id) - id = this.initSecond('task', id) + if (this.countObjectives() === 0 && this.active) { + // store all data as objectives with an sequential id + LOG('seeding values ...') + id = this.initFirst('quiz', id) + id = this.initFirst('survey', id) + id = this.initFirst('task', id) + LOG('... done') + } else { + // restore the current state from the objective + LOG('restoring values ...') + id = this.initSecond('quiz', id) + id = this.initSecond('survey', id) + id = this.initSecond('task', id) + LOG('... done') + } // calculate the new/old scoring value window['SCORE'] = 0 @@ -131,6 +143,25 @@ Have fun ;-)` } } + /** + * This is helper that populates any kind of states with sequential ids as + * objectives within the backend. + * @param key + * @param id + * @returns the last sequence id + */ + initFirst(key: 'quiz' | 'survey' | 'task', id: number) { + for (let slide = 0; slide < this.db[key].length; slide++) { + this.id[key].push([]) + for (let i = 0; i < this.db[key][slide].length; i++) { + this.setObjective(id, this.db[key][slide][i]) + this.id[key][slide].push(id) + id++ + } + } + return id + } + /** * If the data has already been stored it is loaded with this method and the * sequential ids are restored to the `this.id` look-up table. @@ -143,7 +174,7 @@ Have fun ;-)` this.id[key].push([]) for (let i = 0; i < this.db[key][slide].length; i++) { - let data = this.getInteraction(id) + let data = this.getObjective(id) if (data) { this.db[key][slide][i] = data @@ -234,25 +265,12 @@ Have fun ;-)` } } - countInteractions(): number | null { + countObjectives(): number | null { if (!this.scorm) return null let value = parseInt(this.scorm.LMSGetValue('cmi.objectives._count')) - return value ? value : null - } - - setInteraction(id: number, content: string) { - if (content.length <= 255) { - this.write(`cmi.objectives.${id}.id`, Utils.encodeJSON(content)) - return true - } - - this.write( - `cmi.objectives.${id}.id`, - 'Objective could not be stored, content exceeds 256Bytes!' - ) - return false + return value || 0 } initSettings(data: Lia.Settings | null, local = false) { @@ -307,7 +325,7 @@ Have fun ;-)` * @param id * @returns */ - getInteraction(id: number): any | null { + getObjective(id: number): any | null { if (!this.active) return null let data: undefined | string @@ -319,7 +337,7 @@ Have fun ;-)` if (data) return Utils.decodeJSON(data) } } catch (e) { - WARN('getInteraction =>', e, `cmi.objectives.${id}.id`, data) + WARN('getObjective =>', e, `cmi.objectives.${id}.id`, data) } return null @@ -330,8 +348,14 @@ Have fun ;-)` * @param id * @param state */ - updateInteraction(id: number, state: any): void { - this.write(`cmi.objectives.${id}.id`, Utils.encodeJSON(state)) + setObjective(id: number, state: any): void { + const data = Utils.encodeJSON(state) + + if (data.length > 255) { + WARN(`cmi.objectives.${id}.id`, 'Content exceeds 256Bytes!') + } + + this.write(`cmi.objectives.${id}.id`, data) } /** @@ -348,7 +372,12 @@ Have fun ;-)` case 'quiz': case 'survey': case 'task': - LOG('loading ', record.table, record.id, this.db.task[record.id]) + LOG( + 'loading ', + record.table, + record.id, + this.db[record.table][record.id] + ) return this.db[record.table][record.id] } } @@ -383,10 +412,7 @@ Have fun ;-)` storeHelper(record: Base.Record) { for (let i = 0; i < this.db[record.table][record.id].length; i++) { if (Utils.neq(record.data[i], this.db[record.table][record.id][i])) { - this.updateInteraction( - this.id[record.table][record.id][i], - record.data[i] - ) + this.setObjective(this.id[record.table][record.id][i], record.data[i]) // store the changed data in memory this.db[record.table][record.id][i] = record.data[i] @@ -401,7 +427,7 @@ Have fun ;-)` /** * Quizzes might be marked for some reason with additional labels. - * @param id - sequential interaction id + * @param id - sequential objective id * @param state - of the quit * @returns */ From fc8dac4894738da6133f55eb129e04c5b346cb62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 17 Oct 2023 20:43:00 +0200 Subject: [PATCH 26/53] fix: SCORM restore in review mode --- src/typescript/connectors/SCORM1.2/index.ts | 12 ++++-------- src/typescript/connectors/SCORM2004/index.ts | 11 ++++++----- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/typescript/connectors/SCORM1.2/index.ts b/src/typescript/connectors/SCORM1.2/index.ts index 07dbd2bf9..179485f79 100644 --- a/src/typescript/connectors/SCORM1.2/index.ts +++ b/src/typescript/connectors/SCORM1.2/index.ts @@ -104,9 +104,9 @@ Have fun ;-)` WARN( 'Running in "' + mode + - '" mode, results will ' + - (this.active ? '' : 'NOT') + - ' be stored!' + '" mode, results will' + + (this.active ? ' ' : ' NOT ') + + 'be stored!' ) LOG('open location ...') @@ -325,9 +325,7 @@ Have fun ;-)` * @param id * @returns */ - getObjective(id: number): any | null { - if (!this.active) return null - + getObjective(id: number): any { let data: undefined | string try { @@ -366,8 +364,6 @@ Have fun ;-)` * @returns the loaded dataset or nothing (for code) */ load(record: Base.Record) { - if (!this.active) return - switch (record.table) { case 'quiz': case 'survey': diff --git a/src/typescript/connectors/SCORM2004/index.ts b/src/typescript/connectors/SCORM2004/index.ts index 7875b20d0..1ae24f1bb 100644 --- a/src/typescript/connectors/SCORM2004/index.ts +++ b/src/typescript/connectors/SCORM2004/index.ts @@ -344,13 +344,16 @@ class Connector extends Base.Connector { * @returns the loaded dataset or nothing (for code) */ load(record: Base.Record) { - if (!this.active) return - switch (record.table) { case 'quiz': case 'survey': case 'task': - LOG('loading ', record.table, record.id, this.db.task[record.id]) + LOG( + 'loading ', + record.table, + record.id, + this.db[record.table][record.id] + ) return this.db[record.table][record.id] } } @@ -540,8 +543,6 @@ class Connector extends Base.Connector { * @returns */ getInteraction(id: number): any | null { - if (!this.active) return null - try { if (this.scorm) { let val = this.scorm.GetValue(`cmi.interactions.${id}.learner_response`) From 0aea2a0c05197fd9d6a507a9e74d9ace4f74352a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Thu, 19 Oct 2023 09:35:12 +0200 Subject: [PATCH 27/53] fix: SVG painting --- src/elm/Lia/Markdown/HTML/Attributes.elm | 16 ++++++++++++++++ src/elm/Lia/Markdown/HTML/Parser.elm | 16 ++++++++-------- src/elm/Lia/Markdown/HTML/Types.elm | 1 + 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/elm/Lia/Markdown/HTML/Attributes.elm b/src/elm/Lia/Markdown/HTML/Attributes.elm index 19f4e4475..8a060361b 100644 --- a/src/elm/Lia/Markdown/HTML/Attributes.elm +++ b/src/elm/Lia/Markdown/HTML/Attributes.elm @@ -8,6 +8,7 @@ module Lia.Markdown.HTML.Attributes exposing , isSetMaybe , parse , toAttribute + , toString , toURL ) @@ -174,6 +175,21 @@ toAttribute = List.map (\( key, value ) -> Attr.attribute key value) +toString : Parameters -> String +toString = + List.map + (\( key, value ) -> + key + ++ (if String.isEmpty value then + "" + + else + "=\"" ++ value ++ "\"" + ) + ) + >> String.join " " + + {-| Parameters of type: "src", "href", "data", "data-src", "formaction", "poster" diff --git a/src/elm/Lia/Markdown/HTML/Parser.elm b/src/elm/Lia/Markdown/HTML/Parser.elm index 7bddf6b91..e3f3d0c85 100644 --- a/src/elm/Lia/Markdown/HTML/Parser.elm +++ b/src/elm/Lia/Markdown/HTML/Parser.elm @@ -71,16 +71,19 @@ tag parser ( tagType, attributes ) = |> keep (stringTill (closingTag "lia-keep")) |> map InnerHtml + Tag.SVG -> + whitespace + |> ignore (string ">") + |> keep (stringTill (closingTag "svg")) + |> map (toStringNode "svg" attributes >> InnerHtml) + toStringNode : String -> Parameters -> String -> String toStringNode name attributes tagBody = "<" ++ name ++ " " - ++ (attributes - |> List.map (\( key, value ) -> key ++ "=\"" ++ value ++ "\"") - |> String.join " " - ) + ++ Params.toString attributes ++ ">" ++ tagBody ++ " - -- SVG and web-components are handled equally, since elm cannot directly - -- show SVGs at the moment ... later this might change if there is a tighter - -- integration between LiaScript and SVG - succeed (Tag.WebComponent name) + succeed Tag.SVG _ -> succeed diff --git a/src/elm/Lia/Markdown/HTML/Types.elm b/src/elm/Lia/Markdown/HTML/Types.elm index 15ceed2a5..073c2587f 100644 --- a/src/elm/Lia/Markdown/HTML/Types.elm +++ b/src/elm/Lia/Markdown/HTML/Types.elm @@ -23,6 +23,7 @@ type Type | HtmlNode String | HtmlVoidNode String | LiaKeep + | SVG getContent : Node content -> List content From 11df3f56232dfebef03c2b36504f7717bdbd97a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 24 Oct 2023 10:28:07 +0200 Subject: [PATCH 28/53] changed icon --- static/icon.ico | Bin 16958 -> 16958 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/static/icon.ico b/static/icon.ico index 49d0169d7d76217302dd2a9cfe9c13d9a66623b0..02f47e93fdf8848929092b04bf306708d5771a6c 100644 GIT binary patch literal 16958 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 yksy(X@?46*2-L Date: Fri, 10 Nov 2023 08:46:39 +0100 Subject: [PATCH 29/53] fix: General fix for Sting escapes This problem was introduced due to the different string escape handling of elm and javascript. The code is parsed with elm, which has another string representation format... [Issue: 140] --- src/elm/Lia/Markdown/Macro/Parser.elm | 3 +-- src/elm/Lia/Utils.elm | 13 ++----------- src/elm/Service/Script.elm | 5 ++--- src/typescript/liascript/service/Script.ts | 4 ++-- 4 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/elm/Lia/Markdown/Macro/Parser.elm b/src/elm/Lia/Markdown/Macro/Parser.elm index eae411582..1f339b412 100644 --- a/src/elm/Lia/Markdown/Macro/Parser.elm +++ b/src/elm/Lia/Markdown/Macro/Parser.elm @@ -37,7 +37,7 @@ import Lia.Markdown.HTML.Attributes exposing (toURL) import Lia.Parser.Context exposing (Context) import Lia.Parser.Helper exposing (c_frame) import Lia.Parser.Indentation as Indent -import Lia.Utils exposing (toEscapeString, toJSstring) +import Lia.Utils exposing (toEscapeString) import Regex @@ -72,7 +72,6 @@ parameter = , regex "[^),]+" ] |> choice - |> map toJSstring parameter_list : Parser Context (List String) diff --git a/src/elm/Lia/Utils.elm b/src/elm/Lia/Utils.elm index 0563b5466..bd7b5ab37 100644 --- a/src/elm/Lia/Utils.elm +++ b/src/elm/Lia/Utils.elm @@ -16,7 +16,6 @@ module Lia.Utils exposing , percentage , string2Color , toEscapeString - , toJSstring , urlBasePath ) @@ -34,16 +33,6 @@ import List.Extra import Task -{-| Convert JavaScript string escapes for backspace to elm escaped strings: - - toJSstring "javascript \\ escape" == "javascript \\\\ escape" - --} -toJSstring : String -> String -toJSstring = - String.split "\\" >> String.join "\\\\" - - {-| Convert common JavaScript string escapes elm escapes: toEscapeString "javascript \" \n" == "javascript \\\" \\n" @@ -52,10 +41,12 @@ toJSstring = toEscapeString : String -> String toEscapeString str = str + |> String.replace "\\" "\\\\" |> String.replace "\"" "\\\"" |> String.replace "'" "\\'" |> String.replace "`" "\\`" |> String.replace "\n" "\\n" + |> String.replace "\t" "\\t" onKeyDown : (Int -> msg) -> Html.Attribute msg diff --git a/src/elm/Service/Script.elm b/src/elm/Service/Script.elm index 0d1a16bd7..46f284392 100644 --- a/src/elm/Service/Script.elm +++ b/src/elm/Service/Script.elm @@ -15,7 +15,7 @@ module Service.Script exposing import Html exposing (details) import Json.Decode as JD import Json.Encode as JE -import Lia.Utils exposing (toEscapeString, toJSstring) +import Lia.Utils exposing (toEscapeString) import Service.Event as Event exposing (Event) @@ -176,7 +176,6 @@ eval code scripts inputs = inputs |> List.head |> Maybe.withDefault "" - |> toJSstring -- this will replace all inputs, that are originally the -- results from other scripts, to which this script is @@ -185,7 +184,7 @@ eval code scripts inputs = List.foldl replace_inputKey code scripts in inputs - |> List.indexedMap (\i r -> ( i, toJSstring r )) + |> List.indexedMap Tuple.pair |> List.foldl replace_inputID code_ |> replace_input default |> JE.string diff --git a/src/typescript/liascript/service/Script.ts b/src/typescript/liascript/service/Script.ts index 13265d343..4e2d9de1f 100644 --- a/src/typescript/liascript/service/Script.ts +++ b/src/typescript/liascript/service/Script.ts @@ -281,7 +281,7 @@ function liaEvalCode(code: string, send: Script.SendEval) { clear: () => send.lia('LIA: clear'), } - send.lia(String(eval(code.replace('\\`', '`') + '\n'))) //, send, console))) + send.lia(String(eval(code + '\n'))) //, send, console))) } catch (e: any) { if (e instanceof LiaError) { send.lia(e.message, e.details, false) @@ -330,7 +330,7 @@ function liaExecCode(event: Lia.Event) { } try { - const result = eval(event.message.param.code.replace('\\`', '`')) + const result = eval(event.message.param.code) send.lia(result === undefined ? 'LIA: stop' : result) } catch (e: any) { From d07abaa8531435236e572a0b4bd7f2785fbb6e0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Oct 2023 13:35:32 +0000 Subject: [PATCH 30/53] chore(deps-dev): bump browserify-sign from 4.2.1 to 4.2.2 Bumps [browserify-sign](https://github.com/crypto-browserify/browserify-sign) from 4.2.1 to 4.2.2. - [Changelog](https://github.com/browserify/browserify-sign/blob/main/CHANGELOG.md) - [Commits](https://github.com/crypto-browserify/browserify-sign/compare/v4.2.1...v4.2.2) --- updated-dependencies: - dependency-name: browserify-sign dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index a04df3460..6cdeaaffc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4571,20 +4571,23 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dev": true, "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" } }, "node_modules/browserslist": { @@ -9521,9 +9524,10 @@ } }, "node_modules/readable-stream": { - "version": "3.6.0", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", From 3e33af9857c36e1520ab1f4416dedce825857f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 10 Nov 2023 18:03:42 +0100 Subject: [PATCH 31/53] fix: onload precedence loading --- src/typescript/liascript/service/Database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/typescript/liascript/service/Database.ts b/src/typescript/liascript/service/Database.ts index 992d4b74a..93b7dc5da 100644 --- a/src/typescript/liascript/service/Database.ts +++ b/src/typescript/liascript/service/Database.ts @@ -106,7 +106,7 @@ const Service = { if (param.definition.onload !== '') { try { - Script.exec(param.definition.onload, 350) + Script.exec(param.definition.onload, 10) } catch (e) { console.warn('could not execute onload script', e) } From 6846bab2b961aacc3862ff0d09492afda76aa57c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 10 Nov 2023 18:20:13 +0100 Subject: [PATCH 32/53] Add LiaScript github/topics to index --- src/elm/Index/View.elm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/elm/Index/View.elm b/src/elm/Index/View.elm index b79f7fde3..422721c90 100644 --- a/src/elm/Index/View.elm +++ b/src/elm/Index/View.elm @@ -31,7 +31,14 @@ view session settings model = |> Html.map UpdateSettings , Html.div [ Attr.class "lia-slide__container" ] [ Html.main_ [ Attr.class "lia-slide__content" ] - [ Html.h1 [] [ Html.text "Lia: Open-courSes" ] + [ Html.h1 [] [ Html.text "LiaScript: Open-courSe" ] + , Html.p [] + [ Html.text "( ... search a list of free LiaScript courses and related material on " + , Html.a + [ Attr.href "https://github.com/topics/liascript", Attr.target "_blank" ] + [ Html.text "GitHub" ] + , Html.text " )" + ] , searchBar model.input , if List.isEmpty model.courses && model.initialized then Html.section [] <| From d9d351fe285f00f2f2d20d7441bcc911ee9bb69f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 10 Nov 2023 18:23:57 +0100 Subject: [PATCH 33/53] update new image icons --- src/assets/logo.png | Bin 38146 -> 41813 bytes src/assets/logo_192.png | Bin 12907 -> 24646 bytes src/assets/logo_512.png | Bin 37908 -> 50657 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/assets/logo.png b/src/assets/logo.png index a8183ca5ac80332d32b4aadc78c9cfe3e0f94240..14400673df17f550b88d7f39b96745f12f03d804 100644 GIT binary patch literal 41813 zcmeFXWmp`*k~WGv!6m^7I@sV0?(XhBxVt-q0KpxCLxMZOT>`-!0>L3jaMwHJoZUU= zx!<3?_wN0*Jn%5Iyj}HHbyamYAC(oQ&{5u@KtVyF%Sel>LP0^NKtaJkAt69oWC_nS zp`hMP`lxHWshW6_JGnSoSlfZg-MpQ^~GOKOLwhSG(6S=c$aiIibUC*O? zYwI%?Cl_D#Zpu%$9%5g%E&%7LXLG;0FxLq9+9wWApF6u8u{#A{S|%SP2-`>20)T@L zPj_1n7ydnq0iBb+aQKFv*AGvqC#X7padaJ>MkiP)zYZ|eejfVoT?Ul0VuDqB2<5pXt*>>&ya?(ORHC2V033WBQ&^{SBSMOBVVsjK?3Iu^0&D zeo43G-;Np|lM^YNHlABg{gpJL@1Ba{GoH@=GY@whCMpL zDqsCq(tYO0Mbv~s<>rN6c-I^Oq74zt<+qD(cN+wlivd&CNecqvHi2R&d@)Xa-knu7 zgr-rnnw^8q`VD(yk_kTgG(aRI`W5ZUpG^p+^P&0XXY8q`D@{V*^z!fiJihVcKw!qd zP3d}Ccv`~vRc?sV^KF3_8g&qF4n3w9aip5XFD5GN!EpAG@pNG=_vLGqB>YAF=qKbi zLaT?^>>nK0>%L45BC;D9br2i`7zI&p&S&&YTGHQQGk)lew29$_!>?1x>zOPp<|!5a z4st+vo1~M^uKX9_|Da@1HD|=CAD(0;S&maREjEs5GN;)qi!eJmAPd%)t7W2 zinlshSA3#SSAlau)z-f1nm4m?)`g+6Y2JrOz$3KN^^214VMkn#0-_e_Z)nOVnTo;H%}Wr;j2cK zW!prMPT_&rzE^A>u(-Q63b;qV*zRP@-q14K*seZ*wb5H? z&xz_-R*pXSbiB3q<dT$<5KqTWilWnX8(aN^nf7%}E=RWZ!gzilPqfxP~2^*@6x

A7fkwg8E|Sk^f! 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 C`C@?p literal 38146 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 B?-l?6 diff --git a/src/assets/logo_192.png b/src/assets/logo_192.png index b71f44ddb04a24c41bb899cb2266bd40072dba43..d646cee10b32fef9f0d1f79263a1ab5a3842347a 100644 GIT binary patch literal 24646 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 Xw#8C5-RJB7zWGpwYABUHH-Gy->t3&n diff --git a/src/assets/logo_512.png b/src/assets/logo_512.png index 686c7b6ad28f5f64c77f665c86535be940e58e5c..7e88c27cb58e66e5fc317a9f1eef6ee3b8211f47 100644 GIT binary patch literal 50657 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 F{y&k!8dCrO literal 37908 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

7&8_Ke58!U6CO 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 Date: Tue, 14 Nov 2023 10:20:55 +0100 Subject: [PATCH 34/53] Version bump to 0.12.9 --- README.md | 13 +++++++++++-- package-lock.json | 4 ++-- package.json | 2 +- src/typescript/liascript/init.ts | 2 +- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 50ce5a685..dc2455f7e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ author: André Dietrich email: LiaScript@web.de -version: 0.12.8 +version: 0.12.9 language: en narrator: UK English Male @@ -296,7 +296,16 @@ This will apply the following four patches: ## Version-Changes -**0.12.0** (26/09/2023) +**0.12.9** (26/09/2023) + +- fix: string escape in JavaScript executables +- changed icons +- improved index +- fix: onload macro precedence loading +- improve: SVG images can now be directly embedded into the Markdown +- improve: SCORM integration + +**0.12.8** (26/09/2023) - improve: Add "skip-navigation" link to tabulator order, which will only appear in keyboard navigation diff --git a/package-lock.json b/package-lock.json index 6cdeaaffc..683f16144 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "liascript", - "version": "0.12.8", + "version": "0.12.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "liascript", - "version": "0.12.8", + "version": "0.12.9", "license": "BSD-3-Clause", "dependencies": { "pako": "^2.1.0" diff --git a/package.json b/package.json index 0b267c2ae..25e41d825 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "liascript", - "version": "0.12.8", + "version": "0.12.9", "author": "André Dietrich", "license": "BSD-3-Clause", "description": "An extended Markdown interpreter for the creation of interactive online courses.", diff --git a/src/typescript/liascript/init.ts b/src/typescript/liascript/init.ts index 99ba4c1ce..3d4be6663 100644 --- a/src/typescript/liascript/init.ts +++ b/src/typescript/liascript/init.ts @@ -7,7 +7,7 @@ export function initGlobals() { } if (!window.LIA.version) { - window.LIA.version = '0.12.8' + window.LIA.version = '0.12.9' } if (!window.LIA.eventSemaphore) { From d429e45f846772dada83677d7f1da13f36dc77f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Mon, 4 Mar 2024 12:30:53 +0100 Subject: [PATCH 35/53] add missing package-log --- package-lock.json | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2012353eb..a6ab17f11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5662,17 +5662,6 @@ } ] }, - "node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "optional": true, - "dependencies": { - "webidl-conversions": "^4.0.2" - } - }, "node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", From 40068567a233db000ea6e788af83ad9ed0ea6796 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Thu, 7 Nov 2024 13:52:59 +0100 Subject: [PATCH 36/53] removed lazy loading --- src/elm/Index/View.elm | 6 ++++-- src/elm/Lia/Markdown/Inline/View.elm | 6 +++--- src/typescript/webcomponents/embed/index.ts | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/elm/Index/View.elm b/src/elm/Index/View.elm index 1710cd6cf..2185a06a4 100644 --- a/src/elm/Index/View.elm +++ b/src/elm/Index/View.elm @@ -360,7 +360,8 @@ viewMedia courseUrl logoUrl = , logoUrl |> String.trim |> Attr.src - , Attr.attribute "loading" "lazy" + + --, Attr.attribute "loading" "lazy" , defaultBackground courseUrl ] [] @@ -466,7 +467,8 @@ viewFooter definition = |> Attr.src , Attr.alt "Logo" , Attr.height 50 - , Attr.attribute "loading" "lazy" + + --, Attr.attribute "loading" "lazy" ] [] , case ( String.trim definition.author, String.trim definition.email ) of diff --git a/src/elm/Lia/Markdown/Inline/View.elm b/src/elm/Lia/Markdown/Inline/View.elm index 0fd177750..c7827a2a9 100644 --- a/src/elm/Lia/Markdown/Inline/View.elm +++ b/src/elm/Lia/Markdown/Inline/View.elm @@ -526,7 +526,7 @@ img : Config sub -> Parameters -> Inlines -> String -> Maybe Inlines -> Maybe In img config attr alt_ url_ title_ width = Html.img (Attr.src url_ - :: Attr.attribute "loading" "lazy" + -- :: Attr.attribute "loading" "lazy" :: onError "img" url_ :: (if List.isEmpty attr then [ Attr.attribute "onClick" ("window.LIA.img.click(\"" ++ url_ ++ "\")") ] @@ -594,7 +594,7 @@ reference config ref attr = if tube then Html.iframe (Attr.src url_ - :: Attr.attribute "loading" "lazy" + -- :: Attr.attribute "loading" "lazy" :: Attr.attribute "allowfullscreen" "" :: Attr.attribute "allow" "accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" :: Attr.style "width" "100%" @@ -629,7 +629,7 @@ reference config ref attr = |> Attr.src ) :: Attr.attribute "allowfullscreen" "" - :: Attr.attribute "loading" "lazy" + -- :: Attr.attribute "loading" "lazy" :: Attr.attribute "allow" "accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" :: toAttribute attr |> CList.addWhen (title config title_) diff --git a/src/typescript/webcomponents/embed/index.ts b/src/typescript/webcomponents/embed/index.ts index 0113f62b3..a6527ff90 100644 --- a/src/typescript/webcomponents/embed/index.ts +++ b/src/typescript/webcomponents/embed/index.ts @@ -142,7 +142,7 @@ export async function extract(link: string, params: Params) { } function iframe(url: string) { - return `` + return `` } function init(event: Event) { @@ -272,7 +272,7 @@ customElements.define( .catch((err: any) => { div.innerHTML = `` + };" allowfullscreen>` this.applyAttributesToIframe(div) }) From 72ac1f5e4170ebd9850931065e4808ad2d9365c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 4 Feb 2025 09:59:50 +0100 Subject: [PATCH 37/53] fix: formala path --- src/entry/pdf/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/entry/pdf/index.html b/src/entry/pdf/index.html index 44df5c435..a1887f83a 100644 --- a/src/entry/pdf/index.html +++ b/src/entry/pdf/index.html @@ -13,7 +13,7 @@ - + From 20b94c37e00daaec38c680a8af1b4c4b5b79ed0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 15 Aug 2025 08:14:00 +0200 Subject: [PATCH 38/53] fix: pdf export --- src/entry/pdf/index.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/entry/pdf/index.ts b/src/entry/pdf/index.ts index 456ccb04e..50909dc44 100644 --- a/src/entry/pdf/index.ts +++ b/src/entry/pdf/index.ts @@ -3,10 +3,9 @@ import * as Lia from '../../typescript/liascript/index' import('../../typescript/connectors/Base/index').then(function (Base) { let debug = false - var app = new Lia.LiaScript( - new Base.Connector(), - false, // allowSync - false, // debug - true // fullPage - ) + var app = new Lia.LiaScript(new Base.Connector(), { + allowSync: false, + debug: false, + fullPage: true, + }) }) From 7347bc672ec9148372732733698e5c2fe28d7957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Thu, 16 Oct 2025 20:42:03 +0200 Subject: [PATCH 39/53] fix: package-lock.json --- package-lock.json | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index e7455590a..a76ae1646 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9822,17 +9822,6 @@ "which": "bin/which" } }, - "node_modules/node-gyp-build": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, "node_modules/node-gyp-build-optional-packages": { "version": "5.0.3", "dev": true, From 8b39f6d4be0dae2c7195ee2db5586ec0bb0adfbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Thu, 13 Nov 2025 23:41:16 +0100 Subject: [PATCH 40/53] fix: multiple loads with goto --- src/typescript/liascript/index.ts | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/typescript/liascript/index.ts b/src/typescript/liascript/index.ts index 2184fef77..3ff2c0be3 100644 --- a/src/typescript/liascript/index.ts +++ b/src/typescript/liascript/index.ts @@ -136,16 +136,22 @@ export class LiaScript { window.LIA.showFootnote = (key: string) => { self.app.ports.footnote.send(key) } + + let SLIDE = -1 window.LIA.goto = (slide: number) => { - sender({ - reply: true, - track: [['goto', -1]], - service: '', - message: { - cmd: 'goto', - param: slide, - }, - }) + if (slide !== SLIDE) { + SLIDE = slide + + sender({ + reply: true, + track: [['goto', -1]], + service: '', + message: { + cmd: 'goto', + param: slide, + }, + }) + } } window.LIA.gotoNext = () => { From 92a8ffcbe708c249e19bbfa8a13ae0c2a3a73537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Thu, 13 Nov 2025 23:42:13 +0100 Subject: [PATCH 41/53] chore: npm i --- package-lock.json | 355 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 355 insertions(+) diff --git a/package-lock.json b/package-lock.json index 75a74329c..ae259f36d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2059,6 +2059,34 @@ "ace-builds": "^1.4.12" } }, + "node_modules/@elm_binaries/darwin_arm64": { + "version": "0.19.1-0", + "resolved": "https://registry.npmjs.org/@elm_binaries/darwin_arm64/-/darwin_arm64-0.19.1-0.tgz", + "integrity": "sha512-mjbsH7BNHEAmoE2SCJFcfk5fIHwFIpxtSgnEAqMsVLpBUFoEtAeX+LQ+N0vSFJB3WAh73+QYx/xSluxxLcL6dA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@elm_binaries/darwin_x64": { + "version": "0.19.1-0", + "resolved": "https://registry.npmjs.org/@elm_binaries/darwin_x64/-/darwin_x64-0.19.1-0.tgz", + "integrity": "sha512-QGUtrZTPBzaxgi9al6nr+9313wrnUVHuijzUK39UsPS+pa+n6CmWyV/69sHZeX9qy6UfeugE0PzF3qcUiy2GDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "darwin" + ] + }, "node_modules/@elm_binaries/linux_x64": { "version": "0.19.1-0", "resolved": "https://registry.npmjs.org/@elm_binaries/linux_x64/-/linux_x64-0.19.1-0.tgz", @@ -2365,6 +2393,62 @@ "@lezer/common": "^0.15.0" } }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", + "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", + "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", + "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", + "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@lmdb/lmdb-linux-x64": { "version": "2.5.2", "cpu": [ @@ -2377,6 +2461,20 @@ "linux" ] }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", + "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@mischnic/json-sourcemap": { "version": "0.1.0", "dev": true, @@ -2390,6 +2488,62 @@ "node": ">=12.0.0" } }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", + "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", + "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", + "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", + "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", @@ -2403,6 +2557,20 @@ "linux" ] }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", + "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -6141,6 +6309,18 @@ } ] }, + "node_modules/domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, "node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", @@ -7449,6 +7629,21 @@ "version": "1.0.0", "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -9101,6 +9296,111 @@ "lightningcss-win32-x64-msvc": "1.19.0" } }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.19.0.tgz", + "integrity": "sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.19.0.tgz", + "integrity": "sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.19.0.tgz", + "integrity": "sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.19.0.tgz", + "integrity": "sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.19.0.tgz", + "integrity": "sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lightningcss-linux-x64-gnu": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.19.0.tgz", @@ -9141,6 +9441,27 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.19.0.tgz", + "integrity": "sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "dev": true, @@ -9822,6 +10143,19 @@ "which": "bin/which" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-gyp-build-optional-packages": { "version": "5.0.3", "dev": true, @@ -13199,6 +13533,27 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/wrtc": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/wrtc/-/wrtc-0.4.7.tgz", + "integrity": "sha512-P6Hn7VT4lfSH49HxLHcHhDq+aFf/jd9dPY7lDHeFhZ22N3858EKuwm2jmnlPzpsRGEPaoF6XwkcxY5SYnt4f/g==", + "bundleDependencies": [ + "node-pre-gyp" + ], + "dev": true, + "hasInstallScript": true, + "license": "BSD-2-Clause", + "optional": true, + "dependencies": { + "node-pre-gyp": "^0.13.0" + }, + "engines": { + "node": "^8.11.2 || >=10.0.0" + }, + "optionalDependencies": { + "domexception": "^1.0.1" + } + }, "node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", From baeb495ee7171c502c017f1ecae30dd41af31b19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Thu, 13 Nov 2025 23:42:38 +0100 Subject: [PATCH 42/53] chore: npm i --- package-lock.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/package-lock.json b/package-lock.json index a53b25ce6..ec2485466 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10123,6 +10123,19 @@ "which": "bin/which" } }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-gyp-build-optional-packages": { "version": "5.0.3", "dev": true, From a7eb30e1501f5077cc93e159a9d83aaac98bf5f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Fri, 14 Nov 2025 09:46:16 +0100 Subject: [PATCH 43/53] add delay to eval --- src/elm/Lia/Markdown/Code/Events.elm | 6 +- src/elm/Lia/Markdown/Code/Update.elm | 16 +-- src/elm/Lia/Markdown/Quiz/Update.elm | 2 +- src/elm/Lia/Markdown/Survey/Update.elm | 2 +- src/elm/Lia/Markdown/Task/Update.elm | 2 +- src/elm/Lia/Update.elm | 2 +- src/elm/Service/Script.elm | 24 +++- src/typescript/liascript/service/Script.ts | 147 +++++++++++---------- 8 files changed, 109 insertions(+), 92 deletions(-) diff --git a/src/elm/Lia/Markdown/Code/Events.elm b/src/elm/Lia/Markdown/Code/Events.elm index 968af9bfb..b6427468f 100644 --- a/src/elm/Lia/Markdown/Code/Events.elm +++ b/src/elm/Lia/Markdown/Code/Events.elm @@ -35,8 +35,8 @@ input projectID value = |> toProject projectID -eval : Array Sync -> Int -> Scripts a -> Project -> Event -eval sync projectID scripts project = +eval : Maybe Int -> Array Sync -> Int -> Scripts a -> Project -> Event +eval delay sync projectID scripts project = let files = if project.syncMode then @@ -49,7 +49,7 @@ eval sync projectID scripts project = in files |> Array.toList - |> Service.Script.eval project.evaluation (outputs scripts) + |> Service.Script.eval delay project.evaluation (outputs scripts) -- navigate the evaluation within the Code module |> toProject projectID diff --git a/src/elm/Lia/Markdown/Code/Update.elm b/src/elm/Lia/Markdown/Code/Update.elm index 4f5b20401..dfe43b2b1 100644 --- a/src/elm/Lia/Markdown/Code/Update.elm +++ b/src/elm/Lia/Markdown/Code/Update.elm @@ -55,7 +55,7 @@ runAll sectionID scripts model = (\_ ( id, return ) -> let ret = - execute Array.empty sectionID scripts return.value id + execute (Just (id * 1000)) Array.empty sectionID scripts return.value id in ( id + 1 , ret @@ -99,7 +99,7 @@ update : Array Sync -> Maybe Int -> Scripts a -> Msg -> Model -> Return Model ms update sync sectionID scripts msg model = case msg of Eval idx -> - execute sync sectionID scripts model idx + execute Nothing sync sectionID scripts model idx --|> Return.sync (PEvent.initWithId "eval" idx JE.null) Update id_1 id_2 code_str -> @@ -499,8 +499,8 @@ update_terminal msg project = ( project, Nothing ) -eval : Array Sync -> Int -> Scripts a -> Project -> Return Project msg sub -eval sync id scripts project = +eval : Maybe Int -> Array Sync -> Int -> Scripts a -> Project -> Return Project msg sub +eval delay sync id scripts project = (if project.syncMode then { project | running = True, syncLog = Log.empty } @@ -508,7 +508,7 @@ eval sync id scripts project = { project | running = True, log = Log.empty } ) |> Return.val - |> Return.batchEvent (Event.eval sync id scripts project) + |> Return.batchEvent (Event.eval delay sync id scripts project) maybe_project : Int -> (Project -> x) -> Model -> Maybe (Return x cmd sub) @@ -692,10 +692,10 @@ flipHigh model id_1 id_2 = |> Return.val -execute : Array Sync -> Maybe Int -> Scripts a -> Model -> Int -> Return Model msg sub -execute sync sectionID scripts model id = +execute : Maybe Int -> Array Sync -> Maybe Int -> Scripts a -> Model -> Int -> Return Model msg sub +execute delay sync sectionID scripts model id = model - |> maybe_project id (eval sync id scripts) + |> maybe_project id (eval delay sync id scripts) |> Maybe.map (.value >> is_version_new sectionID id) |> maybe_update id model diff --git a/src/elm/Lia/Markdown/Quiz/Update.elm b/src/elm/Lia/Markdown/Quiz/Update.elm index 0c76fe9ea..2a73e163a 100644 --- a/src/elm/Lia/Markdown/Quiz/Update.elm +++ b/src/elm/Lia/Markdown/Quiz/Update.elm @@ -97,7 +97,7 @@ update sync sectionID scripts msg vector = (case code of Just c -> [ [ toString e.state ] - |> Service.Script.eval c (outputs scripts) + |> Service.Script.eval Nothing c (outputs scripts) |> Event.pushWithId "eval" id ] diff --git a/src/elm/Lia/Markdown/Survey/Update.elm b/src/elm/Lia/Markdown/Survey/Update.elm index c173e25e2..21caa569b 100644 --- a/src/elm/Lia/Markdown/Survey/Update.elm +++ b/src/elm/Lia/Markdown/Survey/Update.elm @@ -122,7 +122,7 @@ update sync sectionID scripts msg vector = of Just code -> [ toString element.state ] - |> Service.Script.eval code (outputs scripts) + |> Service.Script.eval Nothing code (outputs scripts) |> Event.pushWithId "eval" id Nothing -> diff --git a/src/elm/Lia/Markdown/Task/Update.elm b/src/elm/Lia/Markdown/Task/Update.elm index a8a4f2f35..4ce648a69 100644 --- a/src/elm/Lia/Markdown/Task/Update.elm +++ b/src/elm/Lia/Markdown/Task/Update.elm @@ -69,7 +69,7 @@ update sectionID scripts msg vector = Just code -> [ toString element ] - |> Service.Script.eval code (outputs scripts) + |> Service.Script.eval Nothing code (outputs scripts) |> Event.pushWithId "eval" x ) |> store sectionID diff --git a/src/elm/Lia/Update.elm b/src/elm/Lia/Update.elm index 28346f6c0..acb5e4e94 100644 --- a/src/elm/Lia/Update.elm +++ b/src/elm/Lia/Update.elm @@ -401,7 +401,7 @@ update session msg model = 5000 else - 100 + 1000 ) False <| diff --git a/src/elm/Service/Script.elm b/src/elm/Service/Script.elm index a07a0f3c2..b520bbf6a 100644 --- a/src/elm/Service/Script.elm +++ b/src/elm/Service/Script.elm @@ -12,6 +12,7 @@ module Service.Script exposing , stop ) +import Html exposing (del) import Json.Decode as JD import Json.Encode as JE import Lia.Utils exposing (toEscapeString) @@ -166,8 +167,8 @@ input string = which is used to replace numbered input macros => `@input(id)` -} -eval : String -> List ( String, String ) -> List String -> Event -eval code scripts inputs = +eval : Maybe Int -> String -> List ( String, String ) -> List String -> Event +eval delay code scripts inputs = let -- the first input parameter is also used as the default -- one to replace the `@input` without parenthesis @@ -182,11 +183,20 @@ eval code scripts inputs = code_ = List.foldl replace_inputKey code scripts in - inputs - |> List.indexedMap Tuple.pair - |> List.foldl replace_inputID code_ - |> replace_input default - |> JE.string + [ ( "code" + , inputs + |> List.indexedMap Tuple.pair + |> List.foldl replace_inputID code_ + |> replace_input default + |> JE.string + ) + , ( "delay" + , delay + |> Maybe.withDefault 0 + |> JE.int + ) + ] + |> JE.object |> event "eval" diff --git a/src/typescript/liascript/service/Script.ts b/src/typescript/liascript/service/Script.ts index 1e49dae68..564b6fc91 100644 --- a/src/typescript/liascript/service/Script.ts +++ b/src/typescript/liascript/service/Script.ts @@ -11,6 +11,7 @@ export enum JS { export type Eval = { type: JS.eval code: string + delay: number send: Script.SendEval } @@ -231,7 +232,7 @@ function getLineNumber(error: Error): number | null { } function liaEval(event: Lia.Event) { - liaEvalCode(event.message.param, { + liaEvalCode(event.message.param.code, event.message.param.delay, { lia: (result: string, details = [], ok = true) => { event.message.cmd = 'eval' event.message.param = { @@ -264,11 +265,12 @@ function sendReply(event: Lia.Event) { } } -function liaEvalCode(code: string, send: Script.SendEval) { +function liaEvalCode(code: string, delay: number, send: Script.SendEval) { if (window.LIA.eventSemaphore > 0) { lia_queue.push({ type: JS.eval, code: code, + delay: delay, send: send, }) @@ -278,76 +280,81 @@ function liaEvalCode(code: string, send: Script.SendEval) { return } - try { - const counter: { [key: string]: number } = {} - const timer: { [key: string]: number } = {} + setTimeout(() => { + try { + const counter: { [key: string]: number } = {} + const timer: { [key: string]: number } = {} - const console = { - debug: (...args: any) => { - return send.log('debug', '\n', args) - }, - log: (...args: any) => { - return send.log('info', '\n', args) - }, - warn: (...args: any) => { - return send.log('warn', '\n', args) - }, - error: (...args: any) => { - return send.log('error', '\n', args) - }, - stream: (...args: any) => { - return send.log('stream', '', args) - }, - html: (...args: any) => { - return send.log('html', '\n', args) - }, - table: (data: any, config: any) => { - return send.log('html', '\n', [htmlTableLog(data, config)]) - }, - assert: (condition: boolean, ...args: any) => { - if (!condition) { - send.log('error', '\n', ['Assertion failed:', ...args]) - } - }, - count: (id = 'default') => { - counter[id] = (counter[id] || 0) + 1 - send.log('debug', '\n', [id + ':', counter[id]]) - }, - countReset: (id = 'default') => { - counter[id] = 0 - send.log('debug', '\n', [id + ':', counter[id]]) - }, - time: (id = 'default') => { - timer[id] = performance.now() - }, - timeLog: (id = 'default', ...args: any[]) => { - if (timer[id]) { - const duration = performance.now() - timer[id] - send.log('debug', '\n', [`${id}: ${duration.toFixed(2)} ms`, ...args]) - } else { - send.log('warn', '\n', [`No such timer: ${id}`]) - } - }, - timeEnd: (id = 'default') => { - if (timer[id]) { - const duration = performance.now() - timer[id] - send.log('debug', '\n', [`${id}: ${duration.toFixed(2)} ms`]) - delete timer[id] - } else { - send.log('warn', '\n', [`No such timer: ${id}`]) - } - }, - clear: () => send.lia('LIA: clear'), - } + const console = { + debug: (...args: any) => { + return send.log('debug', '\n', args) + }, + log: (...args: any) => { + return send.log('info', '\n', args) + }, + warn: (...args: any) => { + return send.log('warn', '\n', args) + }, + error: (...args: any) => { + return send.log('error', '\n', args) + }, + stream: (...args: any) => { + return send.log('stream', '', args) + }, + html: (...args: any) => { + return send.log('html', '\n', args) + }, + table: (data: any, config: any) => { + return send.log('html', '\n', [htmlTableLog(data, config)]) + }, + assert: (condition: boolean, ...args: any) => { + if (!condition) { + send.log('error', '\n', ['Assertion failed:', ...args]) + } + }, + count: (id = 'default') => { + counter[id] = (counter[id] || 0) + 1 + send.log('debug', '\n', [id + ':', counter[id]]) + }, + countReset: (id = 'default') => { + counter[id] = 0 + send.log('debug', '\n', [id + ':', counter[id]]) + }, + time: (id = 'default') => { + timer[id] = performance.now() + }, + timeLog: (id = 'default', ...args: any[]) => { + if (timer[id]) { + const duration = performance.now() - timer[id] + send.log('debug', '\n', [ + `${id}: ${duration.toFixed(2)} ms`, + ...args, + ]) + } else { + send.log('warn', '\n', [`No such timer: ${id}`]) + } + }, + timeEnd: (id = 'default') => { + if (timer[id]) { + const duration = performance.now() - timer[id] + send.log('debug', '\n', [`${id}: ${duration.toFixed(2)} ms`]) + delete timer[id] + } else { + send.log('warn', '\n', [`No such timer: ${id}`]) + } + }, + clear: () => send.lia('LIA: clear'), + } - send.lia(String(eval(code + '\n'))) //, send, console))) - } catch (e: any) { - if (e instanceof LiaError) { - send.lia(e.message, e.details, false) - } else { - send.lia(e.message, [], false) + send.lia(String(eval(code + '\n'))) //, send, console))) + } catch (e: any) { + if (e instanceof LiaError) { + send.lia(e.message, e.details, false) + } else { + send.lia(e.message, [], false) + } } - } + }, delay) } export function liaExec(event: Lia.Event) { @@ -493,7 +500,7 @@ function delayExecution() { while ((event = lia_queue.shift())) { switch (event.type) { case JS.eval: { - liaEvalCode(event.code, event.send) + liaEvalCode(event.code, event.delay, event.send) break } case JS.exec: { From 25302768eb20d3477ae2ec98d7c3e2654a811ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Mon, 5 Jan 2026 09:49:58 +0100 Subject: [PATCH 44/53] chore: updated npm packages --- package-lock.json | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 067e9e1aa..752f79e3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -95,7 +95,6 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2415,7 +2414,6 @@ "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.8.3.tgz", "integrity": "sha512-Euf/un4ZAiClnlUXqPB9phQlKbveU+2CotZv7m7i+qkgvFn5nAGnrV4h1OzQU42j9dpgOxWi7AttUDMrvkbhCQ==", "dev": true, - "peer": true, "dependencies": { "@mischnic/json-sourcemap": "^0.1.0", "@parcel/cache": "2.8.3", @@ -4254,7 +4252,6 @@ "integrity": "sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.48.0", "@typescript-eslint/types": "8.48.0", @@ -4525,7 +4522,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5287,7 +5283,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -5337,6 +5332,21 @@ "dev": true, "license": "MIT" }, + "node_modules/bufferutil": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", + "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -6433,7 +6443,6 @@ "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "2.3.0", "zrender": "5.6.1" @@ -6502,7 +6511,6 @@ "dev": true, "hasInstallScript": true, "license": "BSD-3-Clause", - "peer": true, "bin": { "elm": "bin/elm" }, @@ -7039,7 +7047,6 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -11592,7 +11599,6 @@ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -12310,7 +12316,6 @@ "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", "dev": true, - "peer": true, "engines": { "node": ">=12" }, @@ -12608,7 +12613,6 @@ "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -12798,7 +12802,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -13029,7 +13032,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13245,6 +13247,21 @@ "punycode": "^2.1.0" } }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -13607,7 +13624,6 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -14054,7 +14070,6 @@ "integrity": "sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "lib0": "^0.2.99" }, From a155561b9107d4f8d9cd24826f7eaba3885e98fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Mon, 9 Feb 2026 11:33:40 +0100 Subject: [PATCH 45/53] updated youtube to original url for link clicks --- src/elm/Lia/Markdown/Inline/Multimedia.elm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elm/Lia/Markdown/Inline/Multimedia.elm b/src/elm/Lia/Markdown/Inline/Multimedia.elm index 887af68ae..540f915ac 100644 --- a/src/elm/Lia/Markdown/Inline/Multimedia.elm +++ b/src/elm/Lia/Markdown/Inline/Multimedia.elm @@ -9,7 +9,7 @@ import Lia.Parser.UrlPattern.Generic exposing (root) website = - { youtube = "https://www.youtube-nocookie.com/embed/" + { youtube = "https://www.youtube.com/embed/" } From 34e0267689a3e968776d313a8e5c86c6445fe755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Mon, 9 Feb 2026 14:08:09 +0100 Subject: [PATCH 46/53] fix: add reverseMovie to have clickable videos again --- src/elm/Lia/Markdown/Inline/Multimedia.elm | 89 ++++++++++++++++++++++ src/elm/Lia/Markdown/Inline/View.elm | 11 ++- 2 files changed, 98 insertions(+), 2 deletions(-) diff --git a/src/elm/Lia/Markdown/Inline/Multimedia.elm b/src/elm/Lia/Markdown/Inline/Multimedia.elm index 540f915ac..1158ae35d 100644 --- a/src/elm/Lia/Markdown/Inline/Multimedia.elm +++ b/src/elm/Lia/Markdown/Inline/Multimedia.elm @@ -1,6 +1,7 @@ module Lia.Markdown.Inline.Multimedia exposing ( audio , movie + , reverseMovie , website ) @@ -56,6 +57,94 @@ movie = |> replace +{-| Reverse transformation of embed URLs back to original website URLs. + + reverseMovie "https://www.youtube.com/embed/dQw4w9WgXcQ" + == Just "https://www.youtube.com/watch?v=dQw4w9WgXcQ" + + reverseMovie "https://player.vimeo.com/video/123456" + == Just "https://vimeo.com/123456" + + reverseMovie "https://example.com/unknown" + == Nothing + +-} +reverseMovie : String -> Maybe String +reverseMovie url = + case + [ { by = + \u w -> + "https://www.youtube.com/watch?v=" + ++ w + ++ reversePreserve u + , pattern = root "(?:www\\.)?youtube\\.com/embed/([^\\?&\"'<> #]+)" + } + , { by = + \u w -> + "https://vimeo.com/" + ++ w + ++ reversePreserve u + , pattern = root "player\\.vimeo\\.com/video/(\\d+)" + } + , { by = + \u w -> + "https://www.dailymotion.com/video/" + ++ w + ++ reversePreserve u + , pattern = root "(?:www\\.)?dailymotion\\.com/embed/video/(.+)" + } + , { by = \_ w -> "https://peertube.tv/videos/watch/" ++ w + , pattern = root "peertube\\.tv/videos/embed/(.+)" + } + , { by = + \u w -> + "https://www.teachertube.com/video/" + ++ w + ++ reversePreserve u + , pattern = root "(?:www\\.)?teachertube\\.com/embed/video/(\\d+.*)" + } + ] + |> replace + |> (\f -> f url) + of + ( True, result ) -> + Just result + + ( False, _ ) -> + Nothing + + +{-| Preserve query parameters and fragment from the original URL for reverse transformation. +-} +reversePreserve : String -> String +reversePreserve url = + let + params = + url + |> String.split "?" + |> List.tail + |> Maybe.andThen List.head + |> Maybe.map (String.split "#") + |> Maybe.andThen List.head + |> Maybe.withDefault "" + + frag = + url + |> String.split "#" + |> List.tail + |> Maybe.andThen List.head + |> Maybe.map ((++) "#") + |> Maybe.withDefault "" + in + (if String.isEmpty params then + "" + + else + "&" ++ params + ) + ++ frag + + audio : String -> ( Bool, String ) audio = [ { by = diff --git a/src/elm/Lia/Markdown/Inline/View.elm b/src/elm/Lia/Markdown/Inline/View.elm index 261ca8076..42e13ac8b 100644 --- a/src/elm/Lia/Markdown/Inline/View.elm +++ b/src/elm/Lia/Markdown/Inline/View.elm @@ -30,7 +30,7 @@ import Lia.Markdown.HTML.Attributes exposing (Parameters, annotation, toAttribut import Lia.Markdown.HTML.Types exposing (Node) import Lia.Markdown.HTML.View as HTML import Lia.Markdown.Inline.Config as Config exposing (Config) -import Lia.Markdown.Inline.Multimedia exposing (website) +import Lia.Markdown.Inline.Multimedia exposing (reverseMovie, website) import Lia.Markdown.Inline.Stringify exposing (stringify_) import Lia.Markdown.Inline.Types exposing (Inline(..), Inlines, Reference(..), combine) import Lia.Markdown.Quiz.Block.Types exposing (State(..)) @@ -884,7 +884,13 @@ reference config ref attr = ] Movie alt_ ( tube, url_ ) title_ -> - Html.a [ Attr.href url_ ] + Html.a + [ url_ + |> reverseMovie + |> Maybe.withDefault url_ + |> Attr.href + , Attr.target "_blank" + ] [ if tube then figure config title_ Nothing "iframe" <| Html.div [ Attr.class "lia-iframe-wrapper" ] @@ -895,6 +901,7 @@ reference config ref attr = ) :: Attr.attribute "allowfullscreen" "" -- :: Attr.attribute "loading" "lazy" + :: Attr.style "pointer-events" "none" :: Attr.attribute "allow" "accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" :: toAttribute attr |> CList.addWhen (title config title_) From abe269068f9b41ebae1c435e8d582a4a8bf9e594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Mon, 9 Feb 2026 14:15:24 +0100 Subject: [PATCH 47/53] add console log marker __RENDER_DONE__ --- src/elm/Lia/Update.elm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/elm/Lia/Update.elm b/src/elm/Lia/Update.elm index acb5e4e94..a261254fb 100644 --- a/src/elm/Lia/Update.elm +++ b/src/elm/Lia/Update.elm @@ -410,7 +410,10 @@ update session msg model = ++ ")" else - Event.none + Service.Script.exec + 5000 + False + "console.log('__RENDER_DONE__')" ) ( JumpToFragment id, Just sec ) -> From 6a25715e015ce393519f5a03f3a71e0f8e0a4126 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Mon, 9 Feb 2026 14:42:18 +0100 Subject: [PATCH 48/53] add console2 log marker __RENDER_DONE__ --- src/elm/Lia/Update.elm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elm/Lia/Update.elm b/src/elm/Lia/Update.elm index a261254fb..9a8585761 100644 --- a/src/elm/Lia/Update.elm +++ b/src/elm/Lia/Update.elm @@ -413,7 +413,7 @@ update session msg model = Service.Script.exec 5000 False - "console.log('__RENDER_DONE__')" + "window.console.log('__RENDER_DONE__')" ) ( JumpToFragment id, Just sec ) -> From 7f74337c4572aeeb6501cce2f67f2048ae490e18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Mon, 9 Feb 2026 14:58:23 +0100 Subject: [PATCH 49/53] add custom event for finalizing drawing --- src/elm/Lia/Update.elm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elm/Lia/Update.elm b/src/elm/Lia/Update.elm index 9a8585761..a4ae43b4e 100644 --- a/src/elm/Lia/Update.elm +++ b/src/elm/Lia/Update.elm @@ -413,7 +413,7 @@ update session msg model = Service.Script.exec 5000 False - "window.console.log('__RENDER_DONE__')" + "window.dispatchEvent( new CustomEvent(\"puppeteer:ready\", { detail: { status: \"done\", ts: Date.now() }}))" ) ( JumpToFragment id, Just sec ) -> From 584447e9a021af841ee438acc9441174d619d6ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Mon, 9 Feb 2026 20:24:56 +0100 Subject: [PATCH 50/53] finally: send render_done event --- src/elm/Lia/Update.elm | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/elm/Lia/Update.elm b/src/elm/Lia/Update.elm index a4ae43b4e..6bf052cea 100644 --- a/src/elm/Lia/Update.elm +++ b/src/elm/Lia/Update.elm @@ -147,6 +147,16 @@ update session msg model = } } ) + |> Return.batchEvent + (if idx == Array.length model.sections - 1 then + Service.Script.exec + 5000 + False + "console.log(\"__RENDER_DONE__\"); window.dispatchEvent( new CustomEvent(\"puppeteer:ready\", { detail: { status: \"done\", ts: Date.now() }}));" + + else + Event.none + ) else { model @@ -410,10 +420,7 @@ update session msg model = ++ ")" else - Service.Script.exec - 5000 - False - "window.dispatchEvent( new CustomEvent(\"puppeteer:ready\", { detail: { status: \"done\", ts: Date.now() }}))" + Event.none ) ( JumpToFragment id, Just sec ) -> From b11523136abf874dec6f6ce2d02b59c06cf06934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Mon, 25 Aug 2025 09:25:45 +0200 Subject: [PATCH 51/53] not working yet --- src/elm/Lia/Settings/Json.elm | 3 +++ src/elm/Lia/Settings/Types.elm | 1 + src/elm/Lia/Settings/View.elm | 18 ++++++++++++++++++ src/elm/Lia/View.elm | 20 +++++++++++++++++--- 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/elm/Lia/Settings/Json.elm b/src/elm/Lia/Settings/Json.elm index ce05f8f29..6050d08d8 100644 --- a/src/elm/Lia/Settings/Json.elm +++ b/src/elm/Lia/Settings/Json.elm @@ -52,6 +52,9 @@ fromMode _ = -} JE.string "Textbook" + Full -> + "Full" + settings : Settings diff --git a/src/elm/Lia/Settings/Types.elm b/src/elm/Lia/Settings/Types.elm index 456e7a7be..4e858fc07 100644 --- a/src/elm/Lia/Settings/Types.elm +++ b/src/elm/Lia/Settings/Types.elm @@ -58,6 +58,7 @@ type Mode = Slides -- Underline Comments and Effects | Presentation -- Only effects | Textbook -- Render Comments and Effects at ones + | Full type Audio diff --git a/src/elm/Lia/Settings/View.elm b/src/elm/Lia/Settings/View.elm index 7c6a1fa6c..4709c2388 100644 --- a/src/elm/Lia/Settings/View.elm +++ b/src/elm/Lia/Settings/View.elm @@ -83,6 +83,9 @@ design model = Slides -> "lia-mode--slides" + + Full -> + "lia-mode--textbook" ] @@ -267,6 +270,15 @@ viewModes grouping lang tabbable settings = "lia-mode-slides" "icon-slides" "" + , viewMode + grouping + lang + tabbable + Full + settings.mode + "lia-mode-full" + "icon-full" + "" ] @@ -301,6 +313,9 @@ modeToString show = Textbook -> Trans.modeTextbook + Full -> + always "TODO" + viewSizing : (List (Attribute Msg) -> List (Attribute Msg)) -> Lang -> Bool -> Int -> Html Msg viewSizing grouping lang tabbable size = @@ -837,6 +852,9 @@ menuMode lang tabbable settings = Textbook -> ( "icon-book", Trans.modeTextbook lang ) + + Full -> + ( "icon-book", "TODO" ) in [ actionBtn { grouping = grouping diff --git a/src/elm/Lia/View.elm b/src/elm/Lia/View.elm index 5a901c24f..97e0c50d1 100644 --- a/src/elm/Lia/View.elm +++ b/src/elm/Lia/View.elm @@ -276,11 +276,24 @@ viewPanes screen model = viewConfig (model.sections |> Array.toIndexedList - |> List.map (showSection model screen) + |> List.map + (\( i, sec ) -> + showSection + { model + | section_active = + if model.settings.mode == Full then + i + + else + model.section_active + } + screen + ( i, sec ) + ) |> Html.div [ Attr.style "width" "100%" , Attr.style "overflow-y" "auto" - , Attr.style "display" "flex" + , Attr.style "display" "block" , Attr.style "justify-content" "center" , Attr.class "lia-slide__container" , Attr.style "margin-top" "0px" @@ -317,7 +330,8 @@ initConfig screen model = showSection : Model -> Screen -> ( Int, Section ) -> Html Msg showSection model screen ( id, section ) = initConfig screen model section - |> Markdown.view (model.section_active /= id) (Maybe.withDefault model.persistent section.persistent) + |> Markdown.view (model.section_active /= id) + (Maybe.withDefault model.persistent section.persistent) |> Html.map UpdateMarkdown From a13561c11a91f5d3fec23d57080bb77e96be8046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Tue, 17 Feb 2026 11:14:42 +0100 Subject: [PATCH 52/53] fix: merging error --- src/elm/Lia/Settings/Json.elm | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/elm/Lia/Settings/Json.elm b/src/elm/Lia/Settings/Json.elm index 6050d08d8..ce05f8f29 100644 --- a/src/elm/Lia/Settings/Json.elm +++ b/src/elm/Lia/Settings/Json.elm @@ -52,9 +52,6 @@ fromMode _ = -} JE.string "Textbook" - Full -> - "Full" - settings : Settings From ddf80c557a5cc19e27da93ecbfa5cacab6bf7c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Dietrich?= Date: Thu, 5 Mar 2026 08:37:54 +0100 Subject: [PATCH 53/53] removed lazy loading from images --- src/elm/Lia/Markdown/Inline/View.elm | 4 ++-- src/typescript/liascript/service/Sync.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/elm/Lia/Markdown/Inline/View.elm b/src/elm/Lia/Markdown/Inline/View.elm index 42e13ac8b..4c5722d77 100644 --- a/src/elm/Lia/Markdown/Inline/View.elm +++ b/src/elm/Lia/Markdown/Inline/View.elm @@ -796,7 +796,7 @@ img config attr alt_ url_ title_ width = ) |> CList.addIf (width == Nothing) (load url_) |> CList.addWhen (title config title_) - |> addLazyLoading config.visible + --|> addLazyLoading config.visible ) [] @@ -865,7 +865,7 @@ reference config ref attr = :: annotation "lia-audio" attr |> CList.addWhen (title config title_) |> CList.addWhen (alt config alt_) - |> addLazyLoading config.visible + --|> addLazyLoading config.visible ) [] diff --git a/src/typescript/liascript/service/Sync.ts b/src/typescript/liascript/service/Sync.ts index 27335c3d1..f65afaecd 100644 --- a/src/typescript/liascript/service/Sync.ts +++ b/src/typescript/liascript/service/Sync.ts @@ -206,7 +206,7 @@ const Service = { true, ) break -*/ + case 'peerjs': if (!PeerJS_) { import('../../sync/PeerJS/index').then((e) => {