rsyntaxtree 1.2.12 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +2 -2
  3. data/README.md +3 -2
  4. data/Rakefile +1 -1
  5. data/bin/rsyntaxtree +4 -2
  6. data/docs/_examples/053.md +41 -0
  7. data/docs/_layouts/default.html +1 -1
  8. data/docs/assets/img/000.png +0 -0
  9. data/docs/assets/img/001.png +0 -0
  10. data/docs/assets/img/002.png +0 -0
  11. data/docs/assets/img/003.png +0 -0
  12. data/docs/assets/img/004.png +0 -0
  13. data/docs/assets/img/005.png +0 -0
  14. data/docs/assets/img/006.png +0 -0
  15. data/docs/assets/img/007.png +0 -0
  16. data/docs/assets/img/008.png +0 -0
  17. data/docs/assets/img/009.png +0 -0
  18. data/docs/assets/img/010.png +0 -0
  19. data/docs/assets/img/011.png +0 -0
  20. data/docs/assets/img/012.png +0 -0
  21. data/docs/assets/img/013.png +0 -0
  22. data/docs/assets/img/014.png +0 -0
  23. data/docs/assets/img/015.png +0 -0
  24. data/docs/assets/img/016.png +0 -0
  25. data/docs/assets/img/017.png +0 -0
  26. data/docs/assets/img/018.png +0 -0
  27. data/docs/assets/img/019.png +0 -0
  28. data/docs/assets/img/020.png +0 -0
  29. data/docs/assets/img/021.png +0 -0
  30. data/docs/assets/img/022.png +0 -0
  31. data/docs/assets/img/023.png +0 -0
  32. data/docs/assets/img/024.png +0 -0
  33. data/docs/assets/img/025.png +0 -0
  34. data/docs/assets/img/026.png +0 -0
  35. data/docs/assets/img/027.png +0 -0
  36. data/docs/assets/img/028.png +0 -0
  37. data/docs/assets/img/029.png +0 -0
  38. data/docs/assets/img/030.png +0 -0
  39. data/docs/assets/img/031.png +0 -0
  40. data/docs/assets/img/032.png +0 -0
  41. data/docs/assets/img/033.png +0 -0
  42. data/docs/assets/img/034.png +0 -0
  43. data/docs/assets/img/035.png +0 -0
  44. data/docs/assets/img/036.png +0 -0
  45. data/docs/assets/img/037.png +0 -0
  46. data/docs/assets/img/038.png +0 -0
  47. data/docs/assets/img/039.png +0 -0
  48. data/docs/assets/img/040.png +0 -0
  49. data/docs/assets/img/041.png +0 -0
  50. data/docs/assets/img/042.png +0 -0
  51. data/docs/assets/img/043.png +0 -0
  52. data/docs/assets/img/044.png +0 -0
  53. data/docs/assets/img/045.png +0 -0
  54. data/docs/assets/img/046.png +0 -0
  55. data/docs/assets/img/048.png +0 -0
  56. data/docs/assets/img/049.png +0 -0
  57. data/docs/assets/img/050.png +0 -0
  58. data/docs/assets/img/051.png +0 -0
  59. data/docs/assets/img/052.png +0 -0
  60. data/docs/assets/img/053.png +0 -0
  61. data/docs/assets/svg/005.svg +17 -17
  62. data/docs/assets/svg/011.svg +19 -19
  63. data/docs/assets/svg/012.svg +17 -17
  64. data/docs/assets/svg/013.svg +76 -76
  65. data/docs/assets/svg/026.svg +15 -15
  66. data/docs/assets/svg/027.svg +46 -46
  67. data/docs/assets/svg/040.svg +63 -63
  68. data/docs/assets/svg/053.svg +81 -0
  69. data/lib/rsyntaxtree/base_graph.rb +1 -1
  70. data/lib/rsyntaxtree/element.rb +16 -10
  71. data/lib/rsyntaxtree/elementlist.rb +1 -1
  72. data/lib/rsyntaxtree/markup_parser.rb +2 -1
  73. data/lib/rsyntaxtree/string_parser.rb +35 -27
  74. data/lib/rsyntaxtree/svg_graph.rb +1 -1
  75. data/lib/rsyntaxtree/utils.rb +1 -1
  76. data/lib/rsyntaxtree/version.rb +1 -1
  77. data/lib/rsyntaxtree.rb +1 -3
  78. data/test/markup_parser_test.rb +7 -0
  79. metadata +6 -3
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" standalone="no"?>
2
2
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
- <svg width="1344.2" height="1049.25" viewBox="-14.4, 0, 1358.6000000000001, 1060.5" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <svg width="1519.2" height="1010.25" viewBox="-14.4, 0, 1533.6000000000001, 1021.5" version="1.1" xmlns="http://www.w3.org/2000/svg">
4
4
  <defs>
