shoes 4.0.0.pre2 → 4.0.0.pre3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (311) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +32 -21
  3. metadata +18 -337
  4. data/CHANGELOG +0 -84
  5. data/Gemfile +0 -24
  6. data/Guardfile +0 -11
  7. data/Rakefile +0 -14
  8. data/app.yaml +0 -60
  9. data/benchmark/app_clear.rb +0 -21
  10. data/benchmark/clear.rb +0 -69
  11. data/benchmark/memory/text_dispose.rb +0 -9
  12. data/benchmark/para_creator.rb +0 -9
  13. data/benchmark/paras.rb +0 -52
  14. data/benchmark/urls.rb +0 -40
  15. data/bin/ruby-shoes +0 -6
  16. data/bin/shoes-guard +0 -8
  17. data/bin/shoes-stub +0 -59
  18. data/ext/install/Rakefile +0 -29
  19. data/ext/install/shoes.bat +0 -9
  20. data/lib/shoes.rb +0 -5
  21. data/lib/shoes/ui/cli.rb +0 -102
  22. data/lib/shoes/ui/help.rb +0 -535
  23. data/lib/shoes/ui/manual.rb +0 -6
  24. data/lib/shoes/version.rb +0 -3
  25. data/manifests/common.rb +0 -34
  26. data/manifests/shoes.rb +0 -44
  27. data/samples/Gemfile +0 -3
  28. data/samples/Gemfile.lock +0 -35
  29. data/samples/README +0 -97
  30. data/samples/boom.rb +0 -239
  31. data/samples/class-book-adjusted.rb +0 -45
  32. data/samples/class-book.rb +0 -43
  33. data/samples/class-book.yaml +0 -387
  34. data/samples/clicky.rb +0 -24
  35. data/samples/cy.png +0 -0
  36. data/samples/expert-definr.rb +0 -23
  37. data/samples/expert-funnies.rb +0 -60
  38. data/samples/expert-game-of-life-adjusted.rb +0 -249
  39. data/samples/expert-game-of-life.rb +0 -243
  40. data/samples/expert-irb-adjusted.rb +0 -110
  41. data/samples/expert-irb.rb +0 -112
  42. data/samples/expert-minesweeper-adjusted.rb +0 -272
  43. data/samples/expert-minesweeper.rb +0 -267
  44. data/samples/expert-othello-adjusted.rb +0 -325
  45. data/samples/expert-othello.rb +0 -318
  46. data/samples/expert-pong.rb +0 -62
  47. data/samples/expert-snake.rb +0 -78
  48. data/samples/expert-tankspank.rb +0 -385
  49. data/samples/flow.rb +0 -63
  50. data/samples/good-arc.rb +0 -45
  51. data/samples/good-clock.rb +0 -51
  52. data/samples/good-displace.rb +0 -98
  53. data/samples/good-follow.rb +0 -26
  54. data/samples/good-potato-chopping.rb +0 -22
  55. data/samples/good-reminder.rb +0 -174
  56. data/samples/good-vjot.rb +0 -58
  57. data/samples/gray.rb +0 -11
  58. data/samples/loogink.png +0 -0
  59. data/samples/nks_booklist.rb +0 -24
  60. data/samples/nks_breadsticks.rb +0 -7
  61. data/samples/nks_dancing_circle.rb +0 -13
  62. data/samples/nks_dictionary.rb +0 -23
  63. data/samples/nks_edit_box.rb +0 -4
  64. data/samples/nks_edit_line.rb +0 -6
  65. data/samples/nks_notes.rb +0 -16
  66. data/samples/nks_poem.rb +0 -22
  67. data/samples/nks_self.rb +0 -6
  68. data/samples/nks_text_sizes.rb +0 -10
  69. data/samples/nks_trurl.rb +0 -5
  70. data/samples/original-manual-adjusted.rb +0 -475
  71. data/samples/original-manual.rb +0 -472
  72. data/samples/packaging/package_me.rb +0 -6
  73. data/samples/potato_chopping/1258_s001.gif +0 -0
  74. data/samples/potato_chopping/1258_s002.gif +0 -0
  75. data/samples/potato_chopping/1258_s003.gif +0 -0
  76. data/samples/potato_chopping/1258_s004.gif +0 -0
  77. data/samples/potato_chopping/1258_s005.gif +0 -0
  78. data/samples/potato_chopping/1258_s006.gif +0 -0
  79. data/samples/potato_chopping/1258_s007.gif +0 -0
  80. data/samples/potato_chopping/1258_s008.gif +0 -0
  81. data/samples/potato_chopping/1258_s009.gif +0 -0
  82. data/samples/potato_chopping/1258_s010.gif +0 -0
  83. data/samples/potato_chopping/1258_s011.gif +0 -0
  84. data/samples/potato_chopping/1258_s012.gif +0 -0
  85. data/samples/potato_chopping/1258_s013.gif +0 -0
  86. data/samples/potato_chopping/1258_s014.gif +0 -0
  87. data/samples/potato_chopping/1258_s015.gif +0 -0
  88. data/samples/potato_chopping/1258_s016.gif +0 -0
  89. data/samples/potato_chopping/1258_s017.gif +0 -0
  90. data/samples/potato_chopping/1258_s018.gif +0 -0
  91. data/samples/potato_chopping/1258_s019.gif +0 -0
  92. data/samples/potato_chopping/1258_s020.gif +0 -0
  93. data/samples/potato_chopping/1258_s021.gif +0 -0
  94. data/samples/potato_chopping/1258_s022.gif +0 -0
  95. data/samples/potato_chopping/1258_s023.gif +0 -0
  96. data/samples/potato_chopping/1258_s024.gif +0 -0
  97. data/samples/potato_chopping/1258_s025.gif +0 -0
  98. data/samples/potato_chopping/1258_s026.gif +0 -0
  99. data/samples/potato_chopping/1258_s027.gif +0 -0
  100. data/samples/potato_chopping/1258_s028.gif +0 -0
  101. data/samples/potato_chopping/1258_s029.gif +0 -0
  102. data/samples/potato_chopping/1258_s030.gif +0 -0
  103. data/samples/potato_chopping/1258_s031.gif +0 -0
  104. data/samples/potato_chopping/1258_s032.gif +0 -0
  105. data/samples/potato_chopping/1258_s033.gif +0 -0
  106. data/samples/potato_chopping/1258_s034.gif +0 -0
  107. data/samples/potato_chopping/1258_s035.gif +0 -0
  108. data/samples/potato_chopping/1258_s036.gif +0 -0
  109. data/samples/potato_chopping/1258_s037.gif +0 -0
  110. data/samples/potato_chopping/1258_s038.gif +0 -0
  111. data/samples/potato_chopping/1258_s039.gif +0 -0
  112. data/samples/potato_chopping/1258_s040.gif +0 -0
  113. data/samples/potato_chopping/1258_s041.gif +0 -0
  114. data/samples/potato_chopping/1258_s042.gif +0 -0
  115. data/samples/potato_chopping/1258_s043.gif +0 -0
  116. data/samples/potato_chopping/1258_s044.gif +0 -0
  117. data/samples/potato_chopping/1258_s045.gif +0 -0
  118. data/samples/potato_chopping/1258_s046.gif +0 -0
  119. data/samples/potato_chopping/1258_s047.gif +0 -0
  120. data/samples/potato_chopping/1258_s048.gif +0 -0
  121. data/samples/potato_chopping/1258_s049.gif +0 -0
  122. data/samples/potato_chopping/1258_s050.gif +0 -0
  123. data/samples/potato_chopping/1258_s051.gif +0 -0
  124. data/samples/potato_chopping/1258_s052.gif +0 -0
  125. data/samples/potato_chopping/1258_s053.gif +0 -0
  126. data/samples/potato_chopping/1258_s054.gif +0 -0
  127. data/samples/potato_chopping/1258_s055.gif +0 -0
  128. data/samples/potato_chopping/1258_s056.gif +0 -0
  129. data/samples/potato_chopping/1258_s057.gif +0 -0
  130. data/samples/potato_chopping/1258_s058.gif +0 -0
  131. data/samples/potato_chopping/1258_s059.gif +0 -0
  132. data/samples/present.rb +0 -27
  133. data/samples/progress.rb +0 -10
  134. data/samples/sample1.rb +0 -30
  135. data/samples/sample12.rb +0 -21
  136. data/samples/sample13.rb +0 -13
  137. data/samples/sample14.rb +0 -64
  138. data/samples/sample15.rb +0 -18
  139. data/samples/sample16.rb +0 -10
  140. data/samples/sample17.rb +0 -10
  141. data/samples/sample2.rb +0 -14
  142. data/samples/sample21.rb +0 -5
  143. data/samples/sample23.rb +0 -8
  144. data/samples/sample24.rb +0 -21
  145. data/samples/sample27.rb +0 -18
  146. data/samples/sample3.rb +0 -14
  147. data/samples/sample31.rb +0 -22
  148. data/samples/sample34.rb +0 -27
  149. data/samples/sample35.rb +0 -32
  150. data/samples/sample37.rb +0 -8
  151. data/samples/sample4.rb +0 -7
  152. data/samples/sample42.rb +0 -14
  153. data/samples/sample45.rb +0 -11
  154. data/samples/sample56.rb +0 -10
  155. data/samples/sample6.rb +0 -9
  156. data/samples/sample7.rb +0 -3
  157. data/samples/sample8.rb +0 -7
  158. data/samples/sample9.rb +0 -10
  159. data/samples/simple-accordion.rb +0 -75
  160. data/samples/simple-anim-shapes.rb +0 -17
  161. data/samples/simple-anim-text.rb +0 -13
  162. data/samples/simple-animate.rb +0 -12
  163. data/samples/simple-arc.rb +0 -23
  164. data/samples/simple-bounce.rb +0 -24
  165. data/samples/simple-brightness-transitions.rb +0 -8
  166. data/samples/simple-button-animate.rb +0 -16
  167. data/samples/simple-calc-2.rb +0 -34
  168. data/samples/simple-calc.rb +0 -70
  169. data/samples/simple-color-selector.rb +0 -10
  170. data/samples/simple-color-transitions.rb +0 -11
  171. data/samples/simple-control-sizes.rb +0 -24
  172. data/samples/simple-curve.rb +0 -26
  173. data/samples/simple-dialogs-outside.rb +0 -12
  174. data/samples/simple-dialogs.rb +0 -32
  175. data/samples/simple-displace.rb +0 -15
  176. data/samples/simple-downloader.rb +0 -27
  177. data/samples/simple-draw.rb +0 -13
  178. data/samples/simple-editor.rb +0 -28
  179. data/samples/simple-face.rb +0 -14
  180. data/samples/simple-flow-wrap.rb +0 -11
  181. data/samples/simple-font.rb +0 -17
  182. data/samples/simple-form.rb +0 -29
  183. data/samples/simple-form.shy +0 -0
  184. data/samples/simple-fullscreen.rb +0 -4
  185. data/samples/simple-guess-game.rb +0 -28
  186. data/samples/simple-keypress.rb +0 -14
  187. data/samples/simple-manual.rb +0 -2
  188. data/samples/simple-mask.rb +0 -21
  189. data/samples/simple-menu.rb +0 -47
  190. data/samples/simple-mouse-follow.rb +0 -8
  191. data/samples/simple-move.rb +0 -13
  192. data/samples/simple-oval.rb +0 -3
  193. data/samples/simple-sample-executor.rb +0 -6
  194. data/samples/simple-shoes-intro.rb +0 -22
  195. data/samples/simple-slide.rb +0 -56
  196. data/samples/simple-sound.rb +0 -30
  197. data/samples/simple-sphere.rb +0 -28
  198. data/samples/simple-stripes.rb +0 -8
  199. data/samples/simple-tictactoe.rb +0 -238
  200. data/samples/simple-timer.rb +0 -15
  201. data/samples/simple-video.rb +0 -13
  202. data/samples/simple-visibility.rb +0 -11
  203. data/samples/simple-widget.rb +0 -9
  204. data/samples/sounds/102719__sarge4267__explosion.mp3 +0 -0
  205. data/samples/sounds/145622__andybrannan__train-fog-horn-long-wyomming.aiff +0 -0
  206. data/samples/sounds/46492__phreaksaccount__shields1.ogg +0 -0
  207. data/samples/sounds/61847__simon-rue__boink-v3.wav +0 -0
  208. data/samples/swt-raw.rb +0 -20
  209. data/samples/troll.rb +0 -22
  210. data/shoes.gemspec +0 -29
  211. data/snapshots/sample1.png +0 -0
  212. data/snapshots/sample10.png +0 -0
  213. data/snapshots/sample11.png +0 -0
  214. data/snapshots/sample12.png +0 -0
  215. data/snapshots/sample13.png +0 -0
  216. data/snapshots/sample14.png +0 -0
  217. data/snapshots/sample15.png +0 -0
  218. data/snapshots/sample16.png +0 -0
  219. data/snapshots/sample17.png +0 -0
  220. data/snapshots/sample18.png +0 -0
  221. data/snapshots/sample19.png +0 -0
  222. data/snapshots/sample2.png +0 -0
  223. data/snapshots/sample20.png +0 -0
  224. data/snapshots/sample21.png +0 -0
  225. data/snapshots/sample22.png +0 -0
  226. data/snapshots/sample23.png +0 -0
  227. data/snapshots/sample24.png +0 -0
  228. data/snapshots/sample27.png +0 -0
  229. data/snapshots/sample28.png +0 -0
  230. data/snapshots/sample29.png +0 -0
  231. data/snapshots/sample3.png +0 -0
  232. data/snapshots/sample30.png +0 -0
  233. data/snapshots/sample31.png +0 -0
  234. data/snapshots/sample34.png +0 -0
  235. data/snapshots/sample35.png +0 -0
  236. data/snapshots/sample36.png +0 -0
  237. data/snapshots/sample37.png +0 -0
  238. data/snapshots/sample4.png +0 -0
  239. data/snapshots/sample42.png +0 -0
  240. data/snapshots/sample44.png +0 -0
  241. data/snapshots/sample45.png +0 -0
  242. data/snapshots/sample46.png +0 -0
  243. data/snapshots/sample5.png +0 -0
  244. data/snapshots/sample56.png +0 -0
  245. data/snapshots/sample6.png +0 -0
  246. data/snapshots/sample7.png +0 -0
  247. data/snapshots/sample8.png +0 -0
  248. data/snapshots/sample9.png +0 -0
  249. data/snapshots/sample99.png +0 -0
  250. data/static/PKGBUILD +0 -47
  251. data/static/Shoes.icns +0 -0
  252. data/static/avatar.png +0 -0
  253. data/static/code_highlighter.js +0 -188
  254. data/static/code_highlighter_ruby.js +0 -26
  255. data/static/downloading.png +0 -0
  256. data/static/icon-debug.png +0 -0
  257. data/static/icon-error.png +0 -0
  258. data/static/icon-info.png +0 -0
  259. data/static/icon-warn.png +0 -0
  260. data/static/listbox_button1.png +0 -0
  261. data/static/listbox_button2.png +0 -0
  262. data/static/man-app.png +0 -0
  263. data/static/man-builds.png +0 -0
  264. data/static/man-builds1.png +0 -0
  265. data/static/man-editor-notepad.png +0 -0
  266. data/static/man-editor-osx.png +0 -0
  267. data/static/man-ele-background.png +0 -0
  268. data/static/man-ele-border.png +0 -0
  269. data/static/man-ele-button.png +0 -0
  270. data/static/man-ele-check.png +0 -0
  271. data/static/man-ele-editbox.png +0 -0
  272. data/static/man-ele-editline.png +0 -0
  273. data/static/man-ele-image.png +0 -0
  274. data/static/man-ele-listbox.png +0 -0
  275. data/static/man-ele-progress.png +0 -0
  276. data/static/man-ele-radio.png +0 -0
  277. data/static/man-ele-shape.png +0 -0
  278. data/static/man-ele-textblock.png +0 -0
  279. data/static/man-ele-video.png +0 -0
  280. data/static/man-intro-dmg.png +0 -0
  281. data/static/man-intro-exe.png +0 -0
  282. data/static/man-look-tiger.png +0 -0
  283. data/static/man-look-ubuntu.png +0 -0
  284. data/static/man-look-vista.png +0 -0
  285. data/static/man-run-osx.png +0 -0
  286. data/static/man-run-vista.png +0 -0
  287. data/static/man-run-xp.png +0 -0
  288. data/static/man-shot1.png +0 -0
  289. data/static/manual-en.txt +0 -3531
  290. data/static/manual-ja.txt +0 -2829
  291. data/static/manual.css +0 -184
  292. data/static/menu-corner1.png +0 -0
  293. data/static/menu-corner2.png +0 -0
  294. data/static/menu-gray.png +0 -0
  295. data/static/menu-left.png +0 -0
  296. data/static/menu-right.png +0 -0
  297. data/static/menu-top.png +0 -0
  298. data/static/shoes-dmg.jpg +0 -0
  299. data/static/shoes-icon-blue.png +0 -0
  300. data/static/shoes-icon-brown.png +0 -0
  301. data/static/shoes-icon.png +0 -0
  302. data/static/shoes-manual-apps.gif +0 -0
  303. data/static/shoes-manual-apps.png +0 -0
  304. data/static/shoes_main_window.png +0 -0
  305. data/static/stripe.png +0 -0
  306. data/static/tutor-back.png +0 -0
  307. data/tasks/changelog.rb +0 -92
  308. data/tasks/gem.rb +0 -38
  309. data/tasks/rspec.rb +0 -106
  310. data/tasks/sample.rb +0 -66
  311. data/tasks/yard.rb +0 -13
