xiki 0.5.0a

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 (252) hide show
  1. data/Gemfile +11 -0
  2. data/LICENSE +22 -0
  3. data/README.markdown +83 -0
  4. data/Rakefile +8 -0
  5. data/bin/xiki +46 -0
  6. data/etc/command/xiki_command.rb +203 -0
  7. data/etc/command/xiki_process.rb +52 -0
  8. data/etc/command/xiki_wrapper +2 -0
  9. data/etc/js/menu1.js +55 -0
  10. data/etc/js/xiki.js +259 -0
  11. data/etc/logo.png +0 -0
  12. data/etc/presentations/bootstrap.deck +5 -0
  13. data/etc/presentations/databases.deck +41 -0
  14. data/etc/presentations/diffs.deck +23 -0
  15. data/etc/presentations/documentation.deck +14 -0
  16. data/etc/presentations/effects.deck +5 -0
  17. data/etc/presentations/face.deck +297 -0
  18. data/etc/presentations/files.deck +79 -0
  19. data/etc/presentations/icons.deck +22 -0
  20. data/etc/presentations/images.deck +24 -0
  21. data/etc/presentations/key_shortcuts.deck +16 -0
  22. data/etc/presentations/macros.deck +18 -0
  23. data/etc/presentations/menu_classes.deck +44 -0
  24. data/etc/presentations/menu_directories.deck +30 -0
  25. data/etc/presentations/notes.deck +19 -0
  26. data/etc/presentations/other_languages.deck +55 -0
  27. data/etc/presentations/other_wiki_syntaxes.deck +4 -0
  28. data/etc/presentations/piano.deck +5 -0
  29. data/etc/presentations/potential/diffs.deck +38 -0
  30. data/etc/presentations/potential/evolution.deck +18 -0
  31. data/etc/presentations/potential/intro.deck +711 -0
  32. data/etc/presentations/potential/intro1.deck +711 -0
  33. data/etc/presentations/potential/intro2.deck +97 -0
  34. data/etc/presentations/potential/make_mysql_menu.deck +36 -0
  35. data/etc/presentations/potential/ruby_development.deck +17 -0
  36. data/etc/presentations/potential/ui_prototyping.deck +50 -0
  37. data/etc/presentations/potential/web_dev.deck +4 -0
  38. data/etc/presentations/potential/web_development.deck +10 -0
  39. data/etc/presentations/potential/wiki.deck +45 -0
  40. data/etc/presentations/presentations.deck +24 -0
  41. data/etc/presentations/rails_development.deck +29 -0
  42. data/etc/presentations/search_key_shortcuts.deck +37 -0
  43. data/etc/presentations/simplest_possible_ui.deck +37 -0
  44. data/etc/presentations/svg.deck +5 -0
  45. data/etc/presentations/testing.deck +28 -0
  46. data/etc/presentations/the_end.deck +13 -0
  47. data/etc/presentations/type_something_and_double_click.deck +57 -0
  48. data/etc/presentations/type_the_acronym.deck +144 -0
  49. data/etc/presentations/web_browser.deck +56 -0
  50. data/etc/presentations/xiki_command.deck +20 -0
  51. data/etc/presentations/xiki_url.deck +14 -0
  52. data/etc/shark.icns +0 -0
  53. data/etc/shark_script.icns +0 -0
  54. data/etc/snippets/html.notes +7 -0
  55. data/etc/snippets/notes.notes +20 -0
  56. data/etc/snippets/rb.notes +38 -0
  57. data/etc/templates/menu_template.menu +2 -0
  58. data/etc/templates/menu_template.rb +8 -0
  59. data/etc/templates/template.rb +5 -0
  60. data/etc/themes/Dark_Metal.notes +28 -0
  61. data/etc/themes/Orange_Path.notes +15 -0
  62. data/etc/themes/Shiny_Blue.notes +27 -0
  63. data/etc/themes/Shiny_Green.notes +27 -0
  64. data/etc/wrappers/wrapper.js +17 -0
  65. data/etc/wrappers/wrapper.py +20 -0
  66. data/etc/wrappers/wrapper.rb +25 -0
  67. data/lib/block.rb +72 -0
  68. data/lib/bookmarks.rb +352 -0
  69. data/lib/buffers.rb +170 -0
  70. data/lib/clipboard.rb +333 -0
  71. data/lib/code.rb +860 -0
  72. data/lib/code_tree.rb +476 -0
  73. data/lib/color.rb +274 -0
  74. data/lib/console.rb +557 -0
  75. data/lib/control_lock.rb +9 -0
  76. data/lib/control_tab.rb +176 -0
  77. data/lib/core_ext.rb +31 -0
  78. data/lib/cursor.rb +111 -0
  79. data/lib/deletes.rb +65 -0
  80. data/lib/diff_log.rb +297 -0
  81. data/lib/effects.rb +145 -0
  82. data/lib/environment.rb +5 -0
  83. data/lib/file_tree.rb +1875 -0
  84. data/lib/files.rb +334 -0
  85. data/lib/hide.rb +259 -0
  86. data/lib/history.rb +286 -0
  87. data/lib/image.rb +51 -0
  88. data/lib/incrementer.rb +15 -0
  89. data/lib/insert.rb +7 -0
  90. data/lib/irc.rb +22 -0
  91. data/lib/key_bindings.rb +658 -0
  92. data/lib/keys.rb +754 -0
  93. data/lib/launcher.rb +1351 -0
  94. data/lib/line.rb +429 -0
  95. data/lib/links.rb +6 -0
  96. data/lib/location.rb +175 -0
  97. data/lib/macros.rb +48 -0
  98. data/lib/man.rb +19 -0
  99. data/lib/menu.rb +708 -0
  100. data/lib/merb.rb +259 -0
  101. data/lib/message.rb +5 -0
  102. data/lib/meths.rb +56 -0
  103. data/lib/mode.rb +34 -0
  104. data/lib/move.rb +248 -0
  105. data/lib/notes.rb +1000 -0
  106. data/lib/numbers.rb +45 -0
  107. data/lib/ol.rb +203 -0
  108. data/lib/ol_helper.rb +44 -0
  109. data/lib/overlay.rb +167 -0
  110. data/lib/pause_means_space.rb +68 -0
  111. data/lib/php.rb +22 -0
  112. data/lib/projects.rb +21 -0
  113. data/lib/relinquish_exception.rb +2 -0
  114. data/lib/remote.rb +206 -0
  115. data/lib/requirer.rb +46 -0
  116. data/lib/rest_tree.rb +108 -0
  117. data/lib/ruby.rb +57 -0
  118. data/lib/ruby_console.rb +165 -0
  119. data/lib/search.rb +1572 -0
  120. data/lib/search_term.rb +40 -0
  121. data/lib/snippet.rb +68 -0
  122. data/lib/specs.rb +229 -0
  123. data/lib/styles.rb +274 -0
  124. data/lib/svn.rb +682 -0
  125. data/lib/text_util.rb +110 -0
  126. data/lib/tree.rb +1871 -0
  127. data/lib/tree_cursor.rb +87 -0
  128. data/lib/trouble_shooting.rb +27 -0
  129. data/lib/url_tree.rb +11 -0
  130. data/lib/view.rb +1474 -0
  131. data/lib/window.rb +133 -0
  132. data/lib/xiki.rb +404 -0
  133. data/menus/accounts.rb +5 -0
  134. data/menus/address_book.rb +21 -0
  135. data/menus/agenda.rb +28 -0
  136. data/menus/all.rb +5 -0
  137. data/menus/amazon.rb +16 -0
  138. data/menus/app.rb +16 -0
  139. data/menus/applescript.rb +46 -0
  140. data/menus/as.rb +15 -0
  141. data/menus/bookmarklet.rb +63 -0
  142. data/menus/bootstrap.rb +568 -0
  143. data/menus/browse.rb +13 -0
  144. data/menus/browser.rb +78 -0
  145. data/menus/cassandra_db.rb +36 -0
  146. data/menus/chmod.rb +27 -0
  147. data/menus/classes.rb +5 -0
  148. data/menus/coffee_script.rb +35 -0
  149. data/menus/computer.rb +24 -0
  150. data/menus/contacts.rb +5 -0
  151. data/menus/cookies.rb +25 -0
  152. data/menus/couch.rb +184 -0
  153. data/menus/crop.rb +45 -0
  154. data/menus/css.rb +55 -0
  155. data/menus/current.rb +5 -0
  156. data/menus/db.rb +12 -0
  157. data/menus/deck.rb +219 -0
  158. data/menus/dictionary.rb +9 -0
  159. data/menus/dir.rb +8 -0
  160. data/menus/disk.rb +5 -0
  161. data/menus/do.rb +13 -0
  162. data/menus/docs.rb +58 -0
  163. data/menus/dotsies.rb +107 -0
  164. data/menus/edited.rb +18 -0
  165. data/menus/emacs.rb +17 -0
  166. data/menus/enter.rb +13 -0
  167. data/menus/eval.rb +17 -0
  168. data/menus/executable.rb +16 -0
  169. data/menus/filter.rb +46 -0
  170. data/menus/firefox.rb +607 -0
  171. data/menus/foo.rb +30 -0
  172. data/menus/french.rb +7 -0
  173. data/menus/git.rb +185 -0
  174. data/menus/gito.rb +785 -0
  175. data/menus/google.rb +35 -0
  176. data/menus/google_images.rb +11 -0
  177. data/menus/google_patents.rb +10 -0
  178. data/menus/gutenberg.rb +13 -0
  179. data/menus/head.rb +10 -0
  180. data/menus/headings.rb +39 -0
  181. data/menus/html.rb +61 -0
  182. data/menus/icon.rb +40 -0
  183. data/menus/images.menu +2 -0
  184. data/menus/img.rb +15 -0
  185. data/menus/info.rb +9 -0
  186. data/menus/ip.rb +10 -0
  187. data/menus/iterm.rb +36 -0
  188. data/menus/itunes.rb +78 -0
  189. data/menus/javascript.rb +74 -0
  190. data/menus/layout.rb +18 -0
  191. data/menus/local_storage.rb +67 -0
  192. data/menus/ls.rb +19 -0
  193. data/menus/mac.rb +87 -0
  194. data/menus/maps.rb +18 -0
  195. data/menus/matches.rb +18 -0
  196. data/menus/memcache.rb +117 -0
  197. data/menus/mkdir.rb +23 -0
  198. data/menus/mongo.rb +83 -0
  199. data/menus/mysql.rb +294 -0
  200. data/menus/node.rb +88 -0
  201. data/menus/open.rb +19 -0
  202. data/menus/outline.rb +24 -0
  203. data/menus/piano.rb +746 -0
  204. data/menus/postgres.rb +34 -0
  205. data/menus/pre.rb +5 -0
  206. data/menus/python.rb +39 -0
  207. data/menus/rails.rb +160 -0
  208. data/menus/rake.rb +12 -0
  209. data/menus/redmine.rb +168 -0
  210. data/menus/riak_tree.rb +204 -0
  211. data/menus/rss.rb +15 -0
  212. data/menus/safari.rb +11 -0
  213. data/menus/sass.rb +15 -0
  214. data/menus/say.rb +6 -0
  215. data/menus/scale.rb +49 -0
  216. data/menus/serve.rb +78 -0
  217. data/menus/shuffle.rb +24 -0
  218. data/menus/spanish.rb +7 -0
  219. data/menus/standalone.rb +57 -0
  220. data/menus/tail.rb +41 -0
  221. data/menus/technologies.rb +19 -0
  222. data/menus/themes.rb +32 -0
  223. data/menus/thesaurus.rb +13 -0
  224. data/menus/to.rb +24 -0
  225. data/menus/twitter.rb +57 -0
  226. data/menus/wikipedia.rb +34 -0
  227. data/menus/words.rb +11 -0
  228. data/spec/code_tree_spec.rb +59 -0
  229. data/spec/diff_log_spec.rb +40 -0
  230. data/spec/file_tree_spec.rb +102 -0
  231. data/spec/keys_spec.rb +24 -0
  232. data/spec/line_spec.rb +68 -0
  233. data/spec/menu_spec.rb +50 -0
  234. data/spec/ol_spec.rb +98 -0
  235. data/spec/remote_spec.rb +43 -0
  236. data/spec/search_spec.rb +162 -0
  237. data/spec/text_util_spec.rb +119 -0
  238. data/spec/tree_cursor_spec.rb +91 -0
  239. data/spec/tree_spec.rb +955 -0
  240. data/tests/console_test.rb +11 -0
  241. data/tests/couch_db_test.rb +12 -0
  242. data/tests/diff_log_test.rb +43 -0
  243. data/tests/el_mixin.rb +16 -0
  244. data/tests/git_test.rb +95 -0
  245. data/tests/keys_test.rb +19 -0
  246. data/tests/line_test.rb +38 -0
  247. data/tests/merb_test.rb +11 -0
  248. data/tests/redmine_test.rb +50 -0
  249. data/tests/remote_test.rb +31 -0
  250. data/tests/rest_tree_test.rb +70 -0
  251. data/xiki.gemspec +37 -0
  252. metadata +332 -0
