wikisys 0.3.1 → 0.4.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e012e479a9c126dbdb7077f87aede11c5393c1ee777f345941ac44388f8ee0db
4
- data.tar.gz: d8784d168321d261aed29fc2e0f48d534f39945fcd2b9b9b97a974c49d091db9
3
+ metadata.gz: 58d2c1e764d883278d6cc59cc30701bec9e60e54f40f5d74a2c2ca9de24aaaa3
4
+ data.tar.gz: 3ce2675464a445aaaa1ae9e5061b34fab9d36556c8d7a37ae06d8cd5a03c9d4d
5
5
  SHA512:
6
- metadata.gz: 2ead29b9039b19e62300e33941021265837f8ddcc1be96da4050a9f32991f7826727b4ee5e60b1361faa0cc537f004d4fc193d06cea8d1fd911b413dec6d6627
7
- data.tar.gz: 3ce9e75cee22a1e6d2e8023a7fb2e694f7d27f65c176cd95d9591bdd625baf5b735c15e5967d1b68992f4f183252f331df81efbbecc07396e8b1eda34b5cc022
6
+ metadata.gz: e67d2e605bfb300d986730021834943b5467b3de637cbcc0257602bb9c1939227add73b3d57de71d13cb6b1e2153bc59e2046c6623fc4f3b421583b71e0292ed
7
+ data.tar.gz: c0d03e1ae012d972ae452a0b8252b444df51c7f3d1d7c55375db126673c4821a96f244090ec4e2c0990c64f063fd9a68546b4c5dedacaba8c7f490ca08c45680
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -0,0 +1,75 @@
1
+
2
+
3
+ /* begin breadcrumb.css */
4
+
5
+ body {font-family: Arial;}
6
+
7
+ /* Style the list */
8
+ ul.breadcrumb {
9
+ padding: 10px 16px;
10
+ list-style: none;
11
+ background-color: #eee;
12
+ }
13
+
14
+ /* Display list items side by side */
15
+ ul.breadcrumb li {
16
+ display: inline;
17
+ font-size: 18px;
18
+ }
19
+
20
+ /* Add a slash symbol (/) before/behind each list item */
21
+ ul.breadcrumb li+li:before {
22
+ padding: 8px;
23
+ color: black;
24
+ content: "/\00a0";
25
+ }
26
+
27
+ /* Add a color to all links inside the list */
28
+ ul.breadcrumb li a {
29
+ color: #0275d8;
30
+ text-decoration: none;
31
+ }
32
+
33
+ /* Add a color on mouse-over */
34
+ ul.breadcrumb li a:hover {
35
+ color: #01447e;
36
+ text-decoration: underline;
37
+ }
38
+
39
+ /* end breadcrumb */
40
+
41
+ article {
42
+ background-color: rgba(255,255,255,0.5);
43
+ padding: 1.1em;
44
+ margin: 0.4em;
45
+ }
46
+
47
+ header div {text-align: right}
48
+ #tags {
49
+ background-color: transparent;
50
+ padding: 2.5em 1.0em;
51
+ margin: 1.0em 0em;
52
+ list-style-type: none
53
+ }
54
+ #tags li {
55
+ background-color: transparent;
56
+ display: inline;
57
+ padding: 0.1em;
58
+ margin: 1.3em 0.1em;
59
+ color: #fff;
60
+ }
61
+
62
+ #tags li a {
63
+ background-color: #eee;
64
+ color: #a95;
65
+ text-decoration: none;
66
+ font-family: "Courier";
67
+ font-weight: 600;
68
+ font-size: 0.9em;
69
+ padding: 0.4em 0.6em;
70
+ margin: 0.3em;
71
+
72
+ }
73
+
74
+ #tags li:hover {background-color: transparent; }
75
+ #tags li a:hover { background-color: #ededed; color: #66e; }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wikisys
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: '0.5'
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: 0.5.3
69
+ version: 0.5.4
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '0.5'
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: 0.5.3
79
+ version: 0.5.4
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: martile
82
82
  requirement: !ruby/object:Gem::Requirement
