rsyntaxtree 1.6.3 → 1.7.0

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 (146) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/CITATION.cff +21 -0
  4. data/Dockerfile +1 -1
  5. data/Gemfile +1 -0
  6. data/README.md +11 -7
  7. data/docs/assets/img/000.png +0 -0
  8. data/docs/assets/img/001.png +0 -0
  9. data/docs/assets/img/002.png +0 -0
  10. data/docs/assets/img/003.png +0 -0
  11. data/docs/assets/img/004.png +0 -0
  12. data/docs/assets/img/005.png +0 -0
  13. data/docs/assets/img/006.png +0 -0
  14. data/docs/assets/img/007.png +0 -0
  15. data/docs/assets/img/008.png +0 -0
  16. data/docs/assets/img/009.png +0 -0
  17. data/docs/assets/img/010.png +0 -0
  18. data/docs/assets/img/011.png +0 -0
  19. data/docs/assets/img/012.png +0 -0
  20. data/docs/assets/img/013.png +0 -0
  21. data/docs/assets/img/014.png +0 -0
  22. data/docs/assets/img/015.png +0 -0
  23. data/docs/assets/img/016.png +0 -0
  24. data/docs/assets/img/017.png +0 -0
  25. data/docs/assets/img/018.png +0 -0
  26. data/docs/assets/img/019.png +0 -0
  27. data/docs/assets/img/020.png +0 -0
  28. data/docs/assets/img/021.png +0 -0
  29. data/docs/assets/img/022.png +0 -0
  30. data/docs/assets/img/023.png +0 -0
  31. data/docs/assets/img/024.png +0 -0
  32. data/docs/assets/img/025.png +0 -0
  33. data/docs/assets/img/026.png +0 -0
  34. data/docs/assets/img/027.png +0 -0
  35. data/docs/assets/img/028.png +0 -0
  36. data/docs/assets/img/029.png +0 -0
  37. data/docs/assets/img/030.png +0 -0
  38. data/docs/assets/img/031.png +0 -0
  39. data/docs/assets/img/032.png +0 -0
  40. data/docs/assets/img/033.png +0 -0
  41. data/docs/assets/img/034.png +0 -0
  42. data/docs/assets/img/035.png +0 -0
  43. data/docs/assets/img/036.png +0 -0
  44. data/docs/assets/img/037.png +0 -0
  45. data/docs/assets/img/038.png +0 -0
  46. data/docs/assets/img/039.png +0 -0
  47. data/docs/assets/img/040.png +0 -0
  48. data/docs/assets/img/041.png +0 -0
  49. data/docs/assets/img/042.png +0 -0
  50. data/docs/assets/img/043.png +0 -0
  51. data/docs/assets/img/044.png +0 -0
  52. data/docs/assets/img/045.png +0 -0
  53. data/docs/assets/img/046.png +0 -0
  54. data/docs/assets/img/047.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/img/054.png +0 -0
  62. data/docs/assets/img/055.png +0 -0
  63. data/docs/assets/img/056.png +0 -0
  64. data/docs/assets/img/057.png +0 -0
  65. data/docs/assets/img/058.png +0 -0
  66. data/docs/assets/img/059.png +0 -0
  67. data/docs/assets/img/060.png +0 -0
  68. data/docs/assets/img/061.png +0 -0
  69. data/docs/assets/img/062.png +0 -0
  70. data/docs/assets/img/063.png +0 -0
  71. data/docs/assets/img/064.png +0 -0
  72. data/docs/assets/img/065.png +0 -0
  73. data/docs/assets/svg/000.svg +31 -31
  74. data/docs/assets/svg/001.svg +19 -19
  75. data/docs/assets/svg/002.svg +37 -37
  76. data/docs/assets/svg/003.svg +29 -29
  77. data/docs/assets/svg/004.svg +41 -41
  78. data/docs/assets/svg/005.svg +21 -21
  79. data/docs/assets/svg/006.svg +25 -25
  80. data/docs/assets/svg/007.svg +31 -31
  81. data/docs/assets/svg/008.svg +35 -35
  82. data/docs/assets/svg/009.svg +35 -35
  83. data/docs/assets/svg/010.svg +50 -50
  84. data/docs/assets/svg/011.svg +30 -30
  85. data/docs/assets/svg/012.svg +35 -35
  86. data/docs/assets/svg/013.svg +116 -116
  87. data/docs/assets/svg/014.svg +96 -96
  88. data/docs/assets/svg/015.svg +33 -33
  89. data/docs/assets/svg/016.svg +397 -397
  90. data/docs/assets/svg/017.svg +35 -35
  91. data/docs/assets/svg/018.svg +37 -37
  92. data/docs/assets/svg/019.svg +95 -95
  93. data/docs/assets/svg/020.svg +62 -62
  94. data/docs/assets/svg/021.svg +42 -42
  95. data/docs/assets/svg/022.svg +75 -75
  96. data/docs/assets/svg/023.svg +47 -47
  97. data/docs/assets/svg/024.svg +23 -23
  98. data/docs/assets/svg/025.svg +99 -99
  99. data/docs/assets/svg/026.svg +19 -19
  100. data/docs/assets/svg/027.svg +50 -50
  101. data/docs/assets/svg/028.svg +21 -21
  102. data/docs/assets/svg/029.svg +69 -69
  103. data/docs/assets/svg/030.svg +35 -35
  104. data/docs/assets/svg/031.svg +15 -15
  105. data/docs/assets/svg/032.svg +40 -40
  106. data/docs/assets/svg/033.svg +39 -39
  107. data/docs/assets/svg/034.svg +40 -40
  108. data/docs/assets/svg/035.svg +39 -39
  109. data/docs/assets/svg/036.svg +17 -17
  110. data/docs/assets/svg/037.svg +29 -29
  111. data/docs/assets/svg/038.svg +39 -39
  112. data/docs/assets/svg/039.svg +7 -7
  113. data/docs/assets/svg/040.svg +67 -67
  114. data/docs/assets/svg/041.svg +49 -49
  115. data/docs/assets/svg/042.svg +15 -15
  116. data/docs/assets/svg/043.svg +146 -146
  117. data/docs/assets/svg/044.svg +4 -4
  118. data/docs/assets/svg/045.svg +56 -56
  119. data/docs/assets/svg/046.svg +647 -647
  120. data/docs/assets/svg/047.svg +26 -26
  121. data/docs/assets/svg/048.svg +69 -69
  122. data/docs/assets/svg/049.svg +44 -44
  123. data/docs/assets/svg/050.svg +100 -100
  124. data/docs/assets/svg/051.svg +96 -96
  125. data/docs/assets/svg/052.svg +50 -50
  126. data/docs/assets/svg/053.svg +41 -41
  127. data/docs/assets/svg/054.svg +17 -17
  128. data/docs/assets/svg/055.svg +19 -19
  129. data/docs/assets/svg/056.svg +27 -27
  130. data/docs/assets/svg/057.svg +49 -49
  131. data/docs/assets/svg/058.svg +42 -42
  132. data/docs/assets/svg/059.svg +50 -50
  133. data/docs/assets/svg/060.svg +65 -65
  134. data/docs/assets/svg/061.svg +96 -96
  135. data/docs/assets/svg/062.svg +92 -92
  136. data/docs/assets/svg/063.svg +50 -50
  137. data/docs/assets/svg/064.svg +30 -30
  138. data/docs/assets/svg/065.svg +24 -24
  139. data/lib/rsyntaxtree/element.rb +8 -17
  140. data/lib/rsyntaxtree/string_parser.rb +4 -1
  141. data/lib/rsyntaxtree/svg_graph.rb +1 -22
  142. data/lib/rsyntaxtree/utils.rb +67 -17
  143. data/lib/rsyntaxtree/version.rb +1 -1
  144. data/lib/rsyntaxtree.rb +15 -1
  145. data/rsyntaxtree.gemspec +1 -0
  146. metadata +16 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd3b753fd33f6df5903c6df87d02bf7c7ac45de57e1ba18da51f03fe391ab45f
