shoes 3.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 (275) hide show
  1. data/.gitignore +12 -0
  2. data/CHANGELOG +29 -0
  3. data/COPYING +30 -0
  4. data/README.md +76 -0
  5. data/README.old +117 -0
  6. data/Rakefile +130 -0
  7. data/Rakefile.bk +651 -0
  8. data/app.yaml +7 -0
  9. data/bin/main.skel +104 -0
  10. data/bugs/issue-012e9468ddc7b0cb7e1503413a8a11c4f8707b67.yaml +21 -0
  11. data/bugs/issue-0711ff8b67baa63586f11d0096fee9dd4436bf58.yaml +23 -0
  12. data/bugs/issue-07f87998d93eb401e22395c11085676389b935c4.yaml +22 -0
  13. data/bugs/issue-0bff2d80008803cbc7efbcdacdc60ef2163664d2.yaml +22 -0
  14. data/bugs/issue-0c66f223d19efbca7b692f3b91961f407ad7abec.yaml +24 -0
  15. data/bugs/issue-183bc3c7a8f575aff2b24e0bf22aa0dfcc8e4fc2.yaml +29 -0
  16. data/bugs/issue-1bad1e60a04cb3adb6a8f3ded128af2e16b56ffe.yaml +18 -0
  17. data/bugs/issue-1f1d43f76bf4de79d7f94adbae6dd506a9d81633.yaml +41 -0
  18. data/bugs/issue-320924117cadb045cc91f2a6fca922b4d81d4bb5.yaml +20 -0
  19. data/bugs/issue-33e5c8355fbf65252ea9e939714651df8bd8cb3b.yaml +25 -0
  20. data/bugs/issue-36f7c8262a72bcd5e28cfa4ed29328b8237ea79b.yaml +20 -0
  21. data/bugs/issue-39bf04ee50c3bef67b89b8e9beb28657805587ce.yaml +18 -0
  22. data/bugs/issue-3e28ba7754f73d02ef416eef989af707a8c00f01.yaml +23 -0
  23. data/bugs/issue-3f638cc03f41f9c3fdf217355321f1563f8fee45.yaml +22 -0
  24. data/bugs/issue-41e48e14f1ef4f6deb69be68165d7dd3ffd99156.yaml +22 -0
  25. data/bugs/issue-4c9408166a2aa5dd333bbb05520deebf4ded08e0.yaml +22 -0
  26. data/bugs/issue-55c687e108ecd5aeb8e0d0aeb4294984f84acd3e.yaml +18 -0
  27. data/bugs/issue-5811d34692cc292717a58ec1df1f8948cf30d826.yaml +28 -0
  28. data/bugs/issue-5a7c1f59a0526f9cea7fb366867cf1e6ed8ef69d.yaml +22 -0
  29. data/bugs/issue-688a2c2566bef6a03efa57a4ae1f7cfa8fc74444.yaml +21 -0
  30. data/bugs/issue-78b16c7988ade2ef96e716fa8cb9a004bd4ced65.yaml +33 -0
  31. data/bugs/issue-804ee49f9800154eddf0650690c7a9bb5626253f.yaml +27 -0
  32. data/bugs/issue-807dd1c610b2e941a5d454e26b2eac27e89a0ab4.yaml +22 -0
  33. data/bugs/issue-822ee33ec11ebd25f90ea86e8438de7891e63aee.yaml +18 -0
  34. data/bugs/issue-82ff7152cebb8a1cb065b864cb4fe22de2328146.yaml +29 -0
  35. data/bugs/issue-856afbdcdd4970ad54b8ce4a6c017fbaab45f49d.yaml +31 -0
  36. data/bugs/issue-8d49e32fb21522651c67490adb4d80076dbb14e1.yaml +24 -0
  37. data/bugs/issue-91583359653a9d530c1e32be72d874d847a306e7.yaml +21 -0
  38. data/bugs/issue-af41a5229613172764e7d3c98431172db337053d.yaml +20 -0
  39. data/bugs/issue-bd9856b3788dd429c998a5af1b2aae8221cb80b7.yaml +28 -0
  40. data/bugs/issue-be22aef5c564fb7b5e9938343136a9cd6a2edb7b.yaml +22 -0
  41. data/bugs/issue-bf8697523c77c326e7e35fc82cf3dd739ae92310.yaml +27 -0
  42. data/bugs/issue-cdd4b4795f34d6ff46e56ece10f8216a4a5456b2.yaml +25 -0
  43. data/bugs/issue-d9bfb5581d745ef9deb3b9b2e08ef74d1cd43082.yaml +20 -0
  44. data/bugs/issue-e0ce2f687cc096f35715d28b0af88589f4ab6cc6.yaml +18 -0
  45. data/bugs/issue-e4b0aca4a10a574b333aeaecaaf221dbc5ed22c6.yaml +38 -0
  46. data/bugs/issue-f263746594b95ba778455730478ee8df60ee639d.yaml +22 -0
  47. data/bugs/project.yaml +72 -0
  48. data/builddeps.sh +102 -0
  49. data/fonts/Coolvetica.ttf +0 -0
  50. data/fonts/Lacuna.ttf +0 -0
  51. data/gemlib/shoes.rb +1 -0
  52. data/lib/shoes.rb +548 -0
  53. data/lib/shoes/cache.rb +54 -0
  54. data/lib/shoes/chipmunk.rb +35 -0
  55. data/lib/shoes/data.rb +39 -0
  56. data/lib/shoes/help.rb +468 -0
  57. data/lib/shoes/image.rb +25 -0
  58. data/lib/shoes/inspect.rb +128 -0
  59. data/lib/shoes/log.rb +48 -0
  60. data/lib/shoes/minitar.rb +986 -0
  61. data/lib/shoes/override.rb +38 -0
  62. data/lib/shoes/pack.rb +543 -0
  63. data/lib/shoes/search.rb +46 -0
  64. data/lib/shoes/setup.rb +329 -0
  65. data/lib/shoes/shy.rb +131 -0
  66. data/lib/shoes/shybuilder.rb +44 -0
  67. data/lib/shoes/version.rb +3 -0
  68. data/make/darwin/deps.vlc +12 -0
  69. data/make/darwin/dylibs.shoes +22 -0
  70. data/make/darwin/dylibs.video +11 -0
  71. data/make/darwin/env.rb +81 -0
  72. data/make/darwin/tasks.rb +105 -0
  73. data/make/linux/env.rb +65 -0
  74. data/make/linux/tasks.rb +61 -0
  75. data/make/make.rb +85 -0
  76. data/make/mingw/dlls +19 -0
  77. data/make/mingw/env.rb +69 -0
  78. data/make/mingw/tasks.rb +70 -0
  79. data/make/rakefile_common.rb +8 -0
  80. data/manual-snapshots/class-book.png +0 -0
  81. data/manual-snapshots/expert-definr.png +0 -0
  82. data/manual-snapshots/expert-funnies.png +0 -0
  83. data/manual-snapshots/expert-irb.png +0 -0
  84. data/manual-snapshots/expert-minesweeper.png +0 -0
  85. data/manual-snapshots/expert-othello.png +0 -0
  86. data/manual-snapshots/expert-pong.png +0 -0
  87. data/manual-snapshots/expert-tankspank.png +0 -0
  88. data/manual-snapshots/good-arc.png +0 -0
  89. data/manual-snapshots/good-clock.png +0 -0
  90. data/manual-snapshots/good-follow.png +0 -0
  91. data/manual-snapshots/good-reminder.png +0 -0
  92. data/manual-snapshots/good-vjot.png +0 -0
  93. data/manual-snapshots/simple-accordion.png +0 -0
  94. data/manual-snapshots/simple-anim-shapes.png +0 -0
  95. data/manual-snapshots/simple-anim-text.png +0 -0
  96. data/manual-snapshots/simple-arc.png +0 -0
  97. data/manual-snapshots/simple-bounce.png +0 -0
  98. data/manual-snapshots/simple-calc.png +0 -0
  99. data/manual-snapshots/simple-chipmunk.png +0 -0
  100. data/manual-snapshots/simple-control-sizes.png +0 -0
  101. data/manual-snapshots/simple-curve.png +0 -0
  102. data/manual-snapshots/simple-dialogs.png +0 -0
  103. data/manual-snapshots/simple-downloader.png +0 -0
  104. data/manual-snapshots/simple-draw.png +0 -0
  105. data/manual-snapshots/simple-editor.png +0 -0
  106. data/manual-snapshots/simple-form.png +0 -0
  107. data/manual-snapshots/simple-mask.png +0 -0
  108. data/manual-snapshots/simple-menu.png +0 -0
  109. data/manual-snapshots/simple-menu1.png +0 -0
  110. data/manual-snapshots/simple-rubygems.png +0 -0
  111. data/manual-snapshots/simple-slide.png +0 -0
  112. data/manual-snapshots/simple-sphere.png +0 -0
  113. data/manual-snapshots/simple-sqlite3.png +0 -0
  114. data/manual-snapshots/simple-timer.png +0 -0
  115. data/manual-snapshots/simple-video.png +0 -0
  116. data/platform/mac/Info.plist +55 -0
  117. data/platform/mac/build-deps.sh +658 -0
  118. data/platform/mac/command-manual.rb +1 -0
  119. data/platform/mac/deps-osx.patch +159 -0
  120. data/platform/mac/dmg_ds_store +0 -0
  121. data/platform/mac/pangorc +2 -0
  122. data/platform/mac/pkg-dmg +1447 -0
  123. data/platform/mac/shoes +31 -0
  124. data/platform/mac/shoes-launch +7 -0
  125. data/platform/mac/stub.m +178 -0
  126. data/platform/mac/version.plist +14 -0
  127. data/platform/msw/base.nsi +644 -0
  128. data/platform/msw/installer-1.bmp +0 -0
  129. data/platform/msw/installer-2.bmp +0 -0
  130. data/platform/msw/shoes.exe.manifest +17 -0
  131. data/platform/msw/shoes.ico +0 -0
  132. data/platform/msw/stub-inject.c +59 -0
  133. data/platform/msw/stub.c +271 -0
  134. data/platform/msw/stub32.h +14 -0
  135. data/platform/msw/stub32.rc +16 -0
  136. data/platform/nix/INSTALL +56 -0
  137. data/platform/nix/Makefile +144 -0
  138. data/platform/nix/shoes.launch +20 -0
  139. data/platform/skel.rb +27 -0
  140. data/rakefile_darwin.rb +7 -0
  141. data/rakefile_linux.rb +3 -0
  142. data/rakefile_mingw.rb +7 -0
  143. data/samples/class-book.rb +43 -0
  144. data/samples/class-book.yaml +387 -0
  145. data/samples/expert-definr.rb +23 -0
  146. data/samples/expert-funnies.rb +51 -0
  147. data/samples/expert-irb.rb +112 -0
  148. data/samples/expert-minesweeper.rb +267 -0
  149. data/samples/expert-othello.rb +319 -0
  150. data/samples/expert-pong.rb +62 -0
  151. data/samples/expert-tankspank.rb +385 -0
  152. data/samples/good-arc.rb +37 -0
  153. data/samples/good-clock.rb +51 -0
  154. data/samples/good-follow.rb +26 -0
  155. data/samples/good-reminder.rb +174 -0
  156. data/samples/good-vjot.rb +56 -0
  157. data/samples/simple-accordion.rb +75 -0
  158. data/samples/simple-anim-shapes.rb +17 -0
  159. data/samples/simple-anim-text.rb +13 -0
  160. data/samples/simple-arc.rb +23 -0
  161. data/samples/simple-bounce.rb +24 -0
  162. data/samples/simple-calc.rb +70 -0
  163. data/samples/simple-chipmunk.rb +26 -0
  164. data/samples/simple-control-sizes.rb +24 -0
  165. data/samples/simple-curve.rb +26 -0
  166. data/samples/simple-dialogs.rb +29 -0
  167. data/samples/simple-downloader.rb +27 -0
  168. data/samples/simple-draw.rb +13 -0
  169. data/samples/simple-editor.rb +28 -0
  170. data/samples/simple-form.rb +28 -0
  171. data/samples/simple-form.shy +0 -0
  172. data/samples/simple-mask.rb +21 -0
  173. data/samples/simple-menu.rb +31 -0
  174. data/samples/simple-menu1.rb +35 -0
  175. data/samples/simple-rubygems.rb +29 -0
  176. data/samples/simple-slide.rb +45 -0
  177. data/samples/simple-sphere.rb +28 -0
  178. data/samples/simple-sqlite3.rb +13 -0
  179. data/samples/simple-timer.rb +13 -0
  180. data/samples/simple-video.rb +13 -0
  181. data/shoes.gemspec +21 -0
  182. data/shoes/app.c +591 -0
  183. data/shoes/app.h +110 -0
  184. data/shoes/appwin32.h +13 -0
  185. data/shoes/appwin32.rc +28 -0
  186. data/shoes/canvas.c +2202 -0
  187. data/shoes/canvas.h +682 -0
  188. data/shoes/code.h +14 -0
  189. data/shoes/config.h +232 -0
  190. data/shoes/effects.c +243 -0
  191. data/shoes/effects.h +7 -0
  192. data/shoes/http.h +44 -0
  193. data/shoes/http/common.h +86 -0
  194. data/shoes/http/curl.c +259 -0
  195. data/shoes/http/nsurl.m +274 -0
  196. data/shoes/http/windownload.c +114 -0
  197. data/shoes/http/winhttp.c +216 -0
  198. data/shoes/http/winhttp.h +19 -0
  199. data/shoes/image.c +1020 -0
  200. data/shoes/internal.c +46 -0
  201. data/shoes/internal.h +63 -0
  202. data/shoes/native.h +110 -0
  203. data/shoes/native/cocoa.h +105 -0
  204. data/shoes/native/cocoa.m +1557 -0
  205. data/shoes/native/gtk.c +1257 -0
  206. data/shoes/native/windows.c +2392 -0
  207. data/shoes/ruby.c +5221 -0
  208. data/shoes/ruby.h +299 -0
  209. data/shoes/world.c +243 -0
  210. data/shoes/world.h +63 -0
  211. data/static/Shoes.icns +0 -0
  212. data/static/avatar.png +0 -0
  213. data/static/code_highlighter.js +188 -0
  214. data/static/code_highlighter_ruby.js +26 -0
  215. data/static/icon-debug.png +0 -0
  216. data/static/icon-error.png +0 -0
  217. data/static/icon-info.png +0 -0
  218. data/static/icon-warn.png +0 -0
  219. data/static/listbox_button1.png +0 -0
  220. data/static/listbox_button2.png +0 -0
  221. data/static/man-app.png +0 -0
  222. data/static/man-builds.png +0 -0
  223. data/static/man-builds1.png +0 -0
  224. data/static/man-editor-notepad.png +0 -0
  225. data/static/man-editor-osx.png +0 -0
  226. data/static/man-ele-background.png +0 -0
  227. data/static/man-ele-border.png +0 -0
  228. data/static/man-ele-button.png +0 -0
  229. data/static/man-ele-check.png +0 -0
  230. data/static/man-ele-editbox.png +0 -0
  231. data/static/man-ele-editline.png +0 -0
  232. data/static/man-ele-image.png +0 -0
  233. data/static/man-ele-listbox.png +0 -0
  234. data/static/man-ele-progress.png +0 -0
  235. data/static/man-ele-radio.png +0 -0
  236. data/static/man-ele-shape.png +0 -0
  237. data/static/man-ele-textblock.png +0 -0
  238. data/static/man-ele-video.png +0 -0
  239. data/static/man-intro-dmg.png +0 -0
  240. data/static/man-intro-exe.png +0 -0
  241. data/static/man-look-tiger.png +0 -0
  242. data/static/man-look-ubuntu.png +0 -0
  243. data/static/man-look-vista.png +0 -0
  244. data/static/man-run-osx.png +0 -0
  245. data/static/man-run-vista.png +0 -0
  246. data/static/man-run-xp.png +0 -0
  247. data/static/man-shot1.png +0 -0
  248. data/static/manual-en.txt +3531 -0
  249. data/static/manual-ja.txt +2825 -0
  250. data/static/manual.css +167 -0
  251. data/static/menu-corner1.png +0 -0
  252. data/static/menu-corner2.png +0 -0
  253. data/static/menu-gray.png +0 -0
  254. data/static/menu-left.png +0 -0
  255. data/static/menu-right.png +0 -0
  256. data/static/menu-top.png +0 -0
  257. data/static/shoes-dmg.jpg +0 -0
  258. data/static/shoes-icon-blue.png +0 -0
  259. data/static/shoes-icon.png +0 -0
  260. data/static/shoes-manual-apps.gif +0 -0
  261. data/static/shoes_main_window.png +0 -0
  262. data/static/stripe.png +0 -0
  263. data/static/stubs/blank.exe +0 -0
  264. data/static/stubs/blank.hfz +0 -0
  265. data/static/stubs/blank.run +375 -0
  266. data/static/stubs/cocoa-install +0 -0
  267. data/static/stubs/sh-install +49 -0
  268. data/static/stubs/shoes-stub-inject.exe +0 -0
  269. data/static/stubs/shoes-stub.exe +0 -0
  270. data/static/tutor-back.png +0 -0
  271. data/test/shoes_test.rb +8 -0
  272. data/test/test_helper.rb +25 -0
  273. data/use-deps +12 -0
  274. data/use-tmp-dep +8 -0
  275. metadata +509 -0