5
5
  <marker id="arrow" markerUnits="userSpaceOnUse" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="14.4" markerHeight="14.4" orient="auto">
6
6
  <path d="M 0 0 L 10 5 L 0 10" fill="black"/>
@@ -24,97 +24,97 @@
24
24
  <line x1="0" y="0" x2="0" y2="10" stroke="black" stroke-width="4"></line>
25
25
  </pattern>
26
26
  </defs>
27
- <rect x="-14.4" y="0" width="1358.6000000000001" height="1060.5" stroke="none" fill="white" />"
28
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='471.17499999999995' y='67.5'><tspan x='668.675' y='67.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">root</tspan>
29
- <tspan x='550.175' y='115.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[cons]<tspan style='fill:none;'>■</tspan>[sonor]</tspan>
30
- <tspan x='637.175' y='163.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">stricture</tspan>
31
- <tspan x='471.17499999999995' y='211.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[later]<tspan style='fill:none;'>■</tspan>[strid]<tspan style='fill:none;'>■</tspan>[contin]</tspan>
27
+ <rect x="-14.4" y="0" width="1533.6000000000001" height="1021.5" stroke="none" fill="white" />"
28
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='600.3000000000002' y='67.5'><tspan x='780.3000000000002' y='67.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">root</tspan>
29
+ <tspan x='690.3000000000002' y='112.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[cons]<tspan style='fill:none;'>■</tspan>[sonor]</tspan>
30
+ <tspan x='735.3000000000002' y='157.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">stricture</tspan>
31
+ <tspan x='600.3000000000002' y='202.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[later]<tspan style='fill:none;'>■</tspan>[strid]<tspan style='fill:none;'>■</tspan>[contin]</tspan>
32
32
  </text>
33
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='264.99999999999994' y='385.5'><tspan x='264.99999999999994' y='385.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">cavity</tspan>
34
- <tspan x='277.99999999999994' y='433.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Oral</tspan>
33
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='315.00000000000006' y='373.5'><tspan x='315.00000000000006' y='373.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">cavity</tspan>
34
+ <tspan x='333.00000000000006' y='418.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Oral</tspan>
35
35
  </text>
36
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='14.399999999999977' y='607.5'><tspan x='14.399999999999977' y='607.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">articulator</tspan>
37
- <tspan x='47.39999999999998' y='655.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Labial</tspan>
36
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='14.399999999999977' y='589.5'><tspan x='14.399999999999977' y='589.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">articulator</tspan>
37
+ <tspan x='59.39999999999998' y='634.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Labial</tspan>
38
38
  </text>
39
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='15.899999999999977' y='829.5'><tspan x='28.899999999999977' y='829.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">terminal</tspan>
40
- <tspan x='31.899999999999977' y='877.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">features</tspan>
41
- <tspan x='15.899999999999977' y='925.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[round]</tspan>
39
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='41.40000000000009' y='805.5'><tspan x='41.40000000000009' y='805.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">terminal</tspan>
40
+ <tspan x='41.40000000000009' y='850.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">features</tspan>
41
+ <tspan x='50.40000000000009' y='895.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[round]</tspan>
42
42
  </text>
43
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='230.9999999999999' y='607.5'><tspan x='230.9999999999999' y='607.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">articulator</tspan>
44
- <tspan x='250.9999999999999' y='655.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Coronal</tspan>
43
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='270.0000000000001' y='589.5'><tspan x='270.0000000000001' y='589.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">articulator</tspan>
44
+ <tspan x='306.0000000000001' y='634.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Coronal</tspan>
45
45
  </text>
46
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='228.9999999999999' y='829.5'><tspan x='245.4999999999999' y='829.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">terminal</tspan>
47
- <tspan x='248.4999999999999' y='877.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">features</tspan>
48
- <tspan x='237.4999999999999' y='925.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[anter]</tspan>
49
- <tspan x='228.9999999999999' y='973.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[distrib]</tspan>
46
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='288.0000000000001' y='805.5'><tspan x='297.0000000000001' y='805.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">terminal</tspan>
47
+ <tspan x='297.0000000000001' y='850.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">features</tspan>
48
+ <tspan x='306.0000000000001' y='895.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[anter]</tspan>
49
+ <tspan x='288.0000000000001' y='940.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[distrib]</tspan>
50
50
  </text>
