heard of nematoden?
they might save your plant some day.
good nematode
looks like a goodie.
bad spider mite
they suck life out of the host
their webbings can end up in cannabis flowers as drammatically as this:
would be eaten by nematoden
heard of nematoden?
they might save your plant some day.
they suck life out of the host
their webbings can end up in cannabis flowers as drammatically as this:
would be eaten by nematoden
Postgres is the nice database - where you can play with vast quantities of qualities.
After installing it:
$ sudo adduser s postgres
What kind of stupid country does this as their main economy?
The property industry is toxic in New Zealand. Not even bringing anything innovative or productive to the economy all about hoarding wealth by speculating on human shelter.
Most farmers can’t just start selling milk out of their homes. Things need to be quality tested and controlled.
We would need to loosen legislation to bring costs of manufacturing and distribution down for small to medium farms.
Obviously loosening rules is dodgy. How about...
This animation is lovingly crafted by Natalie. You can see the expert grandmotherliness.Watch out for the cheesy freeware-jazz soundtrack. I must have rushed it out of the factory, but in my defence our gear's all munted and that last bit of polish can take years.
I am researching for a new layout:
column|row items stack across|down
wrap|nowrap items dont|do squish into the first line
.item { align-self: auto | flex-start | flex-end | center | baseline | stretch;
this does for an item what you may also do to all items via .container { align-content: $those }
so I guess you could make things cling to the ceiling, float in the middle, then sit on the floor...
I might have missed something there...
What I really want is a big left+right division,
and for the insides of those two panes to be bigger than the gap, in a gap-conscious way
it is easy to scroll a pane around I believe...
Putting things in panes (ie, the above flex scheme) is probably not A-conomical.
All the A.3 should be at the same level, be positioned absolutely.
I just want 2-pane layout... So I need a draggable handle...
Rearrangable list of things This is not quite it and doesn't show the source with the all the guts in.
Scalable-movable box Again doesn't show the source, seems to collapse into the top left corner.
I opt for the classic absolute bicameral:
The min() CSS function lets you set the smallest (most negative) value from a list of comma-separated expressions as the value of a CSS property value. The min() function can be used anywhere a <length> , <frequency> , <angle> , <time> , <percentage> , <number> , or <integer> is allowed.
IOing[@dynamicPrecedence=10] { IOness ' ' ~IOpath }IOpath { Leg ("/" Leg)* }Leg { Sigil? Name }
let parserlet warnings = capture_warnings(() => parser = buildParser(grammar))export const sthoLanguage = LRLanguage.define({// ...})
// for EditorState.create extensions[]export function stho() {let lang = new LanguageSupport(sthoLanguage)warnings and lang.warnings = warningsreturn lang}
// ta https://github.com/CodeWitchBella/codewitchbella.com/blob/main/app/routes/_nav.blog._post.2023-lezer-playground.tsxfunction capture_warnings(y) {const warnings: any[] = [];const stash = console.warn;console.warn = (w) => warnings.push(w);y()console.warn = stash;return warnings.length && warnings}
<script lang="ts">export let style = ''// ...</script>
<biggroup style={style}><!-- ... --></biggroup>
IOing[@dynamicPrecedence=10] { IOness ' ' ~IOpath }
@precedence {Number, Title, Sunpitness, IOness, SunpitHead, Name}
Hmm... There at the end of whatsthis() we don't have an obvious place to send such info...
whatsthis() makes waves of loose bits of info
mostly about the graph to build
but also, saving the selection state of the editor is a C-cmglance
which may end up being the few-second moment-mounds we grind out from the user's thrashing things through the viewport.
problems with it will be thrust upon you:The error says "shift/reduce conflict" atexpression "+" expression · "+"
is for going left or right on eg "1 + 1 + 1" with the schema "expr {expr '+' expr}"
I guess it will be clear to you once you have that error.
To explicitly allow Lezer to try multiple actions at a given point, you can use ambiguity markers.
~
GLR markers, are because the parser has to decide whether it is parsing a GoodStatement
or a BadStatement
But I'm not seeing any on the console...Sacre bleu! Svelte must have unplugged my warnings-gobbler... No, it looks okay:Using it was:let parserlet warnings = capture_warnings(() => parser = buildParser(grammar))Which must have just blown up at some point.I refresh the page, having been HMRing for hours now! Yay.It's back to how it was, showing every ⚠ I can reach from doing my thing on my codemirror selection.Lets use a finally block:
try {y();} catch (error) {console.warn = originalWarn;iterable_error(error)warnings.unshift(error)} finally {console.warn = originalWarn;
}
I sabotage my grammar now, so we can ensure...// if stho fails to build, just get something on screen so diag can happen// we would just use @codemirror/lang-javascript, but its object is unwritable!?function stho_substitute() {let parser = buildParser(`@tokens { else { ![\n] } }@top Program { (Lie* "\n")* }Lie { else }`)let Language = LRLanguage.define({parser: parser.configure({})})return new LanguageSupport(Language)}// for EditorState.create extensions[]export function stho() {if (!sthoLanguage) {// it failed in buildParser, with a message!hak(warnings) and debuggerlet lang = stho_substitute()warnings.unshift("Failed to buildParser()")lang.warnings = warningsreturn lang}let lang = new LanguageSupport(sthoLanguage)warnings and lang.warnings = warningsreturn lang}However,it looks empty:Until I think up this:// Errors do not make their properties iterable, somehow// perhaps this should go into Con's data climbing code, if s instanceof Errorfunction iterable_error(error) {// but we can write new properties!error.says = error.messageerror.pile = error.stack.split("\n")}I undo my sabotage,
Flug { Flugenzoid | Flugamata }Flugenzoid[@dynamicPrecedence=33] { "[" Flugenzoidia "]" "+" }Flugenzoidia { "y" ~flugal }Flugamata { "[" Flugamatatola "]" "=" }Flugamatatola { "y" ~flugal }
Flug { Flugenzoid | Flugamata }Flugenzoid[@dynamicPrecedence=10] { "[" Flugenzoidia "]" "+" }Flugenzoidia { Name ~flugal }Flugamata { "[" Flugamatatola "]" "=" }Flugamatatola { Title ~flugal }
Flug { Flugenzoid | Flugamata }Flugenzoid { "[" Flugenzoidia "]" }Flugenzoidia { IOness ~flugal }Flugamata[@dynamicPrecedence=9] { "[" Flugamatatola "]" }Flugamatatola { Name ~flugal }
@tokens {
Title { nonnl+ }Name { (@asciiLetter | "_")+ (@asciiLetter | "_" | @digit)* }
IOness { "i" | "o" }@precedence {IOness, Number, Title, Sunpitness, Name}
}
@tokens {IOness { "i " | "o " }Sunpitness { "S " }
IOpath's chartreuse is visible on the "/" between LegsLeg's fleshtone is always covered up by Name (and Sigil "#")
a limit!
to how much you can say just painting text, before complicatedly stacking the blobs of colour, so their existence is fully communicated...
Simple syntax node business.
Legs wrapped around the Name.
The empty Line.
No text!
It would throw off the shape of course. Artist talk.
The latter is done like this:
Move to the next node in a pre-order traversal, going from a node to its first child or, if the current node is empty or
enter
is false, its next sibling or the next sibling of the first parent node that has one.
moveTo(pos: number, side?: -1 | 0 | 1 = 0) → TreeCursor
Move the cursor to the innermost node that covers
pos
. Ifside
is -1, it will enter nodes that end atpos
. If it is 1, it will enter nodes that start atpos
.
.node.cursor()
is how you clone a cursor, and cloning is cheap, so don’t bother moving a cursor back.