rabbit 3.0.5 → 4.0.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 (241) hide show
  1. checksums.yaml +4 -4
  2. data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
  3. data/doc/_config.yml +2 -2
  4. data/doc/en/news.rd +63 -0
  5. data/doc/ja/news.rd +63 -0
  6. data/lib/rabbit/actions.rb +446 -0
  7. data/lib/rabbit/author-configuration.rb +7 -10
  8. data/lib/rabbit/canvas.rb +74 -42
  9. data/lib/rabbit/command/rabbit-slide.rb +11 -13
  10. data/lib/rabbit/command/rabbit-theme.rb +10 -12
  11. data/lib/rabbit/command/rabbit.rb +31 -43
  12. data/lib/rabbit/console.rb +20 -22
  13. data/lib/rabbit/dependency-canvas.rb +2 -2
  14. data/lib/rabbit/element/base.rb +93 -6
  15. data/lib/rabbit/element/block-element.rb +17 -1
  16. data/lib/rabbit/element/block.rb +17 -1
  17. data/lib/rabbit/element/container-element.rb +59 -3
  18. data/lib/rabbit/element/description-list.rb +18 -2
  19. data/lib/rabbit/element/enum-list.rb +18 -2
  20. data/lib/rabbit/element/footnote.rb +18 -2
  21. data/lib/rabbit/element/image-title-slide.rb +17 -1
  22. data/lib/rabbit/element/image.rb +32 -2
  23. data/lib/rabbit/element/index-slide.rb +29 -13
  24. data/lib/rabbit/element/item-list.rb +18 -2
  25. data/lib/rabbit/element/method-list.rb +18 -2
  26. data/lib/rabbit/element/poppler-page.rb +17 -1
  27. data/lib/rabbit/element/poppler-slide.rb +18 -2
  28. data/lib/rabbit/element/poppler-title-slide.rb +18 -2
  29. data/lib/rabbit/element/preformatted.rb +18 -2
  30. data/lib/rabbit/element/slide-element.rb +29 -2
  31. data/lib/rabbit/element/slide.rb +18 -2
  32. data/lib/rabbit/element/syntax-highlighting.rb +17 -1
  33. data/lib/rabbit/element/table.rb +19 -3
  34. data/lib/rabbit/element/tag.rb +18 -2
  35. data/lib/rabbit/element/text-block-element.rb +18 -2
  36. data/lib/rabbit/element/text-container-element.rb +41 -2
  37. data/lib/rabbit/element/text-element.rb +17 -1
  38. data/lib/rabbit/element/text-renderer.rb +17 -1
  39. data/lib/rabbit/element/text.rb +4 -4
  40. data/lib/rabbit/element/title-slide.rb +19 -3
  41. data/lib/rabbit/element/video.rb +157 -56
  42. data/lib/rabbit/element.rb +20 -20
  43. data/lib/rabbit/formatter.rb +18 -1
  44. data/lib/rabbit/frame.rb +101 -93
  45. data/lib/rabbit/front.rb +11 -4
  46. data/lib/rabbit/gem-finder.rb +4 -8
  47. data/lib/rabbit/gem-pusher.rb +4 -4
  48. data/lib/rabbit/gesture/handler.rb +26 -21
  49. data/lib/rabbit/graffiti/config-dialog.rb +18 -2
  50. data/lib/rabbit/graffiti/processor.rb +20 -4
  51. data/lib/rabbit/gtk.rb +48 -14
  52. data/lib/rabbit/html/generator.rb +18 -18
  53. data/{test/helper/fixture.rb → lib/rabbit/icon.rb} +16 -6
  54. data/lib/rabbit/image/base.rb +7 -6
  55. data/lib/rabbit/image/default.rb +17 -1
  56. data/lib/rabbit/image/dia.rb +2 -2
  57. data/lib/rabbit/image/eps.rb +16 -2
  58. data/lib/rabbit/image/gimp.rb +28 -11
  59. data/lib/rabbit/image/mermaid.rb +3 -3
  60. data/lib/rabbit/image/pdf.rb +3 -3
  61. data/lib/rabbit/image/svg.rb +2 -2
  62. data/lib/rabbit/image.rb +8 -8
  63. data/lib/rabbit/info-window.rb +55 -18
  64. data/lib/rabbit/key-handler.rb +381 -0
  65. data/lib/rabbit/keys.rb +31 -2
  66. data/lib/rabbit/logger/base.rb +17 -1
  67. data/lib/rabbit/logger/gui.rb +20 -4
  68. data/lib/rabbit/logger/stderr.rb +16 -2
  69. data/lib/rabbit/logger.rb +4 -4
  70. data/lib/rabbit/menu.rb +200 -220
  71. data/lib/rabbit/parser/base.rb +17 -1
  72. data/lib/rabbit/parser/ext/aafigure.rb +17 -1
  73. data/lib/rabbit/parser/ext/blockdiag.rb +17 -1
  74. data/lib/rabbit/parser/ext/charty.rb +2 -2
  75. data/lib/rabbit/parser/ext/coderay.rb +20 -4
  76. data/lib/rabbit/parser/ext/enscript.rb +31 -15
  77. data/lib/rabbit/parser/ext/entity.rb +17 -1
  78. data/lib/rabbit/parser/ext/image.rb +6 -6
  79. data/lib/rabbit/parser/ext/inline.rb +17 -1
  80. data/lib/rabbit/parser/ext/rouge.rb +7 -4
  81. data/lib/rabbit/parser/ext/tex.rb +18 -2
  82. data/lib/rabbit/parser/ext/video.rb +4 -4
  83. data/lib/rabbit/parser/image.rb +20 -4
  84. data/lib/rabbit/parser/markdown/converter.rb +12 -13
  85. data/lib/rabbit/parser/markdown.rb +18 -2
  86. data/lib/rabbit/parser/pause-support.rb +1 -0
  87. data/lib/rabbit/parser/pdf.rb +3 -3
  88. data/lib/rabbit/parser/rd/ext/base.rb +20 -4
  89. data/lib/rabbit/parser/rd/ext/block-verbatim.rb +24 -28
  90. data/lib/rabbit/parser/rd/ext/character-reference.rb +18 -2
  91. data/lib/rabbit/parser/rd/ext/image.rb +3 -3
  92. data/lib/rabbit/parser/rd/ext/inline-verbatim.rb +6 -6
  93. data/lib/rabbit/parser/rd/ext/refer.rb +18 -2
  94. data/lib/rabbit/parser/rd/ext/video.rb +19 -2
  95. data/lib/rabbit/parser/rd/rd2rabbit-lib.rb +24 -8
  96. data/lib/rabbit/parser/rd/rt/rt2rabbit-lib.rb +18 -2
  97. data/lib/rabbit/parser/rd/visitor.rb +18 -2
  98. data/lib/rabbit/parser/rd.rb +18 -2
  99. data/lib/rabbit/parser/wiki/output.rb +25 -28
  100. data/lib/rabbit/parser/wiki.rb +18 -2
  101. data/lib/rabbit/parser.rb +6 -6
  102. data/lib/rabbit/path-manipulatable.rb +4 -4
  103. data/lib/rabbit/progress.rb +17 -1
  104. data/lib/rabbit/properties.rb +3 -3
  105. data/lib/rabbit/rabbit.rb +15 -7
  106. data/lib/rabbit/readme-parser.rb +4 -6
  107. data/lib/rabbit/renderer/base.rb +44 -36
  108. data/lib/rabbit/renderer/color.rb +18 -2
  109. data/lib/rabbit/renderer/display/base.rb +10 -12
  110. data/lib/rabbit/renderer/display/button-handler.rb +141 -60
  111. data/lib/rabbit/renderer/display/cursor.rb +4 -5
  112. data/lib/rabbit/renderer/display/drawing-area-base.rb +32 -48
  113. data/lib/rabbit/renderer/display/drawing-area-primitive.rb +10 -61
  114. data/lib/rabbit/renderer/display/drawing-area-view-only.rb +19 -8
  115. data/lib/rabbit/renderer/display/drawing-area.rb +19 -15
  116. data/lib/rabbit/renderer/display/gesture.rb +9 -9
  117. data/lib/rabbit/renderer/display/graffiti.rb +22 -13
  118. data/lib/rabbit/renderer/display/info.rb +22 -2
  119. data/lib/rabbit/renderer/display/magnifier.rb +30 -17
  120. data/lib/rabbit/renderer/display/mask.rb +17 -1
  121. data/lib/rabbit/renderer/display/menu.rb +27 -3
  122. data/lib/rabbit/renderer/display/motion-handler.rb +45 -0
  123. data/lib/rabbit/renderer/display/progress.rb +17 -2
  124. data/lib/rabbit/renderer/display/scroll-handler.rb +60 -13
  125. data/lib/rabbit/renderer/display/search.rb +19 -2
  126. data/lib/rabbit/renderer/display/spotlight.rb +39 -25
  127. data/lib/rabbit/renderer/display.rb +16 -36
  128. data/lib/rabbit/renderer/engine/cairo.rb +4 -11
  129. data/lib/rabbit/renderer/engine.rb +17 -1
  130. data/lib/rabbit/renderer/kernel.rb +2 -20
  131. data/lib/rabbit/renderer/offscreen.rb +8 -14
  132. data/lib/rabbit/renderer/print-layout.rb +2 -2
  133. data/lib/rabbit/renderer/printer.rb +9 -16
  134. data/lib/rabbit/renderer/scene-background-widget.rb +95 -0
  135. data/lib/rabbit/renderer/scene-node-widget.rb +63 -0
  136. data/lib/rabbit/renderer/scene.rb +508 -0
  137. data/lib/rabbit/renderer.rb +6 -6
  138. data/lib/rabbit/search-window.rb +18 -2
  139. data/lib/rabbit/searcher.rb +15 -1
  140. data/lib/rabbit/size.rb +9 -1
  141. data/lib/rabbit/slide-configuration.rb +11 -14
  142. data/lib/rabbit/soap/driver.rb +20 -4
  143. data/lib/rabbit/soap/server.rb +17 -1
  144. data/lib/rabbit/source/argf.rb +5 -5
  145. data/lib/rabbit/source/base.rb +5 -6
  146. data/lib/rabbit/source/file.rb +5 -5
  147. data/lib/rabbit/source/memory.rb +20 -4
  148. data/lib/rabbit/source/uri.rb +9 -11
  149. data/lib/rabbit/source-generator/hiki.rb +2 -7
  150. data/lib/rabbit/source-generator/markdown.rb +2 -7
  151. data/lib/rabbit/source-generator/rd.rb +2 -7
  152. data/lib/rabbit/source-generator.rb +4 -4
  153. data/lib/rabbit/source.rb +5 -5
  154. data/lib/rabbit/task/slide.rb +13 -11
  155. data/lib/rabbit/task/theme.rb +8 -11
  156. data/lib/rabbit/task.rb +3 -3
  157. data/lib/rabbit/theme/applier.rb +27 -11
  158. data/lib/rabbit/theme/clear-blue/clear-blue.rb +1 -1
  159. data/lib/rabbit/theme/color-circle/color-circle.rb +18 -1
  160. data/lib/rabbit/theme/cozmixng/cozmixng.rb +1 -1
  161. data/lib/rabbit/theme/default/default.rb +1 -0
  162. data/lib/rabbit/theme/default-icon/default-icon.rb +1 -1
  163. data/lib/rabbit/theme/default-item-mark-setup/default-item-mark-setup.rb +17 -1
  164. data/lib/rabbit/theme/default-preformatted/default-preformatted.rb +9 -1
  165. data/lib/rabbit/theme/enishi-green/enishi-green.rb +1 -1
  166. data/lib/rabbit/theme/entry.rb +10 -12
  167. data/lib/rabbit/theme/icon/icon.rb +3 -8
  168. data/lib/rabbit/theme/image-slide-number/image-slide-number.rb +5 -5
  169. data/lib/rabbit/theme/image-timer/image-timer.rb +3 -3
  170. data/lib/rabbit/theme/lightning-simple/lightning-simple.rb +1 -0
  171. data/lib/rabbit/theme/lightning-talk/lightning-talk.rb +1 -0
  172. data/lib/rabbit/theme/manager.rb +19 -9
  173. data/lib/rabbit/theme/rabbit-icon/rabbit-icon.rb +1 -1
  174. data/lib/rabbit/theme/ranguba/ranguba.rb +1 -1
  175. data/lib/rabbit/theme/red-frame/red-frame.rb +6 -2
  176. data/lib/rabbit/theme/ruby-gnome2/ruby-gnome2.rb +1 -0
  177. data/lib/rabbit/theme/ruby-gnome2-icon/ruby-gnome2-icon.rb +1 -1
  178. data/lib/rabbit/theme/searcher.rb +23 -7
  179. data/lib/rabbit/theme/slide-number/slide-number.rb +1 -1
  180. data/lib/rabbit/theme/slide-show/slide-show.rb +1 -1
  181. data/lib/rabbit/theme/table/table.rb +2 -2
  182. data/lib/rabbit/theme/video/property.rb +3 -0
  183. data/lib/rabbit/theme/video/video.rb +5 -0
  184. data/lib/rabbit/theme-configuration.rb +9 -11
  185. data/lib/rabbit/utils.rb +12 -94
  186. data/lib/rabbit/version.rb +1 -1
  187. data/lib/rabbit/xmlrpc/client.rb +17 -1
  188. data/lib/rabbit/xmlrpc/server.rb +17 -1
  189. data/po/en/rabbit.edit.po +324 -316
  190. data/po/en/rabbit.po +61 -55
  191. data/po/fr/rabbit.edit.po +324 -316
  192. data/po/fr/rabbit.po +61 -55
  193. data/po/ja/rabbit.edit.po +345 -370
  194. data/po/ja/rabbit.po +83 -80
  195. data/rabbit.gemspec +4 -2
  196. data/sample/block-quote.rab +13 -0
  197. data/sample/description-list.rab +17 -0
  198. data/sample/mermaid.rab +16 -0
  199. data/sample/rabbit-en.hiki +0 -1
  200. data/sample/rabbit-en.md +0 -1
  201. data/sample/rabbit-en.rd +0 -1
  202. data/sample/rabbit.hiki +0 -1
  203. data/sample/rabbit.md +0 -1
  204. data/sample/rabbit.rd +0 -1
  205. data/sample/video.rab +17 -0
  206. metadata +33 -65
  207. data/lib/rabbit/action/basic.rb +0 -304
  208. data/lib/rabbit/action/radio.rb +0 -78
  209. data/lib/rabbit/action/toggle.rb +0 -82
  210. data/lib/rabbit/action.rb +0 -140
  211. data/lib/rabbit/renderer/display/gl.rb +0 -98
  212. data/lib/rabbit/renderer/display/key-handler.rb +0 -321
  213. data/lib/rabbit/renderer/gl.rb +0 -95
  214. data/lib/rabbit/renderer/screen.rb +0 -286
  215. data/lib/rabbit/renderer/widget/drawing-area.rb +0 -93
  216. data/lib/rabbit/stock.rb +0 -31
  217. data/lib/rabbit/trackball.rb +0 -228
  218. data/lib/rabbit/video-window.rb +0 -123
  219. data/test/command/test-rabbit.rb +0 -101
  220. data/test/helper/parser.rb +0 -48
  221. data/test/helper.rb +0 -24
  222. data/test/image/test-dia.rb +0 -54
  223. data/test/image/test-eps.rb +0 -41
  224. data/test/parser/test-markdown.rb +0 -360
  225. data/test/parser/test-rd.rb +0 -43
  226. data/test/parser/test-wiki.rb +0 -71
  227. data/test/run-test.rb +0 -27
  228. data/test/source-generator/test-hiki.rb +0 -68
  229. data/test/source-generator/test-markdown.rb +0 -67
  230. data/test/source-generator/test-rd.rb +0 -69
  231. data/test/test-applier.rb +0 -73
  232. data/test/test-author-configuration.rb +0 -37
  233. data/test/test-canvas.rb +0 -70
  234. data/test/test-color.rb +0 -51
  235. data/test/test-element.rb +0 -103
  236. data/test/test-readme-parser.rb +0 -160
  237. data/test/test-size.rb +0 -155
  238. data/test/test-slide-configuration.rb +0 -74
  239. data/test/test-source.rb +0 -122
  240. data/test/test-theme-configuration.rb +0 -47
  241. data/test/test-utils.rb +0 -64