@@ -0,0 +1,35 @@
1
+ require "cgi"
2
+
3
+ class Google
4
+ def self.menu *args
5
+ if args.empty? # If no path, pull from history
6
+ return Launcher.last "google", :exclude_path=>1, :quoted=>1
7
+ end
8
+ txt = CGI.escape ENV['txt']
9
+
10
+ $el.browse_url "http://www.google.com/search?q=#{txt}"
11
+ nil
12
+ end
13
+
14
+ def self.insert
15
+ line = Line.value
16
+ return View << "google/" if line =~ /^$/
17
+ return View << "@google/" if line =~ /^ /
18
+ return View << "google/" if line =~ /^ *- $/
19
+
20
+ View << "google/"
21
+ end
22
+
23
+ def self.search txt
24
+ txt = CGI.escape txt
25
+ Browser.url "http://www.google.com/search?q=#{txt}"
26
+ nil
27
+ end
28
+
29
+ def self.maps txt
30
+ txt = CGI.escape txt
31
+ Browser.url "http://maps.google.com/maps?q=#{txt}"
32
+ nil
33
+ end
34
+
35
+ end
@@ -0,0 +1,11 @@
1
+ class GoogleImages
2
+ def self.menu *args
3
+ return View.prompt "Type something to google image search for" if args.blank?
4
+ url = "https://www.google.com/search?tbm=isch&q=#{CGI.escape ENV['txt']}"
5
+
6
+ # If up+..., just return url
7
+ return "@ #{url}" if Keys.up?
8
+
9
+ Firefox.url url
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ class GooglePatents
2
+ def self.menu *args
3
+
4
+ return View.prompt "Type something to google patent search for" if args.blank?
5
+ txt = ENV['txt']
6
+
7
+ url = "https://www.google.com/search?tbm=pts&q=#{CGI.escape txt}"
8
+ Browser.url url
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ class Gutenberg
2
+ def self.menu *args
3
+ arg = args.any? ? args.join("/") : nil
4
+
5
+ return View.prompt('Type a search phrase') if arg.nil?
6
+
7
+ arg.sub! /^\| ?/, ''
8
+ return View.prompt "Type something to google gutenberg search for" if arg.nil?
9
+
10
+ url = "http://www.gutenberg.org/ebooks/search.html/?format=html&default_prefix=all&sort_order=downloads&query=#{CGI.escape arg}"
11
+ Browser.url url
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ class Head
2
+ def self.menu *args
3
+
4
+ count = args.shift if args[0] =~ /^\d+$/
5
+
6
+ dir = Tree.dir :file=>1
7
+ Tree.quote `head #{count ? "-n #{count}" : ""} "#{dir}"`
8
+
9
+ end
10
+ end
@@ -0,0 +1,39 @@
1
+ require 'view'
2
+ require 'line'
3
+ require 'effects'
4
+
5
+ class Headings
6
+
7
+ def self.menu target=nil, line=nil
8
+ todo = Bookmarks['$t']
9
+
10
+ # If no target, tell them to enter one
11
+ if target.nil?
12
+ return View.prompt "Type a heading to search for"
13
+ end
14
+
15
+ # If no line, search for headings
16
+ if line.nil?
17
+ txt = IO.read(todo)
18
+ sections = txt.split(/^> /, -1)
19
+ sections = sections.select{|o|
20
+ # Check just first line
21
+ o[/.*/] =~ /#{Regexp.quote target}/i
22
+ }
23
+ return sections.map{|o| "> #{o.strip}\n\n"}.join("").gsub(/^/, '| ').gsub(/^\| $/, '|')
24
+ end
25
+
26
+ # Launched quoted line, so jump to it
27
+
28
+ line = Line.value
29
+
30
+ find = line.sub /^ \| /, ''
31
+ View.open todo
32
+ View.to_top
33
+ Search.forward "^#{$el.regexp_quote(find)}$"
34
+ Line.to_left
35
+ View.recenter_top
36
+ Effects.blink(:what=>:line)
37
+
38
+ end
39
+ end
@@ -0,0 +1,61 @@
1
+ class Html
2
+ def self.menu *args
3
+
4
+ return Tree.<< Dom.dom(:prefix=>"all") if Keys.prefix == "all"
5
+ return Tree.<< Dom.dom(:prefix=>"outline") if Keys.prefix == "outline"
6
+
7
+ prefix = Keys.prefix :clear=>1
8
+
9
+ # If as+open, or launched line without slash, render in browser...
10
+
11
+ if prefix == "open" || (Line !~ /\/$/ && Line =~ /^ /)
12
+ orig = Location.new
13
+ Tree.to_root
14
+ txt = Tree.children :string=>1, :cross_blank_lines=>1
15
+ orig.go
16
+ txt = txt.unindent
17
+
18
+ # Convert from tree to html if any ident, or 1st line doesn't start with "|"
19
+ txt = txt =~ /^ / || txt !~ /\A\|/ ?
20
+ Tree.to_html(txt) :
21
+ txt.gsub(/^\| ?/, '')
22
+
23
+ return Browser.html txt
24
+ end
25
+
26
+ # Suggest relevant elements...
27
+
28
+ last = args.last
29
+ if filler = @@filler[last]
30
+ Line.add_slash :txt=>filler, :left=>1
31
+ elsif args == []
32
+ ['html/', 'div/', 'style/']
33
+ elsif last == 'html'
34
+ ['head/', 'body/']
35
+ elsif last == 'head'
36
+ "- title/\n- style/\n| <script src='http://code.jquery.com/jquery.min.js'></script>"
37
+ elsif last == 'style'
38
+ "
39
+ | body {
40
+ | font-family: arial;
41
+ | margin: 50px;
42
+ | }
43
+ "
44
+ elsif last == 'body'
45
+ ['div/']
46
+ else
47
+ ['h1/Info', 'p/lorem ipsum...']
48
+ end
49
+ end
50
+
51
+ def initialize txt
52
+ @txt = txt
53
+ end
54
+
55
+ @@filler = {
56
+ "h1"=>"Info",
57
+ "title"=>"Welcome",
58
+ "p"=>"Lorem ipsum...",
59
+ }
60
+
61
+ end
@@ -0,0 +1,40 @@
1
+ class Icon
2
+ def self.menu name=nil, choice=nil
3
+ Ol << "name: #{name.inspect}"
4
+
5
+ name = choice if name == "recent" && choice
6
+
7
+ # If they picked recent/, just list icons
8
+
9
+ return Launcher.last "", :omit=>'icon' if name == "recent"
10
+
11
+ # If nothing, show main options
12
+
13
+ if name.nil?
14
+ last = Launcher.last "", :omit=>'icon'
15
+ most_recent = last[/^- (.+?)\//, 1]
16
+
17
+ return "
18
+ | Make an icon for which menu? Use one of these options:
19
+ - type menu name here) #{most_recent}
20
+ - recent/
21
+ "
22
+ end
23
+
24
+ # Name passed so create menu
25
+
26
+
27
+ dir = Tree.dir :or=>:desktop
28
+ # dir = Tree.dir || File.expand_path("~/Desktop")
29
+ Ol << "dir: #{dir.inspect}"
30
+
31
+ path = "#{dir}/#{name}.xiki"
32
+ File.open(path, "w") { |f| f << "\n" }
33
+ Files.open_in_window path
34
+
35
+ Ol << "!"
36
+ # ".flash - created '#{name}' icon!"
37
+ "- created '#{name}' icon!"
38
+
39
+ end
40
+ end
@@ -0,0 +1,2 @@
1
+ << google images/
2
+ << scale/
@@ -0,0 +1,15 @@
1
+ class Img
2
+ def self.menu *args
3
+
4
+ path = args.join('/')
5
+
6
+ column = Line.indent.length
7
+ Line.sub! /^([ +-]*).*/, "\\1"
8
+ Move.to_end
9
+
10
+ at = column > 0 ? "@" : ""
11
+ Image.<< path, "#{at}img/#{path}"
12
+ Move.to_column column
13
+ nil
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ class Info
2
+ def self.menu *args
3
+
4
+ dir = Tree.dir :file=>1
5
+
6
+ result = `ls -lah "#{dir}"`
7
+ Tree.quote result
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ class Ip
2
+ def self.menu
3
+ return '111.1.1.111' # TMP: hard-coded for presentation
4
+
5
+ inet = `ifconfig`.grep(/\binet\b/)
6
+
7
+ return "| #{inet[0][/[\d.]+/]}" if inet.length < 2
8
+ "- #{inet[1][/[\d.]+/]}"
9
+ end
10
+ end
@@ -0,0 +1,36 @@
1
+ class Iterm
2
+ def self.menu *args
3
+
4
+ # If no arg, prompt to type something
5
+
6
+ return View.prompt "Type something to run in iTerm" if args.empty?
7
+
8
+ txt = args.join('/')
9
+
10
+ return self.command("activate") if txt == "start"
11
+ return self.command("quit") if txt == "quit"
12
+
13
+ self.run txt.sub(/^\| /, '')
14
+ end
15
+
16
+ def self.command txt
17
+ $el.do_applescript %`
18
+ #{txt} application "iTerm"
19
+ `
20
+ return nil
21
+ end
22
+
23
+ def self.run txt, options={}
24
+ $el.do_applescript %`
25
+ tell application "iTerm"
26
+ #{options[:activate] ? 'activate' : ''}
27
+ tell the first terminal
28
+ tell the last session
29
+ write text "#{txt}"
30
+ end tell
31
+ end tell
32
+ end tell
33
+ `
34
+ nil
35
+ end
36
+ end
@@ -0,0 +1,78 @@
1
+ class Itunes
2
+ def self.menu
3
+ "
4
+ - .play/
5
+ - .pause/
6
+ - .next/
7
+ - .previous/
8
+ - .artists/
9
+ - .songs/
10
+ - .playlist/
11
+ - api/
12
+ > Play a song
13
+ @ Itunes.songs 'Thunderstorm'
14
+ |
15
+ - docs/
16
+ | Play specific song
17
+ @itunes/songs/Around the Fur
18
+ |
19
+ | Play a playlist
20
+ @itunes/playlist/class
21
+ "
22
+ end
23
+
24
+ def self.songs name=nil
25
+
26
+ # If nothing passed, list all songs
27
+ if name.nil?
28
+ tracks = Applescript.run "iTunes", "get the name of every track of library playlist 1"
29
+ tracks = JSON[tracks.sub(/^\{(.+)\}$/, "[\\1]")]
30
+ return tracks.sort.uniq.select{|o| o != "" && o !~ /^ /}.map{|o| "- #{o}/\n"}.join
31
+ return
32
+ end
33
+
34
+ Applescript.run "iTunes", "play track \"#{name}\""
35
+
36
+ end
37
+
38
+ def self.playlist name=nil
39
+ return View.prompt("Enter a name") if name.nil?
40
+ Applescript.run "iTunes", "play playlist \"#{name}\""
41
+ end
42
+
43
+ def self.play
44
+ Applescript.run "iTunes", "play"
45
+ end
46
+ def self.pause
47
+ Applescript.run "iTunes", "pause"
48
+ end
49
+
50
+ def self.next
51
+ Applescript.run "iTunes", "next track"
52
+ end
53
+ def self.previous
54
+ Applescript.run "iTunes", "previous track"
55
+ end
56
+
57
+ def self.artists artist=nil, track=nil
58
+
59
+ # If nothing passed, list artists
60
+
61
+ if artist.nil?
62
+ artists = Applescript.run "iTunes", 'get the artist of every track of library playlist 1'
63
+ artists = JSON[artists.sub(/^\{(.+)\}$/, "[\\1]")]
64
+ return artists.sort.uniq.select{|o| o != ""}.map{|o| "- #{o}/\n"}.join
65
+ end
66
+
67
+ # If just artist passed, list artists
68
+
69
+ if track.nil?
70
+ tracks = Applescript.run "iTunes", "get the name of every track of library playlist 1 whose artist is \"#{artist}\""
71
+ tracks = JSON[tracks.sub(/^\{(.+)\}$/, "[\\1]")]
72
+ return tracks.sort.uniq.select{|o| o != ""}.map{|o| "- #{o}/\n"}.join
73
+ end
74
+
75
+ self.songs track
76
+ ".flash - Playing!"
77
+ end
78
+ end
@@ -0,0 +1,74 @@
1
+ class Javascript
2
+
3
+ def self.menu
4
+ "
5
+ | See
6
+ @js/
7
+ "
8
+ end
9
+
10
+ def self.run
11
+
12
+ Block.do_as_something do |txt|
13
+
14
+ txt << "
15
+ function p(txt) {
16
+ print(JSON.stringify(txt));
17
+ }";
18
+
19
+ result = self.run_internal txt
20
+ end
21
+ end
22
+
23
+ def self.run_internal txt
24
+
25
+ # Write to temp file
26
+ File.open("/tmp/tmp.js", "w") { |f| f << txt }
27
+ # Call js
28
+ Console.run "js /tmp/tmp.js", :sync=>true
29
+ end
30
+
31
+ def self.launch
32
+ line = Line.without_label
33
+ result = self.run_internal line
34
+ Tree.under result, :escape=>'', :no_slash=>1
35
+ end
36
+
37
+ def self.enter_as_jquery
38
+ clip = Clipboard.get(0)
39
+ insert_this = clip =~ /^[a-z_.#]+$/ ? clip : ""
40
+
41
+ if Keys.prefix_u?
42
+ View.insert "$(\"#{insert_this}\")"
43
+ Search.backward '"'
44
+ return
45
+ end
46
+
47
+ View.insert "- js/$(\"#{insert_this}\").blink()"
48
+ Search.backward '"'
49
+
50
+ end
51
+
52
+ def self.wrap_jquery_load txt, url=nil
53
+
54
+ url ||= "http://code.jquery.com/jquery.min.js"
55
+
56
+ txt = "
57
+ var f = function(){
58
+ #{txt}
59
+ };
60
+
61
+ if(typeof($) == 'undefined') {
62
+ var s = document.createElement('script');
63
+ s.src = '#{url}';
64
+ s.onload = f;
65
+ document.getElementsByTagName('head')[0].appendChild(s);
66
+ }else{
67
+ f();
68
+ }
69
+ ".unindent
70
+
71
+ txt
72
+ end
73
+
74
+ end