51
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='447.5999999999999' y='607.5'><tspan x='447.5999999999999' y='607.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">articulator</tspan>
52
- <tspan x='478.5999999999999' y='655.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Dorsal</tspan>
51
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='525.6000000000001' y='589.5'><tspan x='525.6000000000001' y='589.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">articulator</tspan>
52
+ <tspan x='570.6000000000001' y='634.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Dorsal</tspan>
53
53
  </text>
54
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='458.0999999999999' y='829.5'><tspan x='462.0999999999999' y='829.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">terminal</tspan>
55
- <tspan x='465.0999999999999' y='877.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">features</tspan>
56
- <tspan x='458.0999999999999' y='925.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[back]</tspan>
57
- <tspan x='461.5999999999999' y='973.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[high]</tspan>
58
- <tspan x='467.0999999999999' y='1021.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[low]</tspan>
54
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='552.6000000000001' y='805.5'><tspan x='552.6000000000001' y='805.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">terminal</tspan>
55
+ <tspan x='552.6000000000001' y='850.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">features</tspan>
56
+ <tspan x='570.6000000000001' y='895.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[back]</tspan>
57
+ <tspan x='570.6000000000001' y='940.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[high]</tspan>
58
+ <tspan x='579.6000000000001' y='985.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[low]</tspan>
59
59
  </text>
60
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='703.1999999999999' y='385.5'><tspan x='703.1999999999999' y='385.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">cavity</tspan>
61
- <tspan x='706.1999999999999' y='433.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Nasal</tspan>
60
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='826.2' y='373.5'><tspan x='826.2' y='373.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">cavity</tspan>
61
+ <tspan x='835.2' y='418.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Nasal</tspan>
62
62
  </text>
63
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='662.1999999999999' y='607.5'><tspan x='669.1999999999999' y='607.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">articulator</tspan>
64
- <tspan x='662.1999999999999' y='655.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Soft<tspan style='fill:none;'>■</tspan>Palate</tspan>
63
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='781.2' y='589.5'><tspan x='781.2' y='589.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">articulator</tspan>
64
+ <tspan x='781.2' y='634.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Soft<tspan style='fill:none;'>■</tspan>Palate</tspan>
65
65
  </text>
66
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='675.6999999999999' y='829.5'><tspan x='683.6999999999999' y='829.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">terminal</tspan>
67
- <tspan x='686.6999999999999' y='877.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">features</tspan>
68
- <tspan x='675.6999999999999' y='925.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[nasal]</tspan>
66
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='808.2' y='805.5'><tspan x='808.2' y='805.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">terminal</tspan>
67
+ <tspan x='808.2' y='850.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">features</tspan>
68
+ <tspan x='817.2' y='895.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[nasal]</tspan>
69
69
  </text>
70
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='1005.3499999999999' y='385.5'><tspan x='1045.35' y='385.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">cavity</tspan>
71
- <tspan x='1005.3499999999999' y='433.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Pharyngeal</tspan>
70
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='1173.6' y='373.5'><tspan x='1209.6' y='373.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">cavity</tspan>
71
+ <tspan x='1173.6' y='418.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Pharyngeal</tspan>
72
72
  </text>
73
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='890.8' y='607.5'><tspan x='890.8' y='607.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">articulator</tspan>
74
- <tspan x='914.3' y='655.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Radical</tspan>
73
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='1036.8000000000002' y='589.5'><tspan x='1036.8000000000002' y='589.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">articulator</tspan>
74
+ <tspan x='1072.8000000000002' y='634.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Radical</tspan>
75
75
  </text>
76
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='905.3' y='829.5'><tspan x='905.3' y='829.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">terminal</tspan>
77
- <tspan x='908.3' y='877.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">features</tspan>
78
- <tspan x='908.3' y='925.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[ATR]</tspan>
79
- <tspan x='907.8' y='973.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[RTR]</tspan>
76
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='1063.8000000000002' y='805.5'><tspan x='1063.8000000000002' y='805.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">terminal</tspan>
77
+ <tspan x='1063.8000000000002' y='850.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">features</tspan>
78
+ <tspan x='1090.8000000000002' y='895.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[ATR]</tspan>
79
+ <tspan x='1090.8000000000002' y='940.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[RTR]</tspan>
80
80
  </text>