data/lib/rabbit/logger.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2004-2014 Kouhei Sutou <kou@cozmixng.org>
1
+ # Copyright (C) 2004-2025 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -14,10 +14,10 @@
14
14
  # with this program; if not, write to the Free Software Foundation, Inc.,
15
15
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
16
 
17
- require "rabbit/utils"
17
+ require_relative "utils"
18
18
 
19
- require "rabbit/logger/stderr"
20
- require "rabbit/logger/gui"
19
+ require_relative "logger/stderr"
20
+ require_relative "logger/gui"
21
21
 
22
22
  module Rabbit
23
23
  module Logger
data/lib/rabbit/menu.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2004-2024 Sutou Kouhei <kou@cozmixng.org>
1
+ # Copyright (C) 2004-2025 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -15,69 +15,78 @@
15
15
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
16
 
17
17
  require "erb"
18
- require "stringio"
19
18
 
20
- require "rabbit/gtk"
19
+ require_relative "gtk"
21
20
 
22
- require "rabbit/gettext"
23
- require "rabbit/utils"
24
- require "rabbit/theme/searcher"
25
- require "rabbit/image"
26
- require "rabbit/action"
21
+ require_relative "gettext"
22
+ require_relative "utils"
23
+ require_relative "theme/searcher"
24
+ require_relative "image"
25
+ require_relative "actions"
27
26
 
