From af277b9ee92da63bd41e115c86ea8b76bca8f51c Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Thu, 9 Mar 2023 13:36:32 -0700 Subject: [PATCH 01/27] list tab that's actually edit --- elm/src/EditZkNote.elm | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index b6777c9a..952da484 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -138,6 +138,7 @@ type Msg type NavChoice = NcEdit + | NcList | NcView | NcSearch | NcRecent @@ -150,6 +151,7 @@ type SearchOrRecent type EditOrView = EditView + | ListView | ViewView @@ -1029,6 +1031,9 @@ zknview zone size recentZkns trqs model = else [ EF.color TC.darkGrey ] + listview = + editview + editview linkbkc = let titleed = @@ -1480,6 +1485,7 @@ zknview zone size recentZkns trqs model = ] [ headingPanel "edit" [ E.width E.fill ] (editview TC.white) , headingPanel "view" [ E.width E.fill ] (mdview TC.white) + , headingPanel "list" [ E.width E.fill ] (listview TC.white) , searchOrRecentPanel ] @@ -1504,6 +1510,9 @@ zknview zone size recentZkns trqs model = EditView -> NcEdit + ListView -> + NcList + ViewView -> NcView ) @@ -1516,11 +1525,15 @@ zknview zone size recentZkns trqs model = else "markdown" ) + , ( NcList, "list" ) ] , case model.editOrView of EditView -> editview TC.white + ListView -> + listview TC.white + ViewView -> mdview TC.white ] @@ -1540,6 +1553,7 @@ zknview zone size recentZkns trqs model = else "markdown" ) + , ( NcList, "list" ) , ( NcSearch, "search" ) , ( NcRecent, "recent" ) ] @@ -1547,6 +1561,9 @@ zknview zone size recentZkns trqs model = NcEdit -> editview TC.lightGray + NcList -> + listview TC.lightGray + NcView -> mdview TC.lightGray @@ -1593,6 +1610,9 @@ tabsOnLoad model = EditView -> NcEdit + ListView -> + NcList + ViewView -> NcView } @@ -2548,6 +2568,9 @@ update msg model = NcEdit -> EditView + NcList -> + ListView + NcView -> ViewView From 9a10c869c822da2f1bda7a82e7c5347b720e442a Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Thu, 9 Mar 2023 16:16:45 -0700 Subject: [PATCH 02/27] text renderer that compiles --- elm/src/EditZkNote.elm | 1 + elm/src/MdText.elm | 191 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 elm/src/MdText.elm diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index 952da484..47e031cf 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -71,6 +71,7 @@ import Markdown.Parser import Markdown.Renderer import Maybe.Extra as ME import MdCommon as MC +import MdText as MT import Orgauth.Data exposing (UserId) import RequestsDialog exposing (TRequests) import Schelme.Show exposing (showTerm) diff --git a/elm/src/MdText.elm b/elm/src/MdText.elm new file mode 100644 index 00000000..e9d979e5 --- /dev/null +++ b/elm/src/MdText.elm @@ -0,0 +1,191 @@ +module MdText exposing (stringRenderer) + +import Markdown.Block as Block exposing (Block, Inline, ListItem, Task) +import Markdown.Html +import Markdown.Renderer exposing (Renderer) + + +{-| This renders `Html` in an attempt to be as close as possible to +the HTML output in . +-} +stringRenderer : Renderer String +stringRenderer = + { heading = + -- \{ level, rawText, children } -> + -- case level of + -- Block.H1 -> + -- "# " ++ String.concat children + -- Block.H2 -> + -- "## " ++ String.concat children + -- Block.H3 -> + -- "### " ++ String.concat children + -- Block.H4 -> + -- "#### " ++ String.concat children + -- Block.H5 -> + -- "##### " ++ String.concat children + -- Block.H6 -> + -- "###### " ++ String.concat children + \hinfo -> + case hinfo.level of + Block.H1 -> + "# " ++ String.concat hinfo.children + + Block.H2 -> + "## " ++ String.concat hinfo.children + + Block.H3 -> + "### " ++ String.concat hinfo.children + + Block.H4 -> + "#### " ++ String.concat hinfo.children + + Block.H5 -> + "##### " ++ String.concat hinfo.children + + Block.H6 -> + "###### " ++ String.concat hinfo.children + , paragraph = String.concat + , hardLineBreak = "\n\n" + , blockQuote = + \strs -> + strs + |> List.map (\s -> " " ++ s ++ "\n") + |> String.concat + , strong = + \s -> + String.concat + ("**" :: s ++ [ "**" ]) + , emphasis = + \s -> + String.concat + ("*" :: s ++ [ "*" ]) + + -- |> (\l -> l ++ "*") + -- |> (++) "*" + , strikethrough = + \s -> + String.concat + ("~~" :: s ++ [ "~~" ]) + , codeSpan = + \s -> + "`" ++ s ++ "`" + , link = + \link content -> + String.concat + [ "[" + , -- link.title |> Maybe.withDefault "", + String.concat content + , "](" + , link.destination + , ")" + ] + , image = + \imageInfo -> + String.concat + [ "![" + , -- link.title |> Maybe.withDefault "", + imageInfo.alt + , "](" + , imageInfo.src + , ")" + ] + , text = identity + , unorderedList = + \items -> + items + |> List.map + (\listitem -> + case listitem of + Block.ListItem Block.NoTask childs -> + "- " ++ String.concat childs ++ "\n" + + Block.ListItem Block.IncompleteTask childs -> + "- " ++ String.concat childs ++ "\n" + + Block.ListItem Block.CompletedTask childs -> + "- " ++ String.concat childs ++ "\n" + ) + |> String.concat + , orderedList = + \startingIndex items -> + items + |> List.indexedMap (\i item -> String.fromInt (i + startingIndex) ++ ") " ++ String.concat item ++ "\n") + |> String.concat + , html = Markdown.Html.oneOf [] + , codeBlock = + \{ body, language } -> + String.concat + [ "````" + , language |> Maybe.withDefault "" + , "\n" + , body + , "```\n`" + ] + , thematicBreak = "\n" + , table = String.concat + , tableHeader = String.concat + , tableBody = String.concat + , tableRow = String.concat + , tableHeaderCell = + \maybeAlignment strs -> String.concat strs + , tableCell = + \maybeAlignment strs -> String.concat strs + } + + + +-- type alias Renderer String = +-- { heading : { level : Block.HeadingLevel, rawText : String, children : List String } -> String +-- , paragraph : List String -> String +-- , blockQuote : List String -> String +-- , html : Markdown.Html.Renderer (List String -> String) +-- , text : String -> String +-- , codeSpan : String -> String +-- , strong : List String -> String +-- , emphasis : List String -> String +-- , strikethrough : List String -> String +-- , hardLineBreak : String +-- , link : { title : Maybe String, destination : String } -> List String -> String +-- , image : { alt : String, src : String, title : Maybe String } -> String +-- , unorderedList : List (ListItem String) -> String +-- , orderedList : Int -> List (List String) -> String +-- , codeBlock : { body : String, language : Maybe String } -> String +-- , thematicBreak : String +-- , table : List String -> String +-- , tableHeader : List String -> String +-- , tableBody : List String -> String +-- , tableRow : List String -> String +-- , tableCell : Maybe Block.Alignment -> List String -> String +-- , tableHeaderCell : Maybe Block.Alignment -> List String -> String +-- } +{- + -- { blockQuote : List String -> String + -- , codeBlock : { body : String, language : Maybe String } -> String + -- , codeSpan : String -> String + -- , emphasis : List String -> String + -- , hardLineBreak : String + -- , heading : + -- { children : List String, level : Block.HeadingLevel, rawText : String + -- } + -- -> String + -- , html : Markdown.Html.Renderer (List String -> String) + -- , image : { alt : String, src : String, title : Maybe String } -> String + -- , link : + -- { destination : String, title : Maybe String } + -- -> List String + -- -> String + , orderedList : Int -> List String -> String + , paragraph : List String -> String + , strikethrough : List String -> String + , strong : List String -> String + , table : List String -> String + , tableBody : List String -> String + , tableCell : Maybe Block.Alignment -> List String -> String + , tableHeader : List String -> String + , tableHeaderCell : Maybe Block.Alignment -> List String -> String + , tableRow : List String -> String + , text : String -> String + , thematicBreak : String + , unorderedList : List (ListItem String) -> String + } +-} From 2cc0e17cfa48f34be6c98068114d5d67c6ea383f Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Fri, 10 Mar 2023 08:53:26 -0700 Subject: [PATCH 03/27] looking pretty decent --- elm/src/EditZkNote.elm | 48 +++++++++++++--- elm/src/MdText.elm | 124 +++++++++++------------------------------ 2 files changed, 71 insertions(+), 101 deletions(-) diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index 47e031cf..030a3dc1 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -62,8 +62,8 @@ import Element.Events as EE import Element.Font as EF import Element.Input as EI import Element.Region as ER -import Html exposing (Attribute, Html) -import Html.Attributes +import Html exposing (Html) +import Html.Attributes as HA import Json.Decode as JD import Markdown.Block as Block exposing (Block, Inline, ListItem(..), Task(..), inlineFoldl) import Markdown.Html @@ -1033,7 +1033,37 @@ zknview zone size recentZkns trqs model = [ EF.color TC.darkGrey ] listview = - editview + E.column + [ E.width E.fill + , E.centerX + , E.alignTop + , E.spacing 8 + , E.paddingXY 5 0 + ] + <| + [ E.column + [ E.centerX + , E.paddingXY 0 10 + , E.spacing 8 + ] + [ E.row [ E.width E.fill, E.spacing 8 ] + [ E.paragraph [ EF.bold ] [ E.text model.title ] + ] + , case MT.renderMdText model.md of + Err e -> + E.text e + + Ok s -> + E.html <| + Html.div + [ HA.style "white-space" "pre-wrap" + , HA.style "word-break" "break-word" + ] + [ Html.text <| + s + ] + ] + ] editview linkbkc = let @@ -1046,11 +1076,11 @@ zknview zone size recentZkns trqs model = else [] ) - ++ [ E.htmlAttribute (Html.Attributes.id "title") + ++ [ E.htmlAttribute (HA.id "title") ] else - [ EF.color TC.darkGrey, E.htmlAttribute (Html.Attributes.id "title") ] + [ EF.color TC.darkGrey, E.htmlAttribute (HA.id "title") ] ) { onChange = if editable then @@ -1217,7 +1247,7 @@ zknview zone size recentZkns trqs model = else EF.color TC.darkGrey - , E.htmlAttribute (Html.Attributes.id "mdtext") + , E.htmlAttribute (HA.id "mdtext") , E.alignTop ] ++ (if isdirty then @@ -1486,7 +1516,7 @@ zknview zone size recentZkns trqs model = ] [ headingPanel "edit" [ E.width E.fill ] (editview TC.white) , headingPanel "view" [ E.width E.fill ] (mdview TC.white) - , headingPanel "list" [ E.width E.fill ] (listview TC.white) + , headingPanel "list" [ E.width E.fill ] listview , searchOrRecentPanel ] @@ -1533,7 +1563,7 @@ zknview zone size recentZkns trqs model = editview TC.white ListView -> - listview TC.white + listview ViewView -> mdview TC.white @@ -1563,7 +1593,7 @@ zknview zone size recentZkns trqs model = editview TC.lightGray NcList -> - listview TC.lightGray + listview NcView -> mdview TC.lightGray diff --git a/elm/src/MdText.elm b/elm/src/MdText.elm index e9d979e5..bb47ddaf 100644 --- a/elm/src/MdText.elm +++ b/elm/src/MdText.elm @@ -1,51 +1,50 @@ -module MdText exposing (stringRenderer) +module MdText exposing (renderMdText, stringRenderer) import Markdown.Block as Block exposing (Block, Inline, ListItem, Task) import Markdown.Html +import Markdown.Parser import Markdown.Renderer exposing (Renderer) -{-| This renders `Html` in an attempt to be as close as possible to -the HTML output in . --} +renderMdText : String -> Result String String +renderMdText md = + md + |> Markdown.Parser.parse + |> Result.mapError (\error -> error |> List.map Markdown.Parser.deadEndToString |> String.join "\n") + |> Result.andThen (Markdown.Renderer.render stringRenderer) + |> Result.map String.concat + + stringRenderer : Renderer String stringRenderer = { heading = - -- \{ level, rawText, children } -> - -- case level of - -- Block.H1 -> - -- "# " ++ String.concat children - -- Block.H2 -> - -- "## " ++ String.concat children - -- Block.H3 -> - -- "### " ++ String.concat children - -- Block.H4 -> - -- "#### " ++ String.concat children - -- Block.H5 -> - -- "##### " ++ String.concat children - -- Block.H6 -> - -- "###### " ++ String.concat children - \hinfo -> - case hinfo.level of + \{ level, rawText, children } -> + (case level of Block.H1 -> - "# " ++ String.concat hinfo.children + "# " ++ String.concat children Block.H2 -> - "## " ++ String.concat hinfo.children + "## " ++ String.concat children Block.H3 -> - "### " ++ String.concat hinfo.children + "### " ++ String.concat children Block.H4 -> - "#### " ++ String.concat hinfo.children + "#### " ++ String.concat children Block.H5 -> - "##### " ++ String.concat hinfo.children + "##### " ++ String.concat children Block.H6 -> - "###### " ++ String.concat hinfo.children - , paragraph = String.concat - , hardLineBreak = "\n\n" + "###### " + ++ String.concat children + ) + |> (\s -> String.append s "\n\n") + , paragraph = + \strs -> + String.concat strs + ++ "\n\n" + , hardLineBreak = " \n" , blockQuote = \strs -> strs @@ -59,9 +58,6 @@ stringRenderer = \s -> String.concat ("*" :: s ++ [ "*" ]) - - -- |> (\l -> l ++ "*") - -- |> (++) "*" , strikethrough = \s -> String.concat @@ -100,10 +96,10 @@ stringRenderer = "- " ++ String.concat childs ++ "\n" Block.ListItem Block.IncompleteTask childs -> - "- " ++ String.concat childs ++ "\n" + "- [ ]" ++ String.concat childs ++ "\n" Block.ListItem Block.CompletedTask childs -> - "- " ++ String.concat childs ++ "\n" + "- [x]" ++ String.concat childs ++ "\n" ) |> String.concat , orderedList = @@ -121,7 +117,9 @@ stringRenderer = , body , "```\n`" ] - , thematicBreak = "\n" + , thematicBreak = "--------------------\n" + + -- tables not currently parsed by elm-markdown. , table = String.concat , tableHeader = String.concat , tableBody = String.concat @@ -131,61 +129,3 @@ stringRenderer = , tableCell = \maybeAlignment strs -> String.concat strs } - - - --- type alias Renderer String = --- { heading : { level : Block.HeadingLevel, rawText : String, children : List String } -> String --- , paragraph : List String -> String --- , blockQuote : List String -> String --- , html : Markdown.Html.Renderer (List String -> String) --- , text : String -> String --- , codeSpan : String -> String --- , strong : List String -> String --- , emphasis : List String -> String --- , strikethrough : List String -> String --- , hardLineBreak : String --- , link : { title : Maybe String, destination : String } -> List String -> String --- , image : { alt : String, src : String, title : Maybe String } -> String --- , unorderedList : List (ListItem String) -> String --- , orderedList : Int -> List (List String) -> String --- , codeBlock : { body : String, language : Maybe String } -> String --- , thematicBreak : String --- , table : List String -> String --- , tableHeader : List String -> String --- , tableBody : List String -> String --- , tableRow : List String -> String --- , tableCell : Maybe Block.Alignment -> List String -> String --- , tableHeaderCell : Maybe Block.Alignment -> List String -> String --- } -{- - -- { blockQuote : List String -> String - -- , codeBlock : { body : String, language : Maybe String } -> String - -- , codeSpan : String -> String - -- , emphasis : List String -> String - -- , hardLineBreak : String - -- , heading : - -- { children : List String, level : Block.HeadingLevel, rawText : String - -- } - -- -> String - -- , html : Markdown.Html.Renderer (List String -> String) - -- , image : { alt : String, src : String, title : Maybe String } -> String - -- , link : - -- { destination : String, title : Maybe String } - -- -> List String - -- -> String - , orderedList : Int -> List String -> String - , paragraph : List String -> String - , strikethrough : List String -> String - , strong : List String -> String - , table : List String -> String - , tableBody : List String -> String - , tableCell : Maybe Block.Alignment -> List String -> String - , tableHeader : List String -> String - , tableHeaderCell : Maybe Block.Alignment -> List String -> String - , tableRow : List String -> String - , text : String -> String - , thematicBreak : String - , unorderedList : List (ListItem String) -> String - } --} From 02f270fbd8faf03e9e41b2c30587dcfb81ed52f9 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Fri, 10 Mar 2023 13:03:21 -0700 Subject: [PATCH 04/27] fixes --- elm/src/MdText.elm | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/elm/src/MdText.elm b/elm/src/MdText.elm index bb47ddaf..a85339e6 100644 --- a/elm/src/MdText.elm +++ b/elm/src/MdText.elm @@ -39,7 +39,7 @@ stringRenderer = "###### " ++ String.concat children ) - |> (\s -> String.append s "\n\n") + ++ "\n\n" , paragraph = \strs -> String.concat strs @@ -69,8 +69,7 @@ stringRenderer = \link content -> String.concat [ "[" - , -- link.title |> Maybe.withDefault "", - String.concat content + , String.concat content , "](" , link.destination , ")" @@ -79,8 +78,7 @@ stringRenderer = \imageInfo -> String.concat [ "![" - , -- link.title |> Maybe.withDefault "", - imageInfo.alt + , imageInfo.alt , "](" , imageInfo.src , ")" @@ -111,11 +109,11 @@ stringRenderer = , codeBlock = \{ body, language } -> String.concat - [ "````" + [ "```" , language |> Maybe.withDefault "" , "\n" , body - , "```\n`" + , "```\n\n" ] , thematicBreak = "--------------------\n" From 82e4b38f110715abe1b93f29587bf7061ccb20e8 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Fri, 10 Mar 2023 22:04:52 -0700 Subject: [PATCH 05/27] mdlist --- elm/elm.json | 1 + elm/src/EditZkNote.elm | 38 ++++++++------ elm/src/MdList.elm | 116 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 16 deletions(-) create mode 100644 elm/src/MdList.elm diff --git a/elm/elm.json b/elm/elm.json index d4801d64..cbe59461 100644 --- a/elm/elm.json +++ b/elm/elm.json @@ -10,6 +10,7 @@ "direct": { "PanagiotisGeorgiadis/elm-datetime": "1.3.0", "TSFoster/elm-uuid": "4.1.0", + "annaghi/dnd-list": "6.0.1", "bburdette/cellme": "1.0.0", "bburdette/schelme": "3.0.0", "bburdette/toop": "1.2.0", diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index 030a3dc1..c49a290e 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -65,12 +65,13 @@ import Element.Region as ER import Html exposing (Html) import Html.Attributes as HA import Json.Decode as JD -import Markdown.Block as Block exposing (Block, Inline, ListItem(..), Task(..), inlineFoldl) +import Markdown.Block as Block exposing (Block(..), Html(..), Inline, ListItem(..), Task(..), inlineFoldl) import Markdown.Html import Markdown.Parser import Markdown.Renderer import Maybe.Extra as ME import MdCommon as MC +import MdList as ML import MdText as MT import Orgauth.Data exposing (UserId) import RequestsDialog exposing (TRequests) @@ -1032,6 +1033,9 @@ zknview zone size recentZkns trqs model = else [ EF.color TC.darkGrey ] + parsedMd = + Markdown.Parser.parse model.md + listview = E.column [ E.width E.fill @@ -1046,23 +1050,25 @@ zknview zone size recentZkns trqs model = , E.paddingXY 0 10 , E.spacing 8 ] - [ E.row [ E.width E.fill, E.spacing 8 ] + (E.row [ E.width E.fill, E.spacing 8 ] [ E.paragraph [ EF.bold ] [ E.text model.title ] ] - , case MT.renderMdText model.md of - Err e -> - E.text e - - Ok s -> - E.html <| - Html.div - [ HA.style "white-space" "pre-wrap" - , HA.style "word-break" "break-word" - ] - [ Html.text <| - s - ] - ] + :: ML.mdblockview parsedMd + ++ [ case MT.renderMdText model.md of + Err e -> + E.text e + + Ok s -> + E.html <| + Html.div + [ HA.style "white-space" "pre-wrap" + , HA.style "word-break" "break-word" + ] + [ Html.text <| + s + ] + ] + ) ] editview linkbkc = diff --git a/elm/src/MdList.elm b/elm/src/MdList.elm new file mode 100644 index 00000000..e9d8c4f2 --- /dev/null +++ b/elm/src/MdList.elm @@ -0,0 +1,116 @@ +module MdList exposing (mdblockview) + +import Element as E exposing (Element) +import Element.Background as EBk +import Element.Border as EBd +import Element.Events as EE +import Element.Font as EF +import Element.Input as EI +import Element.Region as ER +import Markdown.Block as Block exposing (Block(..), Html(..), Inline, ListItem(..), Task(..), inlineFoldl) +import Markdown.Html + + +mdblockview parsedMd = + case parsedMd of + Err e -> + [] + + Ok bs -> + bs + |> List.map + (\b -> + case b of + HtmlBlock htmlb -> + E.column [] + [ E.text "HtmlBlock" + , case htmlb of + HtmlElement string listHtmlAttribute listChildren -> + E.el + [ E.paddingEach + { top = 0, right = 0, bottom = 0, left = 10 } + ] + <| + E.text <| + "HtmlElement " + ++ string + + HtmlComment string -> + E.el + [ E.paddingEach + { top = 0, right = 0, bottom = 0, left = 10 } + ] + <| + E.text <| + "HtmlComment " + ++ string + + ProcessingInstruction string -> + E.el + [ E.paddingEach + { top = 0, right = 0, bottom = 0, left = 10 } + ] + <| + E.text <| + "ProcessingInstruction " + ++ string + + HtmlDeclaration string1 string2 -> + E.el + [ E.paddingEach + { top = 0, right = 0, bottom = 0, left = 10 } + ] + <| + E.text <| + "HtmlDeclaration " + ++ string1 + ++ " " + ++ string2 + + Cdata string -> + E.el + [ E.paddingEach + { top = 0, right = 0, bottom = 0, left = 10 } + ] + <| + E.text <| + "Cdata " + ++ string + ] + + UnorderedList listSpacing blockListItems -> + E.text "UnorderedList" + + OrderedList listSpacing offset listListBlocks -> + E.text "OrderedList" + + BlockQuote blocks -> + E.text "BlockQuote" + + Heading headingLevel inlines -> + E.text "Heading" + + Paragraph inlines -> + E.text "Paragraph" + + Table headings inlines -> + E.text "Table" + + CodeBlock bodyLanguage -> + E.text "CodeBlock" + + ThematicBreak -> + E.text "ThematicBreak" + ) + + + +-- = HtmlInline (Html Block) +-- | Link String (Maybe String) (List Inline) +-- | Image String (Maybe String) (List Inline) +-- | Emphasis (List Inline) +-- | Strong (List Inline) +-- | Strikethrough (List Inline) +-- | CodeSpan String +-- | Text String +-- | HardLineBreak From 4f72f28d3bd9cb11cffe4daefa884dad8f6f6d46 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Fri, 10 Mar 2023 22:58:33 -0700 Subject: [PATCH 06/27] more rendering --- elm/src/MdList.elm | 188 ++++++++++++++++++++++++++++----------------- 1 file changed, 119 insertions(+), 69 deletions(-) diff --git a/elm/src/MdList.elm b/elm/src/MdList.elm index e9d8c4f2..b5a612e3 100644 --- a/elm/src/MdList.elm +++ b/elm/src/MdList.elm @@ -7,7 +7,7 @@ import Element.Events as EE import Element.Font as EF import Element.Input as EI import Element.Region as ER -import Markdown.Block as Block exposing (Block(..), Html(..), Inline, ListItem(..), Task(..), inlineFoldl) +import Markdown.Block as Block exposing (Block(..), Html(..), Inline(..), ListItem(..), Task(..), inlineFoldl) import Markdown.Html @@ -22,61 +22,7 @@ mdblockview parsedMd = (\b -> case b of HtmlBlock htmlb -> - E.column [] - [ E.text "HtmlBlock" - , case htmlb of - HtmlElement string listHtmlAttribute listChildren -> - E.el - [ E.paddingEach - { top = 0, right = 0, bottom = 0, left = 10 } - ] - <| - E.text <| - "HtmlElement " - ++ string - - HtmlComment string -> - E.el - [ E.paddingEach - { top = 0, right = 0, bottom = 0, left = 10 } - ] - <| - E.text <| - "HtmlComment " - ++ string - - ProcessingInstruction string -> - E.el - [ E.paddingEach - { top = 0, right = 0, bottom = 0, left = 10 } - ] - <| - E.text <| - "ProcessingInstruction " - ++ string - - HtmlDeclaration string1 string2 -> - E.el - [ E.paddingEach - { top = 0, right = 0, bottom = 0, left = 10 } - ] - <| - E.text <| - "HtmlDeclaration " - ++ string1 - ++ " " - ++ string2 - - Cdata string -> - E.el - [ E.paddingEach - { top = 0, right = 0, bottom = 0, left = 10 } - ] - <| - E.text <| - "Cdata " - ++ string - ] + viewhtml htmlb UnorderedList listSpacing blockListItems -> E.text "UnorderedList" @@ -88,13 +34,23 @@ mdblockview parsedMd = E.text "BlockQuote" Heading headingLevel inlines -> - E.text "Heading" + E.column [] + [ E.text "Heading" + , E.column [] (List.map viewinline inlines) + ] Paragraph inlines -> - E.text "Paragraph" + E.column [] + [ E.text "Paragraph" + , E.column [] (List.map viewinline inlines) + ] Table headings inlines -> - E.text "Table" + E.column [] + [ E.text "Table" + + -- , E.column [] (List.map viewinline inlines) + ] CodeBlock bodyLanguage -> E.text "CodeBlock" @@ -104,13 +60,107 @@ mdblockview parsedMd = ) - --- = HtmlInline (Html Block) --- | Link String (Maybe String) (List Inline) --- | Image String (Maybe String) (List Inline) --- | Emphasis (List Inline) --- | Strong (List Inline) --- | Strikethrough (List Inline) --- | CodeSpan String --- | Text String --- | HardLineBreak +lpad = + E.paddingEach + { top = 0, right = 0, bottom = 0, left = 10 } + + +viewhtml htmlb = + E.column [] + [ E.text "HtmlBlock" + , case htmlb of + HtmlElement string listHtmlAttribute listChildren -> + E.el + [ lpad ] + <| + E.text <| + "HtmlElement " + ++ string + + HtmlComment string -> + E.el + [ lpad ] + <| + E.text <| + "HtmlComment " + ++ string + + ProcessingInstruction string -> + E.el + [ lpad ] + <| + E.text <| + "ProcessingInstruction " + ++ string + + HtmlDeclaration string1 string2 -> + E.el + [ lpad ] + <| + E.text <| + "HtmlDeclaration " + ++ string1 + ++ " " + ++ string2 + + Cdata string -> + E.el + [ lpad ] + <| + E.text <| + "Cdata " + ++ string + ] + + +viewinline inline = + case inline of + HtmlInline html -> + E.row [ lpad ] + [ E.text <| "HtmlInline " + , viewhtml html + ] + + Link string maybeString inlines -> + E.row [ lpad ] + (E.text + "Link " + :: List.map viewinline inlines + ) + + Image string maybeString inlines -> + E.row [ lpad ] + (E.text + "Image " + :: List.map viewinline inlines + ) + + Emphasis inlines -> + E.row [ lpad ] + (E.text + "Emphasis " + :: List.map viewinline inlines + ) + + Strong inlines -> + E.row [ lpad ] + (E.text + "Strong " + :: List.map viewinline inlines + ) + + Strikethrough inlines -> + E.row [ lpad ] + (E.text + "Strikethrough " + :: List.map viewinline inlines + ) + + CodeSpan string -> + E.text <| "CodeSpan " ++ string + + Text string -> + E.text <| "Text " ++ string + + HardLineBreak -> + E.text <| "HardLineBreak " From 99f58e52a046d6783d082ff8e14f364cf55d06e4 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Sat, 11 Mar 2023 16:00:26 -0700 Subject: [PATCH 07/27] bunch of random dnd stuff --- elm/src/MdList.elm | 163 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) diff --git a/elm/src/MdList.elm b/elm/src/MdList.elm index b5a612e3..d03ccdcd 100644 --- a/elm/src/MdList.elm +++ b/elm/src/MdList.elm @@ -1,5 +1,8 @@ module MdList exposing (mdblockview) +import Array exposing (Array) +import Common exposing (buttonStyle) +import DnDList import Element as E exposing (Element) import Element.Background as EBk import Element.Border as EBd @@ -11,6 +14,166 @@ import Markdown.Block as Block exposing (Block(..), Html(..), Inline(..), ListIt import Markdown.Html +type alias Model = + { blocks : Array EditBlock + , focusBlock : Maybe Int + , nextBlockId : Int + , cleanBlocks : Array EditBlock + , blockDnd : DnDList.Model + } + + +type alias EditBlock = + { editid : Int + , block : Block + } + + +type Msg + = AddBlockPress + | BlockDndMsg DnDList.Msg + | BlockClicked Int + | DeleteBlock Int + + + +-- | BlockViewMsg BlockView.Msg + + +blockDndConfig : DnDList.Config EditBlock +blockDndConfig = + { beforeUpdate = \_ _ list -> list + , movement = DnDList.Free + , listen = DnDList.OnDrag + , operation = DnDList.Swap + } + + +blockDndSystem : DnDList.System EditBlock Msg +blockDndSystem = + DnDList.create blockDndConfig BlockDndMsg + + +subscriptions : Model -> Sub Msg +subscriptions model = + blockDndSystem.subscriptions model.blockDnd + ++ (Array.indexedMap + (\i -> viewBlockDnd model.blockDnd i model.focusBlock) + model.blocks + |> Array.toList + ) + + +viewBlockDnd : DnDList.Model -> Int -> Maybe Int -> EditBlock -> Element Msg +viewBlockDnd ddlmodel i focusid s = + let + ddw = + case + blockDndSystem.info ddlmodel + |> Maybe.map .dragIndex + of + Just ix -> + if ix == i then + Ghost + + else + Drop + + Nothing -> + Drag + in + viewBlock ddw i focusid s + + +type DragDropWhat + = Drag + | Drop + | Ghost + + +viewBlock : DragDropWhat -> Int -> Maybe Int -> EditBlock -> Element Msg +viewBlock ddw i focusid s = + let + itemId : String + itemId = + "id-" ++ String.fromInt i + + focus = + focusid == Just s.editid + in + E.row + ([ E.width E.fill + , E.spacing 8 + , E.htmlAttribute (Html.Attributes.id itemId) + , E.padding 10 + , EBd.rounded 5 + , EE.onMouseDown (BlockClicked s.editid) + ] + ++ (case ddw of + Drag -> + [ EBk.color <| + if focus then + TC.darkBlue + + else + TC.blue + ] + + Drop -> + EBk.color TC.yellow + :: List.map E.htmlAttribute (blockDndSystem.dropEvents i itemId) + + Ghost -> + [ E.alpha 0.5, EBk.color TC.green ] + ) + ) + [ E.column + ([ E.width <| E.px 30 + , EBk.color TC.brown + , E.height E.fill + ] + ++ List.map E.htmlAttribute (blockDndSystem.dragEvents i itemId) + ) + [] + , E.column + [ E.width E.fill + , E.spacing 8 + ] + [ viewBlockItem s.editid s.item + + -- , if focus then + -- blockMenu + -- else + -- E.none + ] + , EI.button (E.alignTop :: E.alignRight :: buttonStyle) + { onPress = Just (DeleteBlock s.editid) + , label = E.text "x" + } + ] + + +ghostView : Model -> E.Element Msg +ghostView model = + let + dnd = + model.blockDnd + + maybeDragItem : Maybe EditBlock + maybeDragItem = + blockDndSystem.info dnd + |> Maybe.andThen (\{ dragIndex } -> Array.get dragIndex model.blocks) + in + case maybeDragItem of + Just item -> + E.el + (List.map E.htmlAttribute (blockDndSystem.ghostStyles dnd)) + (viewBlock Ghost 0 (Just item.editid) item) + + Nothing -> + E.none + + mdblockview parsedMd = case parsedMd of Err e -> From e7a06fe250a8a4f1f695060be2eea5aaeff37fe9 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Sat, 11 Mar 2023 17:29:17 -0700 Subject: [PATCH 08/27] fix compile errs --- elm/src/MdList.elm | 123 +++++++++++++++++++++++++++------------------ 1 file changed, 75 insertions(+), 48 deletions(-) diff --git a/elm/src/MdList.elm b/elm/src/MdList.elm index d03ccdcd..fb1498c2 100644 --- a/elm/src/MdList.elm +++ b/elm/src/MdList.elm @@ -10,8 +10,10 @@ import Element.Events as EE import Element.Font as EF import Element.Input as EI import Element.Region as ER +import Html.Attributes as HA import Markdown.Block as Block exposing (Block(..), Html(..), Inline(..), ListItem(..), Task(..), inlineFoldl) import Markdown.Html +import TangoColors as TC type alias Model = @@ -29,6 +31,10 @@ type alias EditBlock = } + +-- | BlockViewMsg BlockView.Msg + + type Msg = AddBlockPress | BlockDndMsg DnDList.Msg @@ -36,10 +42,6 @@ type Msg | DeleteBlock Int - --- | BlockViewMsg BlockView.Msg - - blockDndConfig : DnDList.Config EditBlock blockDndConfig = { beforeUpdate = \_ _ list -> list @@ -57,11 +59,14 @@ blockDndSystem = subscriptions : Model -> Sub Msg subscriptions model = blockDndSystem.subscriptions model.blockDnd - ++ (Array.indexedMap - (\i -> viewBlockDnd model.blockDnd i model.focusBlock) - model.blocks - |> Array.toList - ) + + + +-- ++ (Array.indexedMap +-- (\i -> viewBlockDnd model.blockDnd i model.focusBlock) +-- model.blocks +-- |> Array.toList +-- ) viewBlockDnd : DnDList.Model -> Int -> Maybe Int -> EditBlock -> Element Msg @@ -104,7 +109,7 @@ viewBlock ddw i focusid s = E.row ([ E.width E.fill , E.spacing 8 - , E.htmlAttribute (Html.Attributes.id itemId) + , E.htmlAttribute (HA.id itemId) , E.padding 10 , EBd.rounded 5 , EE.onMouseDown (BlockClicked s.editid) @@ -139,7 +144,7 @@ viewBlock ddw i focusid s = [ E.width E.fill , E.spacing 8 ] - [ viewBlockItem s.editid s.item + [ viewIBlock s.editid s.block -- , if focus then -- blockMenu @@ -153,6 +158,26 @@ viewBlock ddw i focusid s = ] +makeScrollId : Int -> String +makeScrollId i = + "id-" ++ String.fromInt i + + +viewIBlock : Int -> Block -> Element Msg +viewIBlock editid b = + E.row + [ E.width E.fill + , EBd.width 1 + , EBd.rounded 5 + , E.padding 8 + , E.spacing 8 + , E.htmlAttribute (HA.id (makeScrollId editid)) + ] + <| + [ viewMdBlock b + ] + + ghostView : Model -> E.Element Msg ghostView model = let @@ -174,53 +199,55 @@ ghostView model = E.none -mdblockview parsedMd = - case parsedMd of - Err e -> - [] +viewMdBlock b = + case b of + HtmlBlock htmlb -> + viewhtml htmlb - Ok bs -> - bs - |> List.map - (\b -> - case b of - HtmlBlock htmlb -> - viewhtml htmlb + UnorderedList listSpacing blockListItems -> + E.text "UnorderedList" + + OrderedList listSpacing offset listListBlocks -> + E.text "OrderedList" - UnorderedList listSpacing blockListItems -> - E.text "UnorderedList" + BlockQuote blocks -> + E.text "BlockQuote" + + Heading headingLevel inlines -> + E.column [] + [ E.text "Heading" + , E.column [] (List.map viewinline inlines) + ] - OrderedList listSpacing offset listListBlocks -> - E.text "OrderedList" + Paragraph inlines -> + E.column [] + [ E.text "Paragraph" + , E.column [] (List.map viewinline inlines) + ] - BlockQuote blocks -> - E.text "BlockQuote" + Table headings inlines -> + E.column [] + [ E.text "Table" - Heading headingLevel inlines -> - E.column [] - [ E.text "Heading" - , E.column [] (List.map viewinline inlines) - ] + -- , E.column [] (List.map viewinline inlines) + ] - Paragraph inlines -> - E.column [] - [ E.text "Paragraph" - , E.column [] (List.map viewinline inlines) - ] + CodeBlock bodyLanguage -> + E.text "CodeBlock" - Table headings inlines -> - E.column [] - [ E.text "Table" + ThematicBreak -> + E.text "ThematicBreak" - -- , E.column [] (List.map viewinline inlines) - ] - CodeBlock bodyLanguage -> - E.text "CodeBlock" +mdblockview parsedMd = + case parsedMd of + Err e -> + [] - ThematicBreak -> - E.text "ThematicBreak" - ) + Ok bs -> + bs + |> List.map + viewMdBlock lpad = From 1c094bb5bf142e27dde5bfd7e0e3bbf22e50d1e2 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Sat, 11 Mar 2023 22:05:06 -0700 Subject: [PATCH 09/27] showing blocks --- elm/src/EditZkNote.elm | 53 ++++++++++++++++++++++++------------------ elm/src/MdList.elm | 46 +++++++++++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 23 deletions(-) diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index c49a290e..71043f5b 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -65,7 +65,7 @@ import Element.Region as ER import Html exposing (Html) import Html.Attributes as HA import Json.Decode as JD -import Markdown.Block as Block exposing (Block(..), Html(..), Inline, ListItem(..), Task(..), inlineFoldl) +import Markdown.Block as Block exposing (Block, Inline, ListItem(..), Task(..), inlineFoldl) import Markdown.Html import Markdown.Parser import Markdown.Renderer @@ -135,6 +135,7 @@ type Msg | RequestsPress | FlipLink EditLink | ShowArchivesPress + | MLMsg ML.Msg | Noop @@ -202,6 +203,7 @@ type alias Model = , dialog : Maybe D.Model , panelNote : Maybe Data.ZkNote , mbReplaceString : Maybe String + , mlModel : ML.Model } @@ -1033,10 +1035,7 @@ zknview zone size recentZkns trqs model = else [ EF.color TC.darkGrey ] - parsedMd = - Markdown.Parser.parse model.md - - listview = + blocksToStringView = E.column [ E.width E.fill , E.centerX @@ -1050,27 +1049,28 @@ zknview zone size recentZkns trqs model = , E.paddingXY 0 10 , E.spacing 8 ] - (E.row [ E.width E.fill, E.spacing 8 ] + [ E.row [ E.width E.fill, E.spacing 8 ] [ E.paragraph [ EF.bold ] [ E.text model.title ] ] - :: ML.mdblockview parsedMd - ++ [ case MT.renderMdText model.md of - Err e -> - E.text e - - Ok s -> - E.html <| - Html.div - [ HA.style "white-space" "pre-wrap" - , HA.style "word-break" "break-word" - ] - [ Html.text <| - s - ] - ] - ) + , case MT.renderMdText model.md of + Err e -> + E.text e + + Ok s -> + E.html <| + Html.div + [ HA.style "white-space" "pre-wrap" + , HA.style "word-break" "break-word" + ] + [ Html.text <| + s + ] + ] ] + listview = + E.map MLMsg <| ML.view model.mlModel + editview linkbkc = let titleed = @@ -1680,6 +1680,10 @@ initFull ld zkl zknote dtlinks spm = } ) dtlinks + + blocks = + Markdown.Parser.parse zknote.content + |> Result.withDefault [] in ( { id = Just zknote.id , ld = ld @@ -1718,6 +1722,7 @@ initFull ld zkl zknote dtlinks spm = , dialog = Nothing , panelNote = Nothing , mbReplaceString = Nothing + , mlModel = ML.init blocks } , { zknote = zknote.id, offset = 0, limit = Nothing } ) @@ -1770,6 +1775,7 @@ initNew ld zkl spm links = , dialog = Nothing , panelNote = Nothing , mbReplaceString = Nothing + , mlModel = ML.init [] } |> (\m1 -> -- for new EMPTY notes, the 'revert' should be the same as the model, so that you aren't @@ -2727,5 +2733,8 @@ update msg model = RequestsPress -> ( model, Requests ) + MLMsg _ -> + ( model, None ) + Noop -> ( model, None ) diff --git a/elm/src/MdList.elm b/elm/src/MdList.elm index fb1498c2..7ba2143a 100644 --- a/elm/src/MdList.elm +++ b/elm/src/MdList.elm @@ -1,4 +1,4 @@ -module MdList exposing (mdblockview) +module MdList exposing (..) import Array exposing (Array) import Common exposing (buttonStyle) @@ -42,6 +42,22 @@ type Msg | DeleteBlock Int +init : List Block -> Model +init blocks = + let + ba = + blocks + |> List.indexedMap (\i b -> { editid = i, block = b }) + |> Array.fromList + in + { blocks = ba + , focusBlock = Nothing + , nextBlockId = Array.length ba + , cleanBlocks = ba + , blockDnd = blockDndSystem.model + } + + blockDndConfig : DnDList.Config EditBlock blockDndConfig = { beforeUpdate = \_ _ list -> list @@ -69,6 +85,34 @@ subscriptions model = -- ) +view : Model -> Element Msg +view model = + -- let + -- maxwidth = + -- 700 + -- maxheight = + -- nd.size.height - 75 + -- in + E.column + [ E.alignTop + , E.spacing 8 + , E.padding 8 + + -- , E.width (E.maximum maxwidth E.fill) + -- , E.height (E.maximum maxheight E.fill) + , E.centerX + + -- , E.scrollbarY + , E.htmlAttribute (HA.id "steplist") + ] + <| + (Array.indexedMap + (\i -> viewBlockDnd model.blockDnd i model.focusBlock) + model.blocks + |> Array.toList + ) + + viewBlockDnd : DnDList.Model -> Int -> Maybe Int -> EditBlock -> Element Msg viewBlockDnd ddlmodel i focusid s = let From 382037b4f22ad8ceded22127149fd2475e053768 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Sun, 12 Mar 2023 18:01:13 -0600 Subject: [PATCH 10/27] add type annotations --- elm/src/MdList.elm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/elm/src/MdList.elm b/elm/src/MdList.elm index 7ba2143a..5cd11fce 100644 --- a/elm/src/MdList.elm +++ b/elm/src/MdList.elm @@ -31,10 +31,6 @@ type alias EditBlock = } - --- | BlockViewMsg BlockView.Msg - - type Msg = AddBlockPress | BlockDndMsg DnDList.Msg @@ -243,6 +239,7 @@ ghostView model = E.none +viewMdBlock : Block -> Element Msg viewMdBlock b = case b of HtmlBlock htmlb -> @@ -283,6 +280,7 @@ viewMdBlock b = E.text "ThematicBreak" +mdblockview : Result error (List Block) -> List (Element Msg) mdblockview parsedMd = case parsedMd of Err e -> @@ -294,11 +292,13 @@ mdblockview parsedMd = viewMdBlock +lpad : E.Attribute Msg lpad = E.paddingEach { top = 0, right = 0, bottom = 0, left = 10 } +viewhtml : Html Block -> Element Msg viewhtml htmlb = E.column [] [ E.text "HtmlBlock" @@ -347,6 +347,7 @@ viewhtml htmlb = ] +viewinline : Inline -> Element Msg viewinline inline = case inline of HtmlInline html -> From 37244120e2e04cd3b5f9a7437129c2f2b8dbe9c3 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 13 Mar 2023 09:53:10 -0600 Subject: [PATCH 11/27] LinearMd --- elm/src/EditZkNote.elm | 1 + elm/src/LinearMd.elm | 122 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 elm/src/LinearMd.elm diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index 71043f5b..f40dac8d 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -65,6 +65,7 @@ import Element.Region as ER import Html exposing (Html) import Html.Attributes as HA import Json.Decode as JD +import LinearMd import Markdown.Block as Block exposing (Block, Inline, ListItem(..), Task(..), inlineFoldl) import Markdown.Html import Markdown.Parser diff --git a/elm/src/LinearMd.elm b/elm/src/LinearMd.elm new file mode 100644 index 00000000..ec5b0b7b --- /dev/null +++ b/elm/src/LinearMd.elm @@ -0,0 +1,122 @@ +module LinearMd exposing (..) + +import Markdown.Block as MB + + +type MdElement + = -- Container Blocks + HtmlBlock (MB.Html MB.Block) + | UnorderedListStart MB.ListSpacing -- (List (ListItem Block)) + | UnorderedListItem MB.Task (List MB.Block) + | UnorderedListEnd + | OrderedListStart MB.ListSpacing Int -- (List (List Block)) + | OrderedListItem (List MB.Block) + | OrderedListEnd + | BlockQuoteStart -- list blocks + | BlockQuoteEnd + -- Leaf Blocks With Inlines + | HeadingStart MB.HeadingLevel + | HeadingEnd + | ParagraphStart + | ParagraphEnd + | Table (List { label : List MB.Inline, alignment : Maybe MB.Alignment }) (List (List (List MB.Inline))) + -- Leaf Blocks Without Inlines + | CodeBlock { body : String, language : Maybe String } + | ThematicBreak + -- Inlines + | HtmlInline (MB.Html MB.Block) + | Link String (Maybe String) (List MB.Inline) + | Image String (Maybe String) (List MB.Inline) + | EmphasisBegin + | EmphasisEnd + | StrongBegin + | StrongEnd + | StrikethroughBegin + | StrikethroughEnd + | CodeSpan String + | Text String + | HardLineBreak + + +mbToMe : MB.Block -> List MdElement +mbToMe block = + case block of + MB.HtmlBlock hblock -> + [ HtmlBlock hblock ] + + MB.UnorderedList listSpacing listitems -> + UnorderedListStart listSpacing + :: List.map (\(MB.ListItem task blocks) -> UnorderedListItem task blocks) listitems + ++ [ UnorderedListEnd ] + + MB.OrderedList listSpacing offset items -> + OrderedListStart listSpacing offset + :: List.map OrderedListItem items + ++ [ OrderedListEnd ] + + MB.BlockQuote blocks -> + BlockQuoteStart + :: (List.map mbToMe blocks + |> List.concat + ) + ++ [ BlockQuoteEnd ] + + MB.Heading headingLevel inlines -> + HeadingStart headingLevel + :: (List.map miToMe inlines + |> List.concat + ) + ++ [ HeadingEnd ] + + MB.Paragraph inlines -> + ParagraphStart + :: (List.map miToMe inlines + |> List.concat + ) + ++ [ ParagraphEnd ] + + MB.Table headings items -> + [ Table headings items ] + + MB.CodeBlock code -> + [ CodeBlock code ] + + MB.ThematicBreak -> + [ ThematicBreak ] + + +miToMe : MB.Inline -> List MdElement +miToMe inline = + case inline of + MB.HtmlInline hblock -> + [ HtmlInline hblock ] + + MB.Link url maybeTitle inlines -> + [ Link url maybeTitle inlines ] + + MB.Image url maybeTitle inlines -> + [ Image url maybeTitle inlines ] + + MB.Emphasis inlines -> + EmphasisBegin + :: (List.map miToMe inlines |> List.concat) + ++ [ EmphasisEnd ] + + MB.Strong inlines -> + StrongBegin + :: (List.map miToMe inlines |> List.concat) + ++ [ StrongEnd ] + + MB.Strikethrough inlines -> + StrikethroughBegin + :: (List.map miToMe inlines |> List.concat) + ++ [ StrikethroughEnd ] + + MB.CodeSpan string -> + [ CodeSpan string ] + + MB.Text string -> + [ Text string ] + + MB.HardLineBreak -> + [ HardLineBreak ] From bf7dffd569c174c2e89682150b5d32955a977235 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 13 Mar 2023 10:48:13 -0600 Subject: [PATCH 12/27] showing linearmd elements --- elm/src/EditZkNote.elm | 5 +- elm/src/LinearMd.elm | 157 ++++++++++++++++++++++++- elm/src/ViewLinearMd.elm | 245 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 404 insertions(+), 3 deletions(-) create mode 100644 elm/src/ViewLinearMd.elm diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index f40dac8d..dbfd5679 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -48,6 +48,8 @@ module EditZkNote exposing , zknview ) +-- import MdList as ML + import Browser.Dom as BD import Cellme.Cellme exposing (Cell, CellContainer(..), CellState, RunState(..), evalCellsFully, evalCellsOnce) import Cellme.DictCellme exposing (CellDict(..), DictCell, dictCcr, getCd, mkCc) @@ -65,14 +67,12 @@ import Element.Region as ER import Html exposing (Html) import Html.Attributes as HA import Json.Decode as JD -import LinearMd import Markdown.Block as Block exposing (Block, Inline, ListItem(..), Task(..), inlineFoldl) import Markdown.Html import Markdown.Parser import Markdown.Renderer import Maybe.Extra as ME import MdCommon as MC -import MdList as ML import MdText as MT import Orgauth.Data exposing (UserId) import RequestsDialog exposing (TRequests) @@ -87,6 +87,7 @@ import Url as U import Url.Builder as UB import Url.Parser as UP exposing (()) import Util +import ViewLinearMd as ML import WindowKeys as WK import ZkCommon as ZC diff --git a/elm/src/LinearMd.elm b/elm/src/LinearMd.elm index ec5b0b7b..8bb9e7e7 100644 --- a/elm/src/LinearMd.elm +++ b/elm/src/LinearMd.elm @@ -1,5 +1,12 @@ -module LinearMd exposing (..) +module LinearMd exposing (MdElement(..), lpad, mbToMe, miToMe, viewMdElement, viewhtml) +import Element as E exposing (Element) +import Element.Background as EBk +import Element.Border as EBd +import Element.Events as EE +import Element.Font as EF +import Element.Input as EI +import Element.Region as ER import Markdown.Block as MB @@ -38,6 +45,154 @@ type MdElement | HardLineBreak +viewMdElement : MdElement -> Element msg +viewMdElement b = + case b of + HtmlBlock hblock -> + viewhtml hblock + + UnorderedListStart listSpacing -> + E.text <| "UnorderedListStart" + + UnorderedListItem task blocks -> + E.text "UnorderedListItem" + + UnorderedListEnd -> + E.text "UnorderedListEnd" + + OrderedListStart listSpacing offset -> + E.text "OrderedListStart" + + OrderedListItem blocks -> + E.text "OrderedListItem" + + OrderedListEnd -> + E.text "OrderedListEnd" + + BlockQuoteStart -> + E.text "BlockQuoteStart" + + BlockQuoteEnd -> + E.text "BlockQuoteEnd" + + HeadingStart headingLevel -> + E.text "HeadingStart" + + HeadingEnd -> + E.text "HeadingEnd" + + ParagraphStart -> + E.text "ParagraphStart" + + ParagraphEnd -> + E.text "ParagraphEnd" + + Table headings items -> + E.text "Table" + + -- Leaf Blocks Without Inlines -> E.text "--" + CodeBlock code -> + E.text "CodeBlock" + + ThematicBreak -> + E.text "ThematicBreak" + + -- Inlines + HtmlInline hblock -> + viewhtml hblock + + Link url maybeTitle inlines -> + E.text "Link" + + Image url maybeTitle inlines -> + E.text "Image" + + EmphasisBegin -> + E.text "EmphasisBegin" + + EmphasisEnd -> + E.text "EmphasisEnd" + + StrongBegin -> + E.text "StrongBegin" + + StrongEnd -> + E.text "StrongEnd" + + StrikethroughBegin -> + E.text "StrikethroughBegin" + + StrikethroughEnd -> + E.text "StrikethroughEnd" + + CodeSpan string -> + E.text "CodeSpan" + + Text string -> + E.column [] + [ E.text <| "Text" + , E.text string + ] + + HardLineBreak -> + E.text "HardLineBreak" + + +lpad : E.Attribute msg +lpad = + E.paddingEach + { top = 0, right = 0, bottom = 0, left = 10 } + + +viewhtml : MB.Html MB.Block -> Element msg +viewhtml htmlb = + E.column [] + [ E.text "HtmlBlock" + , case htmlb of + MB.HtmlElement string listHtmlAttribute listChildren -> + E.el + [ lpad ] + <| + E.text <| + "HtmlElement " + ++ string + + MB.HtmlComment string -> + E.el + [ lpad ] + <| + E.text <| + "HtmlComment " + ++ string + + MB.ProcessingInstruction string -> + E.el + [ lpad ] + <| + E.text <| + "ProcessingInstruction " + ++ string + + MB.HtmlDeclaration string1 string2 -> + E.el + [ lpad ] + <| + E.text <| + "HtmlDeclaration " + ++ string1 + ++ " " + ++ string2 + + MB.Cdata string -> + E.el + [ lpad ] + <| + E.text <| + "Cdata " + ++ string + ] + + mbToMe : MB.Block -> List MdElement mbToMe block = case block of diff --git a/elm/src/ViewLinearMd.elm b/elm/src/ViewLinearMd.elm new file mode 100644 index 00000000..2b3f0094 --- /dev/null +++ b/elm/src/ViewLinearMd.elm @@ -0,0 +1,245 @@ +module ViewLinearMd exposing (..) + +import LinearMd exposing (MdElement(..), lpad, mbToMe, miToMe, viewMdElement, viewhtml) +import Array exposing (Array) +import Common exposing (buttonStyle) +import DnDList +import Markdown.Block as MB +import Element as E exposing (Element) +import Element.Background as EBk +import Element.Border as EBd +import Element.Events as EE +import Element.Font as EF +import Element.Input as EI +import Element.Region as ER +import Html.Attributes as HA +-- import Markdown.MdElement as MdElement exposing (MdElement(..), Html(..), Inline(..), ListItem(..), Task(..), inlineFoldl) +import Markdown.Html +import TangoColors as TC + +type alias Model = + { blocks : Array EditMdElement + , focusMdElement : Maybe Int + , nextMdElementId : Int + , cleanMdElements : Array EditMdElement + , blockDnd : DnDList.Model + } + + +type alias EditMdElement = + { editid : Int + , block : MdElement + } + + +type Msg + = AddMdElementPress + | MdElementDndMsg DnDList.Msg + | MdElementClicked Int + | DeleteMdElement Int + + +init : List MB.Block -> Model +init blocks = + let + ba = + blocks + |> List.map mbToMe + |> List.concat + |> List.indexedMap (\i b -> { editid = i, block = b }) + |> Array.fromList + in + { blocks = ba + , focusMdElement = Nothing + , nextMdElementId = Array.length ba + , cleanMdElements = ba + , blockDnd = blockDndSystem.model + } + + +blockDndConfig : DnDList.Config EditMdElement +blockDndConfig = + { beforeUpdate = \_ _ list -> list + , movement = DnDList.Free + , listen = DnDList.OnDrag + , operation = DnDList.Swap + } + + +blockDndSystem : DnDList.System EditMdElement Msg +blockDndSystem = + DnDList.create blockDndConfig MdElementDndMsg + + +subscriptions : Model -> Sub Msg +subscriptions model = + blockDndSystem.subscriptions model.blockDnd + + + +-- ++ (Array.indexedMap +-- (\i -> viewMdElementDnd model.blockDnd i model.focusMdElement) +-- model.blocks +-- |> Array.toList +-- ) + + +view : Model -> Element Msg +view model = + -- let + -- maxwidth = + -- 700 + -- maxheight = + -- nd.size.height - 75 + -- in + E.column + [ E.alignTop + , E.spacing 8 + , E.padding 8 + + -- , E.width (E.maximum maxwidth E.fill) + -- , E.height (E.maximum maxheight E.fill) + , E.centerX + + -- , E.scrollbarY + , E.htmlAttribute (HA.id "steplist") + ] + <| + (Array.indexedMap + (\i -> viewMdElementDnd model.blockDnd i model.focusMdElement) + model.blocks + |> Array.toList + ) + + +viewMdElementDnd : DnDList.Model -> Int -> Maybe Int -> EditMdElement -> Element Msg +viewMdElementDnd ddlmodel i focusid s = + let + ddw = + case + blockDndSystem.info ddlmodel + |> Maybe.map .dragIndex + of + Just ix -> + if ix == i then + Ghost + + else + Drop + + Nothing -> + Drag + in + viewMdElement ddw i focusid s + + +type DragDropWhat + = Drag + | Drop + | Ghost + + +viewMdElement : DragDropWhat -> Int -> Maybe Int -> EditMdElement -> Element Msg +viewMdElement ddw i focusid s = + let + itemId : String + itemId = + "id-" ++ String.fromInt i + + focus = + focusid == Just s.editid + in + E.row + ([ E.width E.fill + , E.spacing 8 + , E.htmlAttribute (HA.id itemId) + , E.padding 10 + , EBd.rounded 5 + , EE.onMouseDown (MdElementClicked s.editid) + ] + ++ (case ddw of + Drag -> + [ EBk.color <| + if focus then + TC.darkBlue + + else + TC.blue + ] + + Drop -> + EBk.color TC.yellow + :: List.map E.htmlAttribute (blockDndSystem.dropEvents i itemId) + + Ghost -> + [ E.alpha 0.5, EBk.color TC.green ] + ) + ) + [ E.column + ([ E.width <| E.px 30 + , EBk.color TC.brown + , E.height E.fill + ] + ++ List.map E.htmlAttribute (blockDndSystem.dragEvents i itemId) + ) + [] + , E.column + [ E.width E.fill + , E.spacing 8 + ] + [ viewIMdElement s.editid s.block + + -- , if focus then + -- blockMenu + -- else + -- E.none + ] + , EI.button (E.alignTop :: E.alignRight :: buttonStyle) + { onPress = Just (DeleteMdElement s.editid) + , label = E.text "x" + } + ] + + +makeScrollId : Int -> String +makeScrollId i = + "id-" ++ String.fromInt i + + +viewIMdElement : Int -> MdElement -> Element Msg +viewIMdElement editid b = + E.row + [ E.width E.fill + , EBd.width 1 + , EBd.rounded 5 + , E.padding 8 + , E.spacing 8 + , E.htmlAttribute (HA.id (makeScrollId editid)) + ] + <| + [ LinearMd.viewMdElement b + ] + + +ghostView : Model -> E.Element Msg +ghostView model = + let + dnd = + model.blockDnd + + maybeDragItem : Maybe EditMdElement + maybeDragItem = + blockDndSystem.info dnd + |> Maybe.andThen (\{ dragIndex } -> Array.get dragIndex model.blocks) + in + case maybeDragItem of + Just item -> + E.el + (List.map E.htmlAttribute (blockDndSystem.ghostStyles dnd)) + (viewMdElement Ghost 0 (Just item.editid) item) + + Nothing -> + E.none + + + From c1edbc5c9f111a6e4f78fe567496ded3076c27ea Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Mon, 13 Mar 2023 11:00:57 -0600 Subject: [PATCH 13/27] font color, link info --- elm/src/LinearMd.elm | 130 ++++++++++++++++++++++--------------------- 1 file changed, 68 insertions(+), 62 deletions(-) diff --git a/elm/src/LinearMd.elm b/elm/src/LinearMd.elm index 8bb9e7e7..e197ea64 100644 --- a/elm/src/LinearMd.elm +++ b/elm/src/LinearMd.elm @@ -8,6 +8,7 @@ import Element.Font as EF import Element.Input as EI import Element.Region as ER import Markdown.Block as MB +import TangoColors as TC type MdElement @@ -47,95 +48,100 @@ type MdElement viewMdElement : MdElement -> Element msg viewMdElement b = - case b of - HtmlBlock hblock -> - viewhtml hblock + E.el [ EF.color TC.white ] <| + case b of + HtmlBlock hblock -> + viewhtml hblock - UnorderedListStart listSpacing -> - E.text <| "UnorderedListStart" + UnorderedListStart listSpacing -> + E.text <| "UnorderedListStart" - UnorderedListItem task blocks -> - E.text "UnorderedListItem" + UnorderedListItem task blocks -> + E.text "UnorderedListItem" - UnorderedListEnd -> - E.text "UnorderedListEnd" + UnorderedListEnd -> + E.text "UnorderedListEnd" - OrderedListStart listSpacing offset -> - E.text "OrderedListStart" + OrderedListStart listSpacing offset -> + E.text "OrderedListStart" - OrderedListItem blocks -> - E.text "OrderedListItem" + OrderedListItem blocks -> + E.text "OrderedListItem" - OrderedListEnd -> - E.text "OrderedListEnd" + OrderedListEnd -> + E.text "OrderedListEnd" - BlockQuoteStart -> - E.text "BlockQuoteStart" + BlockQuoteStart -> + E.text "BlockQuoteStart" - BlockQuoteEnd -> - E.text "BlockQuoteEnd" + BlockQuoteEnd -> + E.text "BlockQuoteEnd" - HeadingStart headingLevel -> - E.text "HeadingStart" + HeadingStart headingLevel -> + E.text "HeadingStart" - HeadingEnd -> - E.text "HeadingEnd" + HeadingEnd -> + E.text "HeadingEnd" - ParagraphStart -> - E.text "ParagraphStart" + ParagraphStart -> + E.text "ParagraphStart" - ParagraphEnd -> - E.text "ParagraphEnd" + ParagraphEnd -> + E.text "ParagraphEnd" - Table headings items -> - E.text "Table" + Table headings items -> + E.text "Table" - -- Leaf Blocks Without Inlines -> E.text "--" - CodeBlock code -> - E.text "CodeBlock" + -- Leaf Blocks Without Inlines -> E.text "--" + CodeBlock code -> + E.text "CodeBlock" - ThematicBreak -> - E.text "ThematicBreak" + ThematicBreak -> + E.text "ThematicBreak" - -- Inlines - HtmlInline hblock -> - viewhtml hblock + -- Inlines + HtmlInline hblock -> + viewhtml hblock - Link url maybeTitle inlines -> - E.text "Link" + Link url maybeTitle inlines -> + E.column [] + [ E.text "Link" + , E.text <| "url " ++ url + , E.text <| "title " ++ Maybe.withDefault "" maybeTitle + ] - Image url maybeTitle inlines -> - E.text "Image" + Image url maybeTitle inlines -> + E.text "Image" - EmphasisBegin -> - E.text "EmphasisBegin" + EmphasisBegin -> + E.text "EmphasisBegin" - EmphasisEnd -> - E.text "EmphasisEnd" + EmphasisEnd -> + E.text "EmphasisEnd" - StrongBegin -> - E.text "StrongBegin" + StrongBegin -> + E.text "StrongBegin" - StrongEnd -> - E.text "StrongEnd" + StrongEnd -> + E.text "StrongEnd" - StrikethroughBegin -> - E.text "StrikethroughBegin" + StrikethroughBegin -> + E.text "StrikethroughBegin" - StrikethroughEnd -> - E.text "StrikethroughEnd" + StrikethroughEnd -> + E.text "StrikethroughEnd" - CodeSpan string -> - E.text "CodeSpan" + CodeSpan string -> + E.text "CodeSpan" - Text string -> - E.column [] - [ E.text <| "Text" - , E.text string - ] + Text string -> + E.column [] + [ E.text <| "Text" + , E.text string + ] - HardLineBreak -> - E.text "HardLineBreak" + HardLineBreak -> + E.text "HardLineBreak" lpad : E.Attribute msg From d4c8df94d92b84152e7181d3dc3f31570a96447c Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 14 Mar 2023 10:07:30 -0600 Subject: [PATCH 14/27] VLM --- elm/src/EditZkNote.elm | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index dbfd5679..1a479f02 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -48,8 +48,6 @@ module EditZkNote exposing , zknview ) --- import MdList as ML - import Browser.Dom as BD import Cellme.Cellme exposing (Cell, CellContainer(..), CellState, RunState(..), evalCellsFully, evalCellsOnce) import Cellme.DictCellme exposing (CellDict(..), DictCell, dictCcr, getCd, mkCc) @@ -87,7 +85,7 @@ import Url as U import Url.Builder as UB import Url.Parser as UP exposing (()) import Util -import ViewLinearMd as ML +import ViewLinearMd as VLM import WindowKeys as WK import ZkCommon as ZC @@ -137,7 +135,7 @@ type Msg | RequestsPress | FlipLink EditLink | ShowArchivesPress - | MLMsg ML.Msg + | VLMMsg VLM.Msg | Noop @@ -205,7 +203,7 @@ type alias Model = , dialog : Maybe D.Model , panelNote : Maybe Data.ZkNote , mbReplaceString : Maybe String - , mlModel : ML.Model + , mlModel : VLM.Model } @@ -1071,7 +1069,7 @@ zknview zone size recentZkns trqs model = ] listview = - E.map MLMsg <| ML.view model.mlModel + E.map VLMMsg <| VLM.view model.mlModel editview linkbkc = let @@ -1724,7 +1722,7 @@ initFull ld zkl zknote dtlinks spm = , dialog = Nothing , panelNote = Nothing , mbReplaceString = Nothing - , mlModel = ML.init blocks + , mlModel = VLM.init blocks } , { zknote = zknote.id, offset = 0, limit = Nothing } ) @@ -1777,7 +1775,7 @@ initNew ld zkl spm links = , dialog = Nothing , panelNote = Nothing , mbReplaceString = Nothing - , mlModel = ML.init [] + , mlModel = VLM.init [] } |> (\m1 -> -- for new EMPTY notes, the 'revert' should be the same as the model, so that you aren't @@ -2735,7 +2733,7 @@ update msg model = RequestsPress -> ( model, Requests ) - MLMsg _ -> + VLMMsg _ -> ( model, None ) Noop -> From 1b9f00e75211a2a3f234006f222e076d935fab07 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 14 Mar 2023 10:20:22 -0600 Subject: [PATCH 15/27] dnd subscriptions --- elm/src/EditZkNote.elm | 12 +++++++++++- elm/src/Main.elm | 18 ++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index 1a479f02..e26347a4 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -35,6 +35,7 @@ module EditZkNote exposing , setHomeNote , showSr , showZkl + , subscriptions , sznFromModel , tabsOnLoad , toPubId @@ -238,6 +239,11 @@ type Command | Cmd (Cmd Msg) +subscriptions : Model -> Sub Msg +subscriptions model = + Sub.map VLMMsg <| VLM.subscriptions model.mlModel + + onZkNote : Data.ZkNote -> Model -> ( Model, Command ) onZkNote zkn model = ( { model | panelNote = Just zkn } @@ -2733,7 +2739,11 @@ update msg model = RequestsPress -> ( model, Requests ) - VLMMsg _ -> + VLMMsg vmsg -> + let + wat = + VLM.update model.mlModel vmsg + in ( model, None ) Noop -> diff --git a/elm/src/Main.elm b/elm/src/Main.elm index 88d385c9..639bdd72 100644 --- a/elm/src/Main.elm +++ b/elm/src/Main.elm @@ -3355,11 +3355,11 @@ main = , view = piview , update = piupdate , subscriptions = - \model -> + \pimodel -> let tracks : List (Sub Msg) tracks = - case model of + case pimodel of Ready rmd -> rmd.trackedRequests.requests |> Dict.keys @@ -3367,6 +3367,19 @@ main = PreInit _ -> [] + + esub = + case pimodel of + Ready model -> + case model.state of + EditZkNote state _ -> + [ Sub.map EditZkNoteMsg <| EditZkNote.subscriptions state ] + + _ -> + [] + + _ -> + [] in Sub.batch <| [ receiveTASelection TASelection @@ -3375,6 +3388,7 @@ main = , LS.localVal ReceiveLocalVal ] ++ tracks + ++ esub , onUrlRequest = urlRequest , onUrlChange = UrlChanged } From 9c20fa98b04331eb892d7c9071e911f296a5d40c Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 14 Mar 2023 19:34:57 +0000 Subject: [PATCH 16/27] semi working --- elm/src/EditZkNote.elm | 6 +++-- elm/src/ViewLinearMd.elm | 48 +++++++++++++++++++++++++++++++--------- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index e26347a4..7bbbe56b 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -2741,10 +2741,12 @@ update msg model = VLMMsg vmsg -> let - wat = + ( mlModel, cmd ) = VLM.update model.mlModel vmsg in - ( model, None ) + ( { model | mlModel = mlModel } + , Cmd (Cmd.map VLMMsg cmd) + ) Noop -> ( model, None ) diff --git a/elm/src/ViewLinearMd.elm b/elm/src/ViewLinearMd.elm index 2b3f0094..b71995c8 100644 --- a/elm/src/ViewLinearMd.elm +++ b/elm/src/ViewLinearMd.elm @@ -1,10 +1,8 @@ module ViewLinearMd exposing (..) -import LinearMd exposing (MdElement(..), lpad, mbToMe, miToMe, viewMdElement, viewhtml) import Array exposing (Array) import Common exposing (buttonStyle) import DnDList -import Markdown.Block as MB import Element as E exposing (Element) import Element.Background as EBk import Element.Border as EBd @@ -13,10 +11,12 @@ import Element.Font as EF import Element.Input as EI import Element.Region as ER import Html.Attributes as HA --- import Markdown.MdElement as MdElement exposing (MdElement(..), Html(..), Inline(..), ListItem(..), Task(..), inlineFoldl) +import LinearMd exposing (MdElement(..), lpad, mbToMe, miToMe, viewMdElement, viewhtml) +import Markdown.Block as MB import Markdown.Html import TangoColors as TC + type alias Model = { blocks : Array EditMdElement , focusMdElement : Maybe Int @@ -39,12 +39,18 @@ type Msg | DeleteMdElement Int +type DragDropWhat + = Drag + | Drop + | Ghost + + init : List MB.Block -> Model init blocks = let ba = blocks - |> List.map mbToMe + |> List.map mbToMe |> List.concat |> List.indexedMap (\i b -> { editid = i, block = b }) |> Array.fromList @@ -133,12 +139,6 @@ viewMdElementDnd ddlmodel i focusid s = viewMdElement ddw i focusid s -type DragDropWhat - = Drag - | Drop - | Ghost - - viewMdElement : DragDropWhat -> Int -> Maybe Int -> EditMdElement -> Element Msg viewMdElement ddw i focusid s = let @@ -243,3 +243,31 @@ ghostView model = +-- type Command +-- = None +-- | BlockDndCmd (Cmd Msg) + + +update : Model -> Msg -> ( Model, Cmd Msg ) +update model msg = + case msg of + AddMdElementPress -> + ( model, Cmd.none ) + + MdElementDndMsg dndmsg -> + let + ( blockDnD, blocks ) = + blockDndSystem.update dndmsg model.blockDnd (Array.toList model.blocks) + in + ( { model + | blockDnd = blockDnD + , blocks = Array.fromList blocks + } + , blockDndSystem.commands blockDnD + ) + + MdElementClicked int -> + ( model, Cmd.none ) + + DeleteMdElement int -> + ( model, Cmd.none ) From aecaf1c42e6ef12b474cdd911b71ec9eb59f4ebd Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 14 Mar 2023 21:09:29 +0000 Subject: [PATCH 17/27] ghostView --- elm/src/EditZkNote.elm | 8 ++++++++ elm/src/Main.elm | 24 +++++++++++++++++++++++- elm/src/ViewLinearMd.elm | 20 ++++++++++---------- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index 7bbbe56b..b0a491ee 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -14,6 +14,7 @@ module EditZkNote exposing , dirty , disabledLinkButtonStyle , fullSave + , ghostView , initFull , initNew , isPublic @@ -244,6 +245,13 @@ subscriptions model = Sub.map VLMMsg <| VLM.subscriptions model.mlModel +ghostView : Model -> Maybe (E.Element Msg) +ghostView model = + VLM.ghostView model.mlModel + |> Maybe.map + (E.map VLMMsg) + + onZkNote : Data.ZkNote -> Model -> ( Model, Command ) onZkNote zkn model = ( { model | panelNote = Just zkn } diff --git a/elm/src/Main.elm b/elm/src/Main.elm index 639bdd72..ceeca77a 100644 --- a/elm/src/Main.elm +++ b/elm/src/Main.elm @@ -1215,11 +1215,33 @@ view model = { dm | model = model.trackedRequests } _ -> - E.layout [ EF.size model.fontsize, E.width E.fill ] <| viewState model.size model.state model + E.layout + ((case ghostState model.state of + Just elt -> + [ E.inFront elt ] + + Nothing -> + [] + ) + ++ [ EF.size model.fontsize, E.width E.fill ] + ) + <| + viewState model.size model.state model ] } +ghostState : State -> Maybe (E.Element Msg) +ghostState state = + case state of + EditZkNote m l -> + Maybe.map (E.map EditZkNoteMsg) <| + EditZkNote.ghostView m + + _ -> + Nothing + + piupdate : Msg -> PiModel -> ( PiModel, Cmd Msg ) piupdate msg initmodel = case initmodel of diff --git a/elm/src/ViewLinearMd.elm b/elm/src/ViewLinearMd.elm index b71995c8..c3686dc8 100644 --- a/elm/src/ViewLinearMd.elm +++ b/elm/src/ViewLinearMd.elm @@ -172,7 +172,8 @@ viewMdElement ddw i focusid s = :: List.map E.htmlAttribute (blockDndSystem.dropEvents i itemId) Ghost -> - [ E.alpha 0.5, EBk.color TC.green ] + Debug.log "ghost mode" + [ E.alpha 0.5, EBk.color TC.red ] ) ) [ E.column @@ -221,7 +222,7 @@ viewIMdElement editid b = ] -ghostView : Model -> E.Element Msg +ghostView : Model -> Maybe (E.Element Msg) ghostView model = let dnd = @@ -232,14 +233,13 @@ ghostView model = blockDndSystem.info dnd |> Maybe.andThen (\{ dragIndex } -> Array.get dragIndex model.blocks) in - case maybeDragItem of - Just item -> - E.el - (List.map E.htmlAttribute (blockDndSystem.ghostStyles dnd)) - (viewMdElement Ghost 0 (Just item.editid) item) - - Nothing -> - E.none + maybeDragItem + |> Maybe.map + (\item -> + E.el + (List.map E.htmlAttribute (blockDndSystem.ghostStyles dnd)) + (viewMdElement Ghost 0 (Just item.editid) item) + ) From 2c6edf9e71cd8eadfa856a0850d7501deb37b85b Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 15 Mar 2023 12:04:08 -0600 Subject: [PATCH 18/27] Mdf, Mdb --- elm/src/LinearMd.elm | 125 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/elm/src/LinearMd.elm b/elm/src/LinearMd.elm index e197ea64..2b90c7e3 100644 --- a/elm/src/LinearMd.elm +++ b/elm/src/LinearMd.elm @@ -46,6 +46,131 @@ type MdElement | HardLineBreak +type alias State = + { mdbstack : List Mdb + , mdf : Mdf + , result : Result String (List MB.Block) + } + + +mdfProc : MdElement -> State -> State +mdfProc elt state = + case List.head state.mdbstack of + Just mdf -> + case mdf of + Mdbf fn -> + state + + Mdif fn -> + state + + Nothing -> + state + + +toBlocks : List MdElement -> Result String (List MB.Block) +toBlocks elements = + List.foldl + mdfProc + { mdbstack = [], mdf = Mdf toBlock, result = Ok [] } + elements + |> .result + + + +-- stack 'o states. +-- state is a function. +-- state can + + +type Mdf + = Mdf (List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block )) + | Mdfb Mdb (List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block )) + + +type Mdb + = Mdbf (List MB.Block -> Mdf) + | Mdif (List MB.Inline -> Mdf) + + +unorderedListItem : MB.ListSpacing -> List (MB.ListItem MB.Block) -> List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block ) +unorderedListItem listSpacing items mbs mde = + case mde of + UnorderedListItem task blocks -> + Ok ( Mdf (unorderedListItem listSpacing (MB.ListItem task blocks :: items)), mbs ) + + UnorderedListEnd -> + Ok ( Mdf toBlock, MB.UnorderedList listSpacing (List.reverse items) :: mbs ) + + _ -> + Err "unexpected item" + + +orderedListItem : MB.ListSpacing -> Int -> List (List MB.Block) -> List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block ) +orderedListItem listSpacing offset items mbs mde = + case mde of + OrderedListItem blocks -> + Ok ( Mdf (orderedListItem listSpacing offset (blocks :: items)), mbs ) + + OrderedListEnd -> + Ok ( Mdf toBlock, MB.OrderedList listSpacing offset items :: mbs ) + + _ -> + Err "unexpected item" + + +toBlock : List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block ) +toBlock mbs mde = + Err "" + + + +{- + + toBlock : List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block ) + toBlock mbs mde = + case mde of + HtmlBlock hblock -> + Ok ( Mdf toBlock, MB.HtmlBlock hblock :: mbs ) + UnorderedListStart listSpacing -> -- (List (ListItem Block)) + Ok ( Mdf unorderedListItem listSpacing [], mbs ) + UnorderedListItem _ _ -> + Err "unexpected item" + UnorderedListEnd -> + Err "unexpected item" + OrderedListStart listSpacing offset -> -- (List (List Block)) + Ok ( Mdf orderedListItem listSpacing offset [], mbs ) + OrderedListItem _ -> + Err "unexpected item" + OrderedListEnd -> + Err "unexpected item" + BlockQuoteStart -- list blocks + BlockQuoteEnd + -- Leaf Blocks With Inlines + HeadingStart MB.HeadingLevel + HeadingEnd + ParagraphStart + ParagraphEnd + Table (List { label : List MB.Inline, alignment : Maybe MB.Alignment }) (List (List (List MB.Inline))) + -- Leaf Blocks Without Inlines + CodeBlock { body : String, language : Maybe String } + ThematicBreak + -- Inlines + HtmlInline (MB.Html MB.Block) + Link String (Maybe String) (List MB.Inline) + Image String (Maybe String) (List MB.Inline) + EmphasisBegin + EmphasisEnd + StrongBegin + StrongEnd + StrikethroughBegin + StrikethroughEnd + CodeSpan String + Text String + HardLineBreak +-} + + viewMdElement : MdElement -> Element msg viewMdElement b = E.el [ EF.color TC.white ] <| From a3be04327c2ab84cbdb7c9cb53f58d4cc9fc8d69 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 15 Mar 2023 12:37:09 -0600 Subject: [PATCH 19/27] wip toBlock --- elm/src/LinearMd.elm | 100 ++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 49 deletions(-) diff --git a/elm/src/LinearMd.elm b/elm/src/LinearMd.elm index 2b90c7e3..febe8987 100644 --- a/elm/src/LinearMd.elm +++ b/elm/src/LinearMd.elm @@ -85,7 +85,9 @@ toBlocks elements = type Mdf = Mdf (List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block )) - | Mdfb Mdb (List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block )) + | Mdfb (List MB.Block -> Mdf) (List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block )) + | Mdfi (List MB.Inline -> Mdf) (List MB.Inline -> MdElement -> Result String ( Mdf, List MB.Inline )) + | Mdfe type Mdb @@ -118,57 +120,57 @@ orderedListItem listSpacing offset items mbs mde = _ -> Err "unexpected item" +-- blockQuote : List MB.Block -> + toBlock : List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block ) toBlock mbs mde = - Err "" - - - -{- - - toBlock : List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block ) - toBlock mbs mde = - case mde of - HtmlBlock hblock -> - Ok ( Mdf toBlock, MB.HtmlBlock hblock :: mbs ) - UnorderedListStart listSpacing -> -- (List (ListItem Block)) - Ok ( Mdf unorderedListItem listSpacing [], mbs ) - UnorderedListItem _ _ -> - Err "unexpected item" - UnorderedListEnd -> - Err "unexpected item" - OrderedListStart listSpacing offset -> -- (List (List Block)) - Ok ( Mdf orderedListItem listSpacing offset [], mbs ) - OrderedListItem _ -> - Err "unexpected item" - OrderedListEnd -> - Err "unexpected item" - BlockQuoteStart -- list blocks - BlockQuoteEnd - -- Leaf Blocks With Inlines - HeadingStart MB.HeadingLevel - HeadingEnd - ParagraphStart - ParagraphEnd - Table (List { label : List MB.Inline, alignment : Maybe MB.Alignment }) (List (List (List MB.Inline))) - -- Leaf Blocks Without Inlines - CodeBlock { body : String, language : Maybe String } - ThematicBreak - -- Inlines - HtmlInline (MB.Html MB.Block) - Link String (Maybe String) (List MB.Inline) - Image String (Maybe String) (List MB.Inline) - EmphasisBegin - EmphasisEnd - StrongBegin - StrongEnd - StrikethroughBegin - StrikethroughEnd - CodeSpan String - Text String - HardLineBreak --} + case mde of + HtmlBlock hblock -> + Ok ( Mdf toBlock, MB.HtmlBlock hblock :: mbs ) + UnorderedListStart listSpacing -> -- (List (ListItem Block)) + Ok ( Mdf unorderedListItem listSpacing [], mbs ) + UnorderedListItem _ _ -> + Err "unexpected item" + UnorderedListEnd -> + Err "unexpected item" + OrderedListStart listSpacing offset -> -- (List (List Block)) + Ok ( Mdf orderedListItem listSpacing offset [], mbs ) + OrderedListItem _ -> + Err "unexpected item" + OrderedListEnd -> + Err "unexpected item" + BlockQuoteStart -> -- list blocks + Ok ( Mdfb MB.BlockQuote toBlock, mbs) + BlockQuoteEnd -> + Ok (Mdfe, mbs) + -- Leaf Blocks With Inlines + HeadingStart headingLevel -> + Ok (Mdfi MB.Heading ) + HeadingEnd + ParagraphStart + ParagraphEnd + Table heading data -> + Ok (Mdf toBlock [MB.Table heading data ]) + -- Leaf Blocks Without Inlines + CodeBlock code + -> Ok (Mdf toBlock [MB.CodeBlock code ]) + ThematicBreak -> Ok (Mdf toBlock [MB.ThematicBreak ]) + -- Inlines + HtmlInline hblock -> + -> Ok (Mdf toBlock [MB.HtmlInline hblock ]) + Link url maybeTitle inlines -> + Image url maybeTitle inlines -> + EmphasisBegin + EmphasisEnd + StrongBegin + StrongEnd + StrikethroughBegin + StrikethroughEnd + CodeSpan String + Text String + HardLineBreak + viewMdElement : MdElement -> Element msg From 9754ba2c93f7e97cd522f967bf0b9b52e111b80b Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 15 Mar 2023 20:55:28 +0000 Subject: [PATCH 20/27] save point --- elm/src/LinearMd.elm | 188 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 150 insertions(+), 38 deletions(-) diff --git a/elm/src/LinearMd.elm b/elm/src/LinearMd.elm index febe8987..8c183495 100644 --- a/elm/src/LinearMd.elm +++ b/elm/src/LinearMd.elm @@ -55,6 +55,13 @@ type alias State = mdfProc : MdElement -> State -> State mdfProc elt state = + case state.result of + Err _ -> state + Ok mbs -> + case state.mdf mbs elt of + Err e -> {state | result - Err e} + Ok nmbs -> + case List.head state.mdbstack of Just mdf -> case mdf of @@ -83,93 +90,198 @@ toBlocks elements = -- state can + + + type Mdf - = Mdf (List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block )) - | Mdfb (List MB.Block -> Mdf) (List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block )) - | Mdfi (List MB.Inline -> Mdf) (List MB.Inline -> MdElement -> Result String ( Mdf, List MB.Inline )) + = Mdfb (MdElement -> Result String ( Mdf, List MB.Block )) + | Mdfi (MdElement -> Result String ( Mdf, List MB.Inline )) | Mdfe -type Mdb - = Mdbf (List MB.Block -> Mdf) - | Mdif (List MB.Inline -> Mdf) +-- type Mdb +-- = Mdbf (List MB.Block -> ( Mdf, List MB.Block )) +-- | Mdif (List MB.Inline -> ( Mdf, List MB.Block )) -unorderedListItem : MB.ListSpacing -> List (MB.ListItem MB.Block) -> List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block ) -unorderedListItem listSpacing items mbs mde = +unorderedListItem : MB.ListSpacing -> List (MB.ListItem MB.Block) -> MdElement -> Result String ( Mdf, List MB.Block ) +unorderedListItem listSpacing items mde = case mde of UnorderedListItem task blocks -> - Ok ( Mdf (unorderedListItem listSpacing (MB.ListItem task blocks :: items)), mbs ) + Ok ( Mdf (unorderedListItem listSpacing (MB.ListItem task blocks :: items)), [] ) UnorderedListEnd -> - Ok ( Mdf toBlock, MB.UnorderedList listSpacing (List.reverse items) :: mbs ) + Ok ( Mdf toBlock, [MB.UnorderedList listSpacing (List.reverse items)] ) _ -> Err "unexpected item" -orderedListItem : MB.ListSpacing -> Int -> List (List MB.Block) -> List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block ) +orderedListItem : MB.ListSpacing -> Int -> List (List MB.Block) -> MdElement -> Result String ( Mdf, List MB.Block ) orderedListItem listSpacing offset items mbs mde = case mde of OrderedListItem blocks -> - Ok ( Mdf (orderedListItem listSpacing offset (blocks :: items)), mbs ) + Ok ( Mdf (orderedListItem listSpacing offset (blocks :: items)), [] ) OrderedListEnd -> - Ok ( Mdf toBlock, MB.OrderedList listSpacing offset items :: mbs ) + Ok ( Mdf toBlock, [MB.OrderedList listSpacing offset items ]) _ -> Err "unexpected item" -- blockQuote : List MB.Block -> - -toBlock : List MB.Block -> MdElement -> Result String ( Mdf, List MB.Block ) -toBlock mbs mde = +accumInlinesToB : MdElement -> (List MB.Inline -> MB.Inline) -> List MB.Inline -> MdElement -> Result String (Mdf, List MB.Block) +accumInlinesToB endelt endcontainer accum elt = + if elt == endelt then + Ok (Mdfe, endcontainer accum) + else + + +accumInlines : MdElement -> (List MB.Inline -> MB.Inline) -> List MB.Inline -> MdElement -> Result String (Mdf, List MB.Inline) +accumInlines endelt endcontainer accum elt = + case toInline elt of + Mdfb -> + Err "bad accum" + Mdfi fn -> + + + +andThenInline : (MdElement -> Result String ( Mdf, List MB.Inline )) + -> (MdElement -> Result String ( Mdf, List MB.Inline )) + -> MdElement -> Result String ( Mdf, List MB.Inline ) +andThenInline fn1 fn2 elt = + case fn2 elt of + (Mdfi newf -> + + + +toBlock : MdElement -> Result String ( Mdf, List MB.Block ) +toBlock mde = case mde of HtmlBlock hblock -> - Ok ( Mdf toBlock, MB.HtmlBlock hblock :: mbs ) + Ok ( Mdf toBlock, [MB.HtmlBlock hblock] ) UnorderedListStart listSpacing -> -- (List (ListItem Block)) - Ok ( Mdf unorderedListItem listSpacing [], mbs ) + Ok ( Mdf unorderedListItem listSpacing [], [] ) UnorderedListItem _ _ -> - Err "unexpected item" + Err "unexpected UnorderedListItem" UnorderedListEnd -> - Err "unexpected item" + Err "unexpected UnorderedListEnd" OrderedListStart listSpacing offset -> -- (List (List Block)) - Ok ( Mdf orderedListItem listSpacing offset [], mbs ) + Ok ( Mdf orderedListItem listSpacing offset [], [] ) OrderedListItem _ -> - Err "unexpected item" + Err "unexpected OrderedListItem" OrderedListEnd -> - Err "unexpected item" + Err "unexpected OrderedListEnd" BlockQuoteStart -> -- list blocks - Ok ( Mdfb MB.BlockQuote toBlock, mbs) + Ok ( Mdfb MB.BlockQuote toBlock, []) BlockQuoteEnd -> Ok (Mdfe, mbs) -- Leaf Blocks With Inlines HeadingStart headingLevel -> Ok (Mdfi MB.Heading ) - HeadingEnd - ParagraphStart - ParagraphEnd + HeadingEnd -> + ParagraphStart -> + Ok (Mdfi MB.Paragraph ) + ParagraphEnd -> + Err "unexpected ParagraphEnd" Table heading data -> Ok (Mdf toBlock [MB.Table heading data ]) -- Leaf Blocks Without Inlines CodeBlock code -> Ok (Mdf toBlock [MB.CodeBlock code ]) - ThematicBreak -> Ok (Mdf toBlock [MB.ThematicBreak ]) + ThematicBreak -> Ok (Mdf toBlock [MB.ThematicBreak ]) -- Inlines HtmlInline hblock -> - -> Ok (Mdf toBlock [MB.HtmlInline hblock ]) + Err "unexpected HtmlInline; expected block" Link url maybeTitle inlines -> + Err "unexpected Link; expected block" + Image url maybeTitle inlines -> + Err "unexpected Image; expected block" + EmphasisBegin -> + Err "unexpected EmphasisBegin; expected block" + EmphasisEnd -> + Err "unexpected EmphasisEnd; expected block" + StrongBegin -> + Err "unexpected StrongBegin; expected block" + StrongEnd -> + Err "unexpected StrongEnd; expected block" + StrikethroughBegin -> + Err "unexpected StrikethroughBegin; expected block" + StrikethroughEnd -> + Err "unexpected StrikethroughEnd; expected block" + CodeSpan String -> + Err "unexpected CodeSpan; expected block" + Text String -> + Err "unexpected Text; expected block" + HardLineBreak -> + Err "unexpected HardLineBreak; expected block" + +toInline : MdElement -> Result String (Mdf, List MB.Inline) +toInline mde = + case mde of + HtmlBlock hblock -> + Err "unexpectd HtmlBlock" + UnorderedListStart listSpacing -> -- (List (ListItem Block)) + Err "unexpectd UnorderedListStart" + UnorderedListItem _ _ -> + Err "unexpected UnorderedListItem" + UnorderedListEnd -> + Err "unexpected UnorderedListEnd" + OrderedListStart listSpacing offset -> -- (List (List Block)) + Err "unexpectd OrderedListStart" + OrderedListItem _ -> + Err "unexpected OrderedListItem" + OrderedListEnd -> + Err "unexpected OrderedListEnd" + BlockQuoteStart -> -- list blocks + Err "unexpectd BlockQuoteStart" + BlockQuoteEnd -> + Err "unexpectd BlockQuoteEnd" + -- Leaf Blocks With Inlines + HeadingStart headingLevel -> + Err "unexpectd HeadingStart" + HeadingEnd -> + Err "unexpected HeadingEnd" + ParagraphStart -> + Err "unexpectd ParagraphStart" + ParagraphEnd -> + Err "unexpected ParagraphEnd" + Table heading data -> + Err "unexpectd Table" + -- Leaf Blocks Without Inlines + CodeBlock code + Err "unexpectd CodeBlock" + ThematicBreak -> + Err "unexpectd ThematicBreak" + -- Inlines + HtmlInline hblock -> + Err "unexpectd HtmlInline" + Link url maybeTitle inlines -> + Ok (Mdfe, [MB.Link url maybeTitle inlines]) Image url maybeTitle inlines -> - EmphasisBegin - EmphasisEnd - StrongBegin - StrongEnd - StrikethroughBegin - StrikethroughEnd - CodeSpan String - Text String - HardLineBreak + Ok (Mdfe, [MB.Image url maybeTitle inlines]) + EmphasisBegin -> + Ok (Mdfi (accumInlines EmphasisEnd MB.Emphasis [] )) + EmphasisEnd -> Err "unexpected EmphasisEnd" + + StrongBegin -> + Ok (Mdfi (accumInlines StrongEnd MB.Emphasis [] )) + + StrongEnd ->Err "unexpected StrongEnd" + + StrikethroughBegin -> + Ok (Mdfi (accumInlines StrikethroughEnd MB.Emphasis [] )) + + StrikethroughEnd ->Err "unexpected StrikethroughEnd" + + CodeSpan string -> + + Ok(Mdfe, [MB.CodeSpan string]) + Text string -> + Ok(Mdfe, [MB.CodeSpan string]) + HardLineBreak -> + Ok(Mdfe, [MB.HardLineBreak]) From abbc5add9cbc5bae65569235f36d382325275da6 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Wed, 15 Mar 2023 23:54:52 +0000 Subject: [PATCH 21/27] compiles --- elm/src/LinearMd.elm | 390 +++++++++++++++++++++---------------------- 1 file changed, 194 insertions(+), 196 deletions(-) diff --git a/elm/src/LinearMd.elm b/elm/src/LinearMd.elm index 8c183495..48aea9e2 100644 --- a/elm/src/LinearMd.elm +++ b/elm/src/LinearMd.elm @@ -46,243 +46,241 @@ type MdElement | HardLineBreak +toBlocks : List MdElement -> Result String (List MB.Block) +toBlocks elements = + let + st = + List.foldl mdfProc { blocks = [], result = Ok toMB } elements + in + case st.result of + Err e -> + Err e + + Ok _ -> + Ok st.blocks + + + +-- stack 'o states. +-- state is a function. +-- state can + + type alias State = - { mdbstack : List Mdb - , mdf : Mdf - , result : Result String (List MB.Block) + { blocks : List MB.Block + , result : Result String Mdfn } mdfProc : MdElement -> State -> State mdfProc elt state = - case state.result of - Err _ -> state - Ok mbs -> - case state.mdf mbs elt of - Err e -> {state | result - Err e} - Ok nmbs -> - - case List.head state.mdbstack of - Just mdf -> - case mdf of - Mdbf fn -> - state - - Mdif fn -> - state - - Nothing -> + case state.result of + Err _ -> state + Ok mdfn -> + case mdfn elt of + Err e -> + { state | result = Err e } -toBlocks : List MdElement -> Result String (List MB.Block) -toBlocks elements = - List.foldl - mdfProc - { mdbstack = [], mdf = Mdf toBlock, result = Ok [] } - elements - |> .result - + Ok (Mdeb block) -> + { state | blocks = block :: state.blocks } + Ok (Mdei inline) -> + { state | result = Err "unexpected inline" } --- stack 'o states. --- state is a function. --- state can - + Ok (Mdf fn) -> + { state | result = Ok fn } +type alias Mdfn = + MdElement -> Result String Mdf type Mdf - = Mdfb (MdElement -> Result String ( Mdf, List MB.Block )) - | Mdfi (MdElement -> Result String ( Mdf, List MB.Inline )) - | Mdfe + = Mdf Mdfn + | Mdeb MB.Block + | Mdei MB.Inline --- type Mdb --- = Mdbf (List MB.Block -> ( Mdf, List MB.Block )) --- | Mdif (List MB.Inline -> ( Mdf, List MB.Block )) - - -unorderedListItem : MB.ListSpacing -> List (MB.ListItem MB.Block) -> MdElement -> Result String ( Mdf, List MB.Block ) -unorderedListItem listSpacing items mde = +unorderedListItem : MB.ListSpacing -> List (MB.ListItem MB.Block) -> MdElement -> Result String Mdf +unorderedListItem listSpacing items mde = case mde of UnorderedListItem task blocks -> - Ok ( Mdf (unorderedListItem listSpacing (MB.ListItem task blocks :: items)), [] ) + Ok (Mdf (unorderedListItem listSpacing (MB.ListItem task blocks :: items))) UnorderedListEnd -> - Ok ( Mdf toBlock, [MB.UnorderedList listSpacing (List.reverse items)] ) + Ok (Mdeb (MB.UnorderedList listSpacing (List.reverse items))) _ -> Err "unexpected item" -orderedListItem : MB.ListSpacing -> Int -> List (List MB.Block) -> MdElement -> Result String ( Mdf, List MB.Block ) -orderedListItem listSpacing offset items mbs mde = +orderedListItem : MB.ListSpacing -> Int -> List (List MB.Block) -> MdElement -> Result String Mdf +orderedListItem listSpacing offset items mde = case mde of OrderedListItem blocks -> - Ok ( Mdf (orderedListItem listSpacing offset (blocks :: items)), [] ) + Ok (Mdf (orderedListItem listSpacing offset (blocks :: items))) OrderedListEnd -> - Ok ( Mdf toBlock, [MB.OrderedList listSpacing offset items ]) + Ok (Mdeb (MB.OrderedList listSpacing offset items)) _ -> Err "unexpected item" --- blockQuote : List MB.Block -> -accumInlinesToB : MdElement -> (List MB.Inline -> MB.Inline) -> List MB.Inline -> MdElement -> Result String (Mdf, List MB.Block) -accumInlinesToB endelt endcontainer accum elt = - if elt == endelt then - Ok (Mdfe, endcontainer accum) +accumInlines : MdElement -> (List MB.Inline -> MB.Inline) -> List MB.Inline -> Mdfn -> MdElement -> Result String Mdf +accumInlines endelt endcontainer accum mdfn elt = + if elt == endelt then + Ok (Mdei (endcontainer (List.reverse accum))) + else - - -accumInlines : MdElement -> (List MB.Inline -> MB.Inline) -> List MB.Inline -> MdElement -> Result String (Mdf, List MB.Inline) -accumInlines endelt endcontainer accum elt = - case toInline elt of - Mdfb -> - Err "bad accum" - Mdfi fn -> - - - -andThenInline : (MdElement -> Result String ( Mdf, List MB.Inline )) - -> (MdElement -> Result String ( Mdf, List MB.Inline )) - -> MdElement -> Result String ( Mdf, List MB.Inline ) -andThenInline fn1 fn2 elt = - case fn2 elt of - (Mdfi newf -> - - - -toBlock : MdElement -> Result String ( Mdf, List MB.Block ) -toBlock mde = - case mde of - HtmlBlock hblock -> - Ok ( Mdf toBlock, [MB.HtmlBlock hblock] ) - UnorderedListStart listSpacing -> -- (List (ListItem Block)) - Ok ( Mdf unorderedListItem listSpacing [], [] ) - UnorderedListItem _ _ -> - Err "unexpected UnorderedListItem" - UnorderedListEnd -> - Err "unexpected UnorderedListEnd" - OrderedListStart listSpacing offset -> -- (List (List Block)) - Ok ( Mdf orderedListItem listSpacing offset [], [] ) - OrderedListItem _ -> - Err "unexpected OrderedListItem" - OrderedListEnd -> - Err "unexpected OrderedListEnd" - BlockQuoteStart -> -- list blocks - Ok ( Mdfb MB.BlockQuote toBlock, []) - BlockQuoteEnd -> - Ok (Mdfe, mbs) - -- Leaf Blocks With Inlines - HeadingStart headingLevel -> - Ok (Mdfi MB.Heading ) - HeadingEnd -> - ParagraphStart -> - Ok (Mdfi MB.Paragraph ) - ParagraphEnd -> - Err "unexpected ParagraphEnd" - Table heading data -> - Ok (Mdf toBlock [MB.Table heading data ]) - -- Leaf Blocks Without Inlines - CodeBlock code - -> Ok (Mdf toBlock [MB.CodeBlock code ]) - ThematicBreak -> Ok (Mdf toBlock [MB.ThematicBreak ]) - -- Inlines - HtmlInline hblock -> - Err "unexpected HtmlInline; expected block" - Link url maybeTitle inlines -> - Err "unexpected Link; expected block" - Image url maybeTitle inlines -> - Err "unexpected Image; expected block" - EmphasisBegin -> - Err "unexpected EmphasisBegin; expected block" - EmphasisEnd -> - Err "unexpected EmphasisEnd; expected block" - StrongBegin -> - Err "unexpected StrongBegin; expected block" - StrongEnd -> - Err "unexpected StrongEnd; expected block" - StrikethroughBegin -> - Err "unexpected StrikethroughBegin; expected block" - StrikethroughEnd -> - Err "unexpected StrikethroughEnd; expected block" - CodeSpan String -> - Err "unexpected CodeSpan; expected block" - Text String -> - Err "unexpected Text; expected block" - HardLineBreak -> - Err "unexpected HardLineBreak; expected block" - -toInline : MdElement -> Result String (Mdf, List MB.Inline) -toInline mde = - case mde of - HtmlBlock hblock -> - Err "unexpectd HtmlBlock" - UnorderedListStart listSpacing -> -- (List (ListItem Block)) - Err "unexpectd UnorderedListStart" - UnorderedListItem _ _ -> - Err "unexpected UnorderedListItem" - UnorderedListEnd -> - Err "unexpected UnorderedListEnd" - OrderedListStart listSpacing offset -> -- (List (List Block)) - Err "unexpectd OrderedListStart" - OrderedListItem _ -> - Err "unexpected OrderedListItem" - OrderedListEnd -> - Err "unexpected OrderedListEnd" - BlockQuoteStart -> -- list blocks - Err "unexpectd BlockQuoteStart" - BlockQuoteEnd -> - Err "unexpectd BlockQuoteEnd" - -- Leaf Blocks With Inlines - HeadingStart headingLevel -> - Err "unexpectd HeadingStart" - HeadingEnd -> + case mdfn elt of + Err e -> + Err e + + Ok (Mdeb blocks) -> + Err "expected inlines not blocks" + + Ok (Mdei inline) -> + Ok (Mdf <| accumInlines endelt endcontainer (inline :: accum) toMB) + + Ok (Mdf fn) -> + Ok (Mdf <| accumInlines endelt endcontainer accum fn) + + +accumInlinesToBlock : MdElement -> (List MB.Inline -> MB.Block) -> List MB.Inline -> Mdfn -> MdElement -> Result String Mdf +accumInlinesToBlock endelt endcontainer accum mdfn elt = + if elt == endelt then + Ok (Mdeb (endcontainer (List.reverse accum))) + + else + case mdfn elt of + Err e -> + Err e + + Ok (Mdeb blocks) -> + Err "expected inlines not blocks" + + Ok (Mdei inline) -> + Ok (Mdf <| accumInlinesToBlock endelt endcontainer (inline :: accum) toMB) + + Ok (Mdf fn) -> + Ok (Mdf <| accumInlinesToBlock endelt endcontainer accum fn) + + +accumBlocks : MdElement -> (List MB.Block -> MB.Block) -> List MB.Block -> Mdfn -> MdElement -> Result String Mdf +accumBlocks endelt endcontainer accum mdfn elt = + if elt == endelt then + Ok (Mdeb (endcontainer (List.reverse accum))) + + else + case mdfn elt of + Err e -> + Err e + + Ok (Mdeb block) -> + Ok (Mdf <| accumBlocks endelt endcontainer (block :: accum) mdfn) + + Ok (Mdei _) -> + Err "expected blocks not inlines" + + Ok (Mdf fn) -> + Ok (Mdf <| accumBlocks endelt endcontainer accum fn) + + +toMB : MdElement -> Result String Mdf +toMB mde = + case mde of + HtmlBlock hblock -> + Ok (Mdeb <| MB.HtmlBlock hblock) + + UnorderedListStart listSpacing -> + -- (List (ListItem Block)) + Ok (Mdf (unorderedListItem listSpacing [])) + + UnorderedListItem _ _ -> + Err "unexpected UnorderedListItem" + + UnorderedListEnd -> + Err "unexpected UnorderedListEnd" + + OrderedListStart listSpacing offset -> + -- (List (List Block)) + Ok (Mdf <| orderedListItem listSpacing offset []) + + OrderedListItem _ -> + Err "unexpected OrderedListItem" + + OrderedListEnd -> + Err "unexpected OrderedListEnd" + + BlockQuoteStart -> + -- list blocks + Ok (Mdf (accumBlocks BlockQuoteEnd MB.BlockQuote [] toMB)) + + BlockQuoteEnd -> + Err "unexpected BlockQuoteEnd" + + -- Leaf Blocks With Inlines + HeadingStart headingLevel -> + Ok (Mdf (accumInlinesToBlock HeadingEnd (MB.Heading headingLevel) [] toMB)) + + HeadingEnd -> Err "unexpected HeadingEnd" - ParagraphStart -> - Err "unexpectd ParagraphStart" - ParagraphEnd -> + + ParagraphStart -> + Ok (Mdf (accumInlinesToBlock ParagraphEnd MB.Paragraph [] toMB)) + + ParagraphEnd -> Err "unexpected ParagraphEnd" - Table heading data -> - Err "unexpectd Table" - -- Leaf Blocks Without Inlines - CodeBlock code - Err "unexpectd CodeBlock" - ThematicBreak -> - Err "unexpectd ThematicBreak" - -- Inlines - HtmlInline hblock -> + + Table heading data -> + Ok (Mdeb (MB.Table heading data)) + + -- Leaf Blocks Without Inlines + CodeBlock code -> + Ok (Mdeb (MB.CodeBlock code)) + + ThematicBreak -> + Ok (Mdeb MB.ThematicBreak) + + -- Inlines + HtmlInline hblock -> Err "unexpectd HtmlInline" - Link url maybeTitle inlines -> - Ok (Mdfe, [MB.Link url maybeTitle inlines]) - Image url maybeTitle inlines -> - Ok (Mdfe, [MB.Image url maybeTitle inlines]) - EmphasisBegin -> - Ok (Mdfi (accumInlines EmphasisEnd MB.Emphasis [] )) - EmphasisEnd -> Err "unexpected EmphasisEnd" - - StrongBegin -> - Ok (Mdfi (accumInlines StrongEnd MB.Emphasis [] )) - - StrongEnd ->Err "unexpected StrongEnd" - - StrikethroughBegin -> - Ok (Mdfi (accumInlines StrikethroughEnd MB.Emphasis [] )) - - StrikethroughEnd ->Err "unexpected StrikethroughEnd" - - CodeSpan string -> - - Ok(Mdfe, [MB.CodeSpan string]) - Text string -> - Ok(Mdfe, [MB.CodeSpan string]) - HardLineBreak -> - Ok(Mdfe, [MB.HardLineBreak]) + Link url maybeTitle inlines -> + Ok (Mdei (MB.Link url maybeTitle inlines)) + + Image url maybeTitle inlines -> + Ok (Mdei (MB.Image url maybeTitle inlines)) + + EmphasisBegin -> + Ok (Mdf (accumInlines EmphasisEnd MB.Emphasis [] toMB)) + + EmphasisEnd -> + Err "unexpected EmphasisEnd" + + StrongBegin -> + Ok (Mdf (accumInlines StrongEnd MB.Emphasis [] toMB)) + + StrongEnd -> + Err "unexpected StrongEnd" + + StrikethroughBegin -> + Ok (Mdf (accumInlines StrikethroughEnd MB.Emphasis [] toMB)) + + StrikethroughEnd -> + Err "unexpected StrikethroughEnd" + + CodeSpan string -> + Ok (Mdei (MB.CodeSpan string)) + + Text string -> + Ok (Mdei (MB.CodeSpan string)) + + HardLineBreak -> + Ok (Mdei MB.HardLineBreak) viewMdElement : MdElement -> Element msg From 43b53a34daaf53c9470a5560b187d1e1e24b0592 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Thu, 16 Mar 2023 02:12:16 +0000 Subject: [PATCH 22/27] build button --- elm/src/LinearMd.elm | 31 +++++++++++++++++++-------- elm/src/ViewLinearMd.elm | 45 ++++++++++++++++++++++++++++++++++------ 2 files changed, 61 insertions(+), 15 deletions(-) diff --git a/elm/src/LinearMd.elm b/elm/src/LinearMd.elm index 48aea9e2..d925ed9e 100644 --- a/elm/src/LinearMd.elm +++ b/elm/src/LinearMd.elm @@ -1,4 +1,4 @@ -module LinearMd exposing (MdElement(..), lpad, mbToMe, miToMe, viewMdElement, viewhtml) +module LinearMd exposing (..) import Element as E exposing (Element) import Element.Background as EBk @@ -57,7 +57,7 @@ toBlocks elements = Err e Ok _ -> - Ok st.blocks + Ok (List.reverse st.blocks) @@ -74,6 +74,10 @@ type alias State = mdfProc : MdElement -> State -> State mdfProc elt state = + -- let + -- _ = + -- Debug.log "mdfProc elt, blocks" ( elt, state.blocks ) + -- in case state.result of Err _ -> state @@ -84,7 +88,7 @@ mdfProc elt state = { state | result = Err e } Ok (Mdeb block) -> - { state | blocks = block :: state.blocks } + { state | blocks = block :: state.blocks, result = Ok toMB } Ok (Mdei inline) -> { state | result = Err "unexpected inline" } @@ -140,10 +144,10 @@ accumInlines endelt endcontainer accum mdfn elt = Err e Ok (Mdeb blocks) -> - Err "expected inlines not blocks" + Err "accumInlines - expected inlines not blocks" Ok (Mdei inline) -> - Ok (Mdf <| accumInlines endelt endcontainer (inline :: accum) toMB) + Ok (Mdf <| accumInlines endelt endcontainer (inline :: accum) mdfn) Ok (Mdf fn) -> Ok (Mdf <| accumInlines endelt endcontainer accum fn) @@ -152,18 +156,27 @@ accumInlines endelt endcontainer accum mdfn elt = accumInlinesToBlock : MdElement -> (List MB.Inline -> MB.Block) -> List MB.Inline -> Mdfn -> MdElement -> Result String Mdf accumInlinesToBlock endelt endcontainer accum mdfn elt = if elt == endelt then + -- Ok (Mdeb (Debug.log "return" (endcontainer (List.reverse accum)))) Ok (Mdeb (endcontainer (List.reverse accum))) else + -- let + -- _ = + -- Debug.log "mdfn elt, endelt" ( elt, endelt ) + -- in case mdfn elt of Err e -> Err e - Ok (Mdeb blocks) -> - Err "expected inlines not blocks" + Ok (Mdeb block) -> + -- let + -- _ = + -- Debug.log "blocjk" block + -- in + Err "accumInlinesToBlock - expected inlines not blocks" Ok (Mdei inline) -> - Ok (Mdf <| accumInlinesToBlock endelt endcontainer (inline :: accum) toMB) + Ok (Mdf <| accumInlinesToBlock endelt endcontainer (inline :: accum) mdfn) Ok (Mdf fn) -> Ok (Mdf <| accumInlinesToBlock endelt endcontainer accum fn) @@ -277,7 +290,7 @@ toMB mde = Ok (Mdei (MB.CodeSpan string)) Text string -> - Ok (Mdei (MB.CodeSpan string)) + Ok (Mdei (MB.Text string)) HardLineBreak -> Ok (Mdei MB.HardLineBreak) diff --git a/elm/src/ViewLinearMd.elm b/elm/src/ViewLinearMd.elm index c3686dc8..e7ee69c5 100644 --- a/elm/src/ViewLinearMd.elm +++ b/elm/src/ViewLinearMd.elm @@ -11,9 +11,11 @@ import Element.Font as EF import Element.Input as EI import Element.Region as ER import Html.Attributes as HA -import LinearMd exposing (MdElement(..), lpad, mbToMe, miToMe, viewMdElement, viewhtml) +import LinearMd exposing (MdElement(..), lpad, mbToMe, miToMe, toBlocks, viewMdElement, viewhtml) import Markdown.Block as MB import Markdown.Html +import Markdown.Renderer as MR +import MdText as MT import TangoColors as TC @@ -23,6 +25,7 @@ type alias Model = , nextMdElementId : Int , cleanMdElements : Array EditMdElement , blockDnd : DnDList.Model + , built : Maybe String } @@ -37,6 +40,7 @@ type Msg | MdElementDndMsg DnDList.Msg | MdElementClicked Int | DeleteMdElement Int + | BuildPress type DragDropWhat @@ -60,6 +64,7 @@ init blocks = , nextMdElementId = Array.length ba , cleanMdElements = ba , blockDnd = blockDndSystem.model + , built = Nothing } @@ -111,11 +116,13 @@ view model = , E.htmlAttribute (HA.id "steplist") ] <| - (Array.indexedMap - (\i -> viewMdElementDnd model.blockDnd i model.focusMdElement) - model.blocks - |> Array.toList - ) + EI.button Common.buttonStyle { onPress = Just BuildPress, label = E.text "build" } + :: E.text (Maybe.withDefault "" model.built) + :: (Array.indexedMap + (\i -> viewMdElementDnd model.blockDnd i model.focusMdElement) + model.blocks + |> Array.toList + ) viewMdElementDnd : DnDList.Model -> Int -> Maybe Int -> EditMdElement -> Element Msg @@ -251,6 +258,32 @@ ghostView model = update : Model -> Msg -> ( Model, Cmd Msg ) update model msg = case msg of + BuildPress -> + let + st = + model.blocks + |> Array.toList + |> List.map .block + |> LinearMd.toBlocks + |> Result.andThen + (\blocks -> + MR.render MT.stringRenderer blocks + |> Result.map String.concat + ) + in + ( { model + | built = + Just <| + case st of + Ok s -> + s + + Err s -> + s + } + , Cmd.none + ) + AddMdElementPress -> ( model, Cmd.none ) From bc9cf9f96f1c180b2be256e2f81a04a8bafe7dd4 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Sun, 19 Mar 2023 14:59:05 +0000 Subject: [PATCH 23/27] comment --- elm/src/LinearMd.elm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/elm/src/LinearMd.elm b/elm/src/LinearMd.elm index d925ed9e..09f832f5 100644 --- a/elm/src/LinearMd.elm +++ b/elm/src/LinearMd.elm @@ -60,12 +60,6 @@ toBlocks elements = Ok (List.reverse st.blocks) - --- stack 'o states. --- state is a function. --- state can - - type alias State = { blocks : List MB.Block , result : Result String Mdfn From 9ed7a3179f6de3e89548d2f06ef40b1a945a7ef5 Mon Sep 17 00:00:00 2001 From: Ben Burdette <> Date: Fri, 28 Apr 2023 10:08:35 -0600 Subject: [PATCH 24/27] merge --- Cargo.lock | 927 ++++++++++++++++++++++++------------ elm/elm-srcs.nix | 148 +++--- elm/elm.json | 1 + elm/registry.dat | Bin 124006 -> 129452 bytes elm/src/Data.elm | 40 +- elm/src/EditZkNote.elm | 45 +- elm/src/Main.elm | 731 +++++++++++++++------------- elm/src/MdCommon.elm | 233 +++++++-- elm/src/PublicInterface.elm | 15 +- elm/src/View.elm | 11 +- elm/src/ZkInterface.elm | 24 +- flake.lock | 30 +- orgauth | 2 +- server/Cargo.toml | 4 +- server/src/interfaces.rs | 37 +- server/src/migrations.rs | 23 +- server/src/sqldata.rs | 31 +- server/static/windowkey.js | 17 +- zkprotocol/src/content.rs | 14 + 19 files changed, 1520 insertions(+), 813 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c7c37d40..e58ce862 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,12 +8,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78d1833b3838dbe990df0f1f87baf640cf6146e898166afe401839d1b001e570" dependencies = [ - "bitflags", + "bitflags 1.3.2", "bytes 0.5.6", "futures-core", "futures-sink", "log", - "pin-project 0.4.29", + "pin-project 0.4.30", "tokio", "tokio-util", ] @@ -59,7 +59,7 @@ checksum = "c51e8a9146c12fce92a6e4c24b8c4d9b05268130bfd8d61bc587e822c32ce689" dependencies = [ "actix-service", "actix-web", - "bitflags", + "bitflags 1.3.2", "bytes 0.5.6", "derive_more", "futures-core", @@ -83,8 +83,8 @@ dependencies = [ "actix-service", "actix-threadpool", "actix-utils", - "base64 0.13.0", - "bitflags", + "base64 0.13.1", + "bitflags 1.3.2", "brotli", "bytes 0.5.6", "cookie", @@ -107,7 +107,7 @@ dependencies = [ "log", "mime", "percent-encoding", - "pin-project 1.0.10", + "pin-project 1.0.12", "rand 0.7.3", "regex", "serde", @@ -125,7 +125,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ca8ce00b267af8ccebbd647de0d61e0674b6e61185cc7a592ff88772bed655" dependencies = [ "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -201,7 +201,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0052435d581b5be835d11f4eb3bce417c8af18d87ddf8ace99f8e67e595882bb" dependencies = [ "futures-util", - "pin-project 0.4.29", + "pin-project 0.4.30", ] [[package]] @@ -269,14 +269,14 @@ dependencies = [ "actix-codec", "actix-rt", "actix-service", - "bitflags", + "bitflags 1.3.2", "bytes 0.5.6", "either", "futures-channel", "futures-sink", "futures-util", "log", - "pin-project 0.4.29", + "pin-project 0.4.30", "slab", ] @@ -308,7 +308,7 @@ dependencies = [ "fxhash", "log", "mime", - "pin-project 1.0.10", + "pin-project 1.0.12", "regex", "serde", "serde_json", @@ -327,7 +327,7 @@ checksum = "ad26f77093333e0e7c6ffe54ebe3582d908a104e448723eec6d43d08b07143fb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -396,35 +396,44 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.9", "once_cell", "version_check 0.9.4", ] [[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] [[package]] name = "alloc-no-stdlib" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -442,13 +451,13 @@ checksum = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a" [[package]] name = "async-trait" -version = "0.1.56" +version = "0.1.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -457,7 +466,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi 0.3.9", ] @@ -487,7 +496,7 @@ dependencies = [ "actix-http", "actix-rt", "actix-service", - "base64 0.13.0", + "base64 0.13.1", "bytes 0.5.6", "cfg-if 1.0.0", "derive_more", @@ -509,9 +518,9 @@ checksum = "ad9e605929a6964efbec5ac0884bd0fe93f12a3b1eb271f52c251316640c68d9" [[package]] name = "base-x" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc19a4937b4fbd3fe3379793130e42060d10627a360f2127802b10b87e7baf74" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" [[package]] name = "base64" @@ -534,9 +543,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "bitflags" @@ -544,6 +553,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c70beb79cbb5ce9c4f8e20849978f34225931f665bb49efa6982875a4d5facb3" + [[package]] name = "block-buffer" version = "0.9.0" @@ -566,9 +581,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.2" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -591,9 +606,9 @@ checksum = "40e38929add23cdf8a366df9b0e088953150724bcbe5fc330b0d8eb3b328eec8" [[package]] name = "bumpalo" -version = "3.10.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "byteorder" @@ -609,24 +624,24 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "bytestring" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b6a75fd3048808ef06af5cd79712be8111960adaf89d90250974b38fc3928a" +checksum = "238e4886760d98c4f899360c834fa93e62cf7f721ac3c2da375cbdf4b8679aae" dependencies = [ - "bytes 1.1.0", + "bytes 1.4.0", ] [[package]] name = "cc" -version = "1.0.73" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-if" @@ -642,14 +657,16 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", - "time 0.1.44", + "time 0.1.45", + "wasm-bindgen", "winapi 0.3.9", ] @@ -670,7 +687,7 @@ checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", - "bitflags", + "bitflags 1.3.2", "strsim", "textwrap", "unicode-width", @@ -683,7 +700,17 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" dependencies = [ - "bitflags", + "bitflags 1.3.2", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", ] [[package]] @@ -723,7 +750,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a5d7b21829bc7b4bf4754a978a241ae54ea55a40f92bb20216e54096f4b951" dependencies = [ "aes-gcm", - "base64 0.13.0", + "base64 0.13.1", "hkdf", "hmac", "percent-encoding", @@ -751,15 +778,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.2" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" dependencies = [ "libc", ] @@ -810,6 +837,50 @@ dependencies = [ "cipher", ] +[[package]] +name = "cxx" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn 2.0.15", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -820,7 +891,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.0", - "syn", + "syn 1.0.109", ] [[package]] @@ -840,9 +911,9 @@ checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" [[package]] name = "either" -version = "1.6.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "email" @@ -855,7 +926,7 @@ dependencies = [ "encoding", "lazy_static", "rand 0.4.6", - "time 0.1.44", + "time 0.1.45", "version_check 0.1.5", ] @@ -925,9 +996,9 @@ checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if 1.0.0", ] @@ -941,7 +1012,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -957,6 +1028,27 @@ dependencies = [ "termcolor", ] +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -980,18 +1072,18 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ "instant", ] [[package]] name = "flate2" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" dependencies = [ "crc32fast", "miniz_oxide", @@ -1020,11 +1112,10 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "matches", "percent-encoding", ] @@ -1040,7 +1131,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" dependencies = [ - "bitflags", + "bitflags 1.3.2", "fuchsia-zircon-sys", ] @@ -1058,9 +1149,9 @@ checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" [[package]] name = "futures" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", @@ -1072,9 +1163,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", "futures-sink", @@ -1082,44 +1173,44 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-io" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-macro" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-channel", "futures-core", @@ -1144,9 +1235,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.5" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check 0.9.4", @@ -1165,9 +1256,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" dependencies = [ "cfg-if 1.0.0", "libc", @@ -1206,33 +1297,27 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" - [[package]] name = "hashlink" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa" dependencies = [ - "hashbrown 0.11.2", + "hashbrown", ] [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -1243,6 +1328,21 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.3.2" @@ -1298,20 +1398,20 @@ dependencies = [ [[package]] name = "http" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ - "bytes 1.1.0", + "bytes 1.4.0", "fnv", - "itoa 1.0.2", + "itoa 1.0.6", ] [[package]] name = "httparse" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "humantime" @@ -1322,6 +1422,30 @@ dependencies = [ "quick-error", ] +[[package]] +name = "iana-time-zone" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +dependencies = [ + "cxx", + "cxx-build", +] + [[package]] name = "idna" version = "0.2.3" @@ -1333,14 +1457,24 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.9.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c6392766afd7964e2531940894cffe4bd8d7d17dbc3c1c4857040fd4b33bdb3" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg 1.1.0", - "hashbrown 0.12.1", + "hashbrown", ] [[package]] @@ -1352,6 +1486,17 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "iovec" version = "0.1.4" @@ -1381,9 +1526,18 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.2" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "js-sys" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] [[package]] name = "json" @@ -1441,37 +1595,52 @@ dependencies = [ "email", "lettre", "mime", - "time 0.1.44", + "time 0.1.45", "uuid 0.7.4", ] [[package]] name = "libc" -version = "0.2.126" +version = "0.2.141" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" [[package]] name = "libsqlite3-sys" -version = "0.24.2" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14" +checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" dependencies = [ "pkg-config", "vcpkg", ] +[[package]] +name = "link-cplusplus" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" +dependencies = [ + "cc", +] + [[package]] name = "linked-hash-map" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" [[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ "autocfg 1.1.0", "scopeguard", @@ -1503,9 +1672,9 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matches" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "memchr" @@ -1515,9 +1684,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" @@ -1531,9 +1700,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.5.3" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" dependencies = [ "adler", ] @@ -1582,9 +1751,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" dependencies = [ "lazy_static", "libc", @@ -1600,9 +1769,9 @@ dependencies = [ [[package]] name = "net2" -version = "0.2.37" +version = "0.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" +checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631" dependencies = [ "cfg-if 0.1.10", "libc", @@ -1640,19 +1809,19 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] [[package]] name = "once_cell" -version = "1.12.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -1662,11 +1831,11 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.40" +version = "0.10.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" +checksum = "7e30d8bc91859781f0a943411186324d580f2bbeb71b452fe91ae344806af3f1" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if 1.0.0", "foreign-types", "libc", @@ -1677,13 +1846,13 @@ dependencies = [ [[package]] name = "openssl-macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -1694,11 +1863,10 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.74" +version = "0.9.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1" +checksum = "0d3d193fb1488ad46ffe3aaabc912cc931d02ee8518fe2959aea8ef52718b0c0" dependencies = [ - "autocfg 1.1.0", "cc", "libc", "pkg-config", @@ -1713,7 +1881,7 @@ dependencies = [ "actix-session", "actix-web", "barrel", - "base64 0.13.0", + "base64 0.13.1", "chrono", "clap", "crypto-hash", @@ -1730,7 +1898,7 @@ dependencies = [ "serde_derive", "serde_json", "simple-error", - "time 0.1.44", + "time 0.1.45", "timer", "toml", "uuid 0.8.2", @@ -1749,62 +1917,62 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "smallvec", "winapi 0.3.9", ] [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pin-project" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9615c18d31137579e9ff063499264ddc1278e7b1982757ebc111028c4d1dc909" +checksum = "3ef0f924a5ee7ea9cbcea77529dba45f8a9ba9f622419fe3386ca581a3ae9d5a" dependencies = [ - "pin-project-internal 0.4.29", + "pin-project-internal 0.4.30", ] [[package]] name = "pin-project" -version = "1.0.10" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" dependencies = [ - "pin-project-internal 1.0.10", + "pin-project-internal 1.0.12", ] [[package]] name = "pin-project-internal" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "044964427019eed9d49d9d5bbce6047ef18f37100ea400912a9fa4a3523ab12a" +checksum = "851c8d0ce9bebe43790dedfc86614c23494ac9f423dd618d3a61fc693eafe61e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "pin-project-internal" -version = "1.0.10" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1827,9 +1995,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" [[package]] name = "polyval" @@ -1844,21 +2012,21 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro-hack" -version = "0.5.19" +version = "0.5.20+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.40" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ "unicode-ident", ] @@ -1871,9 +2039,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.20" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ "proc-macro2", ] @@ -1944,7 +2112,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", - "rand_core 0.6.3", + "rand_core 0.6.4", ] [[package]] @@ -1974,7 +2142,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.3", + "rand_core 0.6.4", ] [[package]] @@ -2003,11 +2171,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.9", ] [[package]] @@ -2092,18 +2260,27 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.5.6" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" +checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" dependencies = [ "aho-corasick", "memchr", @@ -2112,18 +2289,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" +version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi 0.3.9", -] +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "resolv-conf" @@ -2137,16 +2305,15 @@ dependencies = [ [[package]] name = "rusqlite" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85127183a999f7db96d1a976a309eebbfb6ea3b0b400ddd8340190129de6eb7a" +checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2" dependencies = [ - "bitflags", + "bitflags 2.1.0", "fallible-iterator", "fallible-streaming-iterator", "hashlink", "libsqlite3-sys", - "memchr", "smallvec", ] @@ -2165,14 +2332,28 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.10", + "semver 1.0.17", +] + +[[package]] +name = "rustix" +version = "0.37.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", ] [[package]] name = "ryu" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "safemem" @@ -2182,12 +2363,11 @@ checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" [[package]] name = "schannel" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" dependencies = [ - "lazy_static", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2196,13 +2376,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "scratch" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" + [[package]] name = "security-framework" -version = "2.6.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -2211,9 +2397,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" dependencies = [ "core-foundation-sys", "libc", @@ -2230,9 +2416,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.10" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41d061efea015927ac527063765e73601444cdc344ba855bc7bd44578b25e1c" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "semver-parser" @@ -2242,31 +2428,31 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.137" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] name = "serde_json" -version = "1.0.81" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ - "itoa 1.0.2", + "itoa 1.0.6", "ryu", "serde", ] @@ -2278,7 +2464,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.2", + "itoa 1.0.6", "ryu", "serde", ] @@ -2326,9 +2512,9 @@ dependencies = [ [[package]] name = "sha256" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e334db67871c14c18fc066ad14af13f9fdf5f9a91c61af432d1e3a39c8c6a141" +checksum = "328169f167261957e83d82be47f9e36629e257c62308129033d7f7e7c173d180" dependencies = [ "hex 0.4.3", "sha2", @@ -2336,9 +2522,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] @@ -2351,15 +2537,18 @@ checksum = "cc47a29ce97772ca5c927f75bac34866b16d64e07f330c3248e2d7226623901b" [[package]] name = "slab" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg 1.1.0", +] [[package]] name = "smallvec" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "socket2" @@ -2405,7 +2594,7 @@ dependencies = [ "quote", "serde", "serde_derive", - "syn", + "syn 1.0.109", ] [[package]] @@ -2421,7 +2610,7 @@ dependencies = [ "serde_derive", "serde_json", "sha1", - "syn", + "syn 1.0.109", ] [[package]] @@ -2444,9 +2633,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.98" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" dependencies = [ "proc-macro2", "quote", @@ -2455,23 +2655,22 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.3.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" dependencies = [ "cfg-if 1.0.0", "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi 0.3.9", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.45.0", ] [[package]] name = "termcolor" -version = "1.1.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] @@ -2487,22 +2686,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -2516,9 +2715,9 @@ dependencies = [ [[package]] name = "time" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" dependencies = [ "libc", "wasi 0.10.0+wasi-snapshot-preview1", @@ -2560,7 +2759,7 @@ dependencies = [ "proc-macro2", "quote", "standback", - "syn", + "syn 1.0.109", ] [[package]] @@ -2583,9 +2782,9 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" @@ -2623,18 +2822,18 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] name = "tracing" -version = "0.1.35" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if 1.0.0", "log", @@ -2644,9 +2843,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.27" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7709595b8878a4965ce5e87ebf880a7d39c9afc6837721b21a5a816a8117d921" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" dependencies = [ "once_cell", ] @@ -2657,7 +2856,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ - "pin-project 1.0.10", + "pin-project 1.0.12", "tracing", ] @@ -2670,8 +2869,8 @@ dependencies = [ "async-trait", "cfg-if 1.0.0", "enum-as-inner", - "futures 0.3.21", - "idna", + "futures 0.3.28", + "idna 0.2.3", "lazy_static", "log", "rand 0.7.3", @@ -2688,7 +2887,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "710f593b371175db53a26d0b38ed2978fafb9e9e8d3868b1acd753ea18df0ceb" dependencies = [ "cfg-if 0.1.10", - "futures 0.3.21", + "futures 0.3.28", "ipconfig", "lazy_static", "log", @@ -2712,9 +2911,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unchecked-index" @@ -2733,30 +2932,30 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.1" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "universal-hash" @@ -2770,13 +2969,12 @@ dependencies = [ [[package]] name = "url" -version = "2.2.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", - "idna", - "matches", + "idna 0.3.0", "percent-encoding", ] @@ -2795,7 +2993,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.9", "serde", ] @@ -2818,7 +3016,7 @@ dependencies = [ "nom", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2875,9 +3073,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.81" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -2885,24 +3083,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.81" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.81" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2910,22 +3108,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.81" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.81" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "widestring" @@ -2976,48 +3174,161 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", +] + [[package]] name = "windows-sys" -version = "0.36.1" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" -version = "0.36.1" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.36.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winreg" @@ -3057,7 +3368,7 @@ dependencies = [ "actix-session", "actix-web", "barrel", - "base64 0.13.0", + "base64 0.13.1", "chrono", "clap", "crypto-hash", @@ -3077,7 +3388,7 @@ dependencies = [ "serde_json", "sha256", "simple-error", - "time 0.1.44", + "time 0.1.45", "timer", "toml", "uuid 0.8.2", diff --git a/elm/elm-srcs.nix b/elm/elm-srcs.nix index c3ca7dbb..d38aeff0 100644 --- a/elm/elm-srcs.nix +++ b/elm/elm-srcs.nix @@ -1,8 +1,28 @@ { - "mdgriffith/elm-ui" = { - sha256 = "0ffcqv4a4ad400hwp824m3qq4jy82cqp5ghmhp1m0q7n004z6kgv"; - version = "1.1.8"; + "PanagiotisGeorgiadis/elm-datetime" = { + sha256 = "10fd2pad1kv8gm8zj2ixspyyxjqlzx50s3di17vl51gp41j05qbw"; + version = "1.3.0"; + }; + + "TSFoster/elm-uuid" = { + sha256 = "1a4a7hlp7mynbng9sykicm48zjwkw9w8bsik0zskgwa06qsmjq85"; + version = "4.1.0"; + }; + + "annaghi/dnd-list" = { + sha256 = "0pmnyiz1b0si8yip6wmixlybgxa8gnh3zwdpbxgq2zqwp7jx52xs"; + version = "6.0.1"; + }; + + "bburdette/cellme" = { + sha256 = "1sdcacja10f0y64jw4pr007hjf6ivhi8syi0mdvlw2vx61fdzvy7"; + version = "1.0.0"; + }; + + "bburdette/httpjsontask" = { + sha256 = "0lxc99j1c8zzw07c331r2yxriig84hwhnni6lhwqf6sxjlcjy3g4"; + version = "1.0.0"; }; "bburdette/schelme" = { @@ -10,14 +30,14 @@ version = "3.0.0"; }; - "elm/html" = { - sha256 = "1n3gpzmpqqdsldys4ipgyl1zacn0kbpc3g4v3hdpiyfjlgh8bf3k"; - version = "1.0.0"; + "bburdette/toop" = { + sha256 = "10i3j97pzc903n0rwkxna6g1pf3lg4zipgrg6r2glygzazaigbs7"; + version = "1.2.0"; }; - "elm/regex" = { - sha256 = "0lijsp50w7n1n57mjg6clpn9phly8vvs07h0qh2rqcs0f1jqvsa2"; - version = "1.0.0"; + "bburdette/typed-collections" = { + sha256 = "1j8hkw35dkc9kcdyxz2vqdv500b9pfar55bq20ybznkbm02c6k8w"; + version = "1.0.2"; }; "bburdette/windowkeys" = { @@ -25,44 +45,39 @@ version = "1.0.1"; }; + "dillonkearns/elm-markdown" = { + sha256 = "05chrkn14b3yyv3sq3466ys4bhwdxva853fzbyc1dyjpk3vslqsc"; + version = "7.0.0"; + }; + + "elm-community/maybe-extra" = { + sha256 = "185jy9jxx3bqf0xl3rmdxfqqmxzcr084llf32glr6hgl5agshywk"; + version = "5.3.0"; + }; + "elm/browser" = { sha256 = "0nagb9ajacxbbg985r4k9h0jadqpp0gp84nm94kcgbr5sf8i9x13"; version = "1.0.2"; }; - "bburdette/cellme" = { - sha256 = "1sdcacja10f0y64jw4pr007hjf6ivhi8syi0mdvlw2vx61fdzvy7"; - version = "1.0.0"; - }; - "elm/core" = { sha256 = "19w0iisdd66ywjayyga4kv2p1v9rxzqjaxhckp8ni6n8i0fb2dvf"; version = "1.0.5"; }; - "elm/url" = { - sha256 = "0av8x5syid40sgpl5vd7pry2rq0q4pga28b4yykn9gd9v12rs3l4"; - version = "1.0.0"; - }; - "elm/file" = { sha256 = "1rljcb41dl97myidyjih2yliyzddkr2m7n74x7gg46rcw4jl0ny8"; version = "1.0.5"; }; - "prikhi/http-tasks" = { - sha256 = "0b84zhq9cxpk2fp8n8drsh47gwqn9hdzjkcgqmh4fi98yi5aard5"; + "elm/html" = { + sha256 = "1n3gpzmpqqdsldys4ipgyl1zacn0kbpc3g4v3hdpiyfjlgh8bf3k"; version = "1.0.0"; }; - "bburdette/toop" = { - sha256 = "10i3j97pzc903n0rwkxna6g1pf3lg4zipgrg6r2glygzazaigbs7"; - version = "1.2.0"; - }; - - "elm-community/maybe-extra" = { - sha256 = "185jy9jxx3bqf0xl3rmdxfqqmxzcr084llf32glr6hgl5agshywk"; - version = "5.3.0"; + "elm/http" = { + sha256 = "008bs76mnp48b4dw8qwjj4fyvzbxvlrl4xpa2qh1gg2kfwyw56v1"; + version = "2.0.0"; }; "elm/json" = { @@ -75,34 +90,14 @@ version = "1.1.0"; }; - "dillonkearns/elm-markdown" = { - sha256 = "05chrkn14b3yyv3sq3466ys4bhwdxva853fzbyc1dyjpk3vslqsc"; - version = "7.0.0"; - }; - - "TSFoster/elm-uuid" = { - sha256 = "1a4a7hlp7mynbng9sykicm48zjwkw9w8bsik0zskgwa06qsmjq85"; - version = "4.1.0"; - }; - - "PanagiotisGeorgiadis/elm-datetime" = { - sha256 = "10fd2pad1kv8gm8zj2ixspyyxjqlzx50s3di17vl51gp41j05qbw"; - version = "1.3.0"; - }; - - "bburdette/typed-collections" = { - sha256 = "1j8hkw35dkc9kcdyxz2vqdv500b9pfar55bq20ybznkbm02c6k8w"; - version = "1.0.2"; - }; - "elm/random" = { sha256 = "138n2455wdjwa657w6sjq18wx2r0k60ibpc4frhbqr50sncxrfdl"; version = "1.0.0"; }; - "elm/http" = { - sha256 = "008bs76mnp48b4dw8qwjj4fyvzbxvlrl4xpa2qh1gg2kfwyw56v1"; - version = "2.0.0"; + "elm/regex" = { + sha256 = "0lijsp50w7n1n57mjg6clpn9phly8vvs07h0qh2rqcs0f1jqvsa2"; + version = "1.0.0"; }; "elm/time" = { @@ -110,19 +105,19 @@ version = "1.0.0"; }; - "TSFoster/elm-md5" = { - sha256 = "0qis57dmlaw97ixgpk30h569280bwrsr889hzy6pz9hzz184fym6"; - version = "2.0.0"; + "elm/url" = { + sha256 = "0av8x5syid40sgpl5vd7pry2rq0q4pga28b4yykn9gd9v12rs3l4"; + version = "1.0.0"; }; - "elm/virtual-dom" = { - sha256 = "0q1v5gi4g336bzz1lgwpn5b1639lrn63d8y6k6pimcyismp2i1yg"; - version = "1.0.2"; + "mdgriffith/elm-ui" = { + sha256 = "0ffcqv4a4ad400hwp824m3qq4jy82cqp5ghmhp1m0q7n004z6kgv"; + version = "1.1.8"; }; - "elm/bytes" = { - sha256 = "02ywbf52akvxclpxwj9n04jydajcbsbcbsnjs53yjc5lwck3abwj"; - version = "1.0.8"; + "prikhi/http-tasks" = { + sha256 = "0b84zhq9cxpk2fp8n8drsh47gwqn9hdzjkcgqmh4fi98yi5aard5"; + version = "1.0.0"; }; "TSFoster/elm-bytes-extra" = { @@ -130,14 +125,9 @@ version = "1.3.0"; }; - "zwilias/elm-utf-tools" = { - sha256 = "04wi45va7w2lyixvqhph2ainvjxba5vq8vy2qsk25qjaziz5hbja"; - version = "2.0.1"; - }; - - "rtfeldman/elm-hex" = { - sha256 = "1y0aa16asvwdqmgbskh5iba6psp43lkcjjw9mgzj3gsrg33lp00d"; - version = "1.0.0"; + "TSFoster/elm-md5" = { + sha256 = "0qis57dmlaw97ixgpk30h569280bwrsr889hzy6pz9hzz184fym6"; + version = "2.0.0"; }; "TSFoster/elm-sha1" = { @@ -150,6 +140,26 @@ version = "1.1.0"; }; + "elm/bytes" = { + sha256 = "02ywbf52akvxclpxwj9n04jydajcbsbcbsnjs53yjc5lwck3abwj"; + version = "1.0.8"; + }; + + "elm/virtual-dom" = { + sha256 = "0q1v5gi4g336bzz1lgwpn5b1639lrn63d8y6k6pimcyismp2i1yg"; + version = "1.0.2"; + }; + + "rtfeldman/elm-hex" = { + sha256 = "1y0aa16asvwdqmgbskh5iba6psp43lkcjjw9mgzj3gsrg33lp00d"; + version = "1.0.0"; + }; + + "zwilias/elm-utf-tools" = { + sha256 = "04wi45va7w2lyixvqhph2ainvjxba5vq8vy2qsk25qjaziz5hbja"; + version = "2.0.1"; + }; + "elm-explorations/test" = { sha256 = "1fsd7bajm7qa93r5pn3mdafqh3blpzya601jbs9l238p0hmvh576"; version = "1.2.2"; diff --git a/elm/elm.json b/elm/elm.json index cbe59461..4b736baf 100644 --- a/elm/elm.json +++ b/elm/elm.json @@ -12,6 +12,7 @@ "TSFoster/elm-uuid": "4.1.0", "annaghi/dnd-list": "6.0.1", "bburdette/cellme": "1.0.0", + "bburdette/httpjsontask": "1.0.0", "bburdette/schelme": "3.0.0", "bburdette/toop": "1.2.0", "bburdette/typed-collections": "1.0.2", diff --git a/elm/registry.dat b/elm/registry.dat index 6084c30e0e746bf53cd7502cda45ecd837be4820..42a81cbb0d6cf4b13211cfc9f44793c8cb61ab96 100644 GIT binary patch delta 6377 zcmZu$dAJ-^mA|K|tM}!-*UQ`TviPDQOG6fx5Re!N2_Q@eF(AR@v%0%pcfHqL)v2m} z3(F)31Ioa-T%wR867l&d^6)H;GBDF=?={O zBl%K&>()8v{?70G&dF;}#16d`>mz)veck&zIrT{29&uT2gJCr~#>W-aG!@lQGLyQh z$(5#3uBlZE2za{*fOEU}uaQjfZxR)W;Arv5$in#fs#a5FV=kjKTV+kR%1Wzk&4oMZ zbLo9~5d4FNBLEQ~5dw5JvvYM^2=<*57f2jPoIsqAm>7wPVoVfbBE&=z6G#k%7(fgN zeL3UW$IgW!eK7lL`<*YrsPpyQ4MLw793%;7nn38isOqhju9Yptv`qT$frX|Urva=6A3$WD~wQe#g9`-9%@u@MUM{ zR2th;O8O6=TuPEsf|TM=ijz`|l%i0Il9B`^iIgHxija~>N&+bXDG^f4kz$q2(d&@ zY}}ZO`iCY!lt7HwE2B_!F1?^FElhu0p8J@r)weYit)7_B4W(6<+iKt~agJVmM2hoR zPE4py<+5iY^uVn}dj9rrEK4ahtz1*8dQCCH7Z71`#gJ=FWo~tnZD`AeY5!>qhUtmz zhiUoLA?NTFGh#CEM*!#49e<4XrDP3{L1-G4ITk!BFDb3>eVAq!(vnR}ujyLP=aTrM z+Nw4cS@W|i{Lxub{RJfA?8Um#uF|cs0)40U(RnnH+)vqzZpUk&E~p|MOHSk`A`U1VM1#(icI0aG97JVw{LE;w;#`B$7!tEUP_f z>Y62+Q_iYR8hYcoar#3LWFP{P?w%RzB@24zjNJ3H^X|;uuryv#EV-_Crg^k#=7b>y zAt4fC77g*>=-6`?1KqM$%CH17%hRedgSe-!ZCp&RzBc8&a?J-J5%`z4_i9KVAG+@5 zL1ajOp?820@I0qmuPr+Na9s?tL&5K4*&reG?T?JiBUnIkgk*ta31kV$5HUl941o-8 zc;WiV1pdfZA3eP3H0P6lJ_z)4LnF?udoBgKEjB=RT$^@&w|9k*4h)JQxjIX3oR!W> z@@q3JrP>%~mnCazOSW{QJfm8TGJ8@r&2IQb&wFsb@|h`dtS`jNkZ&S0j--L4332kb zjl(4=3{OSZs!hF9OLo+9Q^l+><`4t^%3*+6U|C@zq5z_RR3M6gOn`~&N84i*XU*+P zBI8mO>p&%4okOf++M(rESmH3648!!QFC0Q6yoIHV(Cil=xs%l)$m@K z6CRk4-Z2LBRWa}U@=MF(Qe8#I?KgKoepO%^8knjg*Ua(XYCIn`UE@W(i3KU#M^pD4 zT@f0Zl;x6h>>fc_9IMH#Nx3>Tz&u1x4F!3-tQktD)jjXn*IuLI z-~c_c|BQTiNGc+D_W;iS>>m(qV=I>W(fbaJ=(SeHvec#QI5LPH2 z!0z7ydHTtR&hrQdskBA+JoHp}9Ro20?e>GuZtD-hGuBT?A9yGias(LGJ)i@^iJ=_f zlp-XFq)Jex5Ih2@+)qb_7au8f&7so)>{UBZnOuKpI+E>HnJktI=iS50A!L^%L)9U4H6_bMWYrLtdDfJZ)Gl41m9!C!Tmgf+*ekn-ThtPsg2u zPj449VRB>8fhK=)K>^d-UvZy8F^hKmF%&wj-Jc#P7 zuaJWy-?w8LIYBpiZlnL%RndH&vl&YpRjXqqlxqro^R_(w(=lm0Jt0?Al$Q!tUy}o& zCadNgYSh3ILf0JMv5O}>2BN9e!;mqtLryxtOFaY<&t&90mde3F@7vA&HuRRP(a!Oe zTTeR4(@*L(O3gnd^!fkUhB8a3As!68Lw|8vxcB%PF&AbzQ|JhhmtOo2*pQlN&S73F zO=ZIJRYNqqylfPLH1m0Zh@ybhj75O6G?Fv@{L6#Rzr6H7s>Ea(UyG%PAVolm5Ulym zE&n+JnXrB&n7%vs`eiT{t0Qc6qsDI(iLH$aGql?I-(Nor{OV6*cc zrl(&%u`UyO8^@|bw?0*%Z=6_wLNPeb^LOaCQSpp;LpCN*=1uW?tf+OZhZGTM__J#0 zCe{gG=3DBt;`IHl4h8;zk@ZAZbvd=SRtcq0{RbapH65Ir{_AKoi>&3Z46>JV@!NYO z`tn@`_j!OfU||A@0aaC9olc|st&S!0A{3tEJ|V(kp_rINd2SjrN`)ICPqUVfskrg( zFF6iwER5Jgo`ijOIts@l3y?&;wH#G|kOm=5gcJxVA|#2B5bUc`@K>~QThV?o2T5B@ z!v~mhu&+Z&Wv@*`A>{Zha;?2R4IAx67s4WM!}rrL8um&ty1Q2No&)wT^u~Ki_VsB< z*r#P+*zV8aAGtsCo-9bws8m5+(ze^L zLczYK0L$1P$v*Bis)|6G+J9YuzulwERSdP>u=1SDJ!Ott+U2^^y*s?^Nj=z^;yW#! z37#`0WPM-eCkgaaFK`Rv z@bAK~G&$Rxo#kwS=}<>0Vj?8Vs^@Q3R1~CwAms&VK#=+csZWq{f|M1cj3A}mM_0fd z!~H?Cj$LGo0M-Zlm8FokuigabjxP$%C#x0_vXGDkgv=Mnd?51)83Tg%W#79A_Kk;f z7aLU&5&#JZ>$Tt?d%F`%ycj7_7e)1yt z$T+&>uQj1-h|*C+A&^l*MhJ0B7sD@we6%@N!$Qo-3k6xZV>DSly6;{BUxUFcQ>}cJ zvqbQvj6mE6{|ugm1!)8;_KGO9m8RLx($>%`x@DFd9V`K+yZbV@1m^SJN@?kns)=(C zZCXKz-X%!;(XFt1uzU5qsQO}Av`@VpzB|sL6|-EC&2FP_|Lk%&qrXqp ztY*30K;4PRYj-Sr;Z{tt)Hc|)(Ck!XLtc5t%CpjX)l$(A^Q07UtJ}ar>~qOwzp)+k z{=juE=2-%`lUKkoVFlvB4@#y77Yu7$%HjNgHvrrTd+k-Qq(A7^v8RxTfb#`+@+!Db z9ErD7yl4y@C*HQw9c|c|o$%jTE{!IzN#!!ZzHBEHuH@ll&lICvQM77`S2}X$n~jawZT7Xi@V@l`@qAHcem_<-%Ctz zyI0ge66{wU7;@Vauqn1Aq3Ku#ark8LdWX%IfdU7)zM<<=T?ykp)`I(mY*e#3~ z(S|d7ds_QI8+MKNZhB8E#inX_DWaR%4Njz|{dIrXfxS}C`K;4(FTWPf;swjTYcJfr zG1|tauv6jCV)G0Z%nr_WbYlwJeVix-SBy99@AYO3-d-d!Lw1+n0Jn?9G|nAR9M@S3 zH{DmkVF8{-H!LnJIO!LEXrXpbcE5QO9P1y`O+{nxx5BYTkHT`TJK;hBM`7N=>4N7r zva{X44@&N<`>@XpTN3=4xWBy%4#IHEn3FZFQIDZKY&Ujyb*{VbZdfK|Jry8p(=rqB z_Sg5rlHT~cFYbp6qxQZ1FlwLs0DPMM;%wyU2jKL`q8MH=HmgSL8nw*?A&$v>^ZcIr z{y!dqSRsLmpp0FXp|GJ3rhc=j*f%_n3Hi1IpE${6d*@?t_6RfHTR8n<`G!LU^cG!p z_df>j2nAGe{>rdS6R}tk`#~2zobQe{27(TpzWIA(F&9?AXv~_BJElApnUrVbZdNlj z$oFv#EkiwuRt=>QifU&Rt(I!LA@^>+f9^f^eCPE$=lt%L+xDLi z+1=8^(>wdoQ~!6ndy&HHltK zmr`5(3b5Z7Adzmw$MeDNIkHo3Hj@IBS;k^I>ebZ>4=8kw0`Qt5|LsW}EkO8q>k%nrk4Hb6?GsY|9)!+{{zmj*y@UJ3BN z<p@I}N9mZCmd9GYqFS z$PV8B?ilcmf7O88_cU5@uana%z()J;b*IIDCvpG%J2D^jZx;BG{~nWtTgE1vVJ(;x zCk{EVNMrmDc*OX4+=M7_W2-FkeK?~!EeP7Pi9xJlo?`geD@jOT!4LxGEV9)}2zv60 z3JQt}VI}Bd(?b}_Zcf1C>_iCdsb*&q^M<3+nAQlfF=2$9Cg4$G`6!GaTNOr6J)s%U zAiEgG2|cMJ#k33zH`-Vql38H}-ivxPkBcRbMVetQp(KHok42LTW3;hHSUCSYB3<*XRVqF)Y9LG;eW zAh30lFqPJF2iE2Wiq1kO7ziUl*0-tP$hB+Wr|2)*yjoC#{MKzn|63-q%KZteTARA)jF{FZh za2#KYB`0tkPRp0VCZ5EN*zeKF#+||*E3{p-JB=#CX^oZZ^I|p4aBKJzZqST S7-_|c2e;4z;*~qd)cywxU-&x! diff --git a/elm/src/Data.elm b/elm/src/Data.elm index 7d469603..f4f2538f 100644 --- a/elm/src/Data.elm +++ b/elm/src/Data.elm @@ -265,10 +265,30 @@ type alias GetZkNoteComments = type alias GetZkNoteEdit = { zknote : Int + , what : String + } + + +type alias GetZneIfChanged = + { zknote : Int + , changeddate : Int + , what : String + } + + +type alias ZkNoteEditWhat = + { what : String + , zne : ZkNoteEdit } type alias ZkNoteEdit = + { zknote : ZkNote + , links : List EditLink + } + + +type alias PubZkNote = { zknote : ZkNote , links : List EditLink , panelNote : Maybe ZkNote @@ -316,6 +336,16 @@ encodeGetZkNoteEdit : GetZkNoteEdit -> JE.Value encodeGetZkNoteEdit gzl = JE.object [ ( "zknote", JE.int gzl.zknote ) + , ( "what", JE.string gzl.what ) + ] + + +encodeGetZneIfChanged : GetZneIfChanged -> JE.Value +encodeGetZneIfChanged x = + JE.object + [ ( "zknote", JE.int x.zknote ) + , ( "changeddate", JE.int x.changeddate ) + , ( "what", JE.string x.what ) ] @@ -532,10 +562,16 @@ decodeZkNoteArchives = decodeZkNoteEdit : JD.Decoder ZkNoteEdit decodeZkNoteEdit = - JD.map3 ZkNoteEdit + JD.map2 ZkNoteEdit (JD.field "zknote" decodeZkNote) (JD.field "links" (JD.list decodeEditLink)) - (JD.succeed Nothing) + + +decodeZkNoteEditWhat : JD.Decoder ZkNoteEditWhat +decodeZkNoteEditWhat = + JD.map2 ZkNoteEditWhat + (JD.field "what" JD.string) + (JD.field "zne" decodeZkNoteEdit) decodeLoginData : JD.Decoder LoginData diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index b0a491ee..b65ce653 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -74,6 +74,7 @@ import Markdown.Renderer import Maybe.Extra as ME import MdCommon as MC import MdText as MT +import NoteCache as NC exposing (NoteCache) import Orgauth.Data exposing (UserId) import RequestsDialog exposing (TRequests) import Schelme.Show exposing (showTerm) @@ -231,7 +232,7 @@ type Command | Settings | Admin | Requests - | GetZkNote Int + | GetZkNoteWhat Int String | SetHomeNote Int | AddToRecent Data.ZkListNote | ShowMessage String @@ -596,14 +597,14 @@ pageLink model = ) -view : Time.Zone -> Util.Size -> List Data.ZkListNote -> TRequests -> Model -> Element Msg -view zone size recentZkns trqs model = +view : Time.Zone -> Util.Size -> List Data.ZkListNote -> TRequests -> NoteCache -> Model -> Element Msg +view zone size recentZkns trqs noteCache model = case model.dialog of Just dialog -> D.view size dialog |> E.map DialogMsg Nothing -> - zknview zone size recentZkns trqs model + zknview zone size recentZkns trqs noteCache model commonButtonStyle : Bool -> List (E.Attribute msg) @@ -859,9 +860,9 @@ addComment ncs = ] -renderMd : CellDict -> String -> Int -> Element Msg -renderMd cd md mdw = - case MC.markdownView (MC.mkRenderer MC.EditView RestoreSearch mdw cd True OnSchelmeCodeChanged) md of +renderMd : CellDict -> NoteCache -> String -> Int -> Element Msg +renderMd cd noteCache md mdw = + case MC.markdownView (MC.mkRenderer MC.EditView RestoreSearch mdw cd True OnSchelmeCodeChanged noteCache) md of Ok rendered -> E.column [ E.spacing 30 @@ -879,8 +880,8 @@ renderMd cd md mdw = E.text errors -zknview : Time.Zone -> Util.Size -> List Data.ZkListNote -> TRequests -> Model -> Element Msg -zknview zone size recentZkns trqs model = +zknview : Time.Zone -> Util.Size -> List Data.ZkListNote -> TRequests -> NoteCache -> Model -> Element Msg +zknview zone size recentZkns trqs noteCache model = let wclass = if size.width < 800 then @@ -935,7 +936,7 @@ zknview zone size recentZkns trqs model = , columns = [ { header = E.none , width = E.fill - , view = \zkn -> renderMd model.cells zkn.content mdw + , view = \zkn -> renderMd model.cells noteCache zkn.content mdw } , { header = E.none , width = E.shrink @@ -1339,7 +1340,7 @@ zknview zone size recentZkns trqs model = EI.button (E.alignRight :: Common.buttonStyle) { label = E.text ">", onPress = Just <| AddToSearchAsTag model.title } ] - , renderMd model.cells model.md mdw + , renderMd model.cells noteCache model.md mdw ] ] ++ (if wclass == Wide then @@ -1910,20 +1911,17 @@ onTASelection model recentZkns tas = let addLink title id = let - desc = + linktext = if tas.text == "" then - title + "" else - tas.text - - linktext = - "[" - ++ desc - ++ "](" - ++ "/note/" - ++ String.fromInt id - ++ ")" + "[" + ++ tas.text + ++ "](" + ++ "/note/" + ++ String.fromInt id + ++ ")" in TAUpdated { model @@ -2231,7 +2229,7 @@ update msg model = else ( model - , GetZkNote panel.noteid + , GetZkNoteWhat panel.noteid "panel" ) Nothing -> @@ -2441,6 +2439,7 @@ update msg model = size [] (TRequests 0 Dict.empty) + (NC.empty 0) model ) ) diff --git a/elm/src/Main.elm b/elm/src/Main.elm index ceeca77a..b89da26b 100644 --- a/elm/src/Main.elm +++ b/elm/src/Main.elm @@ -17,6 +17,7 @@ import File.Select as FS import GenDialog as GD import Html exposing (Html) import Http +import HttpJsonTask as HE import Import import InviteUser import Json.Decode as JD @@ -24,6 +25,7 @@ import Json.Encode as JE import LocalStorage as LS import MdCommon as MC import MessageNLink +import NoteCache as NC exposing (NoteCache) import Orgauth.AdminInterface as AI import Orgauth.ChangeEmail as CE import Orgauth.ChangePassword as CP @@ -42,6 +44,7 @@ import Route exposing (Route(..), parseUrl, routeTitle, routeUrl) import Search as S import SearchStackPanel as SP import SelectString as SS +import Set import ShowMessage import TagAThing import TagFiles @@ -71,9 +74,9 @@ type Msg | ShowMessageMsg ShowMessage.Msg | UserReplyData (Result Http.Error UI.ServerResponse) | AdminReplyData (Result Http.Error AI.ServerResponse) - | ZkReplyData (Result Http.Error ZI.ServerResponse) - | ZkReplyDataSeq (Result Http.Error ZI.ServerResponse -> Maybe (Cmd Msg)) (Result Http.Error ZI.ServerResponse) - | TAReplyData Data.TASelection (Result Http.Error ZI.ServerResponse) + | ZkReplyData (Result Http.Error ( Time.Posix, ZI.ServerResponse )) + | ZkReplyDataSeq (Result Http.Error ( Time.Posix, ZI.ServerResponse ) -> Maybe (Cmd Msg)) (Result Http.Error ( Time.Posix, ZI.ServerResponse )) + | TAReplyData Data.TASelection (Result Http.Error ( Time.Posix, ZI.ServerResponse )) | PublicReplyData (Result Http.Error PI.ServerResponse) | ErrorIndexNote (Result Http.Error PI.ServerResponse) | LoadUrl String @@ -92,7 +95,8 @@ type Msg | WkMsg (Result JD.Error WindowKeys.Key) | ReceiveLocalVal { for : String, name : String, value : Maybe String } | OnFileSelected F.File (List F.File) - | FileUploaded String (Result Http.Error ZI.ServerResponse) + | FileUploadedButGetTime String (Result Http.Error ZI.ServerResponse) + | FileUploaded String (Result Http.Error ( Time.Posix, ZI.ServerResponse )) | RequestProgress String Http.Progress | RequestsDialogMsg (GD.Msg RequestsDialog.Msg) | TagFilesMsg (TagAThing.Msg TagFiles.Msg) @@ -147,6 +151,11 @@ type alias SavedRoute = } +maxCacheNotes : Int +maxCacheNotes = + 100 + + type alias Model = { state : State , size : Util.Size @@ -163,6 +172,7 @@ type alias Model = , stylePalette : StylePalette , adminSettings : OD.AdminSettings , trackedRequests : TRequests + , noteCache : NoteCache } @@ -236,7 +246,7 @@ routeStateInternal model route = PI.getPublicZkNote model.location (PI.encodeSendMsg (PI.GetZkNote id)) PublicReplyData _ -> - sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) ) Nothing -> @@ -268,12 +278,12 @@ routeStateInternal model route = case model.state of EditZkNote st login -> ( EditZkNote st login - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) ) EditZkNoteListing st login -> ( EditZkNoteListing st login - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) ) EView st login -> @@ -287,7 +297,7 @@ routeStateInternal model route = ( ShowMessage { message = "loading note..." } login (Just model.state) - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) ) Nothing -> @@ -429,7 +439,7 @@ routeStateInternal model route = [ sendZIMsg model.location (ZI.SearchZkNotes <| prevSearchQuery login) - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) ] ) @@ -586,44 +596,32 @@ showMessage msg = ZkReplyData urd -> "ZkReplyData: " - ++ (Result.map ZI.showServerResponse urd - |> Result.mapError Util.httpErrorString - |> (\r -> - case r of - Ok m -> - "message: " ++ m + ++ (case urd of + Ok ( _, m ) -> + "message: " ++ ZI.showServerResponse m - Err e -> - "error: " ++ e - ) + Err e -> + "error: " ++ Util.httpErrorString e ) ZkReplyDataSeq _ urd -> "ZkReplyDataSeq : " - ++ (Result.map ZI.showServerResponse urd - |> Result.mapError Util.httpErrorString - |> (\r -> - case r of - Ok m -> - "message: " ++ m + ++ (case urd of + Ok ( _, m ) -> + "message: " ++ ZI.showServerResponse m - Err e -> - "error: " ++ e - ) + Err e -> + "error: " ++ Util.httpErrorString e ) TAReplyData _ urd -> "TAReplyData: " - ++ (Result.map ZI.showServerResponse urd - |> Result.mapError Util.httpErrorString - |> (\r -> - case r of - Ok m -> - "message: " ++ m + ++ (case urd of + Ok ( _, m ) -> + "message: " ++ ZI.showServerResponse m - Err e -> - "error: " ++ e - ) + Err e -> + "error: " ++ Util.httpErrorString e ) PublicReplyData _ -> @@ -683,6 +681,9 @@ showMessage msg = OnFileSelected _ _ -> "OnFileSelected" + FileUploadedButGetTime _ _ -> + "FileUploadedButGetTime" + FileUploaded _ _ -> "FileUploaded" @@ -799,7 +800,7 @@ viewState size state model = E.map InvitedMsg <| Invited.view model.stylePalette size em EditZkNote em _ -> - E.map EditZkNoteMsg <| EditZkNote.view model.timezone size model.recentNotes model.trackedRequests em + E.map EditZkNoteMsg <| EditZkNote.view model.timezone size model.recentNotes model.trackedRequests model.noteCache em EditZkNoteListing em ld -> E.map EditZkNoteListingMsg <| EditZkNoteListing.view ld size em @@ -820,10 +821,10 @@ viewState size state model = E.map ImportMsg <| Import.view size em View em -> - E.map ViewMsg <| View.view model.timezone size.width em False + E.map ViewMsg <| View.view model.timezone size.width model.noteCache em False EView em _ -> - E.map ViewMsg <| View.view model.timezone size.width em True + E.map ViewMsg <| View.view model.timezone size.width model.noteCache em True UserSettings em _ _ -> E.map UserSettingsMsg <| UserSettings.view em @@ -1074,13 +1075,15 @@ sendZIMsg location msg = sendZIMsgExp location msg ZkReplyData -sendZIMsgExp : String -> ZI.SendMsg -> (Result Http.Error ZI.ServerResponse -> Msg) -> Cmd Msg +sendZIMsgExp : String -> ZI.SendMsg -> (Result Http.Error ( Time.Posix, ZI.ServerResponse ) -> Msg) -> Cmd Msg sendZIMsgExp location msg tomsg = - Http.post + HE.postJsonTask { url = location ++ "/private" , body = Http.jsonBody (ZI.encodeSendMsg msg) - , expect = Http.expectJson tomsg ZI.serverResponseDecoder + , decoder = ZI.serverResponseDecoder } + |> Task.andThen (\x -> Task.map (\posix -> ( posix, x )) Time.now) + |> Task.attempt tomsg {-| send search AND save search in db as a zknote @@ -1442,6 +1445,78 @@ displayMessageNLinkDialog model message url text = } +onZkNoteEditWhat : Model -> Time.Posix -> Data.ZkNoteEditWhat -> ( Model, Cmd Msg ) +onZkNoteEditWhat model pt znew = + let + state = + model.state + in + if znew.what == "cache" then + ( { model + | noteCache = + NC.addNote pt znew.zne model.noteCache + |> NC.purgeNotes + } + , Cmd.none + ) + + else + case stateLogin state of + Just login -> + let + ( spmod, sres ) = + stateSearch state + |> Maybe.withDefault ( SP.initModel, { notes = [], offset = 0, what = "" } ) + + ( nst, c ) = + EditZkNote.initFull login + sres + znew.zne.zknote + znew.zne.links + spmod + + ngets = + makeNoteCacheGets nst.md model + + s = + case state of + EditZkNote eznst _ -> + EditZkNote.copyTabs eznst nst + |> EditZkNote.tabsOnLoad + + _ -> + nst + in + ( { model + | state = + EditZkNote + s + login + , recentNotes = + let + zknote = + znew.zne.zknote + in + addRecentZkListNote model.recentNotes + { id = zknote.id + , user = zknote.user + , title = zknote.title + , isFile = zknote.isFile + , createdate = zknote.createdate + , changeddate = zknote.changeddate + , sysids = zknote.sysids + } + , noteCache = NC.setKeeps (MC.noteIds nst.md) model.noteCache + } + , Cmd.batch ((sendZIMsg model.location <| ZI.GetZkNoteComments c) :: ngets) + ) + + _ -> + ( unexpectedMessage model "ZkNoteEditWhat" + , Cmd.none + ) + + actualupdate : Msg -> Model -> ( Model, Cmd Msg ) actualupdate msg model = case ( msg, model.state ) of @@ -1561,12 +1636,16 @@ actualupdate msg model = EditZkNote.TAUpdated nemod s -> ( { model | state = EditZkNote nemod login } - , case s of - Just sel -> - setTASelection (Data.encodeSetSelection sel) - - Nothing -> - Cmd.none + , Cmd.batch + ((case s of + Just sel -> + setTASelection (Data.encodeSetSelection sel) + + Nothing -> + Cmd.none + ) + :: makeNewNoteCacheGets nemod.md model + ) ) EditZkNote.TANoop -> @@ -1742,7 +1821,7 @@ actualupdate msg model = (EditZkNoteListing.onWkKeyPress key es) ( WkMsg (Err e), _ ) -> - ( displayMessageDialog model <| "error decoding windowskey message: " ++ JD.errorToString e + ( displayMessageDialog model <| "error decoding windowkeys message: " ++ JD.errorToString e , Cmd.none ) @@ -1826,7 +1905,7 @@ actualupdate msg model = Err e -> ( displayMessageDialog model <| Util.httpErrorString e, Cmd.none ) - Ok uiresponse -> + Ok ( _, uiresponse ) -> case uiresponse of ZI.ServerError e -> ( displayMessageDialog model <| e, Cmd.none ) @@ -2117,7 +2196,7 @@ actualupdate msg model = Err e -> ( displayMessageDialog model <| Util.httpErrorString e, Cmd.none ) - Ok ziresponse -> + Ok ( pt, ziresponse ) -> case ziresponse of ZI.ServerError e -> ( displayMessageDialog model <| e, Cmd.none ) @@ -2240,53 +2319,8 @@ actualupdate msg model = , Cmd.none ) - ZI.ZkNoteEdit zne -> - case stateLogin state of - Just login -> - let - ( spmod, sres ) = - stateSearch state - |> Maybe.withDefault ( SP.initModel, { notes = [], offset = 0, what = "" } ) - - ( nst, c ) = - EditZkNote.initFull login - sres - zne.zknote - zne.links - spmod - - s = - case state of - EditZkNote eznst _ -> - EditZkNote.copyTabs eznst nst - |> EditZkNote.tabsOnLoad - - _ -> - nst - in - ( { model - | state = - EditZkNote - s - login - , recentNotes = - addRecentZkListNote model.recentNotes - { id = zne.zknote.id - , user = zne.zknote.user - , title = zne.zknote.title - , isFile = zne.zknote.isFile - , createdate = zne.zknote.createdate - , changeddate = zne.zknote.changeddate - , sysids = zne.zknote.sysids - } - } - , sendZIMsg model.location <| ZI.GetZkNoteComments c - ) - - _ -> - ( unexpectedMessage model (ZI.showServerResponse ziresponse) - , Cmd.none - ) + ZI.ZkNoteEditWhat znew -> + onZkNoteEditWhat model pt znew ZI.ZkNoteComments zc -> case state of @@ -2390,6 +2424,10 @@ actualupdate msg model = , Cmd.none ) + ZI.Noop -> + -- just ignore these. + ( model, Cmd.none ) + ( ViewMsg em, View es ) -> let ( emod, ecmd ) = @@ -2433,7 +2471,7 @@ actualupdate msg model = case es.id of Just id -> ( { model | state = state } - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) ) Nothing -> @@ -2613,21 +2651,25 @@ actualupdate msg model = ) model.state } - , Cmd.batch - [ Http.request - { method = "POST" - , headers = [] - , url = model.location ++ "/upload" - , body = - file - :: files - |> List.map (\f -> Http.filePart (F.name f) f) - |> Http.multipartBody - , expect = Http.expectJson (FileUploaded nrid) ZI.serverResponseDecoder - , timeout = Nothing - , tracker = Just nrid - } - ] + , Http.request + { method = "POST" + , headers = [] + , url = model.location ++ "/upload" + , body = + file + :: files + |> List.map (\f -> Http.filePart (F.name f) f) + |> Http.multipartBody + , expect = Http.expectJson (FileUploadedButGetTime nrid) ZI.serverResponseDecoder + , timeout = Nothing + , tracker = Just nrid + } + ) + + ( FileUploadedButGetTime what zrd, state ) -> + ( { model | state = state } + , Time.now + |> Task.perform (\pt -> FileUploaded what (Result.map (\zi -> ( pt, zi )) zrd)) ) ( FileUploaded what zrd, state ) -> @@ -2635,58 +2677,13 @@ actualupdate msg model = Err e -> ( displayMessageDialog model <| Util.httpErrorString e, Cmd.none ) - Ok ziresponse -> + Ok ( pt, ziresponse ) -> case ziresponse of ZI.ServerError e -> ( displayMessageDialog model <| e, Cmd.none ) - ZI.ZkNoteEdit zne -> - case stateLogin state of - Just login -> - let - ( spmod, sres ) = - stateSearch state - |> Maybe.withDefault ( SP.initModel, { notes = [], offset = 0, what = "" } ) - - ( nst, c ) = - EditZkNote.initFull login - sres - zne.zknote - zne.links - spmod - - s = - case state of - EditZkNote eznst _ -> - EditZkNote.copyTabs eznst nst - |> EditZkNote.tabsOnLoad - - _ -> - nst - in - ( { model - | state = - EditZkNote - s - login - , recentNotes = - addRecentZkListNote model.recentNotes - { id = zne.zknote.id - , user = zne.zknote.user - , title = zne.zknote.title - , isFile = zne.zknote.isFile - , createdate = zne.zknote.createdate - , changeddate = zne.zknote.changeddate - , sysids = zne.zknote.sysids - } - } - , sendZIMsg model.location <| ZI.GetZkNoteComments c - ) - - _ -> - ( unexpectedMessage model (ZI.showServerResponse ziresponse) - , Cmd.none - ) + ZI.ZkNoteEditWhat znew -> + onZkNoteEditWhat model pt znew ZI.FilesUploaded files -> ( { model @@ -2786,6 +2783,47 @@ actualupdate msg model = ) +makeNoteCacheGets : String -> Model -> List (Cmd Msg) +makeNoteCacheGets md model = + MC.noteIds md + |> Set.toList + |> List.map + (\id -> + case NC.getNote id model.noteCache of + Just zkn -> + sendZIMsg + model.location + (ZI.GetZneIfChanged { zknote = id, what = "cache", changeddate = zkn.zknote.changeddate }) + + Nothing -> + sendZIMsg + model.location + (ZI.GetZkNoteEdit { zknote = id, what = "cache" }) + ) + + + +-- only retreive not-found notes. + + +makeNewNoteCacheGets : String -> Model -> List (Cmd Msg) +makeNewNoteCacheGets md model = + MC.noteIds md + |> Set.toList + |> List.filterMap + (\id -> + case NC.getNote id model.noteCache of + Just zkn -> + Nothing + + Nothing -> + Just <| + sendZIMsg + model.location + (ZI.GetZkNoteEdit { zknote = id, what = "cache" }) + ) + + handleEditZkNoteCmd : Model -> Data.LoginData -> ( EditZkNote.Model, EditZkNote.Command ) -> ( Model, Cmd Msg ) handleEditZkNoteCmd model login ( emod, ecmd ) = let @@ -2808,211 +2846,227 @@ handleEditZkNoteCmd model login ( emod, ecmd ) = Nothing -> ( nm, Cmd.none ) - in - case ecmd of - EditZkNote.SaveExit snpl -> - let - gotres = + + ngets = + makeNewNoteCacheGets emod.md model + + ( rm, rcmd ) = + case ecmd of + EditZkNote.SaveExit snpl -> let - nm = - { model - | state = - EditZkNoteListing - { notes = emod.zknSearchResult - , spmodel = emod.spmodel - , dialog = Nothing - } - login - } - in - case SP.getSearch emod.spmodel of - Just s -> - sendSearch nm s + gotres = + let + nm = + { model + | state = + EditZkNoteListing + { notes = emod.zknSearchResult + , spmodel = emod.spmodel + , dialog = Nothing + } + login + } + in + case SP.getSearch emod.spmodel of + Just s -> + sendSearch nm s - Nothing -> - ( nm, Cmd.none ) + Nothing -> + ( nm, Cmd.none ) - onmsg : Model -> Msg -> ( Model, Cmd Msg ) - onmsg _ ms = - case ms of - ZkReplyData (Ok (ZI.SavedZkNotePlusLinks _)) -> - gotres + onmsg : Model -> Msg -> ( Model, Cmd Msg ) + onmsg _ ms = + case ms of + ZkReplyData (Ok ( _, ZI.SavedZkNotePlusLinks _ )) -> + gotres - ZkReplyData (Ok (ZI.ServerError e)) -> - ( displayMessageDialog model e - , Cmd.none - ) + ZkReplyData (Ok ( _, ZI.ServerError e )) -> + ( displayMessageDialog model e + , Cmd.none + ) - _ -> - ( unexpectedMsg model ms - , Cmd.none - ) - in - ( { model - | state = - Wait - (ShowMessage - { message = "loading articles" - } - login - (Just model.state) - ) - onmsg - } - , sendZIMsg model.location - (ZI.SaveZkNotePlusLinks snpl) - ) + _ -> + ( unexpectedMsg model ms + , Cmd.none + ) + in + ( { model + | state = + Wait + (ShowMessage + { message = "loading articles" + } + login + (Just model.state) + ) + onmsg + } + , sendZIMsg model.location + (ZI.SaveZkNotePlusLinks snpl) + ) - EditZkNote.Save snpl -> - ( { model | state = EditZkNote emod login } - , sendZIMsg model.location - (ZI.SaveZkNotePlusLinks snpl) - ) + EditZkNote.Save snpl -> + ( { model + | state = EditZkNote emod login - EditZkNote.None -> - ( { model | state = EditZkNote emod login }, Cmd.none ) + -- reset keeps on save, to get rid of unused notes. + , noteCache = NC.setKeeps (MC.noteIds emod.md) model.noteCache + } + , sendZIMsg model.location + (ZI.SaveZkNotePlusLinks snpl) + ) - EditZkNote.Revert -> - backtolisting + EditZkNote.None -> + ( { model | state = EditZkNote emod login }, Cmd.none ) - EditZkNote.Delete id -> - -- issue delete and go back to listing. - let - ( m, c ) = + EditZkNote.Revert -> backtolisting - in - ( { m - | state = - Wait m.state - (\mod _ -> - -- stop waiting, issue listing query when a message - -- is received. (presumably delete reply) - ( { mod | state = m.state }, c ) - ) - } - , sendZIMsg model.location - (ZI.DeleteZkNote id) - ) - EditZkNote.Switch id -> - let - ( st, cmd ) = - ( ShowMessage { message = "loading note..." } - login - (Just model.state) - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + EditZkNote.Delete id -> + -- issue delete and go back to listing. + let + ( m, c ) = + backtolisting + in + ( { m + | state = + Wait m.state + (\mod _ -> + -- stop waiting, issue listing query when a message + -- is received. (presumably delete reply) + ( { mod | state = m.state }, c ) + ) + } + , sendZIMsg model.location + (ZI.DeleteZkNote id) ) - in - ( { model | state = st }, cmd ) - EditZkNote.SaveSwitch s id -> - let - ( st, cmd ) = - ( ShowMessage { message = "loading note..." } - login - (Just model.state) - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + EditZkNote.Switch id -> + let + ( st, cmd ) = + ( ShowMessage { message = "loading note..." } + login + (Just model.state) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) + ) + in + ( { model | state = st }, cmd ) + + EditZkNote.SaveSwitch s id -> + let + ( st, cmd ) = + ( ShowMessage { message = "loading note..." } + login + (Just model.state) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) + ) + in + ( { model | state = st } + , Cmd.batch + [ cmd + , sendZIMsg model.location + (ZI.SaveZkNotePlusLinks s) + ] ) - in - ( { model | state = st } - , Cmd.batch - [ cmd - , sendZIMsg model.location - (ZI.SaveZkNotePlusLinks s) - ] - ) - EditZkNote.View v -> - ( { model - | state = - EView - (View.initSzn - v.note - v.createdate - v.changeddate - v.links - v.panelnote - ) - (EditZkNote emod login) - } - , Cmd.none - ) + EditZkNote.View v -> + ( { model + | state = + EView + (View.initSzn + v.note + v.createdate + v.changeddate + v.links + v.panelnote + ) + (EditZkNote emod login) + } + , Cmd.none + ) - EditZkNote.GetTASelection id what -> - ( { model | state = EditZkNote emod login } - , getTASelection (JE.object [ ( "id", JE.string id ), ( "what", JE.string what ) ]) - ) + EditZkNote.GetTASelection id what -> + ( { model | state = EditZkNote emod login } + , getTASelection (JE.object [ ( "id", JE.string id ), ( "what", JE.string what ) ]) + ) - EditZkNote.Search s -> - sendSearch { model | state = EditZkNote emod login } s + EditZkNote.Search s -> + sendSearch { model | state = EditZkNote emod login } s - EditZkNote.SearchHistory -> - ( shDialog model - , Cmd.none - ) + EditZkNote.SearchHistory -> + ( shDialog model + , Cmd.none + ) - EditZkNote.BigSearch -> - backtolisting + EditZkNote.BigSearch -> + backtolisting - EditZkNote.Settings -> - ( { model | state = UserSettings (UserSettings.init login model.fontsize) login (EditZkNote emod login) } - , Cmd.none - ) + EditZkNote.Settings -> + ( { model | state = UserSettings (UserSettings.init login model.fontsize) login (EditZkNote emod login) } + , Cmd.none + ) - EditZkNote.Admin -> - ( model - , sendAIMsg model.location AI.GetUsers - ) + EditZkNote.Admin -> + ( model + , sendAIMsg model.location AI.GetUsers + ) - EditZkNote.GetZkNote id -> - ( { model | state = EditZkNote emod login } - , sendZIMsg model.location (ZI.GetZkNote id) - ) + EditZkNote.GetZkNoteWhat id what -> + ( { model | state = EditZkNote emod login } + , case what of + "panel" -> + sendZIMsg model.location (ZI.GetZkNote id) - EditZkNote.SetHomeNote id -> - ( { model | state = EditZkNote emod login } - , sendZIMsg model.location (ZI.SetHomeNote id) - ) + _ -> + sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = what }) + ) - EditZkNote.AddToRecent zkln -> - ( { model - | state = EditZkNote emod login - , recentNotes = addRecentZkListNote model.recentNotes zkln - } - , Cmd.none - ) + EditZkNote.SetHomeNote id -> + ( { model | state = EditZkNote emod login } + , sendZIMsg model.location (ZI.SetHomeNote id) + ) - EditZkNote.ShowMessage e -> - ( displayMessageDialog model e, Cmd.none ) + EditZkNote.AddToRecent zkln -> + ( { model + | state = EditZkNote emod login + , recentNotes = addRecentZkListNote model.recentNotes zkln + } + , Cmd.none + ) - EditZkNote.ShowArchives id -> - ( model - , sendZIMsg model.location (ZI.GetZkNoteArchives { zknote = id, offset = 0, limit = Just S.defaultSearchLimit }) - ) + EditZkNote.ShowMessage e -> + ( displayMessageDialog model e, Cmd.none ) - EditZkNote.FileUpload -> - ( model - , FS.files [] OnFileSelected - ) + EditZkNote.ShowArchives id -> + ( model + , sendZIMsg model.location (ZI.GetZkNoteArchives { zknote = id, offset = 0, limit = Just S.defaultSearchLimit }) + ) - EditZkNote.Requests -> - ( { model - | state = - RequestsDialog - (RequestsDialog.init - model.trackedRequests - Common.buttonStyle - (E.map (\_ -> ()) (viewState model.size model.state model)) - ) - model.state - } - , Cmd.none - ) + EditZkNote.FileUpload -> + ( model + , FS.files [] OnFileSelected + ) - EditZkNote.Cmd cmd -> - ( { model | state = EditZkNote emod login } - , Cmd.map EditZkNoteMsg cmd - ) + EditZkNote.Requests -> + ( { model + | state = + RequestsDialog + (RequestsDialog.init + model.trackedRequests + Common.buttonStyle + (E.map (\_ -> ()) (viewState model.size model.state model)) + ) + model.state + } + , Cmd.none + ) + + EditZkNote.Cmd cmd -> + ( { model | state = EditZkNote emod login } + , Cmd.map EditZkNoteMsg cmd + ) + in + ( rm, Cmd.batch (rcmd :: ngets) ) handleEditZkNoteListing : Model -> Data.LoginData -> ( EditZkNoteListing.Model, EditZkNoteListing.Command ) -> ( Model, Cmd Msg ) @@ -3336,6 +3390,7 @@ init flags url key zone fontsize = , stylePalette = { defaultSpacing = 10 } , adminSettings = adminSettings , trackedRequests = { requestCount = 0, requests = Dict.empty } + , noteCache = NC.empty maxCacheNotes } geterrornote = diff --git a/elm/src/MdCommon.elm b/elm/src/MdCommon.elm index dac485a0..06bffcd5 100644 --- a/elm/src/MdCommon.elm +++ b/elm/src/MdCommon.elm @@ -1,8 +1,9 @@ -module MdCommon exposing (Panel, ViewMode(..), blockCells, blockPanels, cellView, codeBlock, codeSpan, defCell, heading, imageView, linkDict, markdownView, mdCells, mdPanel, mdPanels, mkRenderer, panelView, rawTextToId, searchView, showRunState) +module MdCommon exposing (Panel, ViewMode(..), blockCells, blockPanels, cellView, codeBlock, codeSpan, defCell, heading, imageView, linkDict, markdownView, mdCells, mdPanel, mdPanels, mkRenderer, noteIds, panelView, rawTextToId, searchView, showRunState) import Cellme.Cellme exposing (Cell, CellContainer(..), CellState, RunState(..), evalCellsFully, evalCellsOnce) import Cellme.DictCellme exposing (CellDict(..), DictCell, dictCcr, getCd, mkCc) import Common exposing (buttonStyle) +import Data import Dict exposing (Dict) import Element as E exposing (Element) import Element.Background as EBk @@ -12,13 +13,15 @@ import Element.Input as EI import Element.Region as ER import Html exposing (Attribute, Html) import Html.Attributes as HA -import Markdown.Block as Block exposing (Block, Inline, ListItem(..), Task(..), inlineFoldl) +import Markdown.Block as Block exposing (Block, Inline, ListItem(..), Task(..), foldl, inlineFoldl) import Markdown.Html import Markdown.Parser import Markdown.Renderer import Maybe.Extra as ME +import NoteCache as NC exposing (NoteCache) import Regex import Schelme.Show exposing (showTerm) +import Set exposing (Set(..)) import TangoColors as TC @@ -131,8 +134,28 @@ type ViewMode | EditView -mkRenderer : ViewMode -> (String -> a) -> Int -> CellDict -> Bool -> (String -> String -> a) -> Markdown.Renderer.Renderer (Element a) -mkRenderer viewMode restoreSearchMsg maxw cellDict showPanelElt onchanged = +link : Maybe String -> String -> List (Element a) -> Element a +link title destination body = + (if String.contains ":" destination then + E.newTabLink + + else + E.link + ) + [ E.htmlAttribute (HA.style "display" "inline-flex") ] + { url = destination + , label = + E.paragraph + [ EF.color (E.rgb255 0 0 255) + , E.htmlAttribute (HA.style "overflow-wrap" "break-word") + , E.htmlAttribute (HA.style "word-break" "break-word") + ] + body + } + + +mkRenderer : ViewMode -> (String -> a) -> Int -> CellDict -> Bool -> (String -> String -> a) -> NoteCache -> Markdown.Renderer.Renderer (Element a) +mkRenderer viewMode restoreSearchMsg maxw cellDict showPanelElt onchanged noteCache = { heading = heading , paragraph = E.paragraph @@ -144,36 +167,12 @@ mkRenderer viewMode restoreSearchMsg maxw cellDict showPanelElt onchanged = , strikethrough = \content -> E.paragraph [ EF.strike ] content , codeSpan = codeSpan , link = - \{ title, destination } body -> - (if String.contains ":" destination then - E.newTabLink - - else - E.link - ) - [ E.htmlAttribute (HA.style "display" "inline-flex") ] - { url = destination - , label = - E.paragraph - [ EF.color (E.rgb255 0 0 255) - , E.htmlAttribute (HA.style "overflow-wrap" "break-word") - , E.htmlAttribute (HA.style "word-break" "break-word") - ] - body - } + \{ title, destination } body -> link title destination body , hardLineBreak = Html.br [] [] |> E.html , image = \image -> E.image [ E.width E.fill ] { src = image.src, description = image.alt } - - {- case image.title of - Just title -> - E.image [ E.width E.fill ] { src = image.src, description = image.alt } - - Nothing -> - E.image [ E.width E.fill ] { src = image.src, description = image.alt } - -} , blockQuote = \children -> E.column @@ -260,6 +259,8 @@ mkRenderer viewMode restoreSearchMsg maxw cellDict showPanelElt onchanged = |> Markdown.Html.withOptionalAttribute "text" |> Markdown.Html.withOptionalAttribute "width" |> Markdown.Html.withOptionalAttribute "height" + , Markdown.Html.tag "note" (noteView noteCache) + |> Markdown.Html.withAttribute "id" ] , table = E.column [ E.width <| E.fill ] , tableHeader = E.column [ E.width <| E.fill, EF.bold, EF.underline, E.spacing 8 ] @@ -315,6 +316,104 @@ imageView text url mbwidth renderedChildren = { src = url, description = text } +htmlAudioView : String -> String -> Element a +htmlAudioView url text = + E.html (Html.audio [ HA.controls True, HA.src url ] [ Html.text text ]) + + +audioView : Data.ZkNote -> Element a +audioView zkn = + E.column [ EBd.width 1, E.spacing 5, E.padding 5 ] + [ link (Just zkn.title) ("/note/" ++ String.fromInt zkn.id) [ E.text zkn.title ] + , E.row [ E.spacing 20 ] + [ htmlAudioView ("/file/" ++ String.fromInt zkn.id) zkn.title + + -- TODO pass in url instead of hardcoded + , link + (Just "ts↗") + ("https://29a.ch/timestretch/#a=https://www.zknotes.com/file/" ++ String.fromInt zkn.id) + [ E.text "ts↗" ] + ] + ] + + +noteFile : String -> Data.ZkNote -> Element a +noteFile filename zknote = + let + suffix = + String.split "." filename + |> List.drop 1 + |> List.reverse + |> List.head + + fileurl = + "/file/" ++ String.fromInt zknote.id + in + case suffix of + Nothing -> + E.text filename + + Just s -> + case String.toLower s of + "mp3" -> + audioView zknote + + "m4a" -> + audioView zknote + + "opus" -> + audioView zknote + + "mp4" -> + videoView 200 fileurl (Just zknote.title) Nothing Nothing [] + + "webm" -> + videoView 200 fileurl (Just zknote.title) Nothing Nothing [] + + "mkv" -> + videoView 200 fileurl (Just zknote.title) Nothing Nothing [] + + "jpg" -> + imageView zknote.title fileurl Nothing [] + + "gif" -> + imageView zknote.title fileurl Nothing [] + + "png" -> + imageView zknote.title fileurl Nothing [] + + _ -> + E.text filename + + +noteView : NoteCache -> String -> List (Element a) -> Element a +noteView noteCache id _ = + case + String.toInt id + |> Maybe.andThen (\iid -> NC.getNote iid noteCache) + of + Just zne -> + if zne.zknote.isFile then + noteFile zne.zknote.title zne.zknote + + else + E.link + [ E.htmlAttribute (HA.style "display" "inline-flex") ] + { url = "/note/" ++ id + , label = + E.paragraph + [ EF.color (E.rgb255 0 0 255) + , E.htmlAttribute (HA.style "overflow-wrap" "break-word") + , E.htmlAttribute (HA.style "word-break" "break-word") + ] + [ E.text zne.zknote.title ] + } + + -- , E.column [] (List.map (.othername >> Maybe.withDefault "" >> E.text) zne.links) + Nothing -> + E.text <| "note " ++ id + + videoView : Int -> String -> Maybe String -> Maybe String -> Maybe String -> List (Element a) -> Element a videoView maxw url mbtext mbwidth mbheight renderedChildren = let @@ -500,3 +599,79 @@ linkDict markdown = [] blocks |> Dict.fromList + + +noteIds : String -> Set Int +noteIds markdown = + -- build a dict of description->url + let + parsedmd = + markdown + |> Markdown.Parser.parse + |> Result.mapError (\error -> error |> List.map Markdown.Parser.deadEndToString |> String.join "\n") + in + case parsedmd of + Err _ -> + Set.empty + + Ok blocks -> + foldl + (\block ids -> + case block of + Block.HtmlBlock (Block.HtmlElement tag attr childs) -> + case + ( tag + , List.foldl + (\i mbv -> + if i.name == "id" then + String.toInt i.value + + else + Nothing + ) + Nothing + attr + ) + of + ( "note", Just id ) -> + Set.insert id ids + + _ -> + ids + + _ -> + ids + ) + Set.empty + blocks + |> (\bids -> + inlineFoldl + (\inline ids -> + case inline of + Block.HtmlInline (Block.HtmlElement tag attr childs) -> + case + ( tag + , List.foldl + (\i mbv -> + if i.name == "id" then + String.toInt i.value + + else + Nothing + ) + Nothing + attr + ) + of + ( "note", Just id ) -> + Set.insert id ids + + _ -> + ids + + _ -> + ids + ) + bids + blocks + ) diff --git a/elm/src/PublicInterface.elm b/elm/src/PublicInterface.elm index 03d5edb7..2832de68 100644 --- a/elm/src/PublicInterface.elm +++ b/elm/src/PublicInterface.elm @@ -17,7 +17,7 @@ type SendMsg type ServerResponse = ServerError String - | ZkNote Data.ZkNoteEdit + | ZkNote Data.PubZkNote encodeSendMsg : SendMsg -> JE.Value @@ -42,7 +42,18 @@ serverResponseDecoder = (\what -> case what of "zknote" -> - JD.map ZkNote (JD.at [ "content" ] <| Data.decodeZkNoteEdit) + JD.map ZkNote + (JD.at [ "content" ] <| + JD.map + (\zne -> + -- PubZkNote + { zknote = zne.zknote + , links = zne.links + , panelNote = Nothing + } + ) + Data.decodeZkNoteEdit + ) "server error" -> JD.map ServerError (JD.at [ "content" ] JD.string) diff --git a/elm/src/View.elm b/elm/src/View.elm index 3b131eb3..0156eec2 100644 --- a/elm/src/View.elm +++ b/elm/src/View.elm @@ -18,6 +18,7 @@ import Markdown.Html import Markdown.Parser import Markdown.Renderer import MdCommon as MC +import NoteCache as NC exposing (NoteCache) import Schelme.Show exposing (showTerm) import TangoColors as TC import Time @@ -84,8 +85,8 @@ showZkl id zkl = ] -view : Time.Zone -> Int -> Model -> Bool -> Element Msg -view zone maxw model loggedin = +view : Time.Zone -> Int -> NoteCache -> Model -> Bool -> Element Msg +view zone maxw noteCache model loggedin = let mw = min maxw 1000 - 160 @@ -121,7 +122,7 @@ view zone maxw model loggedin = ] (case MC.markdownView - (MC.mkRenderer MC.PublicView (\_ -> Noop) mw model.cells False OnSchelmeCodeChanged) + (MC.mkRenderer MC.PublicView (\_ -> Noop) mw model.cells False OnSchelmeCodeChanged noteCache) panel.content of Ok rendered -> @@ -146,7 +147,7 @@ view zone maxw model loggedin = else E.none , E.row [ E.width E.fill ] - [ case MC.markdownView (MC.mkRenderer MC.PublicView (\_ -> Noop) mw model.cells False OnSchelmeCodeChanged) model.md of + [ case MC.markdownView (MC.mkRenderer MC.PublicView (\_ -> Noop) mw model.cells False OnSchelmeCodeChanged noteCache) model.md of Ok rendered -> E.column [ E.spacing 30 @@ -193,7 +194,7 @@ view zone maxw model loggedin = ] -initFull : Data.ZkNoteEdit -> Model +initFull : Data.PubZkNote -> Model initFull zknaa = let zknote = diff --git a/elm/src/ZkInterface.elm b/elm/src/ZkInterface.elm index b0cd3689..7cd25c02 100644 --- a/elm/src/ZkInterface.elm +++ b/elm/src/ZkInterface.elm @@ -10,6 +10,7 @@ import Util type SendMsg = GetZkNote Int | GetZkNoteEdit Data.GetZkNoteEdit + | GetZneIfChanged Data.GetZneIfChanged | GetZkNoteComments Data.GetZkNoteComments | GetZkNoteArchives Data.GetZkNoteArchives | GetArchiveZkNote Data.GetArchiveZkNote @@ -31,7 +32,7 @@ type ServerResponse | SavedZkNote Data.SavedZkNote | DeletedZkNote Int | ZkNote Data.ZkNote - | ZkNoteEdit Data.ZkNoteEdit + | ZkNoteEditWhat Data.ZkNoteEditWhat | ZkNoteComments (List Data.ZkNote) | ServerError String | SavedZkLinks @@ -40,6 +41,7 @@ type ServerResponse | PowerDeleteComplete Int | HomeNoteSet Int | FilesUploaded (List Data.ZkListNote) + | Noop showServerResponse : ServerResponse -> String @@ -63,7 +65,7 @@ showServerResponse sr = ZkNote _ -> "ZkNote" - ZkNoteEdit _ -> + ZkNoteEditWhat _ -> "ZkNoteEdit" ZkNoteComments _ -> @@ -93,6 +95,9 @@ showServerResponse sr = FilesUploaded _ -> "FilesUploaded" + Noop -> + "Noop" + encodeSendMsg : SendMsg -> JE.Value encodeSendMsg sm = @@ -109,6 +114,12 @@ encodeSendMsg sm = , ( "data", Data.encodeGetZkNoteEdit zkne ) ] + GetZneIfChanged x -> + JE.object + [ ( "what", JE.string "getzneifchanged" ) + , ( "data", Data.encodeGetZneIfChanged x ) + ] + GetZkNoteComments msg -> JE.object [ ( "what", JE.string "getzknotecomments" ) @@ -133,10 +144,10 @@ encodeSendMsg sm = , ( "data", JE.int id ) ] - SaveZkNote sbe -> + SaveZkNote x -> JE.object [ ( "what", JE.string "savezknote" ) - , ( "data", Data.encodeSaveZkNote sbe ) + , ( "data", Data.encodeSaveZkNote x ) ] SaveZkNotePlusLinks s -> @@ -215,7 +226,7 @@ serverResponseDecoder = JD.map ZkNote (JD.at [ "content" ] <| Data.decodeZkNote) "zknoteedit" -> - JD.map ZkNoteEdit (JD.at [ "content" ] <| Data.decodeZkNoteEdit) + JD.map ZkNoteEditWhat (JD.at [ "content" ] <| Data.decodeZkNoteEditWhat) "zknotecomments" -> JD.map ZkNoteComments (JD.at [ "content" ] <| JD.list Data.decodeZkNote) @@ -238,6 +249,9 @@ serverResponseDecoder = "savedfiles" -> JD.map FilesUploaded (JD.field "content" <| JD.list Data.decodeZkListNote) + "noop" -> + JD.succeed Noop + wat -> JD.succeed (ServerError ("invalid 'what' from server: " ++ wat)) diff --git a/flake.lock b/flake.lock index 6490952b..cef5532e 100644 --- a/flake.lock +++ b/flake.lock @@ -1,12 +1,15 @@ { "nodes": { "flake-utils": { + "inputs": { + "systems": "systems" + }, "locked": { - "lastModified": 1667395993, - "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "lastModified": 1681202837, + "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", "owner": "numtide", "repo": "flake-utils", - "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "rev": "cfacdce06f30d2b68473a46042957675eebb3401", "type": "github" }, "original": { @@ -20,11 +23,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1671096816, - "narHash": "sha256-ezQCsNgmpUHdZANDCILm3RvtO1xH8uujk/+EqNvzIOg=", + "lastModified": 1679567394, + "narHash": "sha256-ZvLuzPeARDLiQUt6zSZFGOs+HZmE+3g4QURc8mkBsfM=", "owner": "nmattia", "repo": "naersk", - "rev": "d998160d6a076cfe8f9741e56aeec7e267e3e114", + "rev": "88cd22380154a2c36799fe8098888f0f59861a15", "type": "github" }, "original": { @@ -67,6 +70,21 @@ "naersk": "naersk", "nixpkgs": "nixpkgs_2" } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } } }, "root": "root", diff --git a/orgauth b/orgauth index 43a3587b..d12c4db0 160000 --- a/orgauth +++ b/orgauth @@ -1 +1 @@ -Subproject commit 43a3587bf9780b984974dde9cbaf31d3827d0bde +Subproject commit d12c4db09e0c7e791fd295eb092887aabde7a889 diff --git a/server/Cargo.toml b/server/Cargo.toml index b221316d..6054b1ea 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -9,7 +9,7 @@ zkprotocol = { path = "../zkprotocol" } orgauth = { path = "../orgauth/rustlib/" } base64 = "0.13.0" env_logger = "0.5.13" -rusqlite = "0.27.0" +rusqlite = "0.29.0" log = "0.4.0" actix-web = "3.3.2" # actix-rt = "0.2.5" @@ -24,7 +24,7 @@ serde = "1.0.124" serde_derive = "1.0.124" serde_json = "1.0.64" uuid = { version = "0.8", features = ["serde", "v4"] } -crypto-hash = "0.3.1" +crypto-hash = "0.3.4" time = "0.1" rand = "0.5.0" toml = "0.5.9" diff --git a/server/src/interfaces.rs b/server/src/interfaces.rs index d669236a..1f327664 100644 --- a/server/src/interfaces.rs +++ b/server/src/interfaces.rs @@ -10,8 +10,9 @@ use orgauth::endpoints::Callbacks; use std::error::Error; use std::time::Duration; use zkprotocol::content::{ - GetArchiveZkNote, GetZkNoteArchives, GetZkNoteComments, GetZkNoteEdit, ImportZkNote, SaveZkNote, - SaveZkNotePlusLinks, ZkLinks, ZkNoteArchives, ZkNoteEdit, + GetArchiveZkNote, GetZkNoteArchives, GetZkNoteComments, GetZkNoteEdit, GetZneIfChanged, + ImportZkNote, SaveZkNote, SaveZkNotePlusLinks, ZkLinks, ZkNoteArchives, ZkNoteEdit, + ZkNoteEditWhat, }; use zkprotocol::messages::{PublicMessage, ServerResponse, UserMessage}; use zkprotocol::search::{TagSearch, ZkListNoteSearchResult, ZkNoteSearch}; @@ -102,11 +103,41 @@ pub fn zk_interface_loggedin( "user#getzknoteedit: {} - {}", gzne.zknote, note.zknote.title ); + + let znew = ZkNoteEditWhat { + what: gzne.what, + zne: note, + }; + Ok(ServerResponse { what: "zknoteedit".to_string(), - content: serde_json::to_value(note)?, + content: serde_json::to_value(znew)?, }) } + "getzneifchanged" => { + let msgdata = Option::ok_or(msg.data.as_ref(), "malformed json data")?; + let gzic: GetZneIfChanged = serde_json::from_value(msgdata.clone())?; + info!( + "user#getzneifchanged: {} - {}", + gzic.zknote, gzic.changeddate + ); + let conn = sqldata::connection_open(config.orgauth_config.db.as_path())?; + let ozkne = sqldata::read_zneifchanged(&conn, uid, &gzic)?; + + match ozkne { + Some(zkne) => Ok(ServerResponse { + what: "zknoteedit".to_string(), + content: serde_json::to_value(ZkNoteEditWhat { + what: gzic.what, + zne: zkne, + })?, + }), + None => Ok(ServerResponse { + what: "noop".to_string(), + content: serde_json::Value::Null, + }), + } + } "getzknotecomments" => { let msgdata = Option::ok_or(msg.data.as_ref(), "malformed json data")?; let gzne: GetZkNoteComments = serde_json::from_value(msgdata.clone())?; diff --git a/server/src/migrations.rs b/server/src/migrations.rs index f92121fa..c323f023 100644 --- a/server/src/migrations.rs +++ b/server/src/migrations.rs @@ -1819,8 +1819,8 @@ pub fn udpate24(dbfile: &Path) -> Result<(), orgauth::error::Error> { conn.execute_batch(m1.make::().as_str())?; conn.execute( - "insert into filetemp (hash, createdate) - select hash, createdate from file", + "insert into filetemp (id, hash, createdate) + select id, hash, createdate from file", params![], )?; @@ -1843,17 +1843,18 @@ pub fn udpate24(dbfile: &Path) -> Result<(), orgauth::error::Error> { conn.execute_batch(m2.make::().as_str())?; - let mut pstmt = conn.prepare("select hash, createdate from filetemp")?; - let r: Vec<(String, i64)> = pstmt + let mut pstmt = conn.prepare("select id, hash, createdate from filetemp")?; + let r: Vec<(i64, String, i64)> = pstmt .query_map(params![], |row| { - let s: String = row.get(0)?; - let i: i64 = row.get(1)?; - Ok((s, i)) + let id: i64 = row.get(0)?; + let s: String = row.get(1)?; + let i: i64 = row.get(2)?; + Ok((id, s, i)) })? .filter_map(|x| x.ok()) .collect(); - for (hash, createdate) in r { + for (id, hash, createdate) in r { // get file size. println!("attempting file {}", hash); @@ -1866,9 +1867,9 @@ pub fn udpate24(dbfile: &Path) -> Result<(), orgauth::error::Error> { println!("file size {} - {}", hash, size); conn.execute( - "insert into file (hash, createdate, size) - values (?1, ?2, ?3)", - params![hash, createdate, size], + "insert into file (id, hash, createdate, size) + values (?1, ?2, ?3, ?4)", + params![id, hash, createdate, size], )?; println!("insert complete"); } diff --git a/server/src/sqldata.rs b/server/src/sqldata.rs index c68f4a5c..47784c25 100644 --- a/server/src/sqldata.rs +++ b/server/src/sqldata.rs @@ -11,8 +11,8 @@ use std::path::{Path, PathBuf}; use std::time::Duration; use zkprotocol::content::{ Direction, EditLink, ExtraLoginData, GetArchiveZkNote, GetZkLinks, GetZkNoteArchives, - GetZkNoteComments, GetZkNoteEdit, ImportZkNote, SaveZkLink, SaveZkNote, SavedZkNote, ZkLink, - ZkListNote, ZkNote, ZkNoteEdit, + GetZkNoteComments, GetZkNoteEdit, GetZneIfChanged, ImportZkNote, SaveZkLink, SaveZkNote, + SavedZkNote, ZkLink, ZkListNote, ZkNote, ZkNoteEdit, }; #[derive(Clone, Deserialize, Serialize, Debug)] @@ -1404,6 +1404,33 @@ pub fn read_zknoteedit( }) } +pub fn read_zneifchanged( + conn: &Connection, + uid: i64, + gzic: &GetZneIfChanged, +) -> Result, orgauth::error::Error> { + let changeddate: i64 = conn.query_row( + "select changeddate from zknote N + where N.id = ?1", + params![gzic.zknote], + |row| Ok(row.get(0)?), + )?; + + if changeddate > gzic.changeddate { + return read_zknoteedit( + conn, + uid, + &GetZkNoteEdit { + zknote: gzic.zknote, + what: gzic.what.clone(), + }, + ) + .map(Some); + } else { + Ok(None) + } +} + pub fn save_importzknotes( conn: &Connection, uid: i64, diff --git a/server/static/windowkey.js b/server/static/windowkey.js index f9f60087..d16e228b 100644 --- a/server/static/windowkey.js +++ b/server/static/windowkey.js @@ -35,16 +35,19 @@ function keycheck(e) { if (pd) { e.preventDefault(); } - // console.log("key found: ", e.key, " preventdefault: ", pd); + // if pd undefined, null, etc, then don't report key press. + if (pd == true || pd == false) { + // console.log("key found: ", e.key, " preventdefault: ", pd); + app.ports.receiveKeyMsg.send({ key : e.key + , ctrl : e.ctrlKey + , alt : e.altKey + , shift : e.shiftKey + , preventDefault : pd}); + } + - app.ports.receiveKeyMsg.send({ key : e.key - , ctrl : e.ctrlKey - , alt : e.altKey - , shift : e.shiftKey - , preventDefault : pd}); } catch (error) { // console.log("key not found: ", e.key); } } - diff --git a/zkprotocol/src/content.rs b/zkprotocol/src/content.rs index c666f9c1..cdac6563 100644 --- a/zkprotocol/src/content.rs +++ b/zkprotocol/src/content.rs @@ -123,6 +123,14 @@ pub struct GetZkLinks { #[derive(Deserialize, Serialize, Debug)] pub struct GetZkNoteEdit { pub zknote: i64, + pub what: String, +} + +#[derive(Deserialize, Debug, Clone)] +pub struct GetZneIfChanged { + pub zknote: i64, + pub changeddate: i64, + pub what: String, } #[derive(Deserialize, Serialize, Debug)] @@ -156,3 +164,9 @@ pub struct ZkNoteEdit { pub zknote: ZkNote, pub links: Vec, } + +#[derive(Serialize, Debug)] +pub struct ZkNoteEditWhat { + pub what: String, + pub zne: ZkNoteEdit, +} From e119679f58ff73e302b37582fa9e84180b25f8c3 Mon Sep 17 00:00:00 2001 From: Ben Burdette <> Date: Fri, 28 Apr 2023 10:10:37 -0600 Subject: [PATCH 25/27] notecache --- elm/src/NoteCache.elm | 129 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 elm/src/NoteCache.elm diff --git a/elm/src/NoteCache.elm b/elm/src/NoteCache.elm new file mode 100644 index 00000000..ff811f53 --- /dev/null +++ b/elm/src/NoteCache.elm @@ -0,0 +1,129 @@ +module NoteCache exposing (NoteCache, addNote, empty, getNote, purgeNotes, setKeeps) + +import Data exposing (ZkNoteEdit) +import Dict exposing (Dict) +import Set exposing (Set) +import Time +import Util + + +type alias ZneEntry = + { receivetime : Int, zne : ZkNoteEdit } + + +type alias NoteCache = + { byId : Dict Int ZneEntry + , byReceipt : Dict Int (Set Int) + , keep : Set Int + , max : Int + } + + +setKeeps : Set Int -> NoteCache -> NoteCache +setKeeps keep nc = + { nc | keep = keep } + + +addNote : Time.Posix -> ZkNoteEdit -> NoteCache -> NoteCache +addNote pt zne nc = + let + ms = + Time.posixToMillis pt + + id = + zne.zknote.id + in + { byId = + Dict.insert id + { receivetime = ms, zne = zne } + nc.byId + , byReceipt = + case Dict.get ms nc.byReceipt of + Just set -> + Dict.insert ms (Set.insert id set) nc.byReceipt + + Nothing -> + Dict.insert ms (Set.insert id Set.empty) nc.byReceipt + + -- add new notes to keeps! assuming they belong in the current note. + , keep = Set.insert id nc.keep + , max = nc.max + } + + +getNote : Int -> NoteCache -> Maybe ZkNoteEdit +getNote id nc = + Dict.get id nc.byId + |> Maybe.map .zne + + +removeNote : Int -> NoteCache -> NoteCache +removeNote id nc = + case Dict.get id nc.byId of + Just ze -> + { byId = Dict.remove id nc.byId + , byReceipt = + case Dict.get ze.receivetime nc.byReceipt of + Just set -> + let + ns = + Set.remove id set + in + if Set.isEmpty ns then + Dict.remove ze.receivetime nc.byReceipt + + else + Dict.insert ze.receivetime ns nc.byReceipt + + Nothing -> + nc.byReceipt + , keep = Set.remove id nc.keep + , max = nc.max + } + + Nothing -> + nc + + +purgeNotes : NoteCache -> NoteCache +purgeNotes nc = + let + ncount = + Dict.size nc.byId + + toremove = + ncount - nc.max + in + if toremove <= 0 then + nc + + else + let + br = + nc.byReceipt |> Dict.toList |> List.map (Tuple.second >> Set.toList) |> List.concat + + ( rcount, nnnc ) = + Util.foldUntil + (\id ( rmv, nnc ) -> + if rmv <= 0 then + Util.Stop ( rmv, nnc ) + + else if Set.member id nc.keep then + Util.Go ( rmv, nnc ) + + else + Util.Go ( rmv - 1, removeNote id nnc ) + ) + ( toremove, nc ) + br + in + nnnc + + +empty : Int -> NoteCache +empty max = + { byId = Dict.empty + , byReceipt = Dict.empty + , keep = Set.empty + , max = max + } From 2fcf2369b522afa74be0d7a4917c43e6fd7c6ff1 Mon Sep 17 00:00:00 2001 From: Ben Burdette <> Date: Mon, 8 May 2023 10:29:29 -0600 Subject: [PATCH 26/27] stringview testing for tables --- elm/src/EditZkNote.elm | 4 ++- elm/src/MdText.elm | 63 +++++++++++++++++++++++++++++++++++++----- orgauth | 2 +- 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index b65ce653..a4787cda 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -1537,7 +1537,9 @@ zknview zone size recentZkns trqs noteCache model = ] [ headingPanel "edit" [ E.width E.fill ] (editview TC.white) , headingPanel "view" [ E.width E.fill ] (mdview TC.white) - , headingPanel "list" [ E.width E.fill ] listview + + -- , headingPanel "list" [ E.width E.fill ] listview + , headingPanel "list" [ E.width E.fill ] blocksToStringView , searchOrRecentPanel ] diff --git a/elm/src/MdText.elm b/elm/src/MdText.elm index a85339e6..6ca6ddc3 100644 --- a/elm/src/MdText.elm +++ b/elm/src/MdText.elm @@ -117,13 +117,62 @@ stringRenderer = ] , thematicBreak = "--------------------\n" - -- tables not currently parsed by elm-markdown. - , table = String.concat - , tableHeader = String.concat - , tableBody = String.concat - , tableRow = String.concat + -- table support is WIP + , table = String.concat >> (++) "\n" + , tableHeader = + -- we get the whole header as one string here, contained in a single element list. + List.map + twoheads + >> String.concat + , tableBody = List.foldr (\s l -> s :: "\n" :: l) [] >> String.concat + , tableRow = List.intersperse " | " >> String.concat , tableHeaderCell = - \maybeAlignment strs -> String.concat strs + \maybeAlignment strs -> + let + _ = + Debug.log "thc" ( maybeAlignment, strs ) + in + String.concat strs + ++ " | " + ++ (case maybeAlignment of + Just Block.AlignLeft -> + ":-" + + Just Block.AlignRight -> + "-:" + + Just Block.AlignCenter -> + ":-:" + + Nothing -> + "--" + ) , tableCell = - \maybeAlignment strs -> String.concat strs + \maybeAlignment strs -> + String.concat strs } + + +twoheads : String -> String +twoheads headstr = + headstr + |> String.split " | " + |> toheads ( [], [] ) + |> (\( heads, aligns ) -> + String.concat (List.intersperse " | " heads) + ++ "\n" + ++ String.concat (List.intersperse "|" aligns) + ++ "\n" + ) + + + + +toheads : ( List String, List String ) -> List String -> ( List String, List String ) +toheads ( llst, rlst ) strs = + case strs of + l :: r :: cdr -> + toheads ( l :: llst, r :: rlst ) cdr + + _ -> + ( List.reverse llst, List.reverse rlst ) diff --git a/orgauth b/orgauth index d12c4db0..f7e619a0 160000 --- a/orgauth +++ b/orgauth @@ -1 +1 @@ -Subproject commit d12c4db09e0c7e791fd295eb092887aabde7a889 +Subproject commit f7e619a07fbf2c529aa681e0f12fbdc350e9a2ba From 37def189bb44be63deee340624f583694749c1a7 Mon Sep 17 00:00:00 2001 From: Ben Burdette Date: Tue, 31 Dec 2024 10:05:38 -0700 Subject: [PATCH 27/27] add MdList tab --- elm/src/EditZkNote.elm | 37 +++++++++++++++++++++++++++++++++++-- elm/src/ViewLinearMd.elm | 11 ++++++----- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index a4787cda..ec50e694 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -73,6 +73,7 @@ import Markdown.Parser import Markdown.Renderer import Maybe.Extra as ME import MdCommon as MC +import MdList as ML import MdText as MT import NoteCache as NC exposing (NoteCache) import Orgauth.Data exposing (UserId) @@ -139,12 +140,14 @@ type Msg | FlipLink EditLink | ShowArchivesPress | VLMMsg VLM.Msg + | MLMsg ML.Msg | Noop type NavChoice = NcEdit | NcList + | NcMdList | NcView | NcSearch | NcRecent @@ -158,6 +161,7 @@ type SearchOrRecent type EditOrView = EditView | ListView + | MdListView | ViewView @@ -207,6 +211,7 @@ type alias Model = , panelNote : Maybe Data.ZkNote , mbReplaceString : Maybe String , mlModel : VLM.Model + , mdlModel : ML.Model } @@ -1086,6 +1091,9 @@ zknview zone size recentZkns trqs noteCache model = listview = E.map VLMMsg <| VLM.view model.mlModel + mdlistview = + E.map MLMsg <| ML.view model.mdlModel + editview linkbkc = let titleed = @@ -1537,9 +1545,10 @@ zknview zone size recentZkns trqs noteCache model = ] [ headingPanel "edit" [ E.width E.fill ] (editview TC.white) , headingPanel "view" [ E.width E.fill ] (mdview TC.white) + , headingPanel "list" [ E.width E.fill ] listview + , headingPanel "mdlist" [ E.width E.fill ] mdlistview - -- , headingPanel "list" [ E.width E.fill ] listview - , headingPanel "list" [ E.width E.fill ] blocksToStringView + -- , headingPanel "list" [ E.width E.fill ] blocksToStringView , searchOrRecentPanel ] @@ -1567,6 +1576,9 @@ zknview zone size recentZkns trqs noteCache model = ListView -> NcList + MdListView -> + NcMdList + ViewView -> NcView ) @@ -1588,6 +1600,9 @@ zknview zone size recentZkns trqs noteCache model = ListView -> listview + MdListView -> + mdlistview + ViewView -> mdview TC.white ] @@ -1618,6 +1633,9 @@ zknview zone size recentZkns trqs noteCache model = NcList -> listview + NcMdList -> + mdlistview + NcView -> mdview TC.lightGray @@ -1667,6 +1685,9 @@ tabsOnLoad model = ListView -> NcList + MdListView -> + NcMdList + ViewView -> NcView } @@ -1740,6 +1761,7 @@ initFull ld zkl zknote dtlinks spm = , panelNote = Nothing , mbReplaceString = Nothing , mlModel = VLM.init blocks + , mdlModel = ML.init blocks } , { zknote = zknote.id, offset = 0, limit = Nothing } ) @@ -1793,6 +1815,7 @@ initNew ld zkl spm links = , panelNote = Nothing , mbReplaceString = Nothing , mlModel = VLM.init [] + , mdlModel = ML.init [] } |> (\m1 -> -- for new EMPTY notes, the 'revert' should be the same as the model, so that you aren't @@ -2757,5 +2780,15 @@ update msg model = , Cmd (Cmd.map VLMMsg cmd) ) + MLMsg vmsg -> + -- let + -- ( mdlModel, cmd ) = + -- ML.update model.mdlModel vmsg + -- in + -- ( { model | mdlModel = mdlModel } + -- , Cmd (Cmd.map MLMsg cmd) + -- ) + ( model, None ) + Noop -> ( model, None ) diff --git a/elm/src/ViewLinearMd.elm b/elm/src/ViewLinearMd.elm index e7ee69c5..ef81f556 100644 --- a/elm/src/ViewLinearMd.elm +++ b/elm/src/ViewLinearMd.elm @@ -53,11 +53,12 @@ init : List MB.Block -> Model init blocks = let ba = - blocks - |> List.map mbToMe - |> List.concat - |> List.indexedMap (\i b -> { editid = i, block = b }) - |> Array.fromList + Debug.log "blocks" + (blocks + |> List.map mbToMe + |> List.concat + |> List.indexedMap (\i b -> { editid = i, block = b }) + |> Array.fromList) in { blocks = ba , focusMdElement = Nothing