81
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='1131.8999999999999' y='607.5'><tspan x='1131.8999999999999' y='607.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">articulator</tspan>
82
- <tspan x='1159.8999999999999' y='655.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Glottal</tspan>
81
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='1292.4' y='589.5'><tspan x='1292.4' y='589.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">articulator</tspan>
82
+ <tspan x='1328.4' y='634.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Glottal</tspan>
83
83
  </text>
84
- <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='1105.3999999999999' y='829.5'><tspan x='1146.3999999999999' y='829.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">terminal</tspan>
85
- <tspan x='1149.3999999999999' y='877.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">features</tspan>
86
- <tspan x='1105.3999999999999' y='925.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[spread<tspan style='fill:none;'>■</tspan>gl]</tspan>
87
- <tspan x='1109.8999999999999' y='973.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[constr<tspan style='fill:none;'>■</tspan>gl]</tspan>
88
- <tspan x='1128.8999999999999' y='1021.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[voiced]</tspan>
84
+ <text white-space='pre' alignment-baseline='text-top' style='fill: black; storoke-width: 0; font-size: 32px;' x='1292.4' y='805.5'><tspan x='1319.4' y='805.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">terminal</tspan>
85
+ <tspan x='1319.4' y='850.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">features</tspan>
86
+ <tspan x='1292.4' y='895.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[spread<tspan style='fill:none;'>■</tspan>gl]</tspan>
87
+ <tspan x='1292.4' y='940.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[constr<tspan style='fill:none;'>■</tspan>gl]</tspan>
88
+ <tspan x='1319.4' y='985.5' style="" text-decoration="" font-family="'Noto Sans Mono SemiCondensed', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">[voiced]</tspan>
89
89
  </text>
90
90
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
91
- points='309.49999999999994 329.25 309.49999999999994 284.4375 699.675 284.4375 699.675 239.625' />
91
+ points='369.00000000000006 317.25 369.00000000000006 273.9375 816.3000000000001 273.9375 816.3000000000001 230.625' />
92
92
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
93
- points='747.6999999999999 329.25 747.6999999999999 284.4375 699.675 284.4375 699.675 239.625' />
93
+ points='880.2 317.25 880.2 273.9375 816.3000000000001 273.9375 816.3000000000001 230.625' />
94
94
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
95
- points='1089.85 329.25 1089.85 284.4375 699.675 284.4375 699.675 239.625' />
95
+ points='1263.6 317.25 1263.6 273.9375 816.3000000000001 273.9375 816.3000000000001 230.625' />
96
96
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
97
- points='92.89999999999998 551.25 92.89999999999998 506.4375 309.49999999999994 506.4375 309.49999999999994 461.625' />
97
+ points='113.39999999999998 533.25 113.39999999999998 489.9375 369.00000000000006 489.9375 369.00000000000006 446.625' />
98
98
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
99
- points='309.4999999999999 551.25 309.4999999999999 506.4375 309.49999999999994 506.4375 309.49999999999994 461.625' />
99
+ points='369.0000000000001 533.25 369.0000000000001 489.9375 369.00000000000006 489.9375 369.00000000000006 446.625' />
100
100
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
101
- points='526.0999999999999 551.25 526.0999999999999 506.4375 309.49999999999994 506.4375 309.49999999999994 461.625' />
101
+ points='624.6000000000001 533.25 624.6000000000001 489.9375 369.00000000000006 489.9375 369.00000000000006 446.625' />
102
102
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
103
- points='92.89999999999998 773.25 92.89999999999998 728.4375 92.89999999999998 728.4375 92.89999999999998 683.625' />
103
+ points='113.40000000000009 749.25 113.40000000000009 705.9375 113.39999999999998 705.9375 113.39999999999998 662.625' />
104
104
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
105
- points='309.4999999999999 773.25 309.4999999999999 728.4375 309.4999999999999 728.4375 309.4999999999999 683.625' />
105
+ points='369.0000000000001 749.25 369.0000000000001 705.9375 369.0000000000001 705.9375 369.0000000000001 662.625' />
106
106
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
107
- points='526.0999999999999 773.25 526.0999999999999 728.4375 526.0999999999999 728.4375 526.0999999999999 683.625' />
107
+ points='624.6000000000001 749.25 624.6000000000001 705.9375 624.6000000000001 705.9375 624.6000000000001 662.625' />
108
108
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
109
- points='747.6999999999999 551.25 747.6999999999999 506.4375 747.6999999999999 506.4375 747.6999999999999 461.625' />
109
+ points='880.2 533.25 880.2 489.9375 880.2 489.9375 880.2 446.625' />
110
110
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
111
- points='747.6999999999999 773.25 747.6999999999999 728.4375 747.6999999999999 728.4375 747.6999999999999 683.625' />
111
+ points='880.2 749.25 880.2 705.9375 880.2 705.9375 880.2 662.625' />
112
112
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
113
- points='969.3 551.25 969.3 506.4375 1089.85 506.4375 1089.85 461.625' />
113
+ points='1135.8000000000002 533.25 1135.8000000000002 489.9375 1263.6 489.9375 1263.6 446.625' />
114
114
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
115
- points='1210.3999999999999 551.25 1210.3999999999999 506.4375 1089.85 506.4375 1089.85 461.625' />
115
+ points='1391.4 533.25 1391.4 489.9375 1263.6 489.9375 1263.6 446.625' />
116
116
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
117
- points='969.3 773.25 969.3 728.4375 969.3 728.4375 969.3 683.625' />
117
+ points='1135.8000000000002 749.25 1135.8000000000002 705.9375 1135.8000000000002 705.9375 1135.8000000000002 662.625' />
118
118
  <polyline style='stroke:black; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