28
27
  module Rabbit
29
28
  class Menu
30
29
  include ERB::Util
31
30
  include GetText
32
31
 
33
- @@icon = nil
34
-
35
32
  def initialize(actions)
36
- @merge = Gtk::UIManager.new
37
- @merge.insert_action_group(actions, 0)
38
- @jump_to_actions = nil
39
- @jump_to_merge_id = nil
40
- @theme_actions = nil
41
- @theme_merge_id = nil
42
- update_ui
33
+ @actions = actions
43
34
  end
44
35
 
45
36
  def attach(window)
46
- window.add_accel_group(accel_group)
37
+ @window = window
47
38
  end
48
39
 
49
40
  def detach(window)
50
- window.remove_accel_group(accel_group)
41
+ @window = nil
51
42
  end
52
43
 
53
44
  def update_menu(canvas)
54
- update_jump_to_menu(canvas)
55
- update_theme_menu(canvas)
56
- Action.update_move_slide_action_status(canvas)
57
- Action.update_graffiti_action_status(canvas)
58
- Action.update_theme_action_status(canvas)
59
- Action.update_quit_action_status(canvas)
60
- @merge.ensure_update
61
- show_tearoff
45
+ @popover_menu = Gtk::PopoverMenu.new
46
+ @menu_model = Gio::Menu.new
47
+ @popover_menu.insert_action_group("rabbit", @actions.group)
48
+ add_jump_to_actions(canvas)
49
+ add_theme_actions(canvas)
50
+ add_items(canvas)
51
+ if @popover_menu.respond_to?(:menu_model=) # GTK 4
52
+ @popover_menu.menu_model = @menu_model
53
+ else
54
+ @popover_menu.bind_model(@menu_model)
55
+ end
56
+ if @window
57
+ if @popover_menu.respond_to?(:relative_to=) # GTK 3
58
+ @popover_menu.relative_to = @window.child
59
+ else
60
+ @popover_menu.parent = @window.child
61
+ end
62
+ end
63
+ @popover_menu.autohide = true if @popover_menu.respond_to?(:autohide=)
64
+
65
+ @actions.update_status
66
+ end
67
+
68
+ def toggle(x=nil, y=nil)
69
+ if @popover_menu.visible?
70
+ popdown
71
+ else
72
+ popup(x, y)
73
+ end
62
74
  end
