rsyntaxtree 1.6.2 → 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 (229) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +32 -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/Rakefile +19 -0
  8. data/docs/.gitignore +0 -0
  9. data/docs/404.html +0 -0
  10. data/docs/Gemfile +0 -0
  11. data/docs/_config.yml +0 -0
  12. data/docs/_examples/000.md +0 -0
  13. data/docs/_examples/001.md +0 -0
  14. data/docs/_examples/002.md +0 -0
  15. data/docs/_examples/003.md +0 -0
  16. data/docs/_examples/004.md +0 -0
  17. data/docs/_examples/005.md +0 -0
  18. data/docs/_examples/006.md +0 -0
  19. data/docs/_examples/007.md +0 -0
  20. data/docs/_examples/008.md +0 -0
  21. data/docs/_examples/009.md +0 -0
  22. data/docs/_examples/010.md +0 -0
  23. data/docs/_examples/011.md +0 -0
  24. data/docs/_examples/012.md +0 -0
  25. data/docs/_examples/013.md +0 -0
  26. data/docs/_examples/014.md +0 -0
  27. data/docs/_examples/015.md +0 -0
  28. data/docs/_examples/016.md +0 -0
  29. data/docs/_examples/017.md +0 -0
  30. data/docs/_examples/018.md +0 -0
  31. data/docs/_examples/019.md +0 -0
  32. data/docs/_examples/020.md +0 -0
  33. data/docs/_examples/021.md +0 -0
  34. data/docs/_examples/022.md +0 -0
  35. data/docs/_examples/023.md +0 -0
  36. data/docs/_examples/024.md +0 -0
  37. data/docs/_examples/025.md +0 -0
  38. data/docs/_examples/026.md +0 -0
  39. data/docs/_examples/027.md +0 -0
  40. data/docs/_examples/028.md +0 -0
  41. data/docs/_examples/029.md +0 -0
  42. data/docs/_examples/030.md +0 -0
  43. data/docs/_examples/031.md +0 -0
  44. data/docs/_examples/032.md +0 -0
  45. data/docs/_examples/033.md +0 -0
  46. data/docs/_examples/034.md +0 -0
  47. data/docs/_examples/035.md +0 -0
  48. data/docs/_examples/036.md +0 -0
  49. data/docs/_examples/037.md +0 -0
  50. data/docs/_examples/038.md +0 -0
  51. data/docs/_examples/039.md +0 -0
  52. data/docs/_examples/040.md +0 -0
  53. data/docs/_examples/041.md +0 -0
  54. data/docs/_examples/042.md +0 -0
  55. data/docs/_examples/043.md +0 -0
  56. data/docs/_examples/044.md +0 -0
  57. data/docs/_examples/045.md +0 -0
  58. data/docs/_examples/046.md +0 -0
  59. data/docs/_includes/box_and_circle_table.html +0 -0
  60. data/docs/_includes/escape_char_table.html +0 -0
  61. data/docs/_includes/social_media_links.html +0 -0
  62. data/docs/_layouts/default.html +0 -0
  63. data/docs/assets/css/style.scss +0 -0
  64. data/docs/assets/img/000.png +0 -0
  65. data/docs/assets/img/001.png +0 -0
  66. data/docs/assets/img/002.png +0 -0
  67. data/docs/assets/img/003.png +0 -0
  68. data/docs/assets/img/004.png +0 -0
  69. data/docs/assets/img/005.png +0 -0
  70. data/docs/assets/img/006.png +0 -0
  71. data/docs/assets/img/007.png +0 -0
  72. data/docs/assets/img/008.png +0 -0
  73. data/docs/assets/img/009.png +0 -0
  74. data/docs/assets/img/010.png +0 -0
  75. data/docs/assets/img/011.png +0 -0
  76. data/docs/assets/img/012.png +0 -0
  77. data/docs/assets/img/013.png +0 -0
  78. data/docs/assets/img/014.png +0 -0
  79. data/docs/assets/img/015.png +0 -0
  80. data/docs/assets/img/016.png +0 -0
  81. data/docs/assets/img/017.png +0 -0
  82. data/docs/assets/img/018.png +0 -0
  83. data/docs/assets/img/019.png +0 -0
  84. data/docs/assets/img/020.png +0 -0
  85. data/docs/assets/img/021.png +0 -0
  86. data/docs/assets/img/022.png +0 -0
  87. data/docs/assets/img/023.png +0 -0
  88. data/docs/assets/img/024.png +0 -0
  89. data/docs/assets/img/025.png +0 -0
  90. data/docs/assets/img/026.png +0 -0
  91. data/docs/assets/img/027.png +0 -0
  92. data/docs/assets/img/028.png +0 -0
  93. data/docs/assets/img/029.png +0 -0
  94. data/docs/assets/img/030.png +0 -0
  95. data/docs/assets/img/031.png +0 -0
  96. data/docs/assets/img/032.png +0 -0
  97. data/docs/assets/img/033.png +0 -0
  98. data/docs/assets/img/034.png +0 -0
  99. data/docs/assets/img/035.png +0 -0
  100. data/docs/assets/img/036.png +0 -0
  101. data/docs/assets/img/037.png +0 -0
  102. data/docs/assets/img/038.png +0 -0
  103. data/docs/assets/img/039.png +0 -0
  104. data/docs/assets/img/040.png +0 -0
  105. data/docs/assets/img/041.png +0 -0
  106. data/docs/assets/img/042.png +0 -0
  107. data/docs/assets/img/043.png +0 -0
  108. data/docs/assets/img/044.png +0 -0
  109. data/docs/assets/img/045.png +0 -0
  110. data/docs/assets/img/046.png +0 -0
  111. data/docs/assets/img/047.png +0 -0
  112. data/docs/assets/img/048.png +0 -0
  113. data/docs/assets/img/049.png +0 -0
  114. data/docs/assets/img/050.png +0 -0
  115. data/docs/assets/img/051.png +0 -0
  116. data/docs/assets/img/052.png +0 -0
  117. data/docs/assets/img/053.png +0 -0
  118. data/docs/assets/img/054.png +0 -0
  119. data/docs/assets/img/055.png +0 -0
  120. data/docs/assets/img/056.png +0 -0
  121. data/docs/assets/img/057.png +0 -0
  122. data/docs/assets/img/058.png +0 -0
  123. data/docs/assets/img/059.png +0 -0
  124. data/docs/assets/img/060.png +0 -0
  125. data/docs/assets/img/061.png +0 -0
  126. data/docs/assets/img/062.png +0 -0
  127. data/docs/assets/img/063.png +0 -0
  128. data/docs/assets/img/064.png +0 -0
  129. data/docs/assets/img/065.png +0 -0
  130. data/docs/assets/img/elements/circle.png +0 -0
  131. data/docs/assets/img/elements/circle_abc.png +0 -0
  132. data/docs/assets/img/elements/circle_bold.png +0 -0
  133. data/docs/assets/img/elements/circle_hatched.png +0 -0
  134. data/docs/assets/img/elements/circle_one.png +0 -0
  135. data/docs/assets/img/elements/connector.png +0 -0
  136. data/docs/assets/img/elements/connector_bold.png +0 -0
  137. data/docs/assets/img/elements/square.png +0 -0
  138. data/docs/assets/img/elements/square_abc.png +0 -0
  139. data/docs/assets/img/elements/square_bold.png +0 -0
  140. data/docs/assets/img/elements/square_hatched.png +0 -0
  141. data/docs/assets/img/elements/square_one.png +0 -0
  142. data/docs/assets/img/favicon/apple-touch-icon.png +0 -0
  143. data/docs/assets/img/favicon/favicon-16x16.png +0 -0
  144. data/docs/assets/img/favicon/favicon-32x32.png +0 -0
  145. data/docs/assets/img/favicon/favicon.ico +0 -0
  146. data/docs/assets/svg/000.svg +31 -31
  147. data/docs/assets/svg/001.svg +19 -19
  148. data/docs/assets/svg/002.svg +37 -37
  149. data/docs/assets/svg/003.svg +29 -29
  150. data/docs/assets/svg/004.svg +41 -41
  151. data/docs/assets/svg/005.svg +21 -21
  152. data/docs/assets/svg/006.svg +25 -25
  153. data/docs/assets/svg/007.svg +31 -31
  154. data/docs/assets/svg/008.svg +35 -35
  155. data/docs/assets/svg/009.svg +35 -35
  156. data/docs/assets/svg/010.svg +50 -50
  157. data/docs/assets/svg/011.svg +30 -30
  158. data/docs/assets/svg/012.svg +35 -35
  159. data/docs/assets/svg/013.svg +116 -116
  160. data/docs/assets/svg/014.svg +96 -96
  161. data/docs/assets/svg/015.svg +33 -33
  162. data/docs/assets/svg/016.svg +397 -397
  163. data/docs/assets/svg/017.svg +35 -35
  164. data/docs/assets/svg/018.svg +37 -37
  165. data/docs/assets/svg/019.svg +95 -95
  166. data/docs/assets/svg/020.svg +62 -62
  167. data/docs/assets/svg/021.svg +42 -42
  168. data/docs/assets/svg/022.svg +75 -75
  169. data/docs/assets/svg/023.svg +47 -47
  170. data/docs/assets/svg/024.svg +23 -23
  171. data/docs/assets/svg/025.svg +99 -99
  172. data/docs/assets/svg/026.svg +19 -19
  173. data/docs/assets/svg/027.svg +50 -50
  174. data/docs/assets/svg/028.svg +21 -21
  175. data/docs/assets/svg/029.svg +69 -69
  176. data/docs/assets/svg/030.svg +35 -35
  177. data/docs/assets/svg/031.svg +15 -15
  178. data/docs/assets/svg/032.svg +40 -40
  179. data/docs/assets/svg/033.svg +39 -39
  180. data/docs/assets/svg/034.svg +40 -40
  181. data/docs/assets/svg/035.svg +39 -39
  182. data/docs/assets/svg/036.svg +17 -17
  183. data/docs/assets/svg/037.svg +29 -29
  184. data/docs/assets/svg/038.svg +39 -39
  185. data/docs/assets/svg/039.svg +7 -7
  186. data/docs/assets/svg/040.svg +67 -67
  187. data/docs/assets/svg/041.svg +49 -49
  188. data/docs/assets/svg/042.svg +15 -15
  189. data/docs/assets/svg/043.svg +146 -146
  190. data/docs/assets/svg/044.svg +4 -4
  191. data/docs/assets/svg/045.svg +56 -56
  192. data/docs/assets/svg/046.svg +647 -647
  193. data/docs/assets/svg/047.svg +26 -26
  194. data/docs/assets/svg/048.svg +69 -69
  195. data/docs/assets/svg/049.svg +44 -44
  196. data/docs/assets/svg/050.svg +100 -100
  197. data/docs/assets/svg/051.svg +96 -96
  198. data/docs/assets/svg/052.svg +50 -50
  199. data/docs/assets/svg/053.svg +41 -41
  200. data/docs/assets/svg/054.svg +17 -17
  201. data/docs/assets/svg/055.svg +19 -19
  202. data/docs/assets/svg/056.svg +27 -27
  203. data/docs/assets/svg/057.svg +49 -49
  204. data/docs/assets/svg/058.svg +42 -42
  205. data/docs/assets/svg/059.svg +50 -50
  206. data/docs/assets/svg/060.svg +65 -65
  207. data/docs/assets/svg/061.svg +96 -96
  208. data/docs/assets/svg/062.svg +92 -92
  209. data/docs/assets/svg/063.svg +50 -50
  210. data/docs/assets/svg/064.svg +30 -30
  211. data/docs/assets/svg/065.svg +24 -24
  212. data/docs/documentation.md +0 -0
  213. data/docs/documentation_ja.md +0 -0
  214. data/docs/examples.html +0 -0
  215. data/docs/index.html +0 -0
  216. data/fonts/NotoSansMono_SemiCondensed-Bold.ttf +0 -0
  217. data/fonts/NotoSansMono_SemiCondensed-Regular.ttf +0 -0
  218. data/img/sample.png +0 -0
  219. data/lib/rsyntaxtree/base_graph.rb +0 -0
  220. data/lib/rsyntaxtree/element.rb +8 -17
  221. data/lib/rsyntaxtree/elementlist.rb +0 -0
  222. data/lib/rsyntaxtree/markup_parser.rb +0 -0
  223. data/lib/rsyntaxtree/string_parser.rb +4 -1
  224. data/lib/rsyntaxtree/svg_graph.rb +1 -22
  225. data/lib/rsyntaxtree/utils.rb +67 -17
  226. data/lib/rsyntaxtree/version.rb +1 -1
  227. data/lib/rsyntaxtree.rb +15 -1
  228. data/rsyntaxtree.gemspec +1 -0
  229. metadata +16 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f13f7407a77bda563986883ec33eed5c2699305e73428582e0caf2c64c7cdf22