119
- points='1210.3999999999999 773.25 1210.3999999999999 728.4375 1210.3999999999999 728.4375 1210.3999999999999 683.625' />
119
+ points='1391.4 749.25 1391.4 705.9375 1391.4 705.9375 1391.4 662.625' />
120
120
  </svg>
@@ -0,0 +1,81 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg width="847.1999999999999" height="1172.25" viewBox="-16.8, 0, 863.9999999999999, 1183.5" version="1.1" xmlns="http://www.w3.org/2000/svg">
4
+ <defs>
5
+ <marker id="arrow" markerUnits="userSpaceOnUse" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="16.8" markerHeight="16.8" orient="auto">
6
+ <path d="M 0 0 L 10 5 L 0 10" fill="#CC79A7"/>
7
+ </marker>
8
+ <marker id="arrowBackward" markerUnits="userSpaceOnUse" viewBox="0 0 10 10" refX="5" refY="5" markerWidth="16.8" markerHeight="16.8" orient="auto">
9
+ <path d="M 0 0 L 10 5 L 0 10 z" fill="#CC79A7"/>
10
+ </marker>
11
+ <marker id="arrowForward" markerUnits="userSpaceOnUse" viewBox="0 0 10 10" refX="5" refY="5" markerWidth="16.8" markerHeight="16.8" orient="auto">
12
+ <path d="M 10 0 L 0 5 L 10 10 z" fill="#CC79A7"/>
13
+ </marker>
14
+ <marker id="arrowBothways" markerUnits="userSpaceOnUse" viewBox="0 0 30 10" refX="15" refY="5" markerWidth="50.400000000000006" markerHeight="16.8" orient="auto">
15
+ <path d="M 0 5 L 10 0 L 10 5 L 20 5 L 20 0 L 30 5 L 20 10 L 20 5 L 10 5 L 10 10 z" fill="#CC79A7"/>
16
+ </marker>
17
+ <pattern id="hatchBlack" x="10" y="10" width="10" height="10" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
18
+ <line x1="0" y="0" x2="0" y2="10" stroke="black" stroke-width="4"></line>
19
+ </pattern>
20
+ <pattern id="hatchForNode" x="10" y="10" width="10" height="10" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
21
+ <line x1="0" y="0" x2="0" y2="10" stroke="#0072B2" stroke-width="4"></line>
22
+ </pattern>
23
+ <pattern id="hatchForLeaf" x="10" y="10" width="10" height="10" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
24
+ <line x1="0" y="0" x2="0" y2="10" stroke="#009E73" stroke-width="4"></line>
25
+ </pattern>
26
+ </defs>
27
+ <rect x="-16.8" y="0" width="863.9999999999999" height="1183.5" stroke="none" fill="white" />"
28
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='147.275' y='67.5'><tspan x='147.275' y='67.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">expr</tspan>
29
+ </text>
30
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='16.80000000000001' y='283.5'><tspan x='16.80000000000001' y='283.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">id</tspan>
31
+ </text>
32
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='22.30000000000001' y='499.5'><tspan x='22.30000000000001' y='499.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">x</tspan>
33
+ </text>
34
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='290.25' y='283.5'><tspan x='290.25' y='283.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">suffix</tspan>
35
+ </text>
36
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='114.0' y='499.5'><tspan x='114.0' y='499.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">[</tspan>
37
+ </text>
38
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='193.19999999999996' y='499.5'><tspan x='193.19999999999996' y='499.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">id</tspan>
39
+ </text>
40
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='199.19999999999996' y='715.5'><tspan x='199.19999999999996' y='715.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">2</tspan>
41
+ </text>
42
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='290.4' y='499.5'><tspan x='290.4' y='499.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">]</tspan>
43
+ </text>
44
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='504.0' y='499.5'><tspan x='504.0' y='499.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">suffix</tspan>
45
+ </text>
46
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='369.59999999999997' y='715.5'><tspan x='369.59999999999997' y='715.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">[</tspan>
47
+ </text>
48
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='448.79999999999995' y='715.5'><tspan x='448.79999999999995' y='715.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">id</tspan>
49
+ </text>
50
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='454.79999999999995' y='931.5'><tspan x='454.79999999999995' y='931.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">3</tspan>
51
+ </text>
52
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='546.0' y='715.5'><tspan x='546.0' y='715.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">]</tspan>
53
+ </text>
54
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='675.9' y='715.5'><tspan x='675.9' y='715.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">suffix</tspan>
55
+ </text>
56
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='625.1999999999999' y='931.5'><tspan x='625.1999999999999' y='931.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">[</tspan>
57
+ </text>
58
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='704.4' y='931.5'><tspan x='704.4' y='931.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">id</tspan>
59
+ </text>
60
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='710.4' y='1147.5'><tspan x='710.4' y='1147.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">4</tspan>
61
+ </text>
62
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='801.5999999999999' y='931.5'><tspan x='801.5999999999999' y='931.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">]</tspan>
63
+ </text>
64
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='31.80000000000001' y1='227.25' x2='182.775' y2='95.625' />
65
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='333.75' y1='227.25' x2='182.775' y2='95.625' />
66
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='31.80000000000001' y1='443.25' x2='31.80000000000001' y2='311.625' />
67
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='120.0' y1='443.25' x2='333.75' y2='311.625' />
68
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='208.19999999999996' y1='443.25' x2='333.75' y2='311.625' />
69
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='296.4' y1='443.25' x2='333.75' y2='311.625' />
70
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='547.5' y1='443.25' x2='333.75' y2='311.625' />
71
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='208.19999999999996' y1='659.25' x2='208.19999999999996' y2='527.625' />
72
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='375.59999999999997' y1='659.25' x2='547.5' y2='527.625' />
73
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='463.79999999999995' y1='659.25' x2='547.5' y2='527.625' />
74
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='552.0' y1='659.25' x2='547.5' y2='527.625' />
75
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='719.4' y1='659.25' x2='547.5' y2='527.625' />
76
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='463.79999999999995' y1='875.25' x2='463.79999999999995' y2='743.625' />
77
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='631.1999999999999' y1='875.25' x2='719.4' y2='743.625' />
78
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='719.4' y1='875.25' x2='719.4' y2='743.625' />
79
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='807.5999999999999' y1='875.25' x2='719.4' y2='743.625' />
80
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='719.4' y1='1091.25' x2='719.4' y2='959.625' />
81
+ </svg>
@@ -5,7 +5,7 @@
5
5
  #==========================
