git.iko.soy/rowtype-yoga/psfp
on master help sign in
Must add visible kids
commite68af4ff4870db8abc7670bf435a6475ef691cf6 authorMark Eibes <mark.eibes@gmail.com> dateTue 14 Apr 2020, 23:04 (6 years ago) parent50f5e9d
4 files changed+53−47
blog/src/components/PSLayout.purs+36−25 blog/src/pages/optional.mdx+9−3 components/src/Yoga/FillInTheGaps/Logic.purs+6−18 components/src/Yoga/FillInTheGaps/Stories.purs+2−1
blog/src/components/PSLayout.purs+36−25
@@ -1,11 +1,13 @@
11module PSLayout where
22
33import Prelude
4+
45import Data.Array as A
56import Data.Array as Array
67import Data.Array.NonEmpty as NEA
7−import Data.Maybe (Maybe(..), fromMaybe)
8−import Data.Nullable (Nullable)
8+import Data.Function.Uncurried (mkFn2)
9+import Data.Maybe (Maybe(..), fromMaybe, isJust)
10+import Data.Nullable (Nullable, toMaybe)
911import Data.Nullable as Nullable
1012import Data.String as String
1113import Data.Tuple.Nested ((/\))
@@ -14,7 +16,7 @@ import Effect (Effect)
1416import JSS (jss, jssClasses)
1517import Justifill (justifill)
1618import Milkis.Impl (FetchImpl)
17−import React.Basic (JSX, ReactComponent)
19+import React.Basic (JSX, ReactComponent, fragment)
1820import React.Basic.DOM (unsafeCreateDOMComponent)
1921import React.Basic.DOM as R
2022import React.Basic.Helpers (jsx)
@@ -24,8 +26,9 @@ import Unsafe.Coerce (unsafeCoerce)
2426import Yoga.Box.Component as Box
2527import Yoga.CompileEditor.Component (mkCompileEditor)
2628import Yoga.Compiler.Api (apiCompiler)
29+import Yoga.Compiler.Types (Compiler)
2730import Yoga.FillInTheGaps.Component as FillInTheGaps
28−import Yoga.FillInTheGaps.Logic (parseSegments)
31+import Yoga.FillInTheGaps.Logic (complete, parseSegments)
2932import Yoga.Header.Component (mkHeader)
3033import Yoga.Helpers ((?||))
3134import Yoga.InlineCode.Component as InlineCode
@@ -70,7 +73,7 @@ mkLayout ∷
7073 )
7174mkLayout fetchImpl = do
7275 themeProvider <- mkThemeProvider
73− mdxProviderComponent <- mkMdxProviderComponent fetchImpl
76+ mdxProviderComponent <- mkMdxProviderComponent (apiCompiler fetchImpl)
7477 componentWithChildren "MDXLayout" \{ children, siteInfo } -> React.do
7578 pure
7679 $ element themeProvider
@@ -96,16 +99,17 @@ mkSecret = do
9699 }
97100
98101mkMdxProviderComponent ∷
99− FetchImpl ->
102+ ∀ r.
103+ { | Compiler r } ->
100104 Effect
101105 ( ReactComponent
102106 { children ∷ ReactChildren JSX
103107 , siteInfo ∷ SiteQueryResult
104108 }
105109 )
106−mkMdxProviderComponent fetchImpl = do
110+mkMdxProviderComponent compiler = do
107111 cssBaseline <- mkCssBaseline
108− editor <- mkCompileEditor fetchImpl
112+ editor <- mkCompileEditor compiler
109113 fillInTheGaps <- FillInTheGaps.makeComponent
110114 box <- Box.makeComponent
111115 sidebar <- mkSidebar
@@ -132,18 +136,14 @@ mkMdxProviderComponent fetchImpl = do
132136 }
133137 componentWithChildren "MDXProviderComponent" \{ children, siteInfo } -> React.do
134138 classes <- useStyles {}
135− visibleThroughKey /\ updateVisible <- useState ""
139+ visibleThrough /\ updateVisible <- useState 1
136140 let
137141 baseline child = element cssBaseline { kids: child }
138142
139143 kids = reactChildrenToArray children
140144
141145 visibleKids =
142− spy "visibleKids"
143− $ fromMaybe kids do
144− i <- kids # A.findIndex (\x -> (unsafeCoerce x).key == visibleThroughKey)
145− pure $ A.take (i + 1) kids
146−
146+ TODO
147147 siteInfoJSX =
148148 R.div
149149 { children:
@@ -163,13 +163,12 @@ mkMdxProviderComponent fetchImpl = do
163163 , h3:
164164 \props ->
165165 element h { level: H4, text: props.children, className: Nothing }
166+ , hr: (const $ R.hr {})
166167 , p:
167168 \props ->
168169 R.div
169170 { children: [ element p { text: props.children } ]
170171 }
171− -- , thematicBreak:
172− -- \props -> jsx secret { register: updateSections (Map.insert ) }
173172 , inlineCode:
174173 \props -> do
175174 R.span { className: classes.code, children: props.children }
@@ -200,23 +199,35 @@ mkMdxProviderComponent fetchImpl = do
200199 )
201200
202201 language = fromMaybe "" (classNameQ >>= String.stripPrefix (String.Pattern "language-"))
203− case isCode, language of
204− true, "puregaps" ->
205− element fillInTheGaps
206− { initialSegments: parseSegments (codeQ ?|| "")
207− , update: \segs -> pure unit
208− }
209− true, _ ->
202+
203+ segmentsQ = parseSegments (codeQ ?|| "")
204+ case isCode, language, segmentsQ of
205+ true, "purescript", Just initialSegments ->
206+ jsx box {}
207+ [ element fillInTheGaps
208+ { initialSegments
209+ , update:
210+ \segs ->
211+ when (complete segs)
212+ $ updateVisible
213+ (\_ -> spy "setting key to" (unsafeCoerce props).key)
214+ }
215+ ]
216+ true, _, _ ->
210217 element editor
211218 { initialCode: fromMaybe "" codeQ
212219 , height
213220 , language
214221 }
215− false, _ -> element (unsafeCreateDOMComponent "pre") props
222+ false, _, _ -> element (unsafeCreateDOMComponent "pre") props
216223 }
217224 useEffect (A.length kids) do
218225 let
219− firstGaps = kids # A.find (\x -> (unsafeCoerce x).props.mdxType == "pre" && ((unsafeCoerce x).props.children.props.className == "language-puregaps")) <#> (\x -> (unsafeCoerce x).key)
226+ firstGaps = kids # A.find (\x -> (unsafeCoerce x).props.mdxType == "pre" &&
227+ ((unsafeCoerce x).props.children.props.className == "language-purescript") &&
228+ ((unsafeCoerce x).props.children.props.mdxType == "code") &&
229+ ((unsafeCoerce x).props.children.props.children # parseSegments # isJust)
230+ ) <#> (\x -> spy "first boy" $ (unsafeCoerce x).key)
220231
221232 lastKey = kids # A.last # unsafeCoerce # _.key
222233 updateVisible (const (firstGaps ?|| lastKey))
blog/src/pages/optional.mdx+9−3
@@ -5,7 +5,7 @@ import SEO from '../components/seo'
55
66# Optional
77
8−```puregaps
8+```purescript
99--result Hello World
1010module Main where
1111import Grimoire
@@ -19,7 +19,7 @@ incantation = cast $
1919
2020---
2121
22−```puregaps
22+```purescript
2323--result Hello World
2424module Main where
2525import Grimoire
@@ -31,4 +31,10 @@ incantation = cast $
3131--end here
3232```
3333
34−## Hans Hölzel
34+---
35+
36+## Hans Hölzel
37+
38+---
39+
40+Guter Mann
components/src/Yoga/FillInTheGaps/Logic.purs+6−18
@@ -3,32 +3,18 @@ module Yoga.FillInTheGaps.Logic where
33import Prelude
44import Data.Array (intercalate)
55import Data.Array as A
6−import Data.Either (Either(..))
76import Data.Foldable (foldl)
87import Data.Lens ((%~))
98import Data.Lens.Index (ix)
10−import Data.Maybe (Maybe(..), fromMaybe')
9+import Data.Maybe (Maybe(..))
1110import Data.String (Pattern(..), split)
1211import Data.String as S
1312import Data.String.Regex (Regex)
1413import Data.String.Regex as Regex
1514import Data.String.Regex.Flags as RegexFlags
1615import Data.String.Regex.Unsafe (unsafeRegex)
17−import Data.Tuple.Nested ((/\))
18−import Debug.Trace (spy)
19−import Effect (Effect)
20−import Justifill (justifill)
2116import Partial.Unsafe (unsafeCrashWith)
22−import React.Basic (JSX, ReactComponent, element)
23−import React.Basic.DOM as R
24−import React.Basic.Hooks (component, useState)
25−import React.Basic.Hooks as React
26−import React.Basic.SyntaxHighlighter.Component (HighlighterTheme, syntaxHighlighterImpl)
27−import Shared.Models.Body (CompileResult, RunResult)
2817import Yoga.Helpers ((?||))
29−import Yoga.InlineCode.Component as InlineCode
30−import Yoga.Theme.Styles (useTheme)
31−import Yoga.Theme.Syntax (mkHighlighterTheme)
3218
3319complete ∷ Array (Array Segment) -> Boolean
3420complete arr = foldl f true (join arr)
@@ -52,8 +38,8 @@ getResult = case _ of
5238 ExpectedResult r -> Just r
5339 _ -> Nothing
5440
55−findResult ∷ Array Segment -> String
56−findResult = fromMaybe' (\_ -> unsafeCrashWith "Even teachers make mistakes") <<< A.findMap getResult
41+findResult ∷ Array Segment -> Maybe String
42+findResult = A.findMap getResult
5743
5844toCode ∷ Array (Array Segment) -> String
5945toCode lines = intercalate "\n" mapped
@@ -112,7 +98,9 @@ smooshFillers = foldl smooshOuter []
11298 [ Filler f ], Just { init, last: [ Filler prev ] } -> A.snoc init [ Filler (prev <> "\n" <> f) ]
11399 _, _ -> A.snoc acc segs
114100
115−parseSegments code = segments
101+parseSegments ∷ String -> Maybe (Array (Array Segment))
102+parseSegments code = result $> segments
116103 where
117104 lines = split (Pattern "\n") code
118105 segments = smooshFillers (lines <#> \line -> rawSegments line <#> toSegment)
106+ result = findResult (join segments)
components/src/Yoga/FillInTheGaps/Stories.purs+2−1
@@ -7,13 +7,14 @@ import Storybook.Decorator.FullScreen (fullScreenDecorator)
77import Storybook.React (Storybook, add, addDecorator, storiesOf)
88import Yoga.FillInTheGaps.Component as FillInTheGaps
99import Yoga.FillInTheGaps.Logic (parseSegments)
10+import Yoga.Helpers ((?||))
1011
1112stories ∷ Effect Storybook
1213stories = do
1314 storiesOf "FillInTheGaps" do
1415 addDecorator fullScreenDecorator
1516 add "The FillInTheGaps" (FillInTheGaps.makeComponent)
16− [ { initialSegments: parseSegments codeWithHoles, update: pure (pure unit) }
17+ [ { initialSegments: parseSegments codeWithHoles ?|| [], update: pure (pure unit) }
1718 ]
1819
1920codeWithHoles =