63
75
 
64
- def popup(button, time)
65
- @menu.popup(nil, nil, button, time)
76
+ def popup(x=nil, y=nil)
77
+ @popover_menu.pointing_to = Gdk::Rectangle.new(x || 0, y || 0, 0, 0)
78
+ @popover_menu.popup
66
79
  end
67
80
 
68
- private
69
- def accel_group
70
- # @merge.accel_group
71
- @accel_group = @merge.accel_group # <- workaround for Ruby/GLib <= 0.18.1
81
+ def popdown
82
+ @popover_menu.popdown
72
83
  end
73
84
 
74
- def make_jump_to_action(jump_to_action, title, i)
75
- name = "JumpTo#{i}"
76
- label = "#{i}: #{escape_label(Utils.unescape_title(title))}"
77
- tooltip = _("Jump to the %dth slide") % i
78
- action = Gtk::Action.new(name, :label => label, :tooltip => tooltip)
85
+ private
86
+ def build_action(name)
87
+ action = Gio::SimpleAction.new(name)
79
88
  action.signal_connect("activate") do
80
- jump_to_action.activate {i}
89
+ yield
81
90
  end
82
91
  action
83
92
  end
@@ -86,216 +95,187 @@ module Rabbit
86
95
  label.gsub(/_/, '__')