@@ -97,13 +97,33 @@ dependencies:
97
97
  - - ">="
98
98
  - !ruby/object:Gem::Version
99
99
  version: 1.4.6
100
+ - !ruby/object:Gem::Dependency
101
+ name: hashcache
102
+ requirement: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '0.2'
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 0.2.10
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.2'
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: 0.2.10
100
120
  description:
101
121
  email: james@jamesrobertson.eu
102
122
  executables: []
103
123
  extensions: []
104
124
  extra_rdoc_files: []
105
125
  files:
106
- - lib/wikisys.rb
126
+ - stylesheet/pg.css
107
127
  homepage: https://github.com/jrobertson/wikisys
108
128
  licenses:
109
129
  - MIT
metadata.gz.sig CHANGED
Binary file
@@ -1,379 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # file: wikisys.rb
4
-
5
- require 'dxlite'
6
- require 'dir-to-xml'
7
- require 'mindwords'
8
- require 'martile'
9
-
10
- module Wikisys
11
-
12
- class Wiki
13
- using ColouredText
14
-
15
- attr_accessor :title, :content, :tags
16
- attr_reader :to_xml
17
-
18
- def initialize(filepath='.', entries: 'entries.json', debug: false)
19
-
20
- @filepath = filepath
21
- @page = ''
22
- @debug = debug
23
-
24
- @hc = HashCache.new(size:30)
25
-
26
- @entries = if entries.is_a? DxLite then
27
-
28
- entries
29
-
30
- elsif File.exists?(entries) then
31
-
32
- DxLite.new(entries)
33
-
34
- else
35
-
36
- DxLite.new('entries/entry(title, tags)')
37
-
38
- end
39
-
40
- end
41
-
42
- def create_breadcrumb(filepath, links)
43
-
44
- doc = Rexle.new(read_file(filepath))
45
- heading = doc.root.element('heading')
46
-
47
- menu = Rexle.new(HtmlCom::Menu.new(:breadcrumb, links).to_html)
48
-
49
- heading.insert_before menu.root
50
- write_file filepath, doc.root.xml
51
-
52
- end
53
-
54
-
55
- def page(title)
56
-
57
- r = @entries.find_by_title title
58
- @page = r ? read_md(title) : make_page(title)
59
- @to_xml = build_xml @page
60
- @entries.save
61
-
62
- return @page
63
-
64
- end
65
-
66
- def page=(raw_content)
67
-
68
- title = raw_content.lines.first.chomp
69
-
70
- r = @entries.find_by_title title
71
- make_page(title, raw_content.lines.last.chomp[/(?<=\+ )/]) unless r
72
-
73
- write_md title, raw_content
74
- title, content, tags = read_md()
75
- @to_xml = build_xml title, content, tags
76
- write_xml title, @to_xml
77
-
78
-
79
- @entries.save
80
- @page = raw_content
81
-
82
- end
83
-
84
- def modify_build(filename)
85
-
86
- @title, @content, @tags = read_md(filename)
87
-
88
- # find the entry
89
- # modify the tags if necessary
90
-
91
- r = @entries.find_by_title @title
92
- puts 'r: ' + r.inspect if @debug
93
- return unless r
94
-
95
- write_xml(@title, build_xml(@title, @content, @tags))
96
-
97
- r.tags = @tags.join(' ') if r.tags != @tags
98
-
99
- end
100
-
101
- def new_build(filename)
102
-
103
- @title, @content, @tags = read_md(filename)
104
- @entries.create title: @title, tags: @tags.join(' ')
105
-
106
- puts 'md contents: ' + [@title, @content, @tags].inspect if @debug
107
- write_xml(@title, build_xml(@title, @content, @tags))
108
-
109
- end
110
-
111
- def read_file(file='index.html')
112
- @hc.read(file) { File.read(file) }
113
- end
114
-
115
- private
116
-
117
- def read_md(filename)
118
-
119
- filepath = File.join(@filepath, 'md', filename)
120
- return unless File.exists? filepath
121
-
122
- s = read_file(filepath).strip
123
-
124
- # read the title
125
- title = s.lines.first.chomp.sub(/^# +/,'')
126
-
127
- # read the hashtags if there is any
128
- tagsline = s.lines.last[/^ *\+ +(.*)/,1]
129
-
130
- if tagsline then
131
-
132
- [title, s.lines[1..-2].join, tagsline.split]
133
-
134
- else
135
-
136
- [title, s.lines[1..--1].join, []]
137
-
138
- end
139
-
140
- end
141
-
142
- def build_xml(title, content, tags)
143
-
144
- puts 'content: ' + content.inspect if @debug
145
- s = content.gsub(/\[\[[^\]]+\]\]/) do |raw_link|
146
-
147
- r = @entries.find_by_title title
148
-
149
- e = Rexle::Element.new('a').add_text title
150
- e.attributes[:href] = title.gsub(/ +/, '_')
151
-
152
- if r then
153
-
154
- e.attributes[:title] = title.capitalize
155
-
156
- else
157
-
158
- make_page(title.capitalize)
159
- e.attributes[:class] = 'new'
160
- e.attributes[:title] = title.capitalize + ' (page does not exist)'
161
-
162
- end
163
-
164
- e.xml
165
-
166
- end
167
-
168
-
169
- heading = "<heading>%s</heading>" % title
170
-
171
- if tags.any? then
172
-
173
- list = tags.map {|tag| " <tag>%s</tag>" % tag}
174
- tags = "<tags>\n%s\n </tags>" % list.join("\n")
175
-
176
- body = "<body>\n %s </body>" % \
177
- Martile.new(s.lines[1..-2].join.strip).to_html
178
-
179
- else
180
-
181
- body = "<body>%s</body>" % Martile.new(s.lines[1..-1].join.strip).to_html
182
-
183
- end
184
-
185
- "<article>\n %s\n %s\n %s\n</article>" % [heading, body, tags]
186
-
187
-
188
- end
189
-
190
- def write_xml(title, content)
191
-
192
- filepath = File.join(File.absolute_path(@filepath), 'xml',
193
- title.downcase.gsub(/ +/,'_') + '.xml')
194
- FileUtils.mkdir_p File.dirname(filepath)
195
- #File.write filepath, content
196
- write_file filepath, content
197
-
198
- end
199
-
200
- def write_file(filepath, content)
201
-
202
- puts 'writing file: ' + filepath.inspect if @debug
203
- File.write filepath, content
204
- @hc.write(filepath) { content }
205
- end
206
-
207
- def make_page(title, raw_tags=title.downcase.gsub(/['\.\(\)]/,''))
208
-
209
- tags = raw_tags.split.join(' ')
210
- s = "#{title}\n\n\n+ " + tags
211
- write_md title, s
212
- write_xml title, build_xml(s)
213
-
214
- @entries.create title: title, tags: tags
215
-
216
- return s
217
-
218
- end
219
-
220
- def read_md_file(filename)
221
-
222
- filepath = File.join(@filepath, 'md', filename)
223
- File.read(filepath)
224
-
225
- end
226
-
227
- def write_md(title, content)
228
-
229
- filepath = File.join(File.absolute_path(@filepath), 'md',
230
- title.gsub(/ +/,'_') + '.md')
231
- FileUtils.mkdir_p File.dirname(filepath)
232
- File.write filepath, content
233
-
234
- end
235
-
236
- end
237
-
238
- class Pages
239
-
240
- attr_accessor :mw, :entries
241
-
242
- def initialize(filepath='.', debug: false)
243
-
244
- @filepath, @debug = filepath, debug
245
-
246
- entries_file = File.join(@filepath, 'entries.txt')
247
-
248
- if File.exists?(entries_file) then
249
- @entries = DxLite.new(entries_file)
250
- else
251
- @entries = DxLite.new('entries/entry(title, tags)')
252
- @entries.save entries_file
253
- end
254
-
255
- # check for the mindwords raw document file
256
- mindwords_file = File.join(@filepath, 'mindwords.txt')
257
-
258
- if File.exists?(mindwords_file) then
259
- @mw = MindWords.new(mindwords_file)
260
- else
261
- @mw = MindWords.new
262
- @mw.filepath = mindwords_file
263
- end
264
-
265
- scan_md_files()
266
-
267
- end
268
-
269
- private
270
-
271
-
272
- # Check if any of the md files have been modified or newly created
273
- #
274
- def scan_md_files()
275
-
276
- filepath = File.join(@filepath, 'md')
277
- puts 'about to scan ' + filepath.inspect if @debug
278
- dir = DirToXML.new(filepath, index: 'dir.json', debug: @debug)
279
- h = dir.activity
280
- puts 'h: ' + h.inspect if @debug
281
-
282
- pg = Wiki.new @filepath, entries: @entries
283
-
284
-
285
- h[:new].each do |filename|
286
-
287
- pg.new_build(filename)
288
- update_mw(pg.title, pg.tags)
289
-
290
- end
291
-
292
- h[:modified].each do |filename|
293
-
294
- pg.modify_build(filename)
295
- update_mw(pg.title, pg.tags)
296
-
297
- end
298
-
299
- @mw.save if @mw.lines.any?
300
- outline_filepath = File.join(@filepath, 'myoutline.txt')
301
-
302
- File.write outline_filepath, @mw.to_outline
303
-
304
- (h[:new] + h[:modified]).each do |filename|
305
-
306
- filepath = File.join(@filepath, 'xml',filename.sub(/\.md$/,'.xml'))
307
- s = pg.read_file filepath
308
- title = Rexle.new(s).root.text('heading')
309
- puts 'about to search title: ' + title.inspect if @debug
310
- found = @mw.search(title)
311
-
312
- next unless found
313
-
314
- links = found.breadcrumb.map {|x| [x, x.downcase.gsub(/ +/,'-') + '.html']}
315
- pg.create_breadcrumb(filepath, links)
316
-
317
- end
318
-
319
- @entries.save
320
-
321
-
322
- end # /scan_md_files
323
-
324
- def update_mw(title, line_tags)
325
-
326
- # read the file
327
-
328
- tags = line_tags.reject {|x| x =~ /#{title.strip}/i}
329
- puts 'tags: ' + tags.inspect if @debug
330
- puts 'title: ' + title.inspect if @debug
331
-
332
- return if tags.empty?
333
-
334
- line = title + ' ' + tags.map {|x| "#" + x }.join(' ') + "\n"
335
- puts 'line: ' + line.inspect if @debug
336
-
337
- # does the tagsline contain the topic hashtag?
338
-
339
- #if tagsline =~ /#/ # not yet implemented
340
-
341
-
342
-
343
- # check if the title already exists
344
- found = @mw.lines.grep(/^#{title} +(?=#)/i)
345
-
346
- if found.any? then
347
-
348
- found_tags = found.first.scan(/(?<=#)\w+/)
349
-
350
- if @debug then
351
-
352
- puts 'tags: ' + tags.inspect
353
- puts 'found_tags: ' + found_tags.inspect
354
-
355
- end
356
-
357
- new_tags = tags - found_tags
358
-
359
- # add the new tags to the mindwords line
360
-
361
- hashtags = (found_tags + new_tags).map {|x| '#' + x }.join(' ')
362
-
363
- i = @mw.lines.index(found.first)
364
- @mw.lines[i] = line
365
-
366
- else
367
-
368
- @mw.lines << line
369
-
370
- end
371
-
372
- end
373
-
374
- def view_file(file='index.html')
375
- @hc.read(file) { File.read(file) }
376
- end
377
-
378
- end
379
- end