data/ext/install/Rakefile DELETED
@@ -1,29 +0,0 @@
1
- require 'rubygems'
2
- require 'fileutils'
3
-
4
- # Running JRuby on OS X requires options passed at the start. To pass those
5
- # options and avoid double JVM startup, we want 'shoes' to be a bash script on
6
- # Unix systems, but Rubygems only supports installing Ruby to the bin.
7
-
8
- # We work around this by installing our script as shoes-stub, then acting like
9
- # a "native extension" via this Rakefile, we manually generate the right script
10
- # (a copy of shoes-stub) in the Gem.bindir.
11
-
12
- # Because we don't actually declare shoes as an executable, we also have to
13
- # copy our shoes.bat into place as well on Windows systems.
14
-
15
- # We also provide a Rubygems plugin to clean up our manual file on uninstall.
16
- # Post-install hooks didn't seem to work, though, hence the extension trick.
17
-
18
- task :default => ['install_script']
19
-
20
- task :install_script do
21
- if Gem.win_platform?
22
- source_path = File.join(File.dirname(__FILE__), "shoes.bat")
23
- dest_path = File.join(Gem.bindir, "shoes.bat")
24
- else
25
- source_path = File.join(File.dirname(__FILE__), "..", "..", "bin", "shoes-stub")
26
- dest_path = File.join(Gem.bindir, "shoes")
27
- end
28
- FileUtils.cp(source_path, dest_path)
29
- end
@@ -1,9 +0,0 @@
1
- @setlocal enableextensions enabledelayedexpansion
2
- @echo off
3
-
4
- REM If we're running from source, bin/shoes.bat will have set bin_dir already.
5
- if not defined bin_dir set bin_dir=%~dp0
6
-
7
- set command=jruby --1.9 !bin_dir!/ruby-shoes %*
8
- call !command!
9
- endlocal
data/lib/shoes.rb DELETED
@@ -1,5 +0,0 @@
1
- require 'tmpdir'
2
- require 'fileutils'
3
-
4
- require 'shoes/ui/manual'
5
- require 'shoes/dsl'
data/lib/shoes/ui/cli.rb DELETED
@@ -1,102 +0,0 @@
1
- require 'optparse'
2
- require 'shoes'
3
-
4
- class Shoes
5
- class CLI
6
- def initialize
7
- @packages = []
8
- end
9
-
10
- def parse!(args)
11
- opts = OptionParser.new do |opts|
12
- opts.program_name = 'shoes'
13
- opts.banner = <<-EOS
14
- Usage: #{opts.program_name} [-h] [-p package] file
15
- EOS
16
- opts.separator ''
17
- opts.separator 'Options:'
18
-
19
- opts.on('-p', '--package PACKAGE_TYPE', 'Package as BACKEND:PACKAGE') do |package|
20
- unless package =~ /^(swt):(app|jar)$/
21
- abort("#{opts.program_name}: Can't package as '#{package}'. See '#{opts.program_name} --help'")
22
- end
23
- @packages << Package.new(package)
24
- end
25
-
26
- opts.on('-v', '--version', 'Shoes version') do
27
- puts "Shoes #{VERSION}"
28
- exit
29
- end
30
-
31
- opts.separator "\nPackage types:"
32
- opts.separator package_types(opts)
33
- opts.separator "\nExamples:"
34
- opts.separator examples(opts)
35
- end
36
-
37
- opts.parse!(args)
38
- opts
39
- end
40
-
41
- def package_types(opts)
42
- <<-EOS
43
- swt:app A standalone OS X executable with the Swt backend
44
- swt:jar An executable JAR with the Swt backend
45
- EOS
46
- end
47
-
48
- def examples(opts)
49
- <<-EOS
50
- To run a Shoes app:
51
- #{opts.program_name} path/to/shoes-app.rb
52
-
53
- Two ways to package a Shoes app as an APP and a JAR, using the Swt backend:
54
- #{opts.program_name} -p swt:app -p swt:jar path/to/app.yaml
55
- #{opts.program_name} -p swt:app -p swt:jar path/to/shoes-app.rb
56
- EOS
57
- end
58
-
59
- def package(path)
60
- begin
61
- require 'furoshiki/shoes'
62
- config = Furoshiki::Shoes::Configuration.load(path)
63
- rescue Errno::ENOENT => e
64
- abort "shoes: #{e.message}"
65
- end
66
- @packages.each do |p|
67
- puts "Packaging #{p.backend}:#{p.wrapper}..."
68
- packager = Furoshiki::Shoes.new(p.backend, p.wrapper, config)
69
- packager.package
70
- end
71
- end
72
-
73
- # Execute a shoes app.
74
- #
75
- # @param [String] app the location of the app to run
76
- def execute_app(app)
77
- $LOAD_PATH.unshift(Dir.pwd)
78
- require 'shoes/swt'
79
- load app
80
- end
81
-
82
- def run(args)
83
- opts = parse!(args)
84
- if args.empty?
85
- puts opts.banner
86
- puts "Try '#{opts.program_name} --help' for more information"
87
- exit(0)
88
- end
89
- package(args.shift) unless @packages.empty?
90
- execute_app(args.first) unless args.empty?
91
- end
92
-
93
- # Convenience class representing a backend:wrapper pair
94
- class Package
95
- def initialize(arg)
96
- @backend, @wrapper = arg.split(':')
97
- end
98
-
99
- attr_reader :backend, :wrapper
100
- end
101
- end
102
- end
data/lib/shoes/ui/help.rb DELETED
@@ -1,535 +0,0 @@
1
- require 'nokogiri'
2
- require 'nkf'
3
- require 'ext/highlighter'
4
-
5
- class Array
6
- def / len
7
- a = []
8
- each_with_index do |x, i|
9
- a << [] if i % len == 0
10
- a.last << x
11
- end
12
- a
13
- end
14
-
15
- def dark?
16
- r, g, b = self
17
- r + g + b < 0x55 * 3
18
- end
19
-
20
- def light?
21
- r, g, b = self
22
- r + g + b > 0xAA * 3
23
- end
24
- end
25
-
26
- class Manual < Shoes
27
- url '/', :index
28
- url '/manual/(\d+)', :index
29
-
30
- include HH::Markup
31
-
32
- def index pnum = 0
33
- #font LANG == 'ja' ? 'MS UI Gothic' : 'Arial'
34
- #style Link, underline: false, weight: 'bold'
35
- #style LinkHover, stroke: '#06E'
36
- self.scroll_top = 0
37
- TOC.clear; TOC_LIST.clear
38
- table_of_contents.each{|toc| TOC << toc}
39
- pnum == '999' ? mk_search_page : manual( *get_title_and_desc(pnum.to_i) )
40
- end
41
-
42
- def get_title_and_desc pnum
43
- chapter, section = PNUMS[pnum]
44
- return nil unless chapter
45
- if section
46
- [pnum, DOCS[chapter][1][:sections][section][1][:title],
47
- DOCS[chapter][1][:sections][section][1][:description],
48
- DOCS[chapter][1][:sections][section][1][:methods]]
49
- else
50
- [pnum, DOCS[chapter][0], DOCS[chapter][1][:description], []]
51
- end
52
- end
53
-
54
- def table_of_contents
55
- PNUMS.map.with_index do |e, pnum|
56
- chapter, section = e
57
- title = section ? DOCS[chapter][1][:sections][section][1][:title] : DOCS[chapter][0]
58
- title = title.sub('The', '').split(' ').first
59
- TOC_LIST << [title, section]
60
- section ? [' ', link(title){visit "/manual/#{pnum}"}, "\n"] : [link(fg(title, magenta)){visit "/manual/#{pnum}"}, "\n"]
61
- end.flatten
62
- end
63
-
64
- def manual pnum, docs_title, docs_description, docs_methods
65
- flow do
66
- show_header docs_title
67
- show_toc
68
- paras = mk_paras docs_description
69
- flow width: 0.75, margin: [20, 0, 20, 0] do
70
- show_page paras, true
71
- show_methods docs_methods
72
- para link('top'){visit "/manual/0"}, " ",
73
- link('prev'){visit "/manual/#{(pnum-1)%PEND}"}, " ",
74
- link('next'){visit "/manual/#{(pnum+1)%PEND}"}, " ",
75
- link('end'){visit "/manual/#{PEND-1}"}
76
- end
77
- end
78
- end
79
-
80
- def show_header docs_title
81
- background snow..white, angle: 90
82
- background midnightblue..black, height: 90
83
- flow width: 500 do
84
- para fg("The Shoes 4 Manual #{VERSION}", gray), left: 120, top: 10
85
- title fg(docs_title, white), left: 120, top: 30, font: 'Coolvetica'
86
- end
87
- image(File.join(DIR, 'static/shoes-icon.png'), width: 110, height: 110).move 5, -12
88
- end
89
-
90
- def show_toc
91
- s = self
92
- stack height: 30
93
- flow width: 0.2, margin_left: 10 do
94
- flow(margin_right: 20) do
95
- background black(0.7), curve: 5
96
- inscription "Not findng it?\n", 'Try ', link(fg 'Search', white){visit '/manual/999'}, '!', align: 'center', stroke: lightgray
97
- end
98
- stack(height: 10){}
99
- para *TOC
100
- para link(fg 'to_html', green){s.html_manual}
101
- end
102
- end
103
-
104
- def show_methods docs_methods, term = nil
105
- docs_methods.each do |m, d|
106
- flow do
107
- background rgb(60, 60, 60), curve: 5
108
- n = m.index("\u00BB")
109
- if n
110
- para ' ', fg(strong(m[0...n]), white), fg(strong(m[n..-1]), rgb(160, 160, 160))
111
- else
112
- para ' ', fg(strong(m), white)
113
- end
114
- end
115
- para NL
116
- show_page mk_paras(d), false, term
117
- end
118
- end
119
-
120
- def show_page paras, intro = false, term = nil
121
- s = self
122
- paras.each_with_index do |text, i|
123
- if text =~ CODE_RE
124
- text.gsub CODE_RE do |lines|
125
- lines = lines.split NL
126
- n = lines[1] =~ /\#\!ruby/ ? 2 : 1
127
- _code = lines[n...-1].join(NL+' ')
128
- flow do
129
- background rgb(190, 190, 190), curve: 5
130
- inscription link(fg('Run this', magenta)){eval s.mk_executable(_code), TOPLEVEL_BINDING}, ' ', align: 'right'
131
- if _code.include? 'te-su-to'
132
- para fg(code(' ' + _code), maroon), NL, margin: [-10, 10, 0, 20]
133
- else
134
- para *highlight(' ' + _code, nil).map{|e| code e}, NL * 2, margin: [-10, 10, 0, 20]
135
- end
136
- end
137
- fill_rest_of_line
138
- para NL
139
- end
140
- next
141
- end
142
-
143
- if text =~ /\A \* (.+)/m
144
- $1.split(/^ \* /).each do |txt|
145
- image File.join(DIR, 'static/shoes-icon.png'), width: 20, height: 20
146
- flow(width: 510){show_paragraph txt, intro, i, term}
147
- para NL
148
- end
149
- else
150
- show_paragraph text, intro, i, term
151
- end
152
- end
153
- end
154
-
155
- def show_paragraph txt, intro, i, term = nil
156
- txt = txt.gsub("\n", ' ').gsub(/\^(.+?)\^/m, '\1').gsub(/\[\[BR\]\]/i, "\n")
157
- txts = txt.split(/(\[\[\S+?\]\])/m).map{|s| s.split(/(\[\[\S+? .+?\]\])/m)}.flatten
158
- case txts[0]
159
- when /\A==== (.+) ====/; caption *marker($1, term), size: 24
160
- when /\A=== (.+) ===/; tagline *marker($1, term), size: 12, weight: 'bold'
161
- when /\A== (.+) ==/; subtitle *marker($1, term)
162
- when /\A= (.+) =/; title *marker($1, term)
163
- when /\A\{COLORS\}/; flow{color_page}
164
- when /\A\{SAMPLES\}/; flow{sample_page}
165
- else
166
- para *mk_deco(mk_links(txts, term).flatten), NL, (intro and i.zero?) ? {size: 16} : ''
167
- txt.gsub IMAGE_RE do
168
- image File.join(DIR, "static/#{$3}"), eval("{#{$2 or "margin_left: 50"}}")
169
- fill_rest_of_line
170
- end
171
- end
172
- end
173
-
174
- def mk_links txts, term = nil
175
- txts.map{|txt| txt.gsub(IMAGE_RE, '')}.
176
- map{|txt| txt =~ /\[\[(\S+?)\]\]/m ? (t = $1.split('.'); link(ins *marker(t.last, term)){visit "/manual/#{find_pnum t.first}"}) : txt}.
177
- map{|txt| txt =~ /\[\[(\S+?) (.+?)\]\]/m ? (url = $1; link(ins *marker($2, term)){visit url =~ /^http/ ? url : "/manual/#{find_pnum url}"}) :
178
- (txt.is_a?(String) ? marker(txt, term) : txt)}
179
- end
180
-
181
- def mk_paras str
182
- str.split(PARA_RE) - ['']
183
- end
184
-
185
- def mk_executable code
186
- if code =~ /\# Not yet available/
187
- "Shoes.app{para 'Sorry, not yet available...'}"
188
- else
189
- code
190
- end
191
- end
192
-
193
- def color_page
194
- COLORS.each do |color, v|
195
- r, g, b = v.red, v.green, v.blue
196
- c = v.dark? ? white : black
197
- stack width: 0.33, height: 55, margin_top: 5 do
198
- clr = send(color)
199
- background clr
200
- #para fg(strong(color), c), align: 'center'
201
- para fg('. ', clr), fg(strong(color), c), fg(' .', clr), align: 'center'
202
- para fg("rgb(#{r}, #{g}, #{b})", c), align: 'center'
203
- end
204
- end
205
- para NL
206
- end
207
-
208
- def sample_page
209
- mk_sample_names.each do |file|
210
- stack width: 80 do
211
- inscription file[0...-3]
212
- image File.join(DIR, "snapshots/#{file[0..-3]}png"), width: 50, height: 50 do
213
- Dir.chdir(File.join DIR, 'samples'){instance_eval(IO.read(file),file,0)}
214
- end
215
- para NL
216
- end
217
- end
218
- end
219
-
220
- def mk_sample_names
221
- Dir[File.join(DIR, 'samples/sample*.rb')].map do |file|
222
- orig_name = File.basename file
223
- dummy_name = orig_name.sub(/sample(.*)\.rb/){
224
- first, second = $1.split('-')
225
- "%02d%s%s" % [first.to_i, ('-' if second), second]
226
- }
227
- [dummy_name, orig_name]
228
- end.sort.map &:last
229
- end
230
-
231
- def find_pnum page
232
- return 999 if page == 'Search'
233
- TOC_LIST.each_with_index do |e, i|
234
- title, section = e
235
- return i if title == page
236
- end
237
- end
238
-
239
- def self.load_docs path
240
- str = IO.read(path).force_encoding("UTF-8")
241
- (str.split(/^= (.+?) =/)[1..-1]/2).map do |k, v|
242
- sparts = v.split(/^== (.+?) ==/)
243
- sections = (sparts[1..-1]/2).map do |k2, v2|
244
- meth = v2.split(/^=== (.+?) ===/)
245
- k2t = k2[/^(?:The )?([\-\w]+)/, 1]
246
- meth_plain = meth[0].gsub(IMAGE_RE, '')
247
- h = {title: k2, section: k, description: meth[0], methods: (meth[1..-1]/2)}
248
- [k2t, h]
249
- end
250
- h = {description: sparts[0], sections: sections, class: "toc" + k.downcase.gsub(/\W+/, '')}
251
- [k, h]
252
- end
253
- end
254
-
255
- def self.mk_page_numbers docs
256
- pnum = []
257
- docs.length.times do |i|
258
- pnum << [i, nil]
259
- docs[i][1][:sections].length.times do |j|
260
- pnum << [i, j]
261
- end
262
- end
263
- pnum
264
- end
265
-
266
- def html_manual
267
- dir = ask_save_folder
268
- return unless dir
269
- FileUtils.mkdir_p File.join(dir, 'static')
270
- FileUtils.mkdir_p File.join(dir, 'snapshots')
271
- %w[shoes-icon.png shoes-manual-apps.png manual.css code_highlighter.js code_highlighter_ruby.js].
272
- each{|x| FileUtils.cp "#{DIR}/static/#{x}", "#{dir}/static"}
273
- Dir[File.join DIR, 'static/man-*.png'].each{|x| FileUtils.cp x, "#{dir}/static"}
274
- Dir[File.join DIR, 'snapshots/sample*.png'].each{|x| FileUtils.cp x, "#{dir}/snapshots"}
275
-
276
- TOC_LIST.length.times do |n|
277
- num, title, desc, methods = get_title_and_desc n
278
- open File.join(dir, "#{TOC_LIST[n][0]}.html"), 'wb:utf-8' do |f|
279
- html = mk_html(title, desc, methods, TOC_LIST[n+1], get_title_and_desc(n+1), mk_sidebar_list(num))
280
- f.puts html.force_encoding('UTF-8')
281
- end
282
- end
283
- end
284
-
285
- def mk_html title, desc, methods, next_file, next_title, menu
286
- man = self
287
- html = Nokogiri::HTML::Builder.new do |h|
288
- h.html(:lang => Manual::LANG) do
289
- h.head do
290
- h.meta charset: 'utf-8'
291
- h.title "The Shoes 4 Manual // #{title}"
292
- h.script type: "text/javascript", src: "static/code_highlighter.js"
293
- h.script type: "text/javascript", src: "static/code_highlighter_ruby.js"
294
- h.style type: "text/css" do
295
- h.text "@import 'static/manual.css';"
296
- end
297
- end
298
- h.body do
299
- h.div.main! do
300
- h.div.manual! do
301
- h.h2 "The Shoes 4 Manual #{VERSION}"
302
- h.h1 title
303
-
304
- paras = man.mk_paras desc
305
- h.div(:class => 'intro') { h << man.manual_p(paras.shift) }
306
-
307
- html_paragraph = proc do
308
- paras.each do |str|
309
- if str =~ CODE_RE
310
- h.pre{h.code(class: 'rb'){h.text $1.gsub(/^\s*?\n/, '')}}
311
- else
312
- cmd, str = case str
313
- when /\A==== (.+) ====/; [:h4, $1]
314
- when /\A=== (.+) ===/; [:h3, $1]
315
- when /\A== (.+) ==/; [:h2, $1]
316
- when /\A= (.+) =/; [:h1, $1]
317
- when /\A\{COLORS\}/
318
- COLORS.each do |color, v|
319
- f = v.dark? ? "white" : "black"
320
- h.div(class: 'color', style: "background: #{color}; color: #{f}"){ h.h3 color.to_s; h.p("rgb(%d, %d, %d)" % [v.red, v.green, v.blue])}
321
- end
322
- when /\A\{SAMPLES\}/
323
- man.mk_sample_names.each do |name|
324
- name = name[0...-3]
325
- h.div( :class => 'sample') do
326
- h.h3 name
327
- h.text '<a href="snapshots/%s.png"><img src="snapshots/%s.png" alt="%s" border=0 width=50 height=50></a>' % [name, name, name]
328
- end
329
- end
330
- when /\A \* (.+)/m
331
- h.ul {$1.split(/^ \* /).each{|x| h << man.manual_p(x) }} ; nil
332
- else
333
- [:p_, str]
334
- end
335
- h.send(cmd){ h << man.manual_p(str) } if cmd.is_a?(Symbol)
336
- end
337
- end
338
- end
339
-
340
- html_paragraph.call
341
-
342
- methods.each do |m, d|
343
- n = m.index("\u00BB")
344
- n ? (sig, val = m[0...n-1], m[n-1..-1]) : (sig, val = m, nil)
345
- aname = sig[/^[^(=]+=?/].gsub(/\s/, '').downcase
346
- h.a(name: aname)
347
- h.div(class: 'divmethod') do
348
- h.a sig, href: "##{aname}"
349
- h.text val if val
350
- end
351
- h.div(class: 'desc') do
352
- paras = man.mk_paras d
353
- html_paragraph.call
354
- end
355
- end
356
-
357
- h.p(class: 'next'){h.text "Next: "; h.a(href: "#{next_file[0]}.html") { h.text next_title[1] }} if next_title
358
- end
359
- h.div(class: 'sidebar') do
360
- h.img src: "static/shoes-icon.png"
361
- h.ul do
362
- h.li{h.a(class:'prime', href: "./") { h.text "HELP" }}
363
- menu.each do |m|
364
- h.li do
365
- unless m.is_a?(Array)
366
- h.a(href: "#{m}.html") {h.text m}
367
- else
368
- h.ul(class: 'sub') do
369
- m.each do |sm|
370
- h.li{h.a(href: "#{sm}.html") {h.text sm}}
371
- end
372
- end
373
- end
374
- end
375
- end
376
- end
377
- end
378
- end
379
- end
380
- end
381
- end.to_html
382
-
383
- "<!DOCTYPE html>\n#{html}"
384
- end
385
-
386
- def mk_sidebar_list num
387
- toc = []
388
- [0..3, 4..9, 10..16, 17..32, 33..37].each do |r|
389
- toc.push TOC_LIST[r.first][0]
390
- toc.push(TOC_LIST[r.first+1..r.last].to_a.map &:first) if r.include?(num)
391
- end
392
- toc
393
- end
394
-
395
- def manual_p str
396
- str.gsub(/\n+\s*/, " ").
397
- gsub(/&/, '&amp;').gsub(/>/, '&gt;').gsub(/>/, '&lt;').gsub(/"/, '&quot;').
398
- gsub(/`(.+?)`/m, '<code>\1</code>').gsub(/\[\[BR\]\]/i, "<br />\n").
399
- gsub(/\^(.+?)\^/m, '\1').
400
- gsub(/'''(.+?)'''/m, '<strong>\1</strong>').gsub(/''(.+?)''/m, '<em>\1</em>').
401
- gsub(/\[\[((http|https):\/\/\S+?)\]\]/m, '<a href="\1" target="_new">\1</a>').
402
- gsub(/\[\[((http|https):\/\/\S+?) (.+?)\]\]/m, '<a href="\1" target="_new">\3</a>').
403
- gsub(/\[\[(\S+?)\]\]/m) do
404
- ms, mn = $1.split(".", 2)
405
- if mn
406
- '<a href="' + ms + '.html#' + mn + '">' + mn + '</a>'
407
- else
408
- '<a href="' + ms + '.html">' + ms + '</a>'
409
- end
410
- end.
411
- gsub(/\[\[(\S+?) (.+?)\]\]/m, '<a href="\1.html">\2</a>').
412
- gsub(/\!(\{[^}\n]+\})?([^!\n]+\.\w+)\!/) do
413
- '<img src="' + "static/#$2" + '" />'
414
- end
415
- end
416
-
417
- def mk_search_page
418
- s = self
419
- flow do
420
- show_header 'Search'
421
- show_toc
422
- pnum, docs_title, docs_description, docs_methods = get_title_and_desc(25)
423
- paras = mk_paras docs_description
424
-
425
- flow width: 0.8, margin: [10, 0, 20, 0] do
426
- el = edit_line width: 300
427
- tagline link('search'){
428
- term = el.text.strip
429
- unless term.empty?
430
- descs, methods = s.search term
431
- @f.clear{s.show_search_result term, descs, methods}
432
- end
433
- }
434
- stack(height: 20){}
435
- @f = flow{}
436
- end
437
- end
438
- end
439
-
440
- def search term
441
- descs, methods = [], []
442
- PNUMS.each_with_index do |(chapter, section), pnum|
443
- pnum, docs_title, docs_description, docs_methods = get_title_and_desc(pnum)
444
- paras = mk_paras(docs_description)
445
- descs << [chapter, section, docs_title, paras] if paras.map{|txt| txt.gsub(CODE_RE, '').gsub(IMAGE_RE, '')}.join(' ').index(term)
446
- docs_methods.each do |docs_method|
447
- m, d = docs_method
448
- methods << [chapter, section, docs_title, docs_method] if m.index(term) or d.gsub(CODE_RE, '').gsub(IMAGE_RE, '').index(term)
449
- end
450
- end
451
- return descs, methods
452
- end
453
-
454
- def show_search_result term, descs, methods
455
- s = self
456
- if descs.empty? and methods.empty?
457
- subtitle 'Not Found'
458
- else
459
- methods.each do |(chapter, section, docs_title, docs_method)|
460
- flow margin: [10, 10, 0, 5] do
461
- background rgb(200, 200, 200), curve: 5
462
- para "#{DOCS[chapter][0]}: #{docs_title.sub('The', '').split(' ').first}: ",
463
- link(docs_method[0]){@f.clear{title docs_title; s.show_methods [docs_method], term}}, NL
464
- end
465
- stack(height: 2){}
466
- end
467
- descs.each do |(chapter, section, docs_title, paras)|
468
- flow margin_left: 10 do
469
- if section
470
- background gray, curve: 5
471
- tagline link(fg(docs_title, white)){@f.clear{title docs_title; s.show_page paras, true, term}}, width: 320
472
- inscription "Sub-Section under #{DOCS[chapter][0]}", stroke: lightgray, width: 180
473
- else
474
- background black(0.8), curve: 5
475
- subtitle link(fg(docs_title, white)){@f.clear{title docs_title; s.show_page paras, true, term}}, width: 320
476
- inscription 'Section Header', stroke: lightgray, width: 100
477
- end
478
- end
479
- stack(height: 2){}
480
- end
481
- para NL
482
- end
483
- end
484
-
485
- def marker txt, term
486
- if term && txt
487
- tmp = txt.split(term).map{|s| [s, bg(term, yellow)]}.flatten
488
- txt =~ /#{term}$/ ? tmp : tmp[0...-1]
489
- else
490
- [txt]
491
- end
492
- end
493
-
494
- def mk_deco datas
495
- datas = decoration(datas, /`(.+?)`/m){|s| fg code(s), rgb(255, 30, 0)}
496
- datas = decoration(datas, /'''(.+?)'''/m){|s| strong s}
497
- decoration(datas, /''(.+?)''/m){|s| em s}
498
- end
499
-
500
- def decoration datas, re, &blk
501
- datas.map do |data|
502
- if data.is_a? String
503
- txts = [data]
504
- data.match re do |md|
505
- n = data.index md[0]
506
- txts = [data[0...n], blk[md[1]], decoration([data[n+md[0].length..-1]], re, &blk)]
507
- end
508
- txts
509
- else
510
- data
511
- end
512
- end.flatten
513
- end
514
-
515
- # Hack to consume remaining space to the right of a flow.
516
- # Used to rely on NL's, but with new text flowing, that doesn't work anymore.
517
- def fill_rest_of_line
518
- flow width:1.0 do
519
- end
520
- end
521
-
522
- IMAGE_RE = /\!(\{([^}\n]+)\})?([^!\n]+\.\w+)\!/
523
- CODE_RE = /\{{3}(?:\s*\#![^\n]+)?(.+?)\}{3}/m
524
- PARA_RE = /\s*?(\{{3}(?:.+?)\}{3})|\n\n/m
525
- NL = "\n"
526
- LANG = $lang.downcase[0, 2]
527
- DOCS = load_docs($lang =~ /\.txt$/ ? $lang : File.join(DIR, "static/manual-#{LANG}.txt"))
528
- PNUMS = mk_page_numbers DOCS
529
- PEND = PNUMS.length
530
- TOC, TOC_LIST = [], []
531
- COLORS = Shoes::COLORS
532
- VERSION = Shoes::VERSION
533
- end
534
-
535
- Shoes.app title: 'The Shoes 4 Manual', width: 720, height: 640