@@ -0,0 +1,54 @@
1
+ require 'fileutils'
2
+ include FileUtils
3
+
4
+ # locate ~/.shoes
5
+ require 'tmpdir'
6
+
7
+ lib_dir = nil
8
+ homes = []
9
+ homes << [ENV['HOME'], File.join( ENV['HOME'], '.shoes' )] if ENV['HOME']
10
+ homes << [ENV['APPDATA'], File.join( ENV['APPDATA'], 'Shoes' )] if ENV['APPDATA']
11
+ homes.each do |home_top, home_dir|
12
+ next unless home_top
13
+ if File.exists? home_top
14
+ lib_dir = home_dir
15
+ break
16
+ end
17
+ end
18
+ LIB_DIR = lib_dir || File.join(Dir::tmpdir, "shoes")
19
+ LIB_DIR.gsub! /\\/, '/'
20
+ SITE_LIB_DIR = File.join(LIB_DIR, '+lib')
21
+ GEM_DIR = File.join(LIB_DIR, '+gem')
22
+ CACHE_DIR = File.join(LIB_DIR, '+cache')
23
+
24
+ mkdir_p(CACHE_DIR)
25
+ $:.unshift SITE_LIB_DIR
26
+ $:.unshift GEM_DIR
27
+ ENV['GEM_HOME'] = GEM_DIR
28
+
29
+ require 'rbconfig'
30
+ config = {
31
+ 'ruby_install_name' => "shoes --ruby",
32
+ 'RUBY_INSTALL_NAME' => "shoes --ruby",
33
+ 'prefix' => "#{DIR}",
34
+ 'bindir' => "#{DIR}",
35
+ 'rubylibdir' => "#{DIR}/ruby/lib",
36
+ 'datarootdir' => "#{DIR}/share",
37
+ 'dvidir' => "#{DIR}/doc/${PACKAGE}",
38
+ 'psdir' => "#{DIR}/doc/${PACKAGE}",
39
+ 'htmldir' => "#{DIR}/doc/${PACKAGE}",
40
+ 'docdir' => "#{DIR}/doc/${PACKAGE}",
41
+ 'archdir' => "#{DIR}/ruby/lib/#{RUBY_PLATFORM}",
42
+ 'sitedir' => SITE_LIB_DIR,
43
+ 'sitelibdir' => SITE_LIB_DIR,
44
+ 'sitearchdir' => "#{SITE_LIB_DIR}/#{RUBY_PLATFORM}",
45
+ 'LIBRUBYARG_STATIC' => "",
46
+ 'libdir' => "#{DIR}",
47
+ 'LDFLAGS' => "-L. -L#{DIR}"
48
+ }
49
+ Config::CONFIG.merge! config
50
+ Config::MAKEFILE_CONFIG.merge! config
51
+ GEM_CENTRAL_DIR = File.join(DIR, 'ruby/gems/' + Config::CONFIG['ruby_version'])
52
+ Dir[GEM_CENTRAL_DIR + "/gems/*"].each do |gdir|
53
+ $: << "#{gdir}/lib"
54
+ end
@@ -0,0 +1,35 @@
1
+ require 'chipmunk'
2
+
3
+ module ChipMunk
4
+ def cp_space
5
+ @space = CP::Space.new
6
+ @space.damping = 0.8
7
+ @space.gravity = vec2 0, 25
8
+ @space
9
+ end
10
+
11
+ def cp_oval l, t, r, opts = {}
12
+ b = CP::Body.new 1,1
13
+ b.p = vec2 l, t
14
+ @space.add_body b
15
+ @space.add_shape CP::Shape::Circle.new(b, r, vec2(0, 0))
16
+
17
+ img = image left: l-r-1, top: t-r-1, width: 2*r+2, height: 2*r+2, body: b, inflate: r-2 do
18
+ oval 1, 1, 2*r, opts
19
+ end
20
+ end
21
+
22
+ def cp_line x0, y0, x1, y1, opts = {}
23
+ opts[:strokewidth] = 5 unless opts[:strokewidth]
24
+ sb = CP::Body.new 1.0/0.0, 1.0/0.0
25
+ seg = CP::Shape::Segment.new sb, vec2(x0, y0), vec2(x1, y1), opts[:strokewidth]
26
+ @space.add_shape seg
27
+ line x0, y0, x1, y1, opts
28
+ end
29
+ end
30
+
31
+ Shoes::Image.class_eval do
32
+ def cp_move
33
+ move style[:body].p.x.to_i - style[:inflate], style[:body].p.y.to_i - style[:inflate]
34
+ end
35
+ end
@@ -0,0 +1,39 @@
1
+ require 'sqlite3'
2
+
3
+ data_file = File.join(LIB_DIR, "+data")
4
+ data_init = !File.exists?(data_file)
5
+
6
+ DATABASE = SQLite3::Database.new data_file
7
+ DATABASE.type_translation = true
8
+
9
+ class << DATABASE
10
+ DATABASE_VERSION = 1
11
+ def setup
12
+ DATABASE.execute_batch %{
13
+ CREATE TABLE cache (
14
+ url text primary key,
15
+ etag text,
16
+ hash varchar(40),
17
+ saved datetime
18
+ );
19
+ CREATE TABLE upgrades (
20
+ version int primary key
21
+ );
22
+ INSERT INTO upgrades VALUES (?);
23
+ }, DATABASE_VERSION
24
+ end
25
+ def check_cache_for url
26
+ etag, hash, saved =
27
+ DATABASE.get_first_row("SELECT etag, hash, saved FROM cache WHERE url = ?", url)
28
+ {:etag => etag, :hash => hash, :saved => saved.nil? ? 0 : Time.parse(saved.to_s).to_i}
29
+ end
30
+ def notify_cache_of url, etag, hash
31
+ DATABASE.query %{
32
+ REPLACE INTO cache (url, etag, hash, saved)
33
+ VALUES (?, ?, ?, datetime("now", "localtime"));
34
+ }, url, etag, hash
35
+ nil
36
+ end
37
+ end
38
+
39
+ DATABASE.setup if data_init
@@ -0,0 +1,468 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module Shoes::Manual
3
+ PARA_RE = /\s*?(\{{3}(?:.+?)\}{3})|\n\n/m
4
+ CODE_RE = /\{{3}(?:\s*\#![^\n]+)?(.+?)\}{3}/m
5
+ IMAGE_RE = /\!(\{([^}\n]+)\})?([^!\n]+\.\w+)\!/
6
+ CODE_STYLE = {:size => 9, :margin => 12}
7
+ INTRO_STYLE = {:size => 16, :margin_bottom => 20, :stroke => "#000"}
8
+ SUB_STYLE = {:stroke => "#CCC", :margin_top => 10}
9
+ IMAGE_STYLE = {:margin => 8, :margin_left => 100}
10
+ COLON = ": "
11
+
12
+ [INTRO_STYLE, SUB_STYLE].each do |h|
13
+ h[:font] = "MS UI Gothic"
14
+ end if Shoes.language == 'ja'
15
+
16
+ def self.path
17
+ path = "#{DIR}/static/manual-#{Shoes.language}.txt"
18
+ unless File.exists? path
19
+ path = "#{DIR}/static/manual-en.txt"
20
+ end
21
+ path
22
+ end
23
+
24
+ def dewikify_hi(str, terms, intro = false)
25
+ if terms
26
+ code = []
27
+ str = str.
28
+ gsub(CODE_RE) { |x| code << x; "CODE#[#{code.length-1}]" }.
29
+ gsub(/#{Regexp::quote(terms)}/i, '@\0@').
30
+ gsub(/CODE#\[(\d+)\]/) { code[$1.to_i] }
31
+ end
32
+ dewikify(str, intro)
33
+ end
34
+
35
+ def dewikify_p(ele, str, *args)
36
+ str = str.gsub(/\n+\s*/, " ").dump.
37
+ gsub(/`(.+?)`/m, '", code("\1"), "').gsub(/\[\[BR\]\]/i, "\n").
38
+ gsub(/\^(.+?)\^/m, '\1').
39
+ gsub(/@(.+?)@/m, '", strong("\1", :fill => yellow), "').
40
+ gsub(/'''(.+?)'''/m, '", strong("\1"), "').gsub(/''(.+?)''/m, '", em("\1"), "').
41
+ gsub(/\[\[(\S+?)\]\]/m, '", link("\1".split(".", 2).last) { open_link("\1") }, "').
42
+ gsub(/\[\[(\S+?) (.+?)\]\]/m, '", link("\2") { open_link("\1") }, "').
43
+ gsub(IMAGE_RE, '", *args); stack(IMAGE_STYLE.merge({\2})) { image("#{DIR}/static/\3") }; #{ele}("')
44
+ #debug str if str =~ /The list of special keys/
45
+ a = str.split(', ", ", ')
46
+ if a.size == 1
47
+ eval("#{ele}(#{str}, *args)")
48
+ else
49
+ flow do
50
+ a[0...-1].each{|s| eval("#{ele}(#{s}, ',', *args)")}
51
+ eval("#{ele}(#{a[-1]}, *args)")
52
+ end
53
+ end
54
+ end
55
+
56
+ def dewikify_code(str)
57
+ str = str.gsub(/\A\n+/, '').chomp
58
+ stack :margin_bottom => 12 do
59
+ background rgb(210, 210, 210), :curve => 4
60
+ para code(str), CODE_STYLE
61
+ stack :top => 0, :right => 2, :width => 70 do
62
+ stack do
63
+ background "#8A7", :margin => [0, 2, 0, 2], :curve => 4
64
+ para link("Run this", :stroke => "#eee", :underline => "none") { run_code(str) },
65
+ :margin => 4, :align => 'center', :weight => 'bold', :size => 9
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ def wiki_tokens(str, intro = false)
72
+ paras = str.split(PARA_RE).reject { |x| x.empty? }
73
+ if intro
74
+ yield :intro, paras.shift
75
+ end
76
+ paras.map do |ps|
77
+ if ps =~ CODE_RE
78
+ yield :code, $1
79
+ else
80
+ case ps
81
+ when /\A\{COLORS\}/
82
+ yield :colors, nil
83
+ when /\A\{INDEX\}/
84
+ yield :index, nil
85
+ when /\A\{SAMPLES\}/
86
+ yield :samples, nil
87
+ when /\A \* (.+)/m
88
+ yield :list, $1.split(/^ \* /)
89
+ when /\A==== (.+) ====/
90
+ yield :caption, $1
91
+ when /\A=== (.+) ===/
92
+ yield :tagline, $1
93
+ when /\A== (.+) ==/
94
+ yield :subtitle, $1
95
+ when /\A= (.+) =/
96
+ yield :title, $1
97
+ else
98
+ yield :para, ps
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ def dewikify(str, intro = false)
105
+ proc do
106
+ wiki_tokens(str, intro) do |sym, text|
107
+ case sym when :intro
108
+ dewikify_p :para, text, INTRO_STYLE
109
+ when :code
110
+ dewikify_code(text)
111
+ when :colors
112
+ color_page
113
+ when :index
114
+ index_page
115
+ when :samples
116
+ sample_page
117
+ when :list
118
+ text.each { |t| stack(:margin_left => 30) {
119
+ fill black; oval -10, 7, 6; dewikify_p :para, t } }
120
+ else
121
+ dewikify_p sym, text
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ def sample_page
128
+ folder = File.join DIR, 'samples'
129
+ h = {}
130
+ Dir.glob(File.join folder, '*').each do |file|
131
+ if File.extname(file) == '.rb'
132
+ key = File.basename(file).split('-')[0]
133
+ h[key] ? h[key].push(file) : h[key] = [file]
134
+ end
135
+ end
136
+ stack do
137
+ h.each do |k, v|
138
+ subtitle k
139
+ flow do
140
+ v.each do |file|
141
+ para link(File.basename(file).split('-')[1..-1].join('-')[0..-4]){
142
+ Dir.chdir(folder){eval IO.read(file).force_encoding("UTF-8"), TOPLEVEL_BINDING}
143
+ }
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
149
+
150
+ def color_page
151
+ color_names = (Shoes::COLORS.keys*"\n").split("\n").sort
152
+ flow do
153
+ color_names.each do |color|
154
+ flow :width => 0.33 do
155
+ c = send(color)
156
+ background c
157
+ para strong(color), "\n", c, :stroke => (c.dark? ? white : black),
158
+ :margin => 4, :align => 'center'
159
+ end
160
+ end
161
+ end
162
+ end
163
+
164
+ def class_tree
165
+ tree = {}
166
+ Shoes.constants.each do |c|
167
+ k = Shoes.const_get(c)
168
+ next unless k.respond_to? :superclass
169
+
170
+ c = "Shoes::#{c}"
171
+ if k.superclass == Object
172
+ tree[c] ||= []
173
+ else
174
+ k.ancestors[1..-1].each do |sk|
175
+ break if [Object, Kernel].include? sk
176
+ next unless sk.is_a? Class #don't show mixins
177
+ (tree[sk.name] ||= []) << c
178
+ c = sk.name
179
+ end
180
+ end
181
+ end
182
+ tree
183
+ end
184
+
185
+ def index_page
186
+ tree = class_tree
187
+ shown = []
188
+ index_p = proc do |k, subs|
189
+ unless shown.include? k
190
+ stack :margin_left => 20 do
191
+ flow do
192
+ para "▸ ", :font => case RUBY_PLATFORM
193
+ when /mingw/; "MS UI Gothic"
194
+ when /darwin/; "AppleGothic, Arial"
195
+ else "Arial"
196
+ end
197
+ para k
198
+ end
199
+ subs.uniq.sort.each do |s|
200
+ index_p[s, tree[s]]
201
+ end if subs
202
+ end
203
+ shown << k
204
+ end
205
+ end
206
+ tree.sort.each &index_p
207
+ end
208
+
209
+ def run_code str
210
+ eval(str, TOPLEVEL_BINDING)
211
+ end
212
+
213
+ def load_docs path
214
+ return @docs if @docs
215
+ str = Shoes.read_file(path)
216
+ @search = Shoes::Search.new
217
+ @sections, @methods, @mindex = {}, {}, {}
218
+ @docs =
219
+ (str.split(/^= (.+?) =/)[1..-1]/2).map do |k,v|
220
+ sparts = v.split(/^== (.+?) ==/)
221
+
222
+ sections = (sparts[1..-1]/2).map do |k2,v2|
223
+ meth = v2.split(/^=== (.+?) ===/)
224
+ k2t = k2[/^(?:The )?([\-\w]+)/, 1]
225
+ meth_plain = meth[0].gsub(IMAGE_RE, '')
226
+ @search.add_document :uri => "T #{k2t}", :body => "#{k2}\n#{meth_plain}".downcase
227
+
228
+ hsh = {'title' => k2, 'section' => k,
229
+ 'description' => meth[0],
230
+ 'methods' => (meth[1..-1]/2).map { |_k,_v|
231
+ @search.add_document :uri => "M #{k}#{COLON}#{k2t}#{COLON}#{_k}", :body => "#{_k}\n#{_v}".downcase
232
+ @mindex["#{k2t}.#{_k[/[\w\.]+/]}"] = [k2t, _k]
233
+ [_k, _v]
234
+ }}
235
+ @methods[k2t] = hsh
236
+ [k2t, hsh]
237
+ end
238
+
239
+ @search.add_document :uri => "S #{k}", :body => "#{k}\n#{sparts[0]}".downcase
240
+ hsh = {'description' => sparts[0], 'sections' => sections,
241
+ 'class' => "toc" + k.downcase.gsub(/\W+/, '')}
242
+ @sections[k] = hsh
243
+ [k, hsh]
244
+ end
245
+ @search.finish!
246
+ @docs
247
+ end
248
+
249
+ def show_search
250
+ @toc.each { |k,v| v.hide }
251
+ @title.replace "Search"
252
+ @doc.clear do
253
+ dewikify_p :para, "Try method names (like `button` or `arrow`) or topics (like `slots`)", :align => 'center'
254
+ flow :margin_left => 60 do
255
+ edit_line :width => -60 do |terms|
256
+ @results.clear do
257
+ termd = terms.text.downcase
258
+ #found = termd.empty? ? [] : manual_search(termd)
259
+ found = (termd.empty? or termd[0] == 'z' or termd[0] == 'y') ? [] : manual_search(termd)
260
+ para "#{found.length} matches", :align => "center", :margin_bottom => 0
261
+ found.each do |typ, head|
262
+ flow :margin => 4 do
263
+ case typ
264
+ when "S"
265
+ background "#333", :curve => 4
266
+ caption strong(link(head, :stroke => white) { open_section(head, terms.text) })
267
+ para "Section header", Shoes::Manual::SUB_STYLE
268
+ when "T"
269
+ background "#777", :curve => 4
270
+ caption strong(link(head, :stroke => "#EEE") { open_methods(head, terms.text) })
271
+ hsh = @methods[head]
272
+ para "Sub-section under #{hsh['section']} (#{hsh['methods'].length} methods)", Shoes::Manual::SUB_STYLE
273
+ when "M"
274
+ background "#CCC", :curve => 4
275
+ sect, subhead, head = head.split(Shoes::Manual::COLON, 3)
276
+ para strong(sect, Shoes::Manual::COLON, subhead, Shoes::Manual::COLON, link(head) { open_methods(subhead, terms.text, head) })
277
+ end
278
+ end
279
+ end
280
+ end
281
+ end
282
+ end
283
+ @results = stack
284
+ end
285
+ app.slot.scroll_top = 0
286
+ end
287
+
288
+ def open_link(head)
289
+ if head == "Search"
290
+ show_search
291
+ elsif @sections.has_key? head
292
+ open_section(head)
293
+ elsif @methods.has_key? head
294
+ open_methods(head)
295
+ elsif @mindex.has_key? head
296
+ head, sub = @mindex[head]
297
+ open_methods(head, nil, sub)
298
+ elsif head =~ /^http:\/\//
299
+ debug head
300
+ visit head
301
+ end
302
+ end
303
+
304
+ def add_next_link(docn, optn)
305
+ opt1, optn = @docs[docn][1], optn + 1
306
+ if opt1['sections'][optn]
307
+ @doc.para "Next: ",
308
+ link(opt1['sections'][optn][1]['title']) { open_methods(opt1['sections'][optn][0]) },
309
+ :align => "right"
310
+ elsif @docs[docn + 1]
311
+ @doc.para "Next: ",
312
+ link(@docs[docn + 1][0]) { open_section(@docs[docn + 1][0].gsub(/\W/, '')) },
313
+ :align => "right"
314
+ end
315
+ end
316
+
317
+ def open_section(sect_s, terms = nil)
318
+ sect_h = @sections[sect_s]
319
+ sect_cls = sect_h['class']
320
+ @toc.each { |k,v| v.send(k == sect_cls ? :show : :hide) }
321
+ @title.replace sect_s
322
+ @doc.clear(&dewikify_hi(sect_h['description'], terms, true))
323
+ add_next_link(@docs.index { |x,| x == sect_s }, -1) rescue nil
324
+ app.slot.scroll_top = 0
325
+ end
326
+
327
+ def open_methods(meth_s, terms = nil, meth_a = nil)
328
+ meth_h = @methods[meth_s]
329
+ @title.replace meth_h['title']
330
+ @doc.clear do
331
+ unless meth_a
332
+ instance_eval &dewikify_hi(meth_h['description'], terms, true)
333
+ end
334
+ meth_h['methods'].each do |mname, expl|
335
+ if meth_a.nil? or meth_a == mname
336
+ sig, val = mname.split("»", 2)
337
+ stack(:margin_top => 8, :margin_bottom => 8) {
338
+ background "#333".."#666", :curve => 3, :angle => 90
339
+ tagline sig, (span("»", val, :stroke => "#BBB") if val), :margin => 4 }
340
+ instance_eval &dewikify_hi(expl, terms)
341
+ end
342
+ end
343
+ end
344
+ optn = nil
345
+ docn = @docs.index { |_,h| optn = h['sections'].index { |x,| x == meth_s } } rescue nil
346
+ add_next_link(docn, optn) if docn
347
+ app.slot.scroll_top = 0
348
+ end
349
+
350
+ def manual_search(terms)
351
+ terms += " " if terms.length == 1
352
+ @search.find_all(terms).map do |title, count|
353
+ title.split(" ", 2)
354
+ end
355
+ end
356
+
357
+ def make_html(path, title, menu, &blk)
358
+ require 'hpricot'
359
+ File.open(path, 'w') do |f|
360
+ f << Hpricot do
361
+ xhtml_transitional do
362
+ head do
363
+ meta :"http-equiv" => "Content-Type", "content" => "text/html; charset=utf-8"
364
+ title "The Shoes Manual // #{title}"
365
+ script :type => "text/javascript", :src => "static/code_highlighter.js"
366
+ script :type => "text/javascript", :src => "static/code_highlighter_ruby.js"
367
+ style :type => "text/css" do
368
+ text "@import 'static/manual.css';"
369
+ end
370
+ end
371
+ body do
372
+ div.main! do
373
+ div.manual! &blk
374
+ div.sidebar do
375
+ img :src => "static/shoes-icon.png"
376
+ ul do
377
+ li { a.prime "HELP", :href => "./" }
378
+ menu.each do |m, sm|
379
+ li do
380
+ a m, :href => "#{m[/^\w+/]}.html"
381
+ if sm
382
+ ul.sub do
383
+ sm.each { |smm| li { a smm, :href => "#{smm}.html" } }
384
+ end
385
+ end
386
+ end
387
+ end
388
+
389
+ end
390
+ end
391
+ end
392
+ end
393
+ end
394
+ end.to_html
395
+ end
396
+ end
397
+ end
398
+
399
+ def Shoes.make_help_page
400
+ font "#{DIR}/fonts/Coolvetica.ttf" unless Shoes::FONTS.include? "Coolvetica"
401
+ proc do
402
+ extend Shoes::Manual
403
+ docs = load_docs Shoes::Manual.path
404
+
405
+ style(Shoes::Image, :margin => 8, :margin_left => 100)
406
+ style(Shoes::Code, :stroke => "#C30")
407
+ style(Shoes::LinkHover, :stroke => green, :fill => nil)
408
+ style(Shoes::Para, :size => 12, :stroke => "#332")
409
+ style(Shoes::Tagline, :size => 12, :weight => "bold", :stroke => "#eee", :margin => 6)
410
+ style(Shoes::Caption, :size => 24)
411
+ background "#ddd".."#fff", :angle => 90
412
+
413
+ [Shoes::LinkHover, Shoes::Para, Shoes::Tagline, Shoes::Caption].each do |type|
414
+ style(type, :font => "MS UI Gothic")
415
+ end if Shoes.language == 'ja'
416
+
417
+ stack do
418
+ background black
419
+ stack :margin_left => 118 do
420
+ para "The Shoes Manual", :stroke => "#eee", :margin_top => 8, :margin_left => 17,
421
+ :margin_bottom => 0
422
+ @title = title docs[0][0], :stroke => white, :margin => 4, :margin_left => 14,
423
+ :margin_top => 0, :font => "Coolvetica"
424
+ end
425
+ background "rgb(66, 66, 66, 180)".."rgb(0, 0, 0, 0)", :height => 0.7
426
+ background "rgb(66, 66, 66, 100)".."rgb(255, 255, 255, 0)", :height => 20, :bottom => 0
427
+ end
428
+ @doc =
429
+ stack :margin_left => 130, :margin_top => 20, :margin_bottom => 50, :margin_right => 50 + gutter,
430
+ &dewikify(docs[0][-1]['description'], true)
431
+ add_next_link(0, -1)
432
+ stack :top => 80, :left => 0, :attach => Shoes::Window do
433
+ @toc = {}
434
+ stack :margin => 12, :width => 130, :margin_top => 20 do
435
+ docs.each do |sect_s, sect_h|
436
+ sect_cls = sect_h['class']
437
+ para strong(link(sect_s, :stroke => black) { open_section(sect_s) }),
438
+ :size => 11, :margin => 4, :margin_top => 0
439
+ @toc[sect_cls] =
440
+ stack :hidden => @toc.empty? ? false : true do
441
+ links = sect_h['sections'].map do |meth_s, meth_h|
442
+ [link(meth_s) { open_methods(meth_s) }, "\n"]
443
+ end.flatten
444
+ links[-1] = {:size => 9, :margin => 4, :margin_left => 10}
445
+ para *links
446
+ end
447
+ end
448
+ end
449
+ stack :margin => 12, :width => 118, :margin_top => 6 do
450
+ background "#330", :curve => 4
451
+ para "Not finding it? Try ", strong(link("Search", :stroke => white) { show_search }), "!", :stroke => "#ddd", :size => 9, :align => "center", :margin => 6
452
+ end
453
+ stack :margin => 12, :width => 118 do
454
+ inscription "Shoes #{Shoes::RELEASE_NAME}\nRevision: #{Shoes::REVISION}",
455
+ :size => 7, :align => "center", :stroke => "#999"
456
+ end
457
+ end
458
+ image :width => 120, :height => 120, :top => -18, :left => 6 do
459
+ image "#{DIR}/static/shoes-icon.png", :width => 100, :height => 100, :top => 10, :left => 10
460
+ glow 2
461
+ end
462
+ end
463
+ rescue => e
464
+ p e.message
465
+ p e.class
466
+ end
467
+
468
+ Shoes::Help = Shoes.make_help_page