4
- data.tar.gz: 329f1d4357b0034709bd842f117c14ea401dad18b7ca72e65b917149fcc794a9
3
+ metadata.gz: 4b011905bb833561ebbc545ce04c4c6cf104290298fc6b2018d09f8c9ef58383
4
+ data.tar.gz: 7f35db88fa0d6585f6832d6d6621b527e830c5d7772ddb3282ccf1341b990c16
5
5
  SHA512:
6
- metadata.gz: 4bab8dc69ae2631ae4818e41a2b986136ab9b40e20a6e9bd2e4793b745e605193f35920e5679e48f5e37bc89211c26e2a1f659a432292c2fd3c027fe35063ae1
7
- data.tar.gz: 36db33880b172ac48da638dc0de97797481c88ca6af3bddb632cb1e5f7f795d5146ad1cac5d29f242213157bd16a8c44e031c690d55561fd73076be4bb2dde0e
6
+ metadata.gz: 7d96fe35d241eb21bb3248dd9b566a5dd0603bbed8f7118579f915ef9eecb3d875f10508dbdb4ec09f8fffa53ec2a86cb7d9d3d7458dba86f799ff1505f70fd0
7
+ data.tar.gz: 9e2298a797787e12407e57d0dc05e59cbb444b6b0792c6be1447190ef99fae4899a2ead1df2d40e80f26615d268ce0e3287029db002c02c1344aceed2a5d7bf5
data/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
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
+
23
+ ## [1.6.3] - 2026-07
24
+
25
+ ### Fixed
26
+ - Packaged files no longer carry owner-only permissions. `gem build` preserves
27
+ on-disk modes, so gems built from a checkout with `0600`/`0700` files shipped
28
+ a library unreadable — and a `rsyntaxtree` CLI unexecutable — by anyone but
29
+ the owner after `sudo gem install`. File modes are now normalized before the
30
+ gem is built: `0755` for commands (`bin/`, `exe/`) and shebang scripts, `0644`
31
+ for everything else. This also drops stray executable bits that the working
32
+ tree had picked up on data files (images, fonts, Markdown, CSS, library
33
+ sources).
34
+
3
35
  ## [1.6.2] - 2026-06
