tiddlywiki_cp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. data/COPYING +674 -0
  2. data/History.txt +4 -0
  3. data/Manifest.txt +68 -0
  4. data/README.txt +3 -0
  5. data/Rakefile +123 -0
  6. data/bin/tiddlywiki_cp +13 -0
  7. data/lib/tiddlywiki_cp/converters.rb +36 -0
  8. data/lib/tiddlywiki_cp/file2file.rb +32 -0
  9. data/lib/tiddlywiki_cp/file2tiddler.rb +42 -0
  10. data/lib/tiddlywiki_cp/r4tw.rb +763 -0
  11. data/lib/tiddlywiki_cp/tiddler2directory.rb +27 -0
  12. data/lib/tiddlywiki_cp/tiddler2file.rb +41 -0
  13. data/lib/tiddlywiki_cp/tiddler2tiddlywiki.rb +29 -0
  14. data/lib/tiddlywiki_cp/tiddler_css.rb +39 -0
  15. data/lib/tiddlywiki_cp/tiddler_html.rb +39 -0
  16. data/lib/tiddlywiki_cp/tiddler_js.rb +39 -0
  17. data/lib/tiddlywiki_cp/tiddlywiki2file.rb +29 -0
  18. data/lib/tiddlywiki_cp/version.rb +24 -0
  19. data/lib/tiddlywiki_cp.rb +378 -0
  20. data/scripts/txt2html +67 -0
  21. data/setup.rb +1585 -0
  22. data/test/content/a +0 -0
  23. data/test/content/a.div +0 -0
  24. data/test/content/b +0 -0
  25. data/test/content/e +3 -0
  26. data/test/content/e.div +1 -0
  27. data/test/content/html_entities.html +6 -0
  28. data/test/content/test_fetch.html +6 -0
  29. data/test/content/universe.html +10522 -0
  30. data/test/r4tw/addtag.rb +93 -0
  31. data/test/r4tw/all.rb +29 -0
  32. data/test/r4tw/createfrom.rb +62 -0
  33. data/test/r4tw/empties/2.1.3.html +7087 -0
  34. data/test/r4tw/empties/2.2.0.beta5.html +8726 -0
  35. data/test/r4tw/fromremote.rb +19 -0
  36. data/test/r4tw/fromurl.rb +28 -0
  37. data/test/r4tw/shadows.rb +27 -0
  38. data/test/r4tw/tiddler.rb +70 -0
  39. data/test/r4tw/tiddlerfromurl.rb +23 -0
  40. data/test/r4tw/tiddlywiki.rb +66 -0
  41. data/test/r4tw/utils.rb +55 -0
  42. data/test/r4tw/withcontent/2.2.0.beta5.html +8739 -0
  43. data/test/r4tw/withcontent/22b5index.html +13523 -0
  44. data/test/r4tw/withcontent/empty2.html +7084 -0
  45. data/test/r4tw/withcontent/nothing.js +1 -0
  46. data/test/r4tw/write_all_tiddlers_to.rb +62 -0
  47. data/test/test_all.rb +8 -0
  48. data/test/test_helper.rb +36 -0
  49. data/test/test_tiddler_css.rb +55 -0
  50. data/test/test_tiddler_html.rb +54 -0
  51. data/test/test_tiddler_js.rb +56 -0
  52. data/test/test_tiddlywiki_cp.rb +341 -0
  53. data/website/files/DefaultTiddlers.tiddler +2 -0
  54. data/website/files/DefaultTiddlers.tiddler.div +1 -0
  55. data/website/files/Introduction.tiddler +12 -0
  56. data/website/files/Introduction.tiddler.div +1 -0
  57. data/website/files/MainMenu.tiddler +1 -0
  58. data/website/files/MainMenu.tiddler.div +1 -0
  59. data/website/files/SiteSubtitle.tiddler +1 -0
  60. data/website/files/SiteSubtitle.tiddler.div +1 -0
  61. data/website/files/SiteTitle.tiddler +1 -0
  62. data/website/files/SiteTitle.tiddler.div +1 -0
  63. data/website/files/Usage.tiddler +55 -0
  64. data/website/files/Usage.tiddler.div +1 -0
  65. data/website/files/WebDAVSavingPlugin.js +234 -0
  66. data/website/files/WebDAVSavingPlugin.js.div +1 -0
  67. data/website/index.html +9144 -0
  68. data/website/index.xml +336 -0
  69. metadata +116 -0
