shoes 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
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