Hyperscript.jl icon indicating copy to clipboard operation
Hyperscript.jl copied to clipboard

Result is malformed and not what was expected

Open MarkNahabedian opened this issue 1 year ago • 0 comments

I'm having a problem with HyperScript.jl.

This function

function pretty_stitches(image_stitches, flip_right_to_left::Bool)
    # image_stitches should be the top_image_stitches or bottom_image_stitches
    # of a TabletWeavingPattern.
    stitch_width = 5
    stitch_length = 10
    stitch_diameter = 1
    uses = []
    function use(row, col, color, slant)
	push!(uses,
	      m("use",
		href = slant == '/' ? "#stitch1" : "#stitch2",
		x="$(col * stitch_width)mm",
		y="$(row * stitch_length)mm",
		width="$(stitch_width)mm",
		height="$(stitch_length)mm",
		style="stroke: none; fill: $(color)"))
    end
    for (rownum, row) in enumerate(image_stitches)
	for (colnum, stitch) in enumerate(row)
	    (color, slant) = stitch
	    use(rownum, colnum, color, slant)
	end
    end
    println(length(uses))
    m("svg", 
      viewBox="0 0 $(stitch_width * length(image_stitches[1])) $(stitch_length * length(image_stitches))",
      m("g",
        m("symbol", id="stitch1",
    	  preserveAspectRatio="xMinYMin",
    	  viewBox="0 0 $(stitch_width) $(stitch_length)",
    	  refX="0", refY="0",
    	  svg_stitch(stitch_width, stitch_length, stitch_diameter, '/';)),
        m("symbol", id="stitch2",
    	  preserveAspectRatio="xMinYMin",
    	  viewBox="0 0 $(stitch_width) $(stitch_length)",
    	  refX="0", refY="0",
    	  svg_stitch(stitch_width, stitch_length, stitch_diameter, '\\';)),
        uses...)
      )
end

(you can focus on the Hyperscript calls to generate SVG at the end) produces this SVG:

<svg viewBox="0 0 80 1360">
  <g>
    <symbol refX="0" viewBox="0 0 5 10" refY="0" id="stitch1" preserveAspectRatio="xMinYMin">
      <g>
        <path style="stroke-width: 1px; vector-effect: non-scaling-stroke" d="M 0.9569057743101286 9.703069233026724 L 4.956905774310129 0.7030692330267239 A 0.5 0.5 0 0 0 4.043094225" ⋯ 259507 bytes ⋯ "B{N0f8}(1.0,0.0,0.0)" width="5mm" y="1360mm" />
        <use height="10mm" href="#stitch1" x="75mm" style="stroke: none; fill: RGB{N0f8}(1.0,0.0,0.0)" width="5mm" y="1360mm" />
        <use height="10mm" href="#stitch1" x="80mm" style="stroke: none; fill: RGB{N0f8}(1.0,0.0,0.0)" width="5mm" y="1360mm" />
      </g>
    </svg>

(which has been stringified and reformatted for readability).

Note that it also genrates the printed output

`uses` has 2176 elements.

The call

string(svg_stitch(5, 10, 1, '/';))

returns

"<path style="stroke-width: 1px; vector-effect: non-scaling-stroke" d="M 0.9569057743101286 9.703069233026724 L 4.956905774310129 0.7030692330267239 A 0.5 0.5 0 0 0 4.043094225689871 0.29693076697327614 L 0.04309422568987137 9.296930766973276 A 0.5 0.5 0 0 0 0.9569057743101286 9.703069233026724" />"

or more readably

<g>
  <path style="stroke-width: 1px; vector-effect: non-scaling-stroke"
        d="M 0.9569057743101286 9.703069233026724 L 4.956905774310129 0.7030692330267239 A 0.5 0.5 0 0 0 4.043094225689871 0.29693076697327614 L 0.04309422568987137 9.296930766973276 A 0.5 0.5 0 0 0 0.9569057743101286 9.703069233026724" />
</g>

That is what the content of each of the symbols should look like.

Why do the close tags in the output of pretty_stitches not balance?

Where is the second symbol element?

Why are the use elements nested within the symbol's group rather than after the symbol?

Why are there only two use elements when there should be 2176?

Why do the attributes of an element appear in a different order in the SVG than in the source code? Maybe use OrderedDict?

Perhaps I'm misusing the m function? My use is consistent with the examplesin the README file, but not with its function signature.

I prefer the do syntax that the NativeSVG package allows for, but that package is apparently no longer maintained.

MarkNahabedian avatar Oct 20 '22 21:10 MarkNahabedian