@@ -0,0 +1,27 @@
1
+ #
2
+ # Copyright (C) 2007 Loic Dachary <loic@dachary.org>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ #
17
+ module TiddlywikiCp
18
+
19
+ class TiddlyWikiCp
20
+
21
+ def tiddler2directory(from, to)
22
+ tiddler2file(from, TiddlyWikiCp.tiddler2filename(to, from) + ".tiddler")
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,41 @@
1
+ #
2
+ # Copyright (C) 2007 Loic Dachary <loic@dachary.org>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ #
17
+ module TiddlywikiCp
18
+
19
+ class TiddlyWikiCp
20
+
21
+ def tiddler2file(from, to)
22
+ tiddler = uri2tiddlywiki(from).get_tiddler(from.split('#')[1])
23
+ if to == '-'
24
+ puts tiddler.text
25
+ else
26
+ fields_string = tiddler.to_fields_string(true)
27
+ fields_string.join(' ').to_file("#{to}.div")
28
+ tiddler.text.to_file(to)
29
+ if @options.times
30
+ if tiddler.modified
31
+ modified = Time.convertFromYYYYMMDDHHMM(tiddler.modified)
32
+ File.utime(modified, modified, to)
33
+ File.utime(modified, modified, "#{to}.div")
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,29 @@
1
+ #
2
+ # Copyright (C) 2007 Loic Dachary <loic@dachary.org>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ #
17
+ module TiddlywikiCp
18
+
19
+ class TiddlyWikiCp
20
+
21
+ def tiddler2tiddlywiki(from, to)
22
+ tiddler = uri2tiddlywiki(from).get_tiddler(from.split('#')[1])
23
+ tiddlywiki = uri2tiddlywiki(to)
24
+ tiddlywiki.add_tiddler(tiddler)
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,39 @@
1
+ #
2
+ # Copyright (C) 2007 Loic Dachary <loic@dachary.org>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ #
17
+ module TiddlywikiCp
18
+
19
+ class TiddlyWikiCp
20
+
21
+ TIDDLER_CSS = 'css'
22
+
23
+ def tiddler_css?(tiddler) #:nodoc:
24
+ tiddler.name =~ /(StyleSheet|Styles)/ && TIDDLER_CSS
25
+ end
26
+
27
+ def css2directory(from, to)
28
+ tiddler2file(from, TiddlyWikiCp.tiddler2filename(to, from) + ".css")
29
+ end
30
+
31
+ alias css2file tiddler2file
32
+
33
+ alias css2tiddlywiki tiddler2tiddlywiki
34
+
35
+ end
36
+
37
+ end
38
+
39
+
@@ -0,0 +1,39 @@
1
+ #
2
+ # Copyright (C) 2007 Loic Dachary <loic@dachary.org>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ #
17
+ module TiddlywikiCp
18
+
19
+ class TiddlyWikiCp
20
+
21
+ TIDDLER_HTML = 'html'
22
+
23
+ def tiddler_html?(tiddler) #:nodoc:
24
+ tiddler.name =~ /Template/ && TIDDLER_HTML
25
+ end
26
+
27
+ def html2directory(from, to)
28
+ tiddler2file(from, TiddlyWikiCp.tiddler2filename(to, from) + ".html")
29
+ end
30
+
31
+ alias html2file tiddler2file
32
+
33
+ alias html2tiddlywiki tiddler2tiddlywiki
34
+
35
+ end
36
+
37
+ end
38
+
39
+
@@ -0,0 +1,39 @@
1
+ #
2
+ # Copyright (C) 2007 Loic Dachary <loic@dachary.org>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ #
17
+ module TiddlywikiCp
18
+
19
+ class TiddlyWikiCp
20
+
21
+ TIDDLER_JS = 'js'
22
+
23
+ def tiddler_js?(tiddler) #:nodoc:
24
+ tiddler.tags && tiddler.tags.include?("systemConfig") && TIDDLER_JS
25
+ end
26
+
27
+ def js2directory(from, to)
28
+ tiddler2file(from, TiddlyWikiCp.tiddler2filename(to, from) + ".js")
29
+ end
30
+
31
+ alias js2file tiddler2file
32
+
33
+ alias js2tiddlywiki tiddler2tiddlywiki
34
+
35
+ end
36
+
37
+ end
38
+
39
+
@@ -0,0 +1,29 @@
1
+ #
2
+ # Copyright (C) 2007 Loic Dachary <loic@dachary.org>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ #
17
+ require 'fileutils'
18
+
19
+ module TiddlywikiCp
20
+
21
+ class TiddlyWikiCp
22
+
23
+ def tiddlywiki2file(from, to)
24
+ write_uri(to, read_uri(from))
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,24 @@
1
+ # Copyright (C) 2007 Loic Dachary <loic@dachary.org>
2
+ #
3
+ # This program is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
+ #
16
+ module TiddlywikiCp #:nodoc:
17
+ module VERSION #:nodoc:
18
+ MAJOR = 0
19
+ MINOR = 0
20
+ TINY = 1
21
+
22
+ STRING = [MAJOR, MINOR, TINY].join('.')
23
+ end
24
+ end
@@ -0,0 +1,378 @@
1
+ #
2
+ # Copyright (C) 2007 Loic Dachary <loic@dachary.org>
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ #
17
+ require 'tiddlywiki_cp/r4tw'
18
+ require 'tiddlywiki_cp/version'
19
+ require 'tiddlywiki_cp/converters'
20
+ require 'optparse'
21
+ require 'ostruct'
22
+ require 'open-uri'
23
+ require 'find'
24
+
25
+ module TiddlywikiCp
26
+
27
+ class TiddlyWikiCp
28
+
29
+ CONTAINER_DIRECTORY = 'directory'
30
+ CONTAINER_FILE = 'file'
31
+ CONTAINER_TIDDLYWIKI = 'tiddlywiki'
32
+ CONTAINER_TIDDLER = 'tiddler'
33
+
34
+ TIDDLER_DEFAULT = CONTAINER_TIDDLER
35
+
36
+ attr_reader :file_cache
37
+ attr_reader :tiddlywiki_cache
38
+ attr_accessor :options
39
+
40
+ def initialize(*args)
41
+ reset
42
+ end
43
+
44
+ def reset() #:nodoc:
45
+ @file_cache = {}
46
+ @tiddlywiki_cache = {}
47
+
48
+ @options = OpenStruct.new
49
+ @options.verbose = false
50
+ @options.times = false
51
+ @options.recursive = false
52
+ @options.dry_run = false
53
+ @options.includes = []
54
+ @options.excludes = []
55
+ @options.ignores = ['^\.(hg|svn)$', '(#|~|.div)$']
56
+ end
57
+
58
+ def main(argv) #:nodoc:
59
+ args = argv.clone
60
+ if parse!(args)
61
+ run(args)
62
+ end
63
+ end
64
+
65
+ def parse!(argv) #:nodoc:
66
+ reset
67
+ cmd = File.basename($0, '.*')
68
+
69
+ opts = OptionParser.new do |opts|
70
+
71
+ opts.banner = "Usage: #{cmd} [options] FROM [FROM ...] TO|-"
72
+
73
+ opts.separator ""
74
+
75
+ opts.on("-r", "--[no-]recursive",
76
+ "recurse into directories and tiddlywikies") do |v|
77
+ @options.recursive = v
78
+ end
79
+
80
+ opts.on("-t", "--[no-]times",
81
+ "preserve modification time") do |v|
82
+ @options.times = v
83
+ end
84
+
85
+ opts.on("-a", "--all",
86
+ "implies -rt") do
87
+ @options.times = true
88
+ @options.recursive = true
89
+ end
90
+
91
+ opts.on("-i", "--include REGEX",
92
+ "all files,directories or tiddlers must match regex.",
93
+ " If specified multiple times, ",
94
+ " must match at least one of the regex.",
95
+ " Includes are tested after excludes.") do |regex|
96
+ @options.includes.push(regex)
97
+ end
98
+
99
+ opts.on("--exclude REGEX",
100
+ "all files,directories or tiddlers must NOT match regex.",
101
+ " If specified multiple times, ",
102
+ " exclude if matches at least one of the regex.",
103
+ " Includes are tested after excludes.") do |regex|
104
+ @options.excludes.push(regex)
105
+ end
106
+
107
+ opts.on("-v", "--[no-]verbose", "run verbosely") do |v|
108
+ @options.verbose = v
109
+ end
110
+
111
+ opts.on("-n", "--[no-]dry-run", "show what would have been transferred") do |v|
112
+ @options.dry_run = v
113
+ end
114
+
115
+ opts.on("--version", "show version") do
116
+ puts VERSION::STRING
117
+ return false
118
+ end
119
+
120
+ opts.on("--help", "show command usage") do
121
+ puts opts.help
122
+ return false
123
+ end
124
+
125
+ opts.separator ""
126
+ opts.separator "Examples:"
127
+ opts.separator ""
128
+ opts.separator " mkdir /tmp/a ; #{cmd} -a http://tiddlywiki.com/index.html /tmp/a"
129
+ opts.separator " copies index.html tiddlers in separate files and preserve times."
130
+ opts.separator " For each tiddler, a .div file contains the meta information."
131
+ opts.separator " The files are named after their content:"
132
+ opts.separator " /tmp/a/HelloThere.tiddler"
133
+ opts.separator " /tmp/a/HelloThere.tiddler.div"
134
+ opts.separator " /tmp/a/Plugin.js"
135
+ opts.separator " /tmp/a/Plugin.js.div"
136
+ opts.separator " /tmp/a/OwnStyle.css"
137
+ opts.separator " /tmp/a/OwnStyle.css.div"
138
+ opts.separator " ..."
139
+ opts.separator ""
140
+ opts.separator " #{cmd} 'http://tiddlylab.bidix.info/#WebDAVSavingPlugin' tiddlywiki.html"
141
+ opts.separator " copies the WebDAVSavingPlugin tiddler in the existing tiddlywiki.html"
142
+ opts.separator ""
143
+ opts.separator " #{cmd} http://tiddlywiki.com/index.html /tmp/i.html"
144
+ opts.separator " copies to a local file "
145
+ opts.separator ""
146
+ opts.separator " #{cmd} -t myplugin.js tiddlywiki.html"
147
+ opts.separator " copies the tiddler in the existing tiddlywiki.html tiddlywiki"
148
+ opts.separator " and use file system modification time"
149
+ opts.separator ""
150
+ opts.separator " #{cmd} 'http://tiddlylab.bidix.info/#WebDAVSavingPlugin' WebDAVSavingPlugin.js"
151
+ opts.separator " get a local copy of the WebDAVSavingPlugin tiddler"
152
+ opts.separator ""
153
+ opts.separator " mkdir A ; #{cmd} -a --include 'WebDAV' --include 'RSS' 'http://tiddlylab.bidix.info/' A"
154
+ opts.separator " copy all tiddlers with WebDAV or RSS in the url"
155
+ opts.separator ""
156
+ opts.separator " mkdir A ; #{cmd} -a --exclude 'SEX' 'http://tiddlylab.bidix.info/' A"
157
+ opts.separator " copy all tiddlers except those with SEX in the url"
158
+ opts.separator ""
159
+ opts.separator " #{cmd} -a A B C tiddlywiki.html"
160
+ opts.separator " copy all tiddlers found in the A B and C directories to tiddlywiki.html"
161
+
162
+ end
163
+ opts.parse!(argv)
164
+ return @options
165
+ end # parse()
166
+
167
+ def run(args) #:nodoc:
168
+ if args.length < 2
169
+ raise "need at least two arguments"
170
+ end
171
+
172
+ to = args.pop
173
+ to_container = uri2container(to)
174
+ to_type = uri2type(to)
175
+
176
+ from = args2from(args, @options.recursive)
177
+ #
178
+ # more than 2 args but really only 1 because of the pop above
179
+ #
180
+ if from.length > 1 && to_container != CONTAINER_TIDDLYWIKI && to_container != CONTAINER_DIRECTORY
181
+ raise "the destination must be a tiddlywiki or a directory when more than two arguments are given (from = \n" + from.join("\n")
182
+ end
183
+
184
+ from.each { |from|
185
+ from_type = uri2type(from)
186
+ method = "#{from_type}2#{to_type}"
187
+ if @options.dry_run or @options.verbose
188
+ puts "copy '#{from}' '#{to}'"
189
+ end
190
+ if ! @options.dry_run
191
+ self.send(method.intern, from, to)
192
+ end
193
+ }
194
+
195
+ #
196
+ # sync the tiddlywiki destination file system when done
197
+ #
198
+ if to_container == CONTAINER_TIDDLYWIKI || to_container == CONTAINER_TIDDLER
199
+ uri2tiddlywiki(to).to_file(TiddlyWikiCp.without_fragment(to))
200
+ end
201
+
202
+ end
203
+
204
+ def args2from(args, recursive) #:nodoc:
205
+ new_args = []
206
+ if recursive
207
+ Find.find(*args) { |uri|
208
+ if File.exists?(uri) && File.ftype(uri) == 'directory'
209
+ next
210
+ end
211
+
212
+ if ignore?(uri)
213
+ next
214
+ end
215
+
216
+ case uri2container(uri)
217
+ when CONTAINER_FILE
218
+ if File.exists?(uri)
219
+ if File.exists?("#{uri}.div")
220
+ new_args.push(uri)
221
+ else
222
+ raise Errno::ENOENT, "#{uri}.div"
223
+ end
224
+ else
225
+ raise Errno::ENOENT, "#{uri}"
226
+ end
227
+
228
+ when CONTAINER_TIDDLYWIKI
229
+ new_args += uri2tiddlywiki(uri).tiddlers.map{|t| uri + "#" + t.name.gsub('/', '%2F')}
230
+
231
+ when CONTAINER_TIDDLER
232
+ new_args.push(uri)
233
+ end
234
+ }
235
+ else
236
+ args.each do |uri|
237
+ case uri2container(uri)
238
+ when CONTAINER_FILE
239
+ if File.exists?(uri)
240
+ if File.exists?("#{uri}.div")
241
+ new_args.push(uri)
242
+ else
243
+ raise Errno::ENOENT, "#{uri}.div"
244
+ end
245
+ else
246
+ raise Errno::ENOENT, "#{uri}"
247
+ end
248
+
249
+ when CONTAINER_TIDDLYWIKI
250
+ new_args.push(uri)
251
+
252
+ when CONTAINER_TIDDLER
253
+ new_args.push(uri)
254
+
255
+ when CONTAINER_DIRECTORY
256
+ raise "#{uri} is a directory"
257
+ end
258
+ end
259
+ end
260
+
261
+ new_args.reject! { |uri| ! accept?(uri) }
262
+ return new_args
263
+
264
+ end
265
+
266
+ def uri2type(uri) #:nodoc:
267
+ type = uri2container(uri)
268
+ if type == CONTAINER_TIDDLER
269
+ print "uri2type '#{uri}' " if @options.verbose
270
+ fragment = uri.split('#')[1]
271
+ tiddler = uri2tiddlywiki(uri).get_tiddler(fragment)
272
+ predicates = methods.select{ |m| m =~ /^tiddler_.*?/ }.sort
273
+ predicates.each do |p|
274
+ got_type = self.send(p.intern, tiddler)
275
+ if got_type
276
+ type = got_type
277
+ break
278
+ else
279
+ print "." if @options.verbose
280
+ end
281
+ end
282
+ print " #{type}\n" if @options.verbose
283
+ end
284
+ return type
285
+ end
286
+
287
+ def uri2container(uri) #:nodoc:
288
+ begin
289
+ if File.exists?(uri) && File.ftype(uri) == 'directory'
290
+ uri_container = CONTAINER_DIRECTORY
291
+ elsif tiddlywiki? uri
292
+ if TiddlyWikiCp.tiddler_uri? uri
293
+ uri_container = CONTAINER_TIDDLER
294
+ else
295
+ uri_container = CONTAINER_TIDDLYWIKI
296
+ end
297
+ else
298
+ uri_container = CONTAINER_FILE
299
+ end
300
+ rescue OpenURI::HTTPError, Errno::ECONNREFUSED, Errno::ENOENT
301
+ uri_container = CONTAINER_FILE
302
+ end
303
+ print "uri2container '#{uri}' -> #{uri_container}\n" if @options.verbose
304
+ return uri_container
305
+ end
306
+
307
+ def ignore?(uri)
308
+ @options.ignores.each do |regex|
309
+ return true if uri.match(regex)
310
+ end
311
+ return false
312
+ end
313
+
314
+ def accept?(uri)
315
+ @options.excludes.each do |regex|
316
+ return false if uri.match(regex)
317
+ end
318
+ if @options.includes.length > 0
319
+ @options.includes.each do |regex|
320
+ return true if uri.match(regex)
321
+ end
322
+ return false
323
+ else
324
+ return true
325
+ end
326
+ end
327
+
328
+ def self.tiddler2filename(directory, uri) #:nodoc:
329
+ fragment = uri.split('#')[1]
330
+ if ! fragment
331
+ raise "missing fragment in #{uri}"
332
+ end
333
+ return Pathname.new(directory).join(fragment.gsub('/', '%2F')).to_s
334
+ end
335
+
336
+ def uri2tiddlywiki(uri) #:nodoc:
337
+ uri = TiddlyWikiCp.without_fragment(uri)
338
+ if ! @tiddlywiki_cache.has_key?(uri)
339
+ @tiddlywiki_cache[uri] = TiddlyWiki.new.source_empty(uri)
340
+ end
341
+ return @tiddlywiki_cache[uri]
342
+ end
343
+
344
+ def read_uri(uri) #:nodoc:
345
+ uri = TiddlyWikiCp.without_fragment(uri)
346
+
347
+ if ! @file_cache.has_key?(uri)
348
+ @tiddlywiki_cache.delete(uri)
349
+ @file_cache[uri] = open(uri).read
350
+ end
351
+ return @file_cache[uri]
352
+ end
353
+
354
+ def write_uri(uri, content) #:nodoc:
355
+ uri = TiddlyWikiCp.without_fragment(uri)
356
+ @tiddlywiki_cache.delete(uri)
357
+
358
+ @file_cache[uri] = content
359
+ fd = open(uri, "w")
360
+ fd.write(content)
361
+ fd.close()
362
+ end
363
+
364
+ def self.without_fragment(uri) #:nodoc:
365
+ uri.gsub(/#.*/, '')
366
+ end
367
+
368
+ def self.tiddler_uri?(uri) #:nodoc:
369
+ return uri.include?('#')
370
+ end
371
+
372
+ def tiddlywiki?(uri) #:nodoc:
373
+ return read_uri(uri) =~ /var version = \{title: "TiddlyWiki"/
374
+ end # tiddlywiki?
375
+
376
+ end # TiddlyWikiCp
377
+
378
+ end