6
6
  #
7
7
  # Image utility functions to inspect text font metrics
8
- # Copyright (c) 2007-2023 Yoichiro Hasebe <yohasebe@gmail.com>
8
+ # Copyright (c) 2007-2024 Yoichiro Hasebe <yohasebe@gmail.com>
9
9
 
10
10
  require_relative 'utils'
11
11
 
@@ -5,7 +5,7 @@
5
5
  #==========================
6
6
  #
7
7
  # Aa class that represents a basic tree element, either node or leaf.
8
- # Copyright (c) 2007-2023 Yoichiro Hasebe <yohasebe@gmail.com>
8
+ # Copyright (c) 2007-2024 Yoichiro Hasebe <yohasebe@gmail.com>
9
9
 
10
10
  require_relative "markup_parser"
11
11
  require_relative "utils"
@@ -70,7 +70,12 @@ module RSyntaxTree
70
70
  elements_height = []
71
71
  content[:elements].each do |e|
72
72
  text = e[:text]
73
- e[:text] = text.gsub(" ", WHITESPACE_BLOCK).gsub(">", '&#62;').gsub("<", '&#60;')
73
+ # エスケープされた角括弧の処理
74
+ text = text.gsub('\\[', '[')
75
+ .gsub('\\]', ']')
76
+ e[:text] = text.gsub(" ", WHITESPACE_BLOCK)
77
+ .gsub(">", '&#62;')
78
+ .gsub("<", '&#60;')
74
79
 
75
80
  @contains_phrase = true if text.include?(" ")
76
81
  decoration = e[:decoration]