87
96
  end
88
97
 
89
- def update_jump_to_menu(canvas)
90
- @merge.remove_ui(@jump_to_merge_id) if @jump_to_merge_id
91
- @merge.remove_action_group(@jump_to_actions) if @jump_to_actions
92
-
93
- @jump_to_merge_id = @merge.new_merge_id
94
- @jump_to_actions = Gtk::ActionGroup.new("JumpToActions")
95
- @merge.insert_action_group(@jump_to_actions, 0)
96
- jump_to_path = "/popup/JumpTo"
97
- jump_to_action = canvas.action("JumpTo")
98
- return unless jump_to_action
98
+ def add_jump_to_actions(canvas)
99
+ @jump_to_actions = Gio::SimpleActionGroup.new
99
100
  canvas.slides.each_with_index do |slide, i|
100
- action = make_jump_to_action(jump_to_action, slide.title, i)
101
+ action = build_action("JumpTo#{i}") do
102
+ canvas.move_to_if_can(i)
103
+ end
101
104
  @jump_to_actions.add_action(action)
102
- @merge.add_ui(@jump_to_merge_id, jump_to_path, action.name,
103
- action.name, :auto, false)
104
105
  end
106
+ @popover_menu.insert_action_group("jump", @jump_to_actions)
105
107
  end
106
108
 
107
- def update_ui
108
- @merge_ui = @merge.add_ui(ui_xml)
109
- @menu = @merge.get_widget("/popup")
110
- tearoff = Gtk::TearoffMenuItem.new
111
- tearoff.show
112
- @menu.prepend(tearoff)
109
+ def jump_to_items(canvas)
110
+ canvas.slides.collect.with_index do |slide, i|
111
+ label = "#{i}: #{escape_label(Utils.unescape_title(slide.title))}"
112
+ [:item, "jump.JumpTo#{i}", label]
113
+ end
113
114
  end
114
115
 
115
- def update_theme_menu(canvas)
116
- @merge.remove_ui(@theme_merge_id) if @theme_merge_id
117
- @merge.remove_action_group(@theme_actions) if @theme_actions
118
-
119
- @theme_merge_id = @merge.new_merge_id
120
- @theme_actions = Gtk::ActionGroup.new("ThemeActions")
121
- @merge.insert_action_group(@theme_actions, 0)
122
-
116
+ def add_theme_actions(canvas)
117
+ @theme_actions = Gio::SimpleActionGroup.new
123
118
  themes = Theme::Searcher.collect_theme
