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.
- data/Gemfile +11 -0
- data/LICENSE +22 -0
- data/README.markdown +83 -0
- data/Rakefile +8 -0
- data/bin/xiki +46 -0
- data/etc/command/xiki_command.rb +203 -0
- data/etc/command/xiki_process.rb +52 -0
- data/etc/command/xiki_wrapper +2 -0
- data/etc/js/menu1.js +55 -0
- data/etc/js/xiki.js +259 -0
- data/etc/logo.png +0 -0
- data/etc/presentations/bootstrap.deck +5 -0
- data/etc/presentations/databases.deck +41 -0
- data/etc/presentations/diffs.deck +23 -0
- data/etc/presentations/documentation.deck +14 -0
- data/etc/presentations/effects.deck +5 -0
- data/etc/presentations/face.deck +297 -0
- data/etc/presentations/files.deck +79 -0
- data/etc/presentations/icons.deck +22 -0
- data/etc/presentations/images.deck +24 -0
- data/etc/presentations/key_shortcuts.deck +16 -0
- data/etc/presentations/macros.deck +18 -0
- data/etc/presentations/menu_classes.deck +44 -0
- data/etc/presentations/menu_directories.deck +30 -0
- data/etc/presentations/notes.deck +19 -0
- data/etc/presentations/other_languages.deck +55 -0
- data/etc/presentations/other_wiki_syntaxes.deck +4 -0
- data/etc/presentations/piano.deck +5 -0
- data/etc/presentations/potential/diffs.deck +38 -0
- data/etc/presentations/potential/evolution.deck +18 -0
- data/etc/presentations/potential/intro.deck +711 -0
- data/etc/presentations/potential/intro1.deck +711 -0
- data/etc/presentations/potential/intro2.deck +97 -0
- data/etc/presentations/potential/make_mysql_menu.deck +36 -0
- data/etc/presentations/potential/ruby_development.deck +17 -0
- data/etc/presentations/potential/ui_prototyping.deck +50 -0
- data/etc/presentations/potential/web_dev.deck +4 -0
- data/etc/presentations/potential/web_development.deck +10 -0
- data/etc/presentations/potential/wiki.deck +45 -0
- data/etc/presentations/presentations.deck +24 -0
- data/etc/presentations/rails_development.deck +29 -0
- data/etc/presentations/search_key_shortcuts.deck +37 -0
- data/etc/presentations/simplest_possible_ui.deck +37 -0
- data/etc/presentations/svg.deck +5 -0
- data/etc/presentations/testing.deck +28 -0
- data/etc/presentations/the_end.deck +13 -0
- data/etc/presentations/type_something_and_double_click.deck +57 -0
- data/etc/presentations/type_the_acronym.deck +144 -0
- data/etc/presentations/web_browser.deck +56 -0
- data/etc/presentations/xiki_command.deck +20 -0
- data/etc/presentations/xiki_url.deck +14 -0
- data/etc/shark.icns +0 -0
- data/etc/shark_script.icns +0 -0
- data/etc/snippets/html.notes +7 -0
- data/etc/snippets/notes.notes +20 -0
- data/etc/snippets/rb.notes +38 -0
- data/etc/templates/menu_template.menu +2 -0
- data/etc/templates/menu_template.rb +8 -0
- data/etc/templates/template.rb +5 -0
- data/etc/themes/Dark_Metal.notes +28 -0
- data/etc/themes/Orange_Path.notes +15 -0
- data/etc/themes/Shiny_Blue.notes +27 -0
- data/etc/themes/Shiny_Green.notes +27 -0
- data/etc/wrappers/wrapper.js +17 -0
- data/etc/wrappers/wrapper.py +20 -0
- data/etc/wrappers/wrapper.rb +25 -0
- data/lib/block.rb +72 -0
- data/lib/bookmarks.rb +352 -0
- data/lib/buffers.rb +170 -0
- data/lib/clipboard.rb +333 -0
- data/lib/code.rb +860 -0
- data/lib/code_tree.rb +476 -0
- data/lib/color.rb +274 -0
- data/lib/console.rb +557 -0
- data/lib/control_lock.rb +9 -0
- data/lib/control_tab.rb +176 -0
- data/lib/core_ext.rb +31 -0
- data/lib/cursor.rb +111 -0
- data/lib/deletes.rb +65 -0
- data/lib/diff_log.rb +297 -0
- data/lib/effects.rb +145 -0
- data/lib/environment.rb +5 -0
- data/lib/file_tree.rb +1875 -0
- data/lib/files.rb +334 -0
- data/lib/hide.rb +259 -0
- data/lib/history.rb +286 -0
- data/lib/image.rb +51 -0
- data/lib/incrementer.rb +15 -0
- data/lib/insert.rb +7 -0
- data/lib/irc.rb +22 -0
- data/lib/key_bindings.rb +658 -0
- data/lib/keys.rb +754 -0
- data/lib/launcher.rb +1351 -0
- data/lib/line.rb +429 -0
- data/lib/links.rb +6 -0
- data/lib/location.rb +175 -0
- data/lib/macros.rb +48 -0
- data/lib/man.rb +19 -0
- data/lib/menu.rb +708 -0
- data/lib/merb.rb +259 -0
- data/lib/message.rb +5 -0
- data/lib/meths.rb +56 -0
- data/lib/mode.rb +34 -0
- data/lib/move.rb +248 -0
- data/lib/notes.rb +1000 -0
- data/lib/numbers.rb +45 -0
- data/lib/ol.rb +203 -0
- data/lib/ol_helper.rb +44 -0
- data/lib/overlay.rb +167 -0
- data/lib/pause_means_space.rb +68 -0
- data/lib/php.rb +22 -0
- data/lib/projects.rb +21 -0
- data/lib/relinquish_exception.rb +2 -0
- data/lib/remote.rb +206 -0
- data/lib/requirer.rb +46 -0
- data/lib/rest_tree.rb +108 -0
- data/lib/ruby.rb +57 -0
- data/lib/ruby_console.rb +165 -0
- data/lib/search.rb +1572 -0
- data/lib/search_term.rb +40 -0
- data/lib/snippet.rb +68 -0
- data/lib/specs.rb +229 -0
- data/lib/styles.rb +274 -0
- data/lib/svn.rb +682 -0
- data/lib/text_util.rb +110 -0
- data/lib/tree.rb +1871 -0
- data/lib/tree_cursor.rb +87 -0
- data/lib/trouble_shooting.rb +27 -0
- data/lib/url_tree.rb +11 -0
- data/lib/view.rb +1474 -0
- data/lib/window.rb +133 -0
- data/lib/xiki.rb +404 -0
- data/menus/accounts.rb +5 -0
- data/menus/address_book.rb +21 -0
- data/menus/agenda.rb +28 -0
- data/menus/all.rb +5 -0
- data/menus/amazon.rb +16 -0
- data/menus/app.rb +16 -0
- data/menus/applescript.rb +46 -0
- data/menus/as.rb +15 -0
- data/menus/bookmarklet.rb +63 -0
- data/menus/bootstrap.rb +568 -0
- data/menus/browse.rb +13 -0
- data/menus/browser.rb +78 -0
- data/menus/cassandra_db.rb +36 -0
- data/menus/chmod.rb +27 -0
- data/menus/classes.rb +5 -0
- data/menus/coffee_script.rb +35 -0
- data/menus/computer.rb +24 -0
- data/menus/contacts.rb +5 -0
- data/menus/cookies.rb +25 -0
- data/menus/couch.rb +184 -0
- data/menus/crop.rb +45 -0
- data/menus/css.rb +55 -0
- data/menus/current.rb +5 -0
- data/menus/db.rb +12 -0
- data/menus/deck.rb +219 -0
- data/menus/dictionary.rb +9 -0
- data/menus/dir.rb +8 -0
- data/menus/disk.rb +5 -0
- data/menus/do.rb +13 -0
- data/menus/docs.rb +58 -0
- data/menus/dotsies.rb +107 -0
- data/menus/edited.rb +18 -0
- data/menus/emacs.rb +17 -0
- data/menus/enter.rb +13 -0
- data/menus/eval.rb +17 -0
- data/menus/executable.rb +16 -0
- data/menus/filter.rb +46 -0
- data/menus/firefox.rb +607 -0
- data/menus/foo.rb +30 -0
- data/menus/french.rb +7 -0
- data/menus/git.rb +185 -0
- data/menus/gito.rb +785 -0
- data/menus/google.rb +35 -0
- data/menus/google_images.rb +11 -0
- data/menus/google_patents.rb +10 -0
- data/menus/gutenberg.rb +13 -0
- data/menus/head.rb +10 -0
- data/menus/headings.rb +39 -0
- data/menus/html.rb +61 -0
- data/menus/icon.rb +40 -0
- data/menus/images.menu +2 -0
- data/menus/img.rb +15 -0
- data/menus/info.rb +9 -0
- data/menus/ip.rb +10 -0
- data/menus/iterm.rb +36 -0
- data/menus/itunes.rb +78 -0
- data/menus/javascript.rb +74 -0
- data/menus/layout.rb +18 -0
- data/menus/local_storage.rb +67 -0
- data/menus/ls.rb +19 -0
- data/menus/mac.rb +87 -0
- data/menus/maps.rb +18 -0
- data/menus/matches.rb +18 -0
- data/menus/memcache.rb +117 -0
- data/menus/mkdir.rb +23 -0
- data/menus/mongo.rb +83 -0
- data/menus/mysql.rb +294 -0
- data/menus/node.rb +88 -0
- data/menus/open.rb +19 -0
- data/menus/outline.rb +24 -0
- data/menus/piano.rb +746 -0
- data/menus/postgres.rb +34 -0
- data/menus/pre.rb +5 -0
- data/menus/python.rb +39 -0
- data/menus/rails.rb +160 -0
- data/menus/rake.rb +12 -0
- data/menus/redmine.rb +168 -0
- data/menus/riak_tree.rb +204 -0
- data/menus/rss.rb +15 -0
- data/menus/safari.rb +11 -0
- data/menus/sass.rb +15 -0
- data/menus/say.rb +6 -0
- data/menus/scale.rb +49 -0
- data/menus/serve.rb +78 -0
- data/menus/shuffle.rb +24 -0
- data/menus/spanish.rb +7 -0
- data/menus/standalone.rb +57 -0
- data/menus/tail.rb +41 -0
- data/menus/technologies.rb +19 -0
- data/menus/themes.rb +32 -0
- data/menus/thesaurus.rb +13 -0
- data/menus/to.rb +24 -0
- data/menus/twitter.rb +57 -0
- data/menus/wikipedia.rb +34 -0
- data/menus/words.rb +11 -0
- data/spec/code_tree_spec.rb +59 -0
- data/spec/diff_log_spec.rb +40 -0
- data/spec/file_tree_spec.rb +102 -0
- data/spec/keys_spec.rb +24 -0
- data/spec/line_spec.rb +68 -0
- data/spec/menu_spec.rb +50 -0
- data/spec/ol_spec.rb +98 -0
- data/spec/remote_spec.rb +43 -0
- data/spec/search_spec.rb +162 -0
- data/spec/text_util_spec.rb +119 -0
- data/spec/tree_cursor_spec.rb +91 -0
- data/spec/tree_spec.rb +955 -0
- data/tests/console_test.rb +11 -0
- data/tests/couch_db_test.rb +12 -0
- data/tests/diff_log_test.rb +43 -0
- data/tests/el_mixin.rb +16 -0
- data/tests/git_test.rb +95 -0
- data/tests/keys_test.rb +19 -0
- data/tests/line_test.rb +38 -0
- data/tests/merb_test.rb +11 -0
- data/tests/redmine_test.rb +50 -0
- data/tests/remote_test.rb +31 -0
- data/tests/rest_tree_test.rb +70 -0
- data/xiki.gemspec +37 -0
- metadata +332 -0
data/lib/notes.rb
ADDED
|
@@ -0,0 +1,1000 @@
|
|
|
1
|
+
require 'styles'
|
|
2
|
+
require 'line'
|
|
3
|
+
require 'effects'
|
|
4
|
+
require 'view'
|
|
5
|
+
require 'keys'
|
|
6
|
+
require 'clipboard'
|
|
7
|
+
|
|
8
|
+
class Notes
|
|
9
|
+
|
|
10
|
+
LABEL_REGEX = /(?:[a-zA-Z0-9 _-]+\) )?/
|
|
11
|
+
|
|
12
|
+
def self.menu
|
|
13
|
+
%`
|
|
14
|
+
- api/
|
|
15
|
+
> Turn notes wiki text into html
|
|
16
|
+
@ Notes.to_html "> Heading\\njust text\\n"
|
|
17
|
+
`
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.block regex="^> "
|
|
21
|
+
left, after_header, right = View.block_positions regex
|
|
22
|
+
View.txt after_header, right
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.narrow_block options={}
|
|
26
|
+
|
|
27
|
+
delimiter = options[:delimiter] || ">"
|
|
28
|
+
|
|
29
|
+
# If nothing hidden, hide all but current
|
|
30
|
+
if $el.point_min == 1 && ($el.buffer_size + 1 == $el.point_max)
|
|
31
|
+
left, after_header, right = View.block_positions "^#{delimiter}\\( \\|$\\)"
|
|
32
|
+
$el.narrow_to_region left, right
|
|
33
|
+
return
|
|
34
|
+
end
|
|
35
|
+
# Otherwise, expand all, go to next heading, hide all but current
|
|
36
|
+
$el.widen
|
|
37
|
+
Notes.to_block
|
|
38
|
+
left, after_header, right = View.block_positions "^#{delimiter}\\( \\|$\\)"
|
|
39
|
+
$el.narrow_to_region left, right
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def self.archive
|
|
43
|
+
block = get_block
|
|
44
|
+
block.archive
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.show_text
|
|
48
|
+
block = get_block
|
|
49
|
+
block.show_text
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def self.hide_text
|
|
53
|
+
block = get_block
|
|
54
|
+
block.hide_text
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.to_block up=false
|
|
58
|
+
|
|
59
|
+
regex = self.heading_regex Keys.prefix
|
|
60
|
+
|
|
61
|
+
prefix = Keys.prefix :clear=>1
|
|
62
|
+
|
|
63
|
+
times = prefix.is_a?(Fixnum) ? prefix : 1
|
|
64
|
+
|
|
65
|
+
if up
|
|
66
|
+
times.times do
|
|
67
|
+
Line.to_left
|
|
68
|
+
Search.backward regex
|
|
69
|
+
end
|
|
70
|
+
else
|
|
71
|
+
times.times do
|
|
72
|
+
Line.next if $el.string_match regex, Line.value # Use elisp matcher
|
|
73
|
+
Search.forward regex
|
|
74
|
+
Line.to_left
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def self.heading_regex prefix=nil
|
|
80
|
+
prefix == :u ?
|
|
81
|
+
"^[>=]\\{1,2\\}\\( \\|$\\)" :
|
|
82
|
+
"^[>=]\\( \\|$\\)"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def self.move_block up=false
|
|
86
|
+
regex = self.heading_regex Keys.prefix
|
|
87
|
+
|
|
88
|
+
times = Keys.prefix_times
|
|
89
|
+
|
|
90
|
+
orig = Location.new
|
|
91
|
+
|
|
92
|
+
prefix = Keys.prefix :clear=>1
|
|
93
|
+
|
|
94
|
+
block = get_block prefix == :u ? 2 : 1
|
|
95
|
+
block.delete_content
|
|
96
|
+
|
|
97
|
+
if up
|
|
98
|
+
times.times do
|
|
99
|
+
Search.backward regex, :go_anyway=>true
|
|
100
|
+
end
|
|
101
|
+
$el.insert block.content
|
|
102
|
+
Search.backward regex
|
|
103
|
+
else
|
|
104
|
+
|
|
105
|
+
move_regex = prefix == :u ? "^>" : regex
|
|
106
|
+
|
|
107
|
+
Search.forward move_regex
|
|
108
|
+
times.times do
|
|
109
|
+
Search.forward move_regex, :go_anyway=>true
|
|
110
|
+
end
|
|
111
|
+
Move.to_axis
|
|
112
|
+
|
|
113
|
+
View.insert block.content
|
|
114
|
+
|
|
115
|
+
Search.backward move_regex
|
|
116
|
+
end
|
|
117
|
+
moved_block = get_block regex
|
|
118
|
+
|
|
119
|
+
times == 1 ?
|
|
120
|
+
moved_block.fade_in :
|
|
121
|
+
orig.go
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def self.insert_heading options={}
|
|
125
|
+
Line.start
|
|
126
|
+
orig = Line.value
|
|
127
|
+
|
|
128
|
+
times = Keys.prefix_u? ? 1 : (Keys.prefix || 1)
|
|
129
|
+
times.times { $el.insert ">" }
|
|
130
|
+
View.insert " " # unless times > 1
|
|
131
|
+
|
|
132
|
+
if options[:extra_space] || Keys.prefix_u? # If U create blank lines.
|
|
133
|
+
View.insert("\n"*4, :dont_move=>1)
|
|
134
|
+
return
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
View.insert("\n", :dont_move=>1) if orig != ""
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def self.cut_block no_clipboard=false
|
|
141
|
+
block = get_block Keys.prefix
|
|
142
|
+
|
|
143
|
+
block.blink
|
|
144
|
+
|
|
145
|
+
unless no_clipboard
|
|
146
|
+
Clipboard.set("0", block.content)
|
|
147
|
+
end
|
|
148
|
+
block.delete_content
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def self.copy_block
|
|
152
|
+
prefix = Keys.prefix
|
|
153
|
+
block = get_block prefix == :u ? 2 : 1
|
|
154
|
+
block.blink
|
|
155
|
+
Clipboard.set("0", Keys.prefix_u ? block.text : block.content)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def self.move_block_to_top no_clipboard=false
|
|
159
|
+
|
|
160
|
+
prefix_u = Keys.prefix_u :clear=>true
|
|
161
|
+
block = get_block
|
|
162
|
+
|
|
163
|
+
if prefix_u
|
|
164
|
+
line = View.line_number
|
|
165
|
+
scroll = View.scroll_position
|
|
166
|
+
orig_right = block.right
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
block.fade_out unless prefix_u
|
|
170
|
+
|
|
171
|
+
block.delete_content
|
|
172
|
+
|
|
173
|
+
$el.beginning_of_buffer
|
|
174
|
+
$el.insert block.content
|
|
175
|
+
|
|
176
|
+
if prefix_u
|
|
177
|
+
View.to_line line
|
|
178
|
+
View.scroll_position = scroll
|
|
179
|
+
View.cursor = orig_right
|
|
180
|
+
Line.next
|
|
181
|
+
else
|
|
182
|
+
View.to_line 2
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
moved_block = get_block
|
|
186
|
+
|
|
187
|
+
moved_block.fade_in unless prefix_u
|
|
188
|
+
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def self.keys
|
|
192
|
+
|
|
193
|
+
return if ! $el
|
|
194
|
+
|
|
195
|
+
# Get reference to map if already there (don't mess with existing buffers)
|
|
196
|
+
$el.elvar.notes_mode_map = $el.make_sparse_keymap unless $el.boundp :notes_mode_map
|
|
197
|
+
|
|
198
|
+
Keys.custom_archive(:notes_mode_map) { Notes.archive }
|
|
199
|
+
Keys.custom_back(:notes_mode_map) { Notes.move_block :backwards } # Move block up to before next block
|
|
200
|
+
Keys.custom_clipboard(:notes_mode_map) { Notes.copy_block } # block -> clipboard
|
|
201
|
+
Keys.custom_delete(:notes_mode_map) { Notes.cut_block :backwards } # block -> clear
|
|
202
|
+
# Keys.custom_expand(:notes_mode_map) { Notes.narrow_block } # Show just block
|
|
203
|
+
Keys.custom_forward(:notes_mode_map) { Notes.move_block } # Move block down to after next block
|
|
204
|
+
Keys.custom_heading(:notes_mode_map) { Notes.insert_heading } # Insert |... etc. heading
|
|
205
|
+
Keys.custom_item(:notes_mode_map) { Agenda.quick_add_line }
|
|
206
|
+
# j
|
|
207
|
+
Keys.custom_kill(:notes_mode_map) { Notes.cut_block } # block -> cut
|
|
208
|
+
# l
|
|
209
|
+
Keys.custom_mask(:notes_mode_map) { Notes.hide_text } # block -> hide
|
|
210
|
+
Keys.custom_next(:notes_mode_map) { Notes.to_block } # Go to block after next block
|
|
211
|
+
Keys.custom_open(:notes_mode_map) { Notes.show_text } # block -> reveal
|
|
212
|
+
Keys.custom_previous(:notes_mode_map) { Notes.to_block :backwards } # Go to block before next block
|
|
213
|
+
# q
|
|
214
|
+
# r
|
|
215
|
+
Keys.custom_stamp(:notes_mode_map) { $el.insert Time.now.strftime("- %Y-%m-%d %I:%M%p: ").downcase.sub(' 0', ' ') }
|
|
216
|
+
Keys.custom_top(:notes_mode_map) { Notes.move_block_to_top } # block -> top
|
|
217
|
+
# u
|
|
218
|
+
# v
|
|
219
|
+
# w
|
|
220
|
+
Keys.custom_x(:notes_mode_map) { Notes.cut_block } # block -> cut
|
|
221
|
+
# y
|
|
222
|
+
# z
|
|
223
|
+
|
|
224
|
+
$el.define_key(:notes_mode_map, $el.kbd("<double-mouse-1>"), :notes_mouse_double_click)
|
|
225
|
+
$el.define_key(:notes_mode_map, $el.kbd("<mouse-1>"), :notes_mouse_toggle)
|
|
226
|
+
|
|
227
|
+
$el.define_key(:notes_mode_map, $el.kbd("<M-mouse-1>"), :notes_mouse_double_click)
|
|
228
|
+
$el.define_key(:notes_mode_map, $el.kbd("<S-mouse-1>"), :notes_mouse_double_click)
|
|
229
|
+
$el.define_key(:notes_mode_map, $el.kbd("<C-mouse-1>"), :notes_mouse_double_click)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
$el.define_key(:notes_mode_map, $el.kbd("C-i")) { Notes.tab_key }
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def self.define_styles
|
|
236
|
+
|
|
237
|
+
return if ! $el
|
|
238
|
+
|
|
239
|
+
# - foo (r): <here>
|
|
240
|
+
Styles.define :notes_light_gray,
|
|
241
|
+
:fg => "bbb"
|
|
242
|
+
|
|
243
|
+
# - foo (r): <here>
|
|
244
|
+
Styles.define :variable,
|
|
245
|
+
:face => 'verdana' #, :size => "+2"
|
|
246
|
+
|
|
247
|
+
# - foo (r): <here>
|
|
248
|
+
Styles.define :notes_label_parens,
|
|
249
|
+
:fg => "bbb",
|
|
250
|
+
:size => "-2",
|
|
251
|
+
:face => 'arial'
|
|
252
|
+
|
|
253
|
+
# |...
|
|
254
|
+
h1_size = "+3"
|
|
255
|
+
|
|
256
|
+
# Colors of "| ..." headings
|
|
257
|
+
if Styles.inverse # If black bg
|
|
258
|
+
@@h1_styles = {
|
|
259
|
+
:notes_h1 =>"333",
|
|
260
|
+
:notes_h1r=>"611", # | r This will be red
|
|
261
|
+
:notes_h1o=>"841", # | o This will be orange
|
|
262
|
+
:notes_h1y=>"871",
|
|
263
|
+
:notes_h1e=>"363",
|
|
264
|
+
:notes_h1g=>"363",
|
|
265
|
+
:notes_h1b=>"678",
|
|
266
|
+
:notes_h1p=>"636",
|
|
267
|
+
:notes_h1m=>"622",
|
|
268
|
+
:notes_h1x=>"345",
|
|
269
|
+
:notes_h1t=>"055",
|
|
270
|
+
}
|
|
271
|
+
else
|
|
272
|
+
# Colors of headings
|
|
273
|
+
@@h1_styles = {
|
|
274
|
+
:notes_h1 =>"aaa",
|
|
275
|
+
:notes_h1r=>"b66", # | r This will be red
|
|
276
|
+
:notes_h1o=>"b83", # | o This will be orange
|
|
277
|
+
:notes_h1y=>"bb3",
|
|
278
|
+
:notes_h1e=>"363",
|
|
279
|
+
:notes_h1g=>"7b6",
|
|
280
|
+
:notes_h1b=>"678",
|
|
281
|
+
:notes_h1p=>"b8b",
|
|
282
|
+
:notes_h1m=>"944",
|
|
283
|
+
:notes_h1x=>"678",
|
|
284
|
+
:notes_h1t=>"055",
|
|
285
|
+
}
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
@@h1_styles.each do |k, v|
|
|
289
|
+
pipe = v.gsub(/./) {|c| (c.to_i(16) + "3".to_i(16)).to_s(16)}
|
|
290
|
+
label = v.gsub(/./) {|c| (c.to_i(16) + "6".to_i(16)).to_s(16)}
|
|
291
|
+
Styles.define k,
|
|
292
|
+
:face=>'arial', :size=>h1_size, :fg=>'ffffff', :bg=>v, :bold=> true
|
|
293
|
+
Styles.define "#{k}_pipe".to_sym, :face=>'arial', :size=>h1_size, :fg=>pipe, :bg=>v, :bold=>true
|
|
294
|
+
Styles.define "#{k}_label".to_sym, :face=>'arial', :size=>h1_size, :fg=>label, :bg=>v, :bold=>true
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
Styles.define :notes_h1_agenda_pipe, :face => 'arial', :size => h1_size, :fg => '88cc88', :bg => '336633', :bold => true
|
|
298
|
+
Styles.define :notes_h1_agenda, :face => 'arial', :size => h1_size, :fg => 'ffffff', :bg => '336633', :bold => true
|
|
299
|
+
|
|
300
|
+
# |||...
|
|
301
|
+
Styles.define :notes_h3,
|
|
302
|
+
:face => 'arial', :size => "-1",
|
|
303
|
+
:fg => '999',#, :bg => "9999cc",
|
|
304
|
+
:bold => true
|
|
305
|
+
Styles.define :notes_h3_pipe,
|
|
306
|
+
:face => 'arial', :size => "-1",
|
|
307
|
+
:fg => '333'
|
|
308
|
+
|
|
309
|
+
# ||||...
|
|
310
|
+
Styles.define :notes_h4,
|
|
311
|
+
:face => 'arial', :size => "-3",
|
|
312
|
+
:fg => '55b',
|
|
313
|
+
:bold => true
|
|
314
|
+
Styles.define :notes_h4_pipe,
|
|
315
|
+
:face => 'arial', :size => "-3",
|
|
316
|
+
:fg => '224'
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
if Styles.inverse # If black and white
|
|
320
|
+
label_color = "e70"
|
|
321
|
+
else
|
|
322
|
+
label_color = "f70"
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
# Labels, emphasis
|
|
326
|
+
Styles.define :notes_label,
|
|
327
|
+
:face=>'arial black', :size=>"0", # Mac
|
|
328
|
+
#:face=>'courier', :size=>"0", # Mac
|
|
329
|
+
:fg=>label_color, :bold=>true
|
|
330
|
+
|
|
331
|
+
Styles.define :notes_bullet_parens,
|
|
332
|
+
:face => 'arial', :size => "-2",
|
|
333
|
+
:fg => "ee7700", :bold => true
|
|
334
|
+
|
|
335
|
+
# Strikethrough
|
|
336
|
+
Styles.define(:strike, :strike=>true)
|
|
337
|
+
|
|
338
|
+
# - <here> (r): foo
|
|
339
|
+
Styles.define :notes_label_link,
|
|
340
|
+
:face => 'verdana', :size => "-1",
|
|
341
|
+
:fg => "66f",
|
|
342
|
+
:bold => true, :underline => true
|
|
343
|
+
|
|
344
|
+
Styles.define :notes_g, :fg=>"6cf", :face=>'arial black', :size=>"0", :bold=>true
|
|
345
|
+
Styles.define :notes_blue, :fg=>"69f", :face=>'arial black', :size=>"0", :bold=>true
|
|
346
|
+
Styles.define :notes_red, :fg=>"c55", :face=>'arial black', :size=>"0", :bold=>true
|
|
347
|
+
Styles.define :notes_yellow, :fg=>"CC0", :face=>'arial black', :size=>"0", :bold=>true
|
|
348
|
+
Styles.define :notes_green, :fg=>"3C3", :face=>'arial black', :size=>"0", :bold=>true
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
if Styles.inverse # If black bg
|
|
352
|
+
# >>...
|
|
353
|
+
Styles.define :notes_h2, :face=>'arial', :size=>"-1", :fg=>'fff', :bg=>"333", :bold=>false
|
|
354
|
+
Styles.define :notes_h2_pipe, :face=>'arial', :size=>"-1", :fg=>'555555', :bg=>"333333", :bold=> true
|
|
355
|
+
else
|
|
356
|
+
Styles.define :notes_h2, :face=>'arial', :size=>"-1", :fg=>'fff', :bg=>"999", :bold=>true
|
|
357
|
+
Styles.define :notes_h2_pipe, :face=>'arial', :size=>"-1", :fg=>'bbb', :bg=>"999", :bold=>true
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
if Styles.inverse # If black bg
|
|
361
|
+
Styles.dotted :bg=>'080808', :fg=>'111', :strike=>nil, :underline=>nil, :border=>['111', -1]
|
|
362
|
+
else
|
|
363
|
+
Styles.dotted :bg=>'eee', :fg=>'ddd', :strike=>nil, :underline=>nil, :border=>['ddd', -1]
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
notes_exclamation_color = Styles.inverse ? "7c4" : "5a0"
|
|
367
|
+
|
|
368
|
+
Styles.define :notes_exclamation, # Green bold text
|
|
369
|
+
:face=>'arial black', :size=>"0",
|
|
370
|
+
:fg=>notes_exclamation_color, :bold=>true
|
|
371
|
+
|
|
372
|
+
Styles.notes_link :fg=>(Styles.inverse ? "9ce" : "08f")
|
|
373
|
+
|
|
374
|
+
Styles.shell_prompt :fg=>'#888', :bold=>1
|
|
375
|
+
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
def self.apply_styles
|
|
379
|
+
# Don't format quotes (it overrides the following formatting)
|
|
380
|
+
Styles.clear
|
|
381
|
+
|
|
382
|
+
# >... lines (headings)
|
|
383
|
+
Styles.apply("^\\(>\\)\\(.*\n\\)", nil, :notes_h1_pipe, :notes_h1)
|
|
384
|
+
|
|
385
|
+
Styles.apply("^\\(> \\)\\(.*\n\\)", nil, :notes_h1_pipe, :notes_h1)
|
|
386
|
+
Styles.apply("^\\(>> \\)\\(.*\n\\)", nil, :notes_h2_pipe, :notes_h2)
|
|
387
|
+
Styles.apply("^\\(= \\)\\(.*\n\\)", nil, :notes_h1_pipe, :notes_h1)
|
|
388
|
+
Styles.apply("^\\(== \\)\\(.*\n\\)", nil, :notes_h2_pipe, :notes_h2)
|
|
389
|
+
|
|
390
|
+
Styles.apply("^\\(>\\)\\( .+?: \\)\\(.+\n\\)", nil, :notes_h1_pipe, :notes_h1_label, :notes_h1)
|
|
391
|
+
|
|
392
|
+
Styles.apply("^\\(> 20[0-9][0-9]-[0-9][0-9]-[0-9][0-9].*:\\)\\(.*\n\\)", nil, :notes_h1_agenda_pipe, :notes_h1_agenda)
|
|
393
|
+
|
|
394
|
+
@@h1_styles.each do |k, v|
|
|
395
|
+
l = k.to_s[/_..(.)$/, 1]
|
|
396
|
+
next unless l
|
|
397
|
+
Styles.apply("^\\(> #{l}\\)\\(\n\\| .*\n\\)", nil, "#{k}_pipe".to_sym, k)
|
|
398
|
+
Styles.apply("^\\(>\\)\\( #{l} .+: \\)\\(.*\n\\)", nil, "#{k}_pipe".to_sym, "#{k}_label".to_sym, k)
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
# >>... lines
|
|
402
|
+
# Styles.apply("^\\(>>\\)\\(.*\\)", nil, :notes_h2_pipe, :notes_h2)
|
|
403
|
+
Styles.apply("^\\(>>\\)\\(.*\n\\)", nil, :notes_h2_pipe, :notes_h2)
|
|
404
|
+
|
|
405
|
+
# Commented
|
|
406
|
+
Styles.apply("^\\(>> .+?: \\)\\(.+\n\\)", nil, :notes_h2_pipe, :notes_h2)
|
|
407
|
+
|
|
408
|
+
# >>>... lines
|
|
409
|
+
Styles.apply("^\\(>>>\\)\\(.*\n\\)", nil, :notes_h3_pipe, :notes_h3)
|
|
410
|
+
|
|
411
|
+
# >>>... lines
|
|
412
|
+
Styles.apply("^\\(>>>>\\)\\(.*\n\\)", nil, :notes_h4_pipe, :notes_h4)
|
|
413
|
+
|
|
414
|
+
# - bullets with labels and comments
|
|
415
|
+
Styles.apply("^[ \t]*\\([<+-]\\) \\([^/:\n]+:\\) ", nil, :ls_bullet, :notes_label) # - hey: you
|
|
416
|
+
Styles.apply("^[ \t]*\\([<+-]<*\\) \\([^(\n]+?)\\) ", nil, :ls_bullet, :notes_label) # - hey) you
|
|
417
|
+
|
|
418
|
+
Styles.apply("^[ \t]*\\([<+=-]<*\\) \\([^(\n]+)\\)$", nil, :ls_bullet, :notes_label) # - hey)
|
|
419
|
+
Styles.apply("^[ \t]*\\([<+=-]<*\\) \\(.+:\\)$", nil, :ls_bullet, :notes_label) # - hey)
|
|
420
|
+
|
|
421
|
+
# Styles.apply("^[ \t]*\\(x\\)\\( \\)\\(.+\\)", nil, :notes_label, :variable, :strike)
|
|
422
|
+
|
|
423
|
+
Styles.apply("^\\([ \t]*\\)\\([<+-]\\) \\(.+?:\\) +\\(|.*\n\\)", nil, :default, :ls_bullet, :notes_label, :ls_quote)
|
|
424
|
+
Styles.apply("^\\([ \t]*\\)\\([<+-]\\) \\([^(\n]+?)\\) +\\(|.*\n\\)", nil, :default, :ls_bullet, :notes_label, :ls_quote)
|
|
425
|
+
|
|
426
|
+
Styles.apply("^ +\\(!.*\n\\)", nil, :ls_quote) # ^!... for commands
|
|
427
|
+
|
|
428
|
+
# exclamation! / todo
|
|
429
|
+
Styles.apply("^[ \t]*\\([<+-]\\) \\(.*!\\)$", nil, :ls_bullet, :notes_exclamation)
|
|
430
|
+
Styles.apply("^ +\\(!\\+.*\n\\)", nil, :diff_green) # Whole lines
|
|
431
|
+
Styles.apply("^ +\\(!-.*\n\\)", nil, :diff_red)
|
|
432
|
+
|
|
433
|
+
Styles.apply("\\(\(-\\)\\(.+?\\)\\(-\)\\)", nil, :diff_small, :diff_red, :diff_small)
|
|
434
|
+
Styles.apply("\\(\(\\+\\)\\(.+?\\)\\(\\+\)\\)", nil, :diff_small, :diff_green, :diff_small)
|
|
435
|
+
|
|
436
|
+
# google/
|
|
437
|
+
Styles.apply "^ *\\(-?\\) ?\\(@?\\)\\(g\\)\\(o\\)\\(o\\)\\(g\\)\\(l\\)\\(e\\)\\(/\\)", nil, :ls_bullet, :ls_dir,
|
|
438
|
+
:notes_blue, :notes_red, :notes_yellow, :notes_blue, :notes_green, :notes_red,
|
|
439
|
+
:ls_dir
|
|
440
|
+
|
|
441
|
+
Styles.apply "^hint/.+", :fade6
|
|
442
|
+
|
|
443
|
+
Styles.apply "^ *@? ?\\([%$&]\\) ", nil, :shell_prompt # Colorize shell prompts
|
|
444
|
+
|
|
445
|
+
Styles.apply("^ *\\(|`\\)\\(.*\n\\)", nil, :quote_heading_pipe, :dotsies_experimental)
|
|
446
|
+
Styles.apply("^ *\\(|~\\)\\([^\n~]+\\)\\(~?\\)", nil, :quote_heading_pipe, :dotsies, :quote_heading_pipe)
|
|
447
|
+
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
# Startup
|
|
451
|
+
def self.init
|
|
452
|
+
|
|
453
|
+
return if ! $el
|
|
454
|
+
|
|
455
|
+
$el.defun(:notes_mouse_meta_click, :interactive => "e") do |e|
|
|
456
|
+
$el.mouse_set_point(e)
|
|
457
|
+
View.insert "hey"
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
$el.defun(:notes_mouse_double_click, :interactive => "e") do |e|
|
|
461
|
+
next Launcher.insert "h" if Line =~ /^$/ # If blank line, launch history
|
|
462
|
+
Launcher.launch_or_hide(:blink=>true)
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
$el.defun(:notes_mouse_toggle, :interactive => "e") do |e|
|
|
466
|
+
$el.mouse_set_point(e)
|
|
467
|
+
Notes.mouse_toggle
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
$el.defun(:notes_mode, :interactive => "", :docstring => "Apply notes styles, etc") {# |point|
|
|
471
|
+
$el.el4r_lisp_eval "(setq font-lock-defaults '(nil t))"
|
|
472
|
+
|
|
473
|
+
FileTree.apply_styles
|
|
474
|
+
Notes.apply_styles
|
|
475
|
+
FileTree.apply_styles_at_end
|
|
476
|
+
$el.use_local_map $el.elvar.notes_mode_map
|
|
477
|
+
}
|
|
478
|
+
$el.el4r_lisp_eval %q<
|
|
479
|
+
(progn
|
|
480
|
+
(add-to-list 'auto-mode-alist '("\\\\.notes\\\\'" . notes-mode))
|
|
481
|
+
(add-to-list 'auto-mode-alist '("\\\\.xik\\\\'" . notes-mode))
|
|
482
|
+
(add-to-list 'auto-mode-alist '("\\\\.wik\\\\'" . notes-mode)))
|
|
483
|
+
>
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
def self.mode
|
|
487
|
+
$el.notes_mode
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
def self.enter_label_bullet
|
|
491
|
+
Line.to_left
|
|
492
|
+
View.insert "- : "
|
|
493
|
+
Move.backward 2
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
def self.enter_junior
|
|
497
|
+
|
|
498
|
+
Move.to_end if Line.before_cursor =~ /^ +$/ # If at awkward position, move
|
|
499
|
+
|
|
500
|
+
cursor = View.cursor
|
|
501
|
+
line = Line.value
|
|
502
|
+
indent = Line.indent line
|
|
503
|
+
pipe = line =~ /^ *([|#])/ ? $1 : ""
|
|
504
|
+
if Line.left == cursor || Line.right == cursor # If beginning or end, leave current line alone
|
|
505
|
+
Move.to_end
|
|
506
|
+
else # In middle of line
|
|
507
|
+
Deletes.delete_whitespace
|
|
508
|
+
end
|
|
509
|
+
|
|
510
|
+
return View.<< "\n#{line[/^[ |#]*/]} " if pipe
|
|
511
|
+
View << "\n#{indent}#{pipe} "
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
def self.bullet bullet_text="- "
|
|
515
|
+
prefix = Keys.prefix :clear=>true
|
|
516
|
+
|
|
517
|
+
if prefix == :u
|
|
518
|
+
Move.forward if Line.at_right?
|
|
519
|
+
return Tree.collapse
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
if prefix == :uu
|
|
523
|
+
return Tree.collapse :replace_parent=>1
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
line = Line.value
|
|
527
|
+
indent = Line.indent indent
|
|
528
|
+
|
|
529
|
+
if line.present? # If non-blank line
|
|
530
|
+
Move.to_end if line =~ /^ / && View.column <= indent.length # If just entered a bullet, go to end first
|
|
531
|
+
|
|
532
|
+
Move.to_end if line =~ /^[+-] / && View.column <= 2 # If just entered a bullet, go to end first
|
|
533
|
+
|
|
534
|
+
# If at beginning of line, just insert bullet
|
|
535
|
+
return View.insert "- " if View.column == 0 && bullet_text == "- " && line !~ /^ /
|
|
536
|
+
|
|
537
|
+
if View.cursor != Line.right
|
|
538
|
+
Deletes.delete_whitespace
|
|
539
|
+
end
|
|
540
|
+
View.insert "\n"
|
|
541
|
+
|
|
542
|
+
# Do simple case if quoted
|
|
543
|
+
return View.<<("#{line[/^[ |#]*/]} - ") if line =~ /^ *[|#]/
|
|
544
|
+
|
|
545
|
+
# Do simple case if on heading
|
|
546
|
+
return View.<<("- ") if line =~ /^>/
|
|
547
|
+
end
|
|
548
|
+
|
|
549
|
+
if prefix.is_a? Fixnum # If numeric prefix, indent by n
|
|
550
|
+
View.insert((" " * prefix) + bullet_text)
|
|
551
|
+
else # Get bullet indent of previous line
|
|
552
|
+
prev = Line.value(0)
|
|
553
|
+
prev_indent = prev[/^( *)/]
|
|
554
|
+
|
|
555
|
+
# Indent further, unless it we're doing bullets and not following bullet
|
|
556
|
+
prev_indent << " " if line != "" && (bullet_text != "- " || prev =~ /^ *[+-]/ || prev !~ /^>/)
|
|
557
|
+
prev_indent = "#{prev_indent}#{bullet_text}"
|
|
558
|
+
View.insert prev_indent
|
|
559
|
+
|
|
560
|
+
if prefix == :-
|
|
561
|
+
View.insert "(): "
|
|
562
|
+
Move.backward 3
|
|
563
|
+
end
|
|
564
|
+
end
|
|
565
|
+
|
|
566
|
+
return if bullet_text == "" # Don't indent rest if not using bullets (enter_junior)
|
|
567
|
+
|
|
568
|
+
following_line = Line.value(2)
|
|
569
|
+
return if following_line !~ /^ / # Don't indent rest of lines if at left margin
|
|
570
|
+
return if Line.matches /^[ -]*$/ # Exit if new bullet was blank
|
|
571
|
+
|
|
572
|
+
indent = Line.indent
|
|
573
|
+
|
|
574
|
+
return if indent.empty? # Don't indent anything if new bullet wasn't indented
|
|
575
|
+
|
|
576
|
+
cursor = View.cursor
|
|
577
|
+
Line.next
|
|
578
|
+
top = View.cursor
|
|
579
|
+
|
|
580
|
+
# Find next line not indented underneath
|
|
581
|
+
Search.forward "^ \\{0,#{indent.size-1}\\}\\($\\|[^ \n]\\)", :beginning=>true
|
|
582
|
+
$el.indent_rigidly top, Line.left, 2
|
|
583
|
+
View.cursor = cursor
|
|
584
|
+
|
|
585
|
+
end
|
|
586
|
+
|
|
587
|
+
def self.mouse_toggle
|
|
588
|
+
#Launcher.launch_or_hide(:blink=>true)
|
|
589
|
+
|
|
590
|
+
# If next line is indented more, kill children
|
|
591
|
+
# If starts with plus or minus, and on plus or minus, launch
|
|
592
|
+
if Line.matches(/^\s*[+-]/) and View.char =~ /[+-]/
|
|
593
|
+
plus_or_minus = Tree.toggle_plus_and_minus
|
|
594
|
+
if ! Tree.children?
|
|
595
|
+
#plus_or_minus == '+' # If +, expand (launch
|
|
596
|
+
|
|
597
|
+
if FileTree.dir? or ! FileTree.handles? # If on a dir or code_tree
|
|
598
|
+
Launcher.launch
|
|
599
|
+
else # If on a file in a FileTree
|
|
600
|
+
FileTree.enter_lines
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
else # If -, kill under
|
|
604
|
+
Tree.kill_under
|
|
605
|
+
Line.to_beginning
|
|
606
|
+
end
|
|
607
|
+
end
|
|
608
|
+
end
|
|
609
|
+
|
|
610
|
+
# Returns an instance of BlockNotes representing the block the point is currently in
|
|
611
|
+
# def self.get_block regex="^[|>]\\( \\|$\\)"
|
|
612
|
+
def self.get_block regex=nil
|
|
613
|
+
regex ||= self.heading_regex
|
|
614
|
+
|
|
615
|
+
regex = self.heading_regex if regex == 1
|
|
616
|
+
regex = self.heading_regex(:u) if regex == 2 || regex == :u
|
|
617
|
+
|
|
618
|
+
left, after_header, right = View.block_positions regex
|
|
619
|
+
NotesBlock.new(left, after_header, right)
|
|
620
|
+
end
|
|
621
|
+
|
|
622
|
+
def self.to_html txt
|
|
623
|
+
txt = txt.
|
|
624
|
+
gsub(/^> (.+)/, "<h1>\\1</h1>").
|
|
625
|
+
gsub(/(^|[^\n>])$/, "\\0<br>")
|
|
626
|
+
end
|
|
627
|
+
|
|
628
|
+
def self.as_nav
|
|
629
|
+
|
|
630
|
+
prefix = Keys.prefix :clear=>true
|
|
631
|
+
txt = ""
|
|
632
|
+
if prefix == :u || prefix == :uu
|
|
633
|
+
txt = Code.grab_containing_method
|
|
634
|
+
end
|
|
635
|
+
|
|
636
|
+
label = nil
|
|
637
|
+
if prefix == 9
|
|
638
|
+
label = Keys.input :prompt=>"label: ", :timed=>1
|
|
639
|
+
label = "do" if label.blank?
|
|
640
|
+
label = Notes.expand_if_action_abbrev(label) || label
|
|
641
|
+
|
|
642
|
+
prefix = nil
|
|
643
|
+
end
|
|
644
|
+
|
|
645
|
+
if prefix == :uu # up+up means add function and line
|
|
646
|
+
txt << "\n#{Line.value}"
|
|
647
|
+
elsif prefix != :u
|
|
648
|
+
txt = View.txt_per_prefix prefix, :selection=>1, :default_is_line=>1, :just_txt=>1
|
|
649
|
+
end
|
|
650
|
+
|
|
651
|
+
# If file has bullet or ends with slash, grab path
|
|
652
|
+
|
|
653
|
+
keep_tweeking = true
|
|
654
|
+
if ! prefix && FileTree.handles? # Grab tree
|
|
655
|
+
txt = Tree.ancestors_indented :just_sub_tree=>1
|
|
656
|
+
txt.sub! /^ /, ' - '
|
|
657
|
+
keep_tweeking = false
|
|
658
|
+
end
|
|
659
|
+
|
|
660
|
+
file = View.file
|
|
661
|
+
orig = Location.new
|
|
662
|
+
|
|
663
|
+
if keep_tweeking
|
|
664
|
+
if Search.fit_in_snippet(txt) # Insert it in existing tree if there
|
|
665
|
+
View << " - #{label}:\n" if label
|
|
666
|
+
return orig.go
|
|
667
|
+
end
|
|
668
|
+
else
|
|
669
|
+
View.layout_files :no_blink=>1
|
|
670
|
+
end
|
|
671
|
+
|
|
672
|
+
# Make it quoted, unless already a quote
|
|
673
|
+
if keep_tweeking && (txt !~ /\A([+-] |\/)/ || txt !~ /^ +/) # If txt isn't already a tree, make it one
|
|
674
|
+
txt = FileTree.snippet :txt=>txt, :file=>file
|
|
675
|
+
txt.sub! /^ /, " - #{label}:\n " if label
|
|
676
|
+
end
|
|
677
|
+
|
|
678
|
+
# Else, add it to top...
|
|
679
|
+
|
|
680
|
+
View.to_highest
|
|
681
|
+
|
|
682
|
+
if prefix == 8
|
|
683
|
+
if Line =~ /^>/
|
|
684
|
+
Line.next
|
|
685
|
+
end
|
|
686
|
+
result = "#{txt}\n"
|
|
687
|
+
else
|
|
688
|
+
result = ">\n#{txt}\n"
|
|
689
|
+
end
|
|
690
|
+
|
|
691
|
+
View.<< result, :dont_move=>1
|
|
692
|
+
|
|
693
|
+
orig.go
|
|
694
|
+
end
|
|
695
|
+
|
|
696
|
+
|
|
697
|
+
def self.as_todo
|
|
698
|
+
prefix = Keys.prefix :clear=>1
|
|
699
|
+
|
|
700
|
+
txt = nil
|
|
701
|
+
|
|
702
|
+
# If method, make it Foo.bar method call
|
|
703
|
+
line = Line.value
|
|
704
|
+
|
|
705
|
+
if View.file =~ /_spec.rb/ && line =~ /^ *(it|describe) /
|
|
706
|
+
return Specs.enter_as_rspec
|
|
707
|
+
end
|
|
708
|
+
|
|
709
|
+
buffer_name = $el.buffer_name
|
|
710
|
+
file_name = View.file_name
|
|
711
|
+
trunk = Xiki.trunk
|
|
712
|
+
|
|
713
|
+
if prefix.nil? # So 1+ or numeric prefix just grab normally
|
|
714
|
+
if buffer_name == "*ol" # Make it into "foo = bar" format
|
|
715
|
+
txt = line[/\) (.+)/, 1]
|
|
716
|
+
txt.sub!(": ", " = ") if txt
|
|
717
|
+
txt ||= line[/ *- (.+?) /, 1]
|
|
718
|
+
|
|
719
|
+
elsif trunk.last =~ /(\w+)\.rb\/\| *def ([\w\.?]+)/
|
|
720
|
+
clazz = $1
|
|
721
|
+
method = $2
|
|
722
|
+
clazz = TextUtil.camel_case clazz if method.slice! /^self\./
|
|
723
|
+
txt = "#{clazz}.#{method}"
|
|
724
|
+
|
|
725
|
+
elsif line =~ /^ +def (.+)/ # Make it into Foo.bar format
|
|
726
|
+
method = $1
|
|
727
|
+
clazz = file_name[/\w+/]
|
|
728
|
+
clazz = TextUtil.camel_case clazz if method.slice! /^self\./
|
|
729
|
+
|
|
730
|
+
txt = "#{clazz}.#{method}"
|
|
731
|
+
|
|
732
|
+
elsif line =~ /^ *\|/ # Make it into Foo.bar format
|
|
733
|
+
txt = line.sub /^ *\| ?/, ''
|
|
734
|
+
elsif FileTree.handles?
|
|
735
|
+
txt = Tree.dir
|
|
736
|
+
elsif line =~ /(^ *[+-] |\/$)/ # Make it into Foo.bar format
|
|
737
|
+
txt = Xiki.trunk.last
|
|
738
|
+
end
|
|
739
|
+
end
|
|
740
|
+
|
|
741
|
+
txt ||= View.txt_per_prefix(prefix, :selection=>1, :just_txt=>1, :default_is_line=>1)
|
|
742
|
+
txt.strip! if txt =~ /\A.+\n\z/ # Strip when only 1 linebreak
|
|
743
|
+
|
|
744
|
+
options = prefix == :uu ? {:append=>1} : {}
|
|
745
|
+
Search.move_to "$t", txt, options
|
|
746
|
+
end
|
|
747
|
+
|
|
748
|
+
|
|
749
|
+
class NotesBlock
|
|
750
|
+
|
|
751
|
+
attr_accessor :left, :after_header, :right
|
|
752
|
+
attr_accessor :header, :text
|
|
753
|
+
|
|
754
|
+
def initialize(left, after_header, right)
|
|
755
|
+
@left, @after_header, @right = left, after_header, right
|
|
756
|
+
@header = $el.buffer_substring left, after_header
|
|
757
|
+
@text = $el.buffer_substring after_header, right
|
|
758
|
+
end
|
|
759
|
+
|
|
760
|
+
def positions
|
|
761
|
+
[left, after_header, right]
|
|
762
|
+
end
|
|
763
|
+
|
|
764
|
+
def content
|
|
765
|
+
header + text
|
|
766
|
+
end
|
|
767
|
+
|
|
768
|
+
def to_s
|
|
769
|
+
content
|
|
770
|
+
end
|
|
771
|
+
|
|
772
|
+
def blink
|
|
773
|
+
Effects.blink :left => after_header, :right => right
|
|
774
|
+
end
|
|
775
|
+
|
|
776
|
+
def fade_out
|
|
777
|
+
Effects.glow :fade_out=>1, :what=>[left, right]
|
|
778
|
+
end
|
|
779
|
+
|
|
780
|
+
def fade_in
|
|
781
|
+
Effects.glow :fade_in=>1, :what=>[left, right]
|
|
782
|
+
end
|
|
783
|
+
|
|
784
|
+
def delete_content
|
|
785
|
+
$el.delete_region left, right
|
|
786
|
+
end
|
|
787
|
+
|
|
788
|
+
# initialize an overlay for this notes block
|
|
789
|
+
# it has a special hook that updates name to be header always
|
|
790
|
+
# this way we can always find the overlay corresponding to header
|
|
791
|
+
|
|
792
|
+
def show_text
|
|
793
|
+
@header_overlay ||= Overlay.find_or_make(left, after_header - 1)
|
|
794
|
+
|
|
795
|
+
@body_overlay ||= Overlay.find_or_make(after_header, right)
|
|
796
|
+
@body_overlay.invisible = false
|
|
797
|
+
end
|
|
798
|
+
|
|
799
|
+
def hide_text
|
|
800
|
+
@header_overlay ||= Overlay.find_or_make(left, after_header - 1)
|
|
801
|
+
|
|
802
|
+
@body_overlay ||= Overlay.find_or_make(after_header, right)
|
|
803
|
+
@body_overlay.invisible = true
|
|
804
|
+
end
|
|
805
|
+
|
|
806
|
+
# cuts the block, and stores it in archive.file.notes
|
|
807
|
+
# example: ruby.notes -> archive.ruby.notes
|
|
808
|
+
def archive
|
|
809
|
+
delete_content
|
|
810
|
+
filename = 'archive.' + $el.file_name_nondirectory(buffer_file_name)
|
|
811
|
+
timestamp = "--- archived on #{Time.now.strftime('%Y-%m-%d at %H:%M')} --- \n"
|
|
812
|
+
$el.append_to_file timestamp, nil, filename
|
|
813
|
+
$el.append_to_file content, nil, filename
|
|
814
|
+
end
|
|
815
|
+
end
|
|
816
|
+
|
|
817
|
+
def self.enter_do_bullet
|
|
818
|
+
|
|
819
|
+
txt = Keys.input :chars=>1, :prompt=>'Enter a character: '
|
|
820
|
+
expanded = Notes.expand_if_action_abbrev txt
|
|
821
|
+
|
|
822
|
+
# If on blank line, just insert it
|
|
823
|
+
if ! Line.blank?
|
|
824
|
+
line = Line.value
|
|
825
|
+
indent, first_char = line.match(/^( *)(.)/)[1..2]
|
|
826
|
+
|
|
827
|
+
Move.to_axis
|
|
828
|
+
$el.open_line(1)
|
|
829
|
+
end
|
|
830
|
+
|
|
831
|
+
if txt == " "
|
|
832
|
+
View << "#{indent}- !"
|
|
833
|
+
ControlLock.disable
|
|
834
|
+
return View.column = -1
|
|
835
|
+
end
|
|
836
|
+
|
|
837
|
+
if expanded
|
|
838
|
+
View << "#{indent}- #{expanded}!"
|
|
839
|
+
Line.to_beginning
|
|
840
|
+
else
|
|
841
|
+
View << "#{indent}- !"
|
|
842
|
+
Move.backward
|
|
843
|
+
View << txt
|
|
844
|
+
end
|
|
845
|
+
|
|
846
|
+
nil
|
|
847
|
+
end
|
|
848
|
+
|
|
849
|
+
def self.drill file, heading=nil, *content
|
|
850
|
+
|
|
851
|
+
prefix = Keys.prefix :clear=>true
|
|
852
|
+
content = content.any? ? content.join('/') : nil
|
|
853
|
+
|
|
854
|
+
file_orig = file.dup
|
|
855
|
+
file = Bookmarks[file]
|
|
856
|
+
|
|
857
|
+
# If bookmark wasn't found, complain
|
|
858
|
+
if file =~ /^\$(\w+)/
|
|
859
|
+
bm = $1
|
|
860
|
+
return "| Set the following bookmark first. Then you'll be able to use this menu to\n| browse the file. The file should have '> ...' headings.\n\n@ $#{bm}\n"
|
|
861
|
+
end
|
|
862
|
+
|
|
863
|
+
# If docs/, output docs string...
|
|
864
|
+
|
|
865
|
+
if heading == "docs"
|
|
866
|
+
message = "
|
|
867
|
+
> Summary
|
|
868
|
+
| Convenient way for browsing the headings in this file:
|
|
869
|
+
|
|
|
870
|
+
- @ #{file}
|
|
871
|
+
".unindent
|
|
872
|
+
return message
|
|
873
|
+
end
|
|
874
|
+
|
|
875
|
+
if ! File.exists? file
|
|
876
|
+
return "
|
|
877
|
+
| File doesn't exist yet, do as+update to create it:
|
|
878
|
+
@ #{file}
|
|
879
|
+
| > Heading
|
|
880
|
+
| Stuff
|
|
881
|
+
"
|
|
882
|
+
end
|
|
883
|
+
|
|
884
|
+
txt = File.read file
|
|
885
|
+
|
|
886
|
+
# If just file passed, headings
|
|
887
|
+
|
|
888
|
+
if ! heading
|
|
889
|
+
|
|
890
|
+
return View.open file if prefix == "open" # If as+open, just jump there
|
|
891
|
+
|
|
892
|
+
txt = txt.grep /^\>( .+)/
|
|
893
|
+
return "| This file has no '>...' headings:\n@ #{file}" if txt.empty?
|
|
894
|
+
return txt.join('') #.gsub /^> /, '| '
|
|
895
|
+
end
|
|
896
|
+
|
|
897
|
+
# If just heading passed, show text under heading
|
|
898
|
+
|
|
899
|
+
heading.sub!(/^\| /, '> ')
|
|
900
|
+
escaped_heading = Regexp.escape heading
|
|
901
|
+
if ! content
|
|
902
|
+
|
|
903
|
+
if prefix == :u || prefix == "open" # If C-u on a heading, just jump there
|
|
904
|
+
View.open file
|
|
905
|
+
View.to_highest
|
|
906
|
+
Search.forward "^#{$el.regexp_quote heading}$", :beginning=>1
|
|
907
|
+
View.recenter_top
|
|
908
|
+
return
|
|
909
|
+
end
|
|
910
|
+
|
|
911
|
+
txt = self.extract_block txt, heading
|
|
912
|
+
return txt.gsub(/^/, '| ').gsub(/^\| $/, '|')
|
|
913
|
+
end
|
|
914
|
+
|
|
915
|
+
# If content passed
|
|
916
|
+
|
|
917
|
+
# If C-4, grab text and save it to file / update
|
|
918
|
+
if prefix == "update"
|
|
919
|
+
# Update difflog
|
|
920
|
+
|
|
921
|
+
# Grab before and after
|
|
922
|
+
index = txt.index /^#{escaped_heading}$/
|
|
923
|
+
index += heading.length
|
|
924
|
+
|
|
925
|
+
before = txt[0..index]
|
|
926
|
+
|
|
927
|
+
after = txt[index..-1].sub(/.*?^>( |$)/m, ">\\1")
|
|
928
|
+
|
|
929
|
+
content = Tree.siblings :string=>1
|
|
930
|
+
|
|
931
|
+
txt = "#{before}#{content}#{after}"
|
|
932
|
+
|
|
933
|
+
DiffLog.save_diffs :patha=>file, :textb=>txt
|
|
934
|
+
|
|
935
|
+
# return
|
|
936
|
+
File.open(file, "w") { |f| f << txt }
|
|
937
|
+
|
|
938
|
+
# Revert file if it's open?
|
|
939
|
+
|
|
940
|
+
View.flash "- Saved!"
|
|
941
|
+
return
|
|
942
|
+
end
|
|
943
|
+
|
|
944
|
+
# Navigate to heading, then content
|
|
945
|
+
|
|
946
|
+
View.open file
|
|
947
|
+
View.to_highest
|
|
948
|
+
Search.forward "^#{$el.regexp_quote heading}$"
|
|
949
|
+
View.recenter_top
|
|
950
|
+
Search.forward "^#{$el.regexp_quote content.sub(/^\| /, '')}"
|
|
951
|
+
Move.to_axis
|
|
952
|
+
nil
|
|
953
|
+
end
|
|
954
|
+
|
|
955
|
+
def self.extract_block txt, heading
|
|
956
|
+
txt = txt.sub /.*^#{Regexp.escape heading}\n/m, '' # Delete before block
|
|
957
|
+
txt.sub! /^>( |$).*/m, '' # Delete after block
|
|
958
|
+
txt # = txt.gsub(/^.?/, "|\\1") # Escape with pipes
|
|
959
|
+
end
|
|
960
|
+
|
|
961
|
+
def self.read_block file, heading
|
|
962
|
+
self.extract_block File.read(file), heading
|
|
963
|
+
end
|
|
964
|
+
|
|
965
|
+
def self.tab_key
|
|
966
|
+
indent = Line.indent(Line.value 0)
|
|
967
|
+
Line.sub! /^ */, indent
|
|
968
|
+
Line.to_beginning
|
|
969
|
+
end
|
|
970
|
+
|
|
971
|
+
@@single_letter_abbrev = {
|
|
972
|
+
"f"=>"fix",
|
|
973
|
+
"b"=>"borrow",
|
|
974
|
+
"i"=>"implement",
|
|
975
|
+
"d"=>"delete",
|
|
976
|
+
"r"=>"rename",
|
|
977
|
+
"t"=>"todo",
|
|
978
|
+
"e"=>"extract",
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
# If the string is "t" or "i", or a few others, return "todo" or "imprement" etc. respectively.
|
|
982
|
+
def self.expand_if_action_abbrev txt
|
|
983
|
+
@@single_letter_abbrev[txt] || txt
|
|
984
|
+
end
|
|
985
|
+
|
|
986
|
+
def self.do_as_quote
|
|
987
|
+
# Make this add or remove quotes
|
|
988
|
+
end
|
|
989
|
+
end
|
|
990
|
+
|
|
991
|
+
Notes.define_styles
|
|
992
|
+
Notes.init
|
|
993
|
+
Notes.keys # Define local keys
|
|
994
|
+
|
|
995
|
+
# TODO - how to turn these on conditionally?
|
|
996
|
+
# What's the best approach for presentations?
|
|
997
|
+
# Probably make .deck files use notes mode
|
|
998
|
+
# Why wasn't working before?
|
|
999
|
+
# require 'deck'
|
|
1000
|
+
# Deck.keys :notes_mode_map # Temporary - only when doing presentations
|