@@ -103,10 +108,10 @@ module RSyntaxTree
103
108
  seg[:char]
104
109
  end
105
110
  this_font = if seg[:type] == :emoji
106
- @fontset[:emoji]
107
- else
108
- font
109
- end
111
+ @fontset[:emoji]
112
+ else
113
+ font
114
+ end
110
115
  metrics = FontMetrics.get_metrics(ch, this_font, fontsize, style, weight)
111
116
  width += metrics.width
112
117
  end
@@ -119,13 +124,14 @@ module RSyntaxTree
119
124
  width = metrics.width
120
125
  end
121
126
 
127
+ # 以下は変更なし
122
128
  if e[:decoration].include?(:box) || e[:decoration].include?(:circle) || e[:decoration].include?(:bar)
123
129
  e[:content_width] = width
124
130
  width += if e[:text].size == 1
125
- height - width
126
- else
127
- @global[:width_half_x]
128
- end
131
+ height - width
132
+ else
133
+ @global[:width_half_x]
134
+ end
129
135
  end
130
136
 
131
137
  if e[:decoration].include?(:whitespace)
@@ -5,7 +5,7 @@
5
5
  #==========================
6
6
  #
7
7
  # Contains a list of unordered tree elements with a defined parent
8
- # Copyright (c) 2007-2023 Yoichiro Hasebe <yohasebe@gmail.com>
8
+ # Copyright (c) 2007-2024 Yoichiro Hasebe <yohasebe@gmail.com>
9
9
 
10
10
  require_relative "element"
11
11
 
@@ -14,7 +14,8 @@ class MarkupParser < Parslet::Parser
14
14
  rule(:triangle) { str('^') }
15
15
 
16
16
  rule(:path) { (str('+') >> str('-').maybe >> (str('>') | str('<')).maybe >> match('\d').repeat(1)).as(:path) }
17
- rule(:escaped) { str('\\') >> match('[#<>{}\\^+*_=~\|\n\-]').as(:chr) }
17
+ # rule(:escaped) { str('\\') >> match('[#<>{}\\^+*_=~\|\n\-]').as(:chr) }
18
+ rule(:escaped) { str('\\') >> match('[#<>{}\\\\^+*_=~\\|\\n\\-\\[\\]]').as(:chr) }
18
19
  rule(:non_escaped) { ((match('[#<>{}\\^+*_=~\|\-]') | str('\\n')).absent? >> any).as(:chr) }
19
20
  rule(:text) { (escaped | non_escaped).repeat(1).as(:text) }
20
21
 
@@ -6,7 +6,7 @@
6
6
  #
7
7
  # Parses a phrase into leafs and nodes and store the result in an element list
8
8
  # (see element_list.rb)
9
- # Copyright (c) 2007-2023 Yoichiro Hasebe <yohasebe@gmail.com>
9
+ # Copyright (c) 2007-2024 Yoichiro Hasebe <yohasebe@gmail.com>
10
10
 
11
11
  require_relative 'elementlist'
12
12
  require_relative 'element'
@@ -112,11 +112,11 @@ module RSyntaxTree
112
112
 
113
113
  escape = false
114
114
  while ((@pos + i) < data.length) && !gottoken
115
- ch = data[@pos + i];
115
+ ch = data[@pos + i]
116
116
  case ch
117
117
  when "["
118
118
  if escape
119
- token += ch
119
+ token += '\\[' # エスケープされた角括弧として保持
120
120
  escape = false
121
121
  elsif i.positive?
122
122
  gottoken = true
@@ -125,7 +125,7 @@ module RSyntaxTree
125
125
  end
126
126
  when "]"
127
127
  if escape
128
- token += ch
128
+ token += '\\]' # エスケープされた角括弧として保持
129
129
  escape = false
130
130
  else
131
131
  token += ch if i.zero?