124
-
125
- categories = themes.collect do |entry|
126
- entry.category
127
- end.uniq.sort_by {|cat| _(cat)}
128
-
129
- change = "/popup/ChangeTheme"
130
- merge = "/popup/MergeTheme"
131
-
132
- categories.each do |category|
133
- theme_menu_add_category("Change", change, category)
134
- theme_menu_add_category("Merge", merge, category)
135
- end
136
-
137
119
  themes.each do |entry|
138
- theme_menu_add_theme("Change", change, entry, canvas)
139
- theme_menu_add_theme("Merge", merge, entry, canvas)
140
- end
141
- end
142
-
143
- def theme_menu_add_category(prefix, path, category)
144
- name = "#{prefix}ThemeCategory#{category}"
145
- label = _(category)
146
- action = Gtk::Action.new(name, :label => label)
147
- @theme_actions.add_action(action)
148
- @merge.add_ui(@theme_merge_id, path, category, name, :menu, false)
149
- end
150
-
151
- def theme_menu_add_theme(prefix, path, entry, canvas)
152
- path = "#{path}/#{entry.category}"
153
- name = "#{prefix}ThemeEntry#{entry.name}"
154
- label = _(entry.title)
155
- action = Gtk::Action.new(name, :label => label)
156
- action.signal_connect("activate") do
157
- canvas.activate("#{prefix}Theme") do
158
- [entry, Utils.process_pending_events_proc]
120
+ action = build_action("ChangeThemeEntry#{entry.name}") do
121
+ canvas.apply_theme(entry.name, &Utils.process_pending_events_proc)
159
122
  end
160
- end
161
- @theme_actions.add_action(action)
162
- @merge.add_ui(@theme_merge_id, path, entry.name, name, :auto, false)
163
- end
164
-
165
- def show_tearoff(sub_menus=@menu.children)
166
- sub_menus.each do |child|
167
- if child.respond_to?(:submenu) and child.submenu
168
- tearoff, *child_sub_menus = child.submenu.children
169
- tearoff.show
170
- show_tearoff(child_sub_menus)
123
+ action = build_action("MergeThemeEntry#{entry.name}") do
124
+ canvas.merge_theme(entry.name, &Utils.process_pending_events_proc)
171
125
  end
172
126
  end
173
127
  end
174
128
 
175
- def ui_xml
176
- format_xml(ui_axml)
177
- end
178
-
179
- def format_xml(axml)
180
- output = StringIO.new
181
- @indent = " "
182
- _format_xml(axml, output, 0)
183
- output.rewind
184
- output.read
185
- end
186
-
187
- def _format_xml(axml, output, indent)
188
- case axml
189
- when Array
190
- tag, *others = axml
191
- output.print("#{@indent * indent}<#{tag}")
192
- if others.first.is_a?(Hash)
193
- attrs, *others = others
194
- attrs.each do |key, value|
195
- output.print(" #{h(key)}=\"#{h(value)}\"") if value
196
- end
197
- end
198
- if others.empty?
199
- output.print("/>\n")
200
- else
201
- output.print(">\n")
202
- others.each do |other|
203
- _format_xml(other, output, indent + 1)
204
- end
205
- output.print("#{@indent * indent}</#{tag}>\n")
129
+ def theme_items(canvas, prefix)
130
+ themes = Theme::Searcher.collect_theme
131
+ themes_by_category = themes.group_by do |entry|
132
+ entry.category
133
+ end
134
+ sorted_categories = themes_by_category.keys.sort_by do |category|
135
+ _(category)
136
+ end
137
+ sorted_categories.collect do |category|
138
+ items = themes_by_category[category].collect do |entry|
139
+ [:item, "theme.#{prefix}ThemeEntry#{entry.name}", entry.name]
206
140
  end
207
- when String
208
- output.print(h(axml))
209
- else
210
- raise "!?!?!?: #{axml.inspect}"
141
+ [:menu, "#{prefix[0]}: #{_(category)}", *items]
211
142
  end
212
143
  end
213
144
 
214
- def ui_axml
215
- [:ui,
216
- [:popup,
217
- *items_to_axml(items)
218
- ]
219
- ]
145
+ def change_theme_items(canvas)
146
+ theme_items(canvas, "Change")
220
147
  end
221
148
 
222
- def items_to_axml(items)
223
- items.collect do |key, name, *others|
224
- params = {:name => name, :action => name}
225
- case key
226
- when :separator
227
- [:separator]
228
- when :item
229
- [:menuitem, params]
230
- when :menu
231
- [:menu, params, *items_to_axml(others)]
232
- end
233
- end
149
+ def merge_theme_items(canvas)
150
+ theme_items(canvas, "Merge")
234
151
  end
235
152
 