4
- data.tar.gz: 3f53988bbb1ccd64b75792b822ccb04eca2d7f209500d881610cf2295ced3ce7
3
+ metadata.gz: 4b011905bb833561ebbc545ce04c4c6cf104290298fc6b2018d09f8c9ef58383
4
+ data.tar.gz: 7f35db88fa0d6585f6832d6d6621b527e830c5d7772ddb3282ccf1341b990c16
5
5
  SHA512:
6
- metadata.gz: 66e9a66413e457d4de55902743cc9ad61861c4b7fcdb4d9951d79966893e0665f5fea1e369ec69bbf058104627fc156250c841e2213f22b55b1c5b306991f311
7
- data.tar.gz: 94ff87d7fab49605087c81bc98639c86fe768c1842048438c87381d22ebbf4d651cc0b5b6cadc16acf169cdee9021b694a8239777bc6088a4d3eb3d5f985d248
6
+ metadata.gz: 7d96fe35d241eb21bb3248dd9b566a5dd0603bbed8f7118579f915ef9eecb3d875f10508dbdb4ec09f8fffa53ec2a86cb7d9d3d7458dba86f799ff1505f70fd0
7
+ data.tar.gz: 9e2298a797787e12407e57d0dc05e59cbb444b6b0792c6be1447190ef99fae4899a2ead1df2d40e80f26615d268ce0e3287029db002c02c1344aceed2a5d7bf5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.7.0] - 2026-08
4
+
5
+ ### Changed
6
+ - Text measurement now uses Pango, the same engine (and the same fontconfig
7
+ font-fallback resolution) librsvg uses to render the output, instead of
8
+ RMagick with the bundled font files. Labels in any script are measured with
9
+ the font that actually draws them, which fixes off-center labels for scripts
10
+ the bundled fonts do not cover (e.g. Khmer, #14) without bundling per-script
11
+ fonts. Horizontal dimensions of the output may change slightly.
12
+ - Vertical rhythm is now derived deterministically from the font size
13
+ (1.4 x size, matching the previous Latin line height) and is identical
14
+ across scripts; the old engine spaced Japanese text 1.5x and WenQuanYi
15
+ 1.25x, so mixed-language documents had inconsistent spacing.
16
+ - The font-family lists used in the SVG output and in measurement are now
17
+ defined in a single place (`FONT_FAMILIES` / `FontFamily`).
18
+
19
+ ### Added
20
+ - Runtime dependency on the `pango` gem (ruby-gnome). No new system
21
+ requirements: librsvg already depends on Pango.
22
+
3
23
  ## [1.6.3] - 2026-07
4
24
 
5
25
  ### Fixed
data/CITATION.cff ADDED
@@ -0,0 +1,21 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use RSyntaxTree in your research, please cite it as below."
3
+ type: software
4
+ title: "RSyntaxTree: A graphical syntax tree image generator"
5
+ authors:
6
+ - family-names: "Hasebe"
7
+ given-names: "Yoichiro"
8
+ email: "yohasebe@gmail.com"
9
+ url: "https://yohasebe.com/rsyntaxtree"
10
+ repository-code: "https://github.com/yohasebe/rsyntaxtree"
11
+ # Concept DOI: always resolves to the latest archived version on Zenodo
12
+ doi: "10.5281/zenodo.21916150"
13
+ license: MIT
14
+ version: 1.7.0
15
+ date-released: "2026-08-13"
16
+ keywords:
17
+ - linguistics
18
+ - syntax tree
19
+ - syntactic analysis
20
+ - visualization
21
+ - Ruby
data/Dockerfile CHANGED
@@ -5,7 +5,7 @@ WORKDIR $WORKSPACE
5
5
  RUN apk update && \
6
6
  apk upgrade && \
7
7
  apk add --no-cache linux-headers libxml2-dev make gcc libc-dev bash && \
8
- apk add --no-cache librsvg librsvg-dev imagemagick imagemagick-dev xz-dev libbz2 && \
8
+ apk add --no-cache librsvg librsvg-dev pango-dev imagemagick imagemagick-dev xz-dev libbz2 && \
9
9
  apk add --no-cache gobject-introspection gobject-introspection-dev && \
10
10
  apk add --no-cache -t .build-packages --no-cache build-base curl-dev wget gcompat
11
11
 
data/Gemfile CHANGED
@@ -3,6 +3,7 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "optimist"
6
+ gem "pango"
6
7
  gem "parslet"
7
8
  gem "rmagick"
8
9
  gem "rsvg2"
data/README.md CHANGED
@@ -189,16 +189,20 @@ For detailed documentation on syntax and markup:
189
189
  - [日本語ドキュメント](https://yohasebe.github.io/rsyntaxtree/documentation_ja)
190
190
  - [Example Gallery](https://yohasebe.github.io/rsyntaxtree/examples)
191
191
 
192
- ## References
192
+ ## How to Cite
193
193
 
194
- Please use the following BibTeX entry when citing RSyntaxTree:
194
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21916150.svg?v=1)](https://doi.org/10.5281/zenodo.21916150)
195
+
196
+ If you use RSyntaxTree in your research, please cite it. You can use the "Cite this repository" button on GitHub (powered by [CITATION.cff](CITATION.cff)), or the following BibTeX entry (adjust `version` to the one you used):
195
197
 
196
198
  ```bibtex
197
- @misc{rsyntaxtree,
198
- author = {Yoichiro Hasebe},
199
- title = {RSyntaxTree: A graphical syntax tree image generator},
200
- url = {https://yohasebe.com/rsyntaxtree},
201
- year = {2026}
199
+ @software{hasebe_rsyntaxtree,
200
+ author = {Hasebe, Yoichiro},
201
+ title = {RSyntaxTree: A graphical syntax tree image generator},
202
+ url = {https://yohasebe.com/rsyntaxtree},
203
+ doi = {10.5281/zenodo.21916150},
204
+ version = {1.7.0},
205
+ year = {2026}
202
206
  }
203
207
  ```
204
208
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -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="919.2000000000002" height="813.375" viewBox="-15.200000000000001, 0, 934.4000000000002, 824.625" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <svg width="919.0000000000001" height="809.76" viewBox="-15.200000000000001, 0, 934.2000000000002, 820.96" 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="15.200000000000001" markerHeight="15.200000000000001" orient="auto">
6
6
  <path d="M 0 0 L 10 5 L 0 10" fill="#CC79A7"/>
@@ -24,51 +24,51 @@
24
24
  <line x1="0" y="0" x2="0" y2="10" stroke="#009E73" stroke-width="4"></line>
25
25
  </pattern>
26
26
  </defs>
27
- <rect x="-15.200000000000001" y="0" width="934.4000000000002" height="824.625" stroke="none" fill="white" />"
28
- <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='335.15000000000003' y='67.5'><tspan x='335.15000000000003' y='67.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">S</tspan>
27
+ <rect x="-15.200000000000001" y="0" width="934.2000000000002" height="820.96" stroke="none" fill="white" />"
28
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='333.9375' y='67.19999999999999'><tspan x='333.9375' y='67.19999999999999' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">S</tspan>
29
29
  </text>
30
- <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='113.19999999999999' y='238.5'><tspan x='113.19999999999999' y='238.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">NP</tspan>
30
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='113.59999999999997' y='237.43999999999997'><tspan x='113.59999999999997' y='237.43999999999997' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">NP</tspan>
31
31
  </text>
32
- <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='15.199999999999989' y='409.5'><tspan x='27.69999999999999' y='409.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">R</tspan>
33
- <tspan x='60.19999999999999' y='409.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif"><tspan style='fill:none;'>■</tspan></tspan>
34
- <tspan x='77.19999999999999' y='409.5' style="font-weight: bold; fill: #D55E00; " text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">SyntaxTree</tspan>
32
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='15.199999999999989' y='407.67999999999995'><tspan x='27.599999999999987' y='407.67999999999995' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">R</tspan>
33
+ <tspan x='59.999999999999986' y='407.67999999999995' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif"><tspan style='fill:none;'>■</tspan></tspan>
34
+ <tspan x='76.99999999999999' y='407.67999999999995' style="font-weight: bold; fill: #D55E00; " text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">SyntaxTree</tspan>
35
35
  </text>
36
- <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='533.6' y='238.5'><tspan x='533.6' y='238.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">VP</tspan>
36
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='532.775' y='237.43999999999997'><tspan x='532.775' y='237.43999999999997' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">VP</tspan>
37
37
  </text>
38
- <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='376.0' y='409.5'><tspan x='376.0' y='409.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">V</tspan>
38
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='375.79999999999995' y='407.67999999999995'><tspan x='375.79999999999995' y='407.67999999999995' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">V</tspan>
39
39
  </text>
40
- <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='316.0' y='580.5'><tspan x='316.0' y='580.5' style="font-style: italic; " text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">generates</tspan>
40
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='315.29999999999995' y='577.92'><tspan x='315.29999999999995' y='577.92' style="font-style: italic; " text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">generates</tspan>
41
41
  </text>
42
- <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='698.2' y='409.5'><tspan x='698.2' y='409.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">NP</tspan>
42
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='698.75' y='407.67999999999995'><tspan x='698.75' y='407.67999999999995' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">NP</tspan>
43
43
  </text>
44
- <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='591.3' y='580.5'><tspan x='591.3' y='580.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Adj</tspan>
44
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='591.6' y='577.92'><tspan x='591.6' y='577.92' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">Adj</tspan>
45
45
  </text>
46
- <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='516.8000000000001' y='751.5'><tspan x='516.8000000000001' y='751.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">+multilingual</tspan>
47
- <tspan x='516.8000000000001' y='796.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">+beautiful</tspan>
46
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='516.6' y='748.16'><tspan x='516.6' y='748.16' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">+multilingual</tspan>
47
+ <tspan x='516.6' y='792.9599999999999' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">+beautiful</tspan>
48
48
  </text>
49
- <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='802.6000000000001' y='580.5'><tspan x='802.6000000000001' y='580.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">NP</tspan>
49
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='803.4000000000001' y='577.92'><tspan x='803.4000000000001' y='577.92' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">NP</tspan>
50
50
  </text>
51
- <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='775.6000000000001' y='751.5'><tspan x='775.6000000000001' y='751.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">syntax</tspan>
52
- <tspan x='786.6000000000001' y='796.5' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">trees</tspan>
51
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='775.4000000000001' y='748.16'><tspan x='775.4000000000001' y='748.16' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">syntax</tspan>
52
+ <tspan x='786.4000000000001' y='792.9599999999999' style="" text-decoration="" font-family="'Noto Sans', 'Noto Sans JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', sans-serif">trees</tspan>
53
53
  </text>
54
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='135.2' y1='182.25' x2='344.15000000000003' y2='95.625' />
55
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='553.1' y1='182.25' x2='344.15000000000003' y2='95.625' />
56
- <polygon style='fill: none; stroke: black; stroke-width:2; stroke-linejoin:round;stroke-linecap:round;' points='15.199999999999989 353.25 255.2 353.25 135.2 266.625' />
57
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='386.0' y1='353.25' x2='553.1' y2='266.625' />
58
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='720.2' y1='353.25' x2='553.1' y2='266.625' />
59
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='386.0' y1='524.25' x2='386.0' y2='437.625' />
60
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='615.8' y1='524.25' x2='720.2' y2='437.625' />
61
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='824.6000000000001' y1='524.25' x2='720.2' y2='437.625' />
62
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='615.8000000000001' y1='695.25' x2='615.8' y2='608.625' />
63
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='824.6000000000001' y1='695.25' x2='824.6000000000001' y2='608.625' />
54
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='134.09999999999997' y1='181.43999999999997' x2='342.9375' y2='95.19999999999999' />
55
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='551.775' y1='181.43999999999997' x2='342.9375' y2='95.19999999999999' />
56
+ <polygon style='fill: none; stroke: black; stroke-width:2; stroke-linejoin:round;stroke-linecap:round;' points='15.199999999999989 351.67999999999995 254.0 351.67999999999995 134.09999999999997 265.44' />
57
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='384.29999999999995' y1='351.67999999999995' x2='551.775' y2='265.44' />
58
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='719.25' y1='351.67999999999995' x2='551.775' y2='265.44' />
59
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='384.79999999999995' y1='521.92' x2='384.29999999999995' y2='435.67999999999995' />
60
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='615.6' y1='521.92' x2='719.25' y2='435.67999999999995' />
61
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='823.9000000000001' y1='521.92' x2='719.25' y2='435.67999999999995' />
62
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='615.6' y1='692.16' x2='615.6' y2='605.92' />
63
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='824.4000000000001' y1='692.16' x2='823.9000000000001' y2='605.92' />
64
64
  <rect style='stroke: #009E73; stroke-linejoin:round; stroke-width:2;'
65
- x='15.199999999999989' y='373.5'
66
- width='45.0' height='45.0'
65
+ x='15.199999999999989' y='371.84'
66
+ width='44.8' height='44.8'
67
67
  fill='none' />
68
68
 
69
69
  <polyline style='stroke:#009E73; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
70
- points='516.8000000000001,700.875 509.20000000000005,700.875 509.20000000000005,819.0 516.8000000000001,819.0' />
70
+ points='516.6,697.7599999999999 509.0,697.7599999999999 509.0,815.3599999999999 516.6,815.3599999999999' />
71
71
 
72
72
  <polyline style='stroke:#009E73; stroke-width:2; fill:none; stroke-linejoin:round; stroke-linecap:round;'
73
- points='714.8000000000001,700.875 722.4000000000001,700.875 722.4000000000001,819.0 714.8000000000001,819.0' />
73
+ points='714.6,697.7599999999999 722.2,697.7599999999999 722.2,815.3599999999999 714.6,815.3599999999999' />
74
74
  </svg>
@@ -1,17 +1,17 @@
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="367.6000000000001" height="336.375" viewBox="-17.6, 0, 385.2000000000001, 347.625" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <svg width="353.80000000000007" height="334.88000000000005" viewBox="-16.8, 0, 370.6000000000001, 346.08000000000004" version="1.1" xmlns="http://www.w3.org/2000/svg">
4
4
  <defs>
5
- <marker id="arrow" markerUnits="userSpaceOnUse" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="17.6" markerHeight="17.6" orient="auto">
5
+ <marker id="arrow" markerUnits="userSpaceOnUse" viewBox="0 0 10 10" refX="10" refY="5" markerWidth="16.8" markerHeight="16.8" orient="auto">
6
6
  <path d="M 0 0 L 10 5 L 0 10" fill="#CC79A7"/>
7
7
  </marker>
8
- <marker id="arrowBackward" markerUnits="userSpaceOnUse" viewBox="0 0 10 10" refX="5" refY="5" markerWidth="17.6" markerHeight="17.6" orient="auto">
8
+ <marker id="arrowBackward" markerUnits="userSpaceOnUse" viewBox="0 0 10 10" refX="5" refY="5" markerWidth="16.8" markerHeight="16.8" orient="auto">
9
9
  <path d="M 0 0 L 10 5 L 0 10 z" fill="#CC79A7"/>
10
10
  </marker>
11
- <marker id="arrowForward" markerUnits="userSpaceOnUse" viewBox="0 0 10 10" refX="5" refY="5" markerWidth="17.6" markerHeight="17.6" orient="auto">
11
+ <marker id="arrowForward" markerUnits="userSpaceOnUse" viewBox="0 0 10 10" refX="5" refY="5" markerWidth="16.8" markerHeight="16.8" orient="auto">
12
12
  <path d="M 10 0 L 0 5 L 10 10 z" fill="#CC79A7"/>
13
13
  </marker>
14
- <marker id="arrowBothways" markerUnits="userSpaceOnUse" viewBox="0 0 30 10" refX="15" refY="5" markerWidth="52.800000000000004" markerHeight="17.6" orient="auto">
14
+ <marker id="arrowBothways" markerUnits="userSpaceOnUse" viewBox="0 0 30 10" refX="15" refY="5" markerWidth="50.400000000000006" markerHeight="16.8" orient="auto">
15
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
16
  </marker>
17
17
  <pattern id="hatchBlack" x="10" y="10" width="10" height="10" patternUnits="userSpaceOnUse" patternTransform="rotate(45)">
@@ -24,25 +24,25 @@
24
24
  <line x1="0" y="0" x2="0" y2="10" stroke="#009E73" stroke-width="4"></line>
25
25
  </pattern>
26
26
  </defs>
27
- <rect x="-17.6" y="0" width="385.2000000000001" height="347.625" stroke="none" fill="white" />"
28
- <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='155.20000000000002' y='67.5'><tspan x='155.20000000000002' y='67.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">A</tspan>
27
+ <rect x="-16.8" y="0" width="370.6000000000001" height="346.08000000000004" stroke="none" fill="white" />"
28
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='148.60000000000002' y='67.19999999999999'><tspan x='148.60000000000002' y='67.19999999999999' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">A</tspan>
29
29
  </text>
30
- <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='65.30000000000001' y='193.5'><tspan x='65.30000000000001' y='193.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">B</tspan>
30
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='62.400000000000006' y='192.63999999999996'><tspan x='62.400000000000006' y='192.63999999999996' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">B</tspan>
31
31
  </text>
32
- <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='17.599999999999994' y='319.5'><tspan x='17.599999999999994' y='319.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">D</tspan>
32
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='17.30000000000001' y='318.08000000000004'><tspan x='17.30000000000001' y='318.08000000000004' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">D</tspan>
33
33
  </text>
34
- <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='112.0' y='319.5'><tspan x='112.0' y='319.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">E</tspan>
34
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='107.0' y='318.08000000000004'><tspan x='107.0' y='318.08000000000004' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">E</tspan>
35
35
  </text>
36
- <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='247.60000000000002' y='193.5'><tspan x='247.60000000000002' y='193.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">C</tspan>
36
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #0072B2; storoke-width: 0; font-size: 32px;' x='237.3' y='192.63999999999996'><tspan x='237.3' y='192.63999999999996' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">C</tspan>
37
37
  </text>
38
- <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='202.40000000000003' y='319.5'><tspan x='202.40000000000003' y='319.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">F</tspan>
38
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='194.70000000000002' y='318.08000000000004'><tspan x='194.70000000000002' y='318.08000000000004' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">F</tspan>
39
39
  </text>
40
- <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='291.80000000000007' y='319.5'><tspan x='291.80000000000007' y='319.5' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">G</tspan>
40
+ <text white-space='pre' alignment-baseline='text-top' style='fill: #009E73; storoke-width: 0; font-size: 32px;' x='280.90000000000003' y='318.08000000000004'><tspan x='280.90000000000003' y='318.08000000000004' style="" text-decoration="" font-family="'Noto Serif', 'Noto Serif JP', OpenMoji, 'OpenMoji Color', 'OpenMoji Black', serif">G</tspan>
41
41
  </text>
42
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='75.80000000000001' y1='137.25' x2='166.70000000000002' y2='95.625' />
43
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='257.6' y1='137.25' x2='166.70000000000002' y2='95.625' />
44
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='29.599999999999994' y1='263.25' x2='75.80000000000001' y2='221.625' />
45
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='122.00000000000001' y1='263.25' x2='75.80000000000001' y2='221.625' />
46
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='211.90000000000003' y1='263.25' x2='257.6' y2='221.625' />
47
- <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='303.30000000000007' y1='263.25' x2='257.6' y2='221.625' />
42
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='71.9' y1='136.64' x2='159.10000000000002' y2='95.19999999999999' />
43
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='247.3' y1='136.64' x2='159.10000000000002' y2='95.19999999999999' />
44
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='27.80000000000001' y1='262.08' x2='71.9' y2='220.63999999999996' />
45
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='117.0' y1='262.08' x2='71.9' y2='220.63999999999996' />
46
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='203.20000000000002' y1='262.08' x2='247.3' y2='220.63999999999996' />
47
+ <line style='fill: none; stroke:black; stroke-width:2; stroke-linejoin:round; stroke-linecap:round;' x1='291.40000000000003' y1='262.08' x2='247.3' y2='220.63999999999996' />
48
48
  </svg>