@@ -179,33 +179,41 @@ module RSyntaxTree
179
179
  token_r = token.split(//)
180
180
  case token_r[0]
181
181
  when "["
182
- tl = token_r.length
183
- token_r = token_r[1, tl - 1]
184
- spaceat = token_r.index(" ")
185
- newparent = -1
186
-
187
- if spaceat
188
- parts[0] = token_r[0, spaceat].join
189
-
190
- tl = token_r.length
191
- parts[1] = token_r[spaceat, tl - spaceat].join
192
-
193
- element = Element.new(@id, parent, parts[0], @level, @fontset, @fontsize, @global)
182
+ # エスケープされた角括弧をチェック
183
+ if token =~ /\A\\\[/ || token =~ /\A\\\]/
184
+ # エスケープされた角括弧の場合は通常のテキストとして扱う
185
+ element = Element.new(@id, parent, token, @level, @fontset, @fontsize, @global)
194
186
  @id += 1
195
187
  @elist.add(element)
196
- newparent = element.id
197
-
198
- element = Element.new(@id, @id - 1, parts[1], @level + 1, @fontset, @fontsize, @global)
199
- @id += 1
200
188
  else
201
- joined = token_r.join
202
- element = Element.new(@id, parent, joined, @level, @fontset, @fontsize, @global)
203
- @id += 1
204
- newparent = element.id
189
+ # 以下、既存の処理
190
+ tl = token_r.length
191
+ token_r = token_r[1, tl - 1]
192
+ spaceat = token_r.index(" ")
193
+ newparent = -1
194
+
195
+ if spaceat
196
+ parts[0] = token_r[0, spaceat].join
197
+ tl = token_r.length
198
+ parts[1] = token_r[spaceat, tl - spaceat].join
199
+
200
+ element = Element.new(@id, parent, parts[0], @level, @fontset, @fontsize, @global)
201
+ @id += 1
202
+ @elist.add(element)
203
+ newparent = element.id
204
+
205
+ element = Element.new(@id, @id - 1, parts[1], @level + 1, @fontset, @fontsize, @global)
206
+ @id += 1
207
+ else
208
+ joined = token_r.join
209
+ element = Element.new(@id, parent, joined, @level, @fontset, @fontsize, @global)
210
+ @id += 1
211
+ newparent = element.id
212
+ end
213
+ @elist.add(element)
214
+ @level += 1
215
+ make_tree(newparent)
205
216
  end
206
- @elist.add(element)
207
- @level += 1
208
- make_tree(newparent)
209
217
  else
210
218
  if token.strip != ""
211
219
  element = Element.new(@id, parent, token, @level, @fontset, @fontsize, @global)
@@ -5,7 +5,7 @@
5
5
  #==========================
6
6
  #
7
7
  # Parses an element list into an SVG tree.
8
- # Copyright (c) 2007-2023 Yoichiro Hasebe <yohasebe@gmail.com>
8
+ # Copyright (c) 2007-2024 Yoichiro Hasebe <yohasebe@gmail.com>
9
9
 
10
10
  require "tempfile"
11
11
  require_relative 'base_graph'
@@ -5,7 +5,7 @@
5
5
  #==========================
6
6
  #
7
7
  # Image utility functions to inspect text font metrics
8
- # Copyright (c) 2007-2023 Yoichiro Hasebe <yohasebe@gmail.com>
8
+ # Copyright (c) 2007-2024 Yoichiro Hasebe <yohasebe@gmail.com>
9
9
 
10
10
  require 'rmagick'
11
11
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RSyntaxTree
4
- VERSION = "1.2.12"
4
+ VERSION = "1.3.1"
5
5
  end
data/lib/rsyntaxtree.rb CHANGED
@@ -6,7 +6,7 @@
6
6
  #
7
7
  # Facade of rsyntaxtree library. When loaded by a driver script, it does all
8
8
  # the necessary 'require' to use the library.
9
- # Copyright (c) 2007-2023 Yoichiro Hasebe <yohasebe@gmail.com>
9
+ # Copyright (c) 2007-2024 Yoichiro Hasebe <yohasebe@gmail.com>
10
10
 
11
11
  FONT_DIR = File.expand_path(File.join(__dir__, "/../fonts"))
12
12
  ETYPE_NODE = 1
@@ -66,8 +66,6 @@ module RSyntaxTree
66
66
  .gsub('-CABRACKET-', '>')
67
67
  .gsub('¥¥', '\¥')
68
68
  .gsub(/(?<!\\)¥/, "\\")
69
- .gsub(/\\\[/, "[")
70
- .gsub(/\\\]/, "]")
71
69
  new_params[key] = data
72
70
 
73
71
  when :symmetrize, :transparent, :polyline, :hide_default_connectors
@@ -207,4 +207,11 @@ class MarkupParserTest < Minitest::Test
207
207
  Markup.parse text2
208
208
  # {:status=>:error, :text=>"!^#----\\n\\nX_Y_Z+1+>2"}
209
209
  end
210
+
211
+ def test_escaped_brackets
212
+ text = "[expr [id x] [suffix \\[ [id 2] \\] ] ]"
213
+ @parser = MarkupParser.new
214
+ @parser.parse(text)
215
+ assert true
216
+ end
210
217
  end