236
- def items
153
+ def items(canvas)
237
154
  [
238
- [:item, "ToggleIndexMode"],
239
- [:separator],
240
- [:item, "ToggleGraffitiMode"],
241
- [:menu, "Graffiti",
155
+ [:section,
156
+ [:item, "ToggleIndexMode"],
157
+ ],
158
+ [:section,
159
+ [:item, "ToggleGraffitiMode"],
160
+ [:menu, _("Graffiti"),
242
161
  [:item, "ClearGraffiti"],
243
162
  [:item, "UndoGraffiti"],
244
163
  [:item, "ChangeGraffitiColor"],
164
+ ],
165
+ ],
166
+ [:section,
167
+ [:item, "ToggleFullscreen"],
168
+ ],
169
+ [:section,
170
+ [:item, "ToggleInfoWindow"],
171
+ ],
172
+ [:section,
173
+ [:item, "ChangeBlank('whiteout')", _("Whiteout")],
174
+ [:item, "ChangeBlank('blackout')", _("Blackout")],
175
+ [:item, "ChangeBlank('show')", _("Show")],
176
+ ],
177
+ # [:section,
178
+ # [:item, "ToggleCommentFrame"],
179
+ # [:item, "ToggleCommentView"],
180
+ # ],
181
+ [:section,
182
+ [:item, "ToggleSpotlight"],
183
+ [:item, "ToggleMagnifier"],
184
+ ],
185
+ [:section,
186
+ [:item, "ToggleTerminal"],
245
187
  ],
246
- [:separator],
247
- [:item, "ToggleFullScreen"],
248
- [:separator],
249
- [:item, "ToggleInfoWindow"],
250
- [:separator],
251
- [:item, "RadioBlankWhiteout"],
252
- [:item, "RadioBlankBlackout"],
253
- [:item, "RadioBlankShow"],
254
- # [:separator],
255
- # [:item, "ToggleCommentFrame"],
256
- # [:item, "ToggleCommentView"],
257
- [:separator],
258
- [:item, "ToggleSpotlight"],
259
- [:item, "ToggleMagnifier"],
260
- [:separator],
261
- [:item, "ToggleTerminal"],
262
- [:separator],
263
- [:menu, "JumpTo"],
264
- [:separator],
265
- [:item, "Previous"],
266
- [:item, "Next"],
267
- [:item, "PreviousSlide"],
268
- [:item, "NextSlide"],
269
- [:item, "FirstSlide"],
270
- [:item, "LastSlide"],
271
- [:separator],
272
- [:item, "Iconify"],
273
- [:separator],
274
- [:item, "Redraw"],
275
- [:item, "ClearSlide"],
276
- [:item, "ReloadTheme"],
277
- [:menu, "ChangeTheme"],
278
- [:menu, "MergeTheme"],
279
- [:separator],
280
- [:item, "CacheAllSlides"],
281
- [:separator],
282
- [:item, "SaveAsImage"],
283
- [:item, "Print"],
284
- [:separator],
285
- [:item, "ResetTimer"],
286
- [:item, "ResetAdjustment"],
287
- [:separator],
288
- [:menu, "LogLevel",
289
- [:item, "RadioLogLevelDebug"],
290
- [:item, "RadioLogLevelInfo"],
291
- [:item, "RadioLogLevelWarning"],
292
- [:item, "RadioLogLevelError"],
293
- [:item, "RadioLogLevelFatal"],
294
- [:item, "RadioLogLevelUnknown"],
188
+ [:section,
189
+ [:menu, _("Jump to slide"), *jump_to_items(canvas)],
190
+ ],
191
+ [:section,
192
+ [:item, "Previous"],
193
+ [:item, "Next"],
194
+ [:item, "PreviousSlide"],
195
+ [:item, "NextSlide"],
196
+ [:item, "FirstSlide"],
197
+ [:item, "LastSlide"],
198
+ ],
199
+ [:section,
200
+ [:item, "Iconify"],
201
+ ],
202
+ [:section,
203
+ [:item, "Redraw"],
204
+ [:item, "ClearSlide"],
205
+ [:item, "ReloadTheme"],
206
+ [:menu, _("Change theme"), *change_theme_items(canvas)],
207
+ [:menu, _("Merge theme"), *merge_theme_items(canvas)],
208
+ ],
209
+ [:sction,
210
+ [:item, "CacheAllSlides"],
211
+ ],
212
+ [:section,
213
+ [:item, "SaveAsImage"],
214
+ [:item, "Print"],
215
+ ],
216
+ [:section,
217
+ [:item, "ResetTimer"],
218
+ [:item, "ResetAdjustment"],
219
+ ],
220
+ [:section,
221
+ [:menu, _("Log level"),
222
+ [:item, "ChangeLogLevel('debug')", _("Debug")],
223
+ [:item, "ChangeLogLevel('info')", _("Info")],
224
+ [:item, "ChangeLogLevel('warning')", _("Warning")],
225
+ [:item, "ChangeLogLevel('error')", _("Error")],
226
+ [:item, "ChangeLogLevel('fatal')", _("Fatal")],
227
+ [:item, "ChangeLogLevel('unknown')", _("Unknown")],
228
+ ],
229
+ ],
230
+ [:section,
231
+ [:item, "Quit"],
295
232
  ],
296
- [:separator],
297
- [:item, "Quit"],
298
233
  ]
299
234
  end
235
+
236
+ def add_item(container, item)
237
+ type = item[0]
238
+ case type
239
+ when :section
240
+ section = Gio::Menu.new
241
+ item[1..-1].each do |i|
242
+ add_item(section, i)
243
+ end
244
+ section_item = Gio::MenuItem.new
245
+ section_item.section = section
246
+ container.append_item(section_item)
247
+ when :item
248
+ action_name = item[1]
249
+ label = item[2]
250
+ icon = nil
251
+ unless action_name.include?(".")
252
+ action = @canvas.actions.find_action(action_name)
253
+ label ||= action&.label
254
+ icon = action&.icon
255
+ action_name = "rabbit.#{action_name}"
256
+ end
257
+ label ||= action_name
258
+ i = Gio::MenuItem.new(label, action_name)
259
+ i.icon = icon if icon
260
+ container.append_item(i)
261
+ when :menu
262
+ submenu = Gio::Menu.new
263
+ label = item[1]
264
+ item[2..-1].each do |i|
265
+ add_item(submenu, i)
266
+ end
267
+ submenu_item = Gio::MenuItem.new(label)
268
+ submenu_item.submenu = submenu
269
+ container.append_item(submenu_item)
270
+ end
271
+ end
272
+
273
+ def add_items(canvas)
274
+ @canvas = canvas
275
+ items(canvas).each do |item|
276
+ add_item(@menu_model, item)
277
+ end
278
+ @canvas = nil
279
+ end
300
280
  end
301
281
  end
@@ -1,4 +1,20 @@
1
- require "rabbit/utils"
1
+ # Copyright (C) 2007-2025 Sutou Kouhei <kou@cozmixng.org>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+
17
+ require_relative "../utils"
2
18
 
3
19
  module Rabbit
4
20
  module Parser
@@ -1,3 +1,19 @@
1
+ # Copyright (C) 2010-2025 Sutou Kouhei <kou@cozmixng.org>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+
1
17
  module Rabbit
2
18
  module Parser
3
19
  module Ext
@@ -7,7 +23,7 @@ module Rabbit
7
23
  module_function
8
24
  AVAILABLE_OPTIONS = ["linewidth", "foreground", "fill", "background",
9
25
  "option"]
10
- def make_image(path, prop, logger)
26
+ def make_image(path, prop)
11
27
  image_file = Tempfile.new("rabbit-image-aafigure")
12
28
  command = [
13
29
  "aafigure",
@@ -1,3 +1,19 @@
1
+ # Copyright (C) 2011-2025 Sutou Kouhei <kou@cozmixng.org>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+
1
17
  module Rabbit
2
18
  module Parser
3
19
  module Ext
@@ -8,7 +24,7 @@ module Rabbit
8
24
  AVAILABLE_FLAG_OPTIONS = ["antialias"]
9
25
  # "font" is treated as specially.
10
26
  AVAILABLE_VALUE_OPTIONS = []
11
- def make_image(path, prop, logger)
27
+ def make_image(path, prop)
12
28
  image_file = Tempfile.new(["rabbit-image-blockdiag", ".svg"])
13
29
  command_line = [
14
30
  "-T", "svg",
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2021 Kouhei Sutou <kou@cozmixng.org>
1
+ # Copyright (C) 2021-2025 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -23,7 +23,7 @@ module Rabbit
23
23
  include GetText
24
24
 
25
25
  module_function
26
- def make_image(path, prop, logger)
26
+ def make_image(path, prop)
27
27
  require "charty"
28
28
  backend = prop["backend"]
29
29
  ::Charty::Backends.use(backend) if backend
@@ -1,7 +1,23 @@
1
- require 'coderay'
1
+ # Copyright (C) 2011-2025 Sutou Kouhei <kou@cozmixng.org>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
2
16
 
3
- require 'rabbit/utils'
4
- require 'rabbit/parser/ext/escape'
17
+ require "coderay"
18
+
19
+ require_relative "../../utils"
20
+ require_relative "escape"
5
21
 
6
22
  module Rabbit
7
23
  module Parser
@@ -10,7 +26,7 @@ module Rabbit
10
26
  include GetText
11
27
 
12
28
  module_function
13
- def highlight(lang, text, logger)
29
+ def highlight(lang, text)
14
30
  tokens = ::CodeRay.scan(text.strip, lang.to_sym)
15
31
  tokens.encode(RabbitEncoder.new)
16
32
  end