4
36
 
5
37
  ### 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
 
data/Rakefile CHANGED
@@ -13,6 +13,25 @@ Rake::TestTask.new do |task|
13
13
  task.warning = false
14
14
  end
15
15
 
16
+ # Gem packaging preserves on-disk file modes. Owner-only permissions (which a
17
+ # Dropbox-synced checkout tends to produce) ship files that are unreadable, and
18
+ # a CLI that is unexecutable, for anyone but the owner after `sudo gem install`.
19
+ # Normalize every tracked file before the gem is built: a file is executable
20
+ # only if it is a command (bin/, exe/) or a script with a shebang; everything
21
+ # else is data and gets 0644. Deciding by path/content rather than by the
22
+ # current mode also drops stray executable bits picked up from the filesystem.
23
+ task :normalize_permissions do
24
+ `git ls-files -z`.split("\x0").each do |f|
25
+ next unless File.file?(f)
26
+
27
+ executable = f.start_with?("bin/", "exe/") ||
28
+ File.open(f, "rb") { |io| io.read(2) } == "#!"
29
+ File.chmod(executable ? 0o755 : 0o644, f)
30
+ end
31
+ end
32
+
33
+ Rake::Task["build"].enhance([:normalize_permissions])
34
+
16
35
  desc "Generate SVG and PNG example images locally"
17
36
  task :generate do
18
37
  require_relative "dev/generate_examples"
data/docs/.gitignore CHANGED
File without changes
data/docs/404.html CHANGED
File without changes
data/docs/Gemfile CHANGED
File without changes
data/docs/_config.yml CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes