mindwords 0.3.1 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/mindwords.rb +118 -111
  5. metadata +22 -2
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6221b29c92e35c56991faead9b0065df928bb5ce5664f9511ad36a41b9382e9c
4
- data.tar.gz: 9aefdce231368e36caf338567b5b8063a12e12c5468a5bd92c7395db04ff28bc
3
+ metadata.gz: cecbfa6443266445084268c94ccedf12ca1f1c4a8e601a510ad49d375c54e910
4
+ data.tar.gz: 184f031666fbc23c62ca1fb7b61bbfbce99a1bd88c75072fc9645153f4e1f502
5
5
  SHA512:
6
- metadata.gz: cf7874e88c03ae3148102bf2ad8ecc539502c16bd620208303f54ea750262b9041de7c97b4c5bbf90b0aaf33a381f935b03be9228b1131be467c314bbd6b8344
7
- data.tar.gz: d98408eab67356ef1312e3464ec671a381d149e7d2584ab63df6c87e4098d22c59e032dc360cd819fca2cd74d94071a5a8e400f4f87616e058f6f59a4b467c25
6
+ metadata.gz: 5fd523b6544be615a5a1112deca758af2cc5f6053f03e48c4382acecd413f32db9ed440d572171be342fd64141c0f34debd18f7bd6ebc615cf125029e86ce3f4
7
+ data.tar.gz: 047f68b8746aa20cda1bff2e9c09472fee21f70d4f36cee1599576b71f6243b5107e45f632eedf2ab2e953e9df00867dda4b9a94ec13f896f6d38a136cda9ed9
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -3,6 +3,7 @@
3
3
  # file: mindwords.rb
4
4
 
5
5
  require 'rexle'
6
+ require 'rxfhelper'
6
7
  require 'line-tree'
7
8
 
8
9
  module HashCopy
@@ -19,97 +20,15 @@ class MindWords
19
20
  using ColouredText
20
21
  using HashCopy
21
22
 
23
+ attr_accessor :lines
22
24
 
23
- def initialize(s, parent: nil, debug: false)
25
+ def initialize(raws, parent: nil, debug: false)
24
26
 
25
- @debug = debug
26
- @a = s.strip.gsub(/^\n/,'').lines
27
- @a.shift if @a.first =~ /<\?mindwords\?>/
27
+ @parent, @debug = parent, debug
28
28
 
29
- lines = @a.map do |line|
30
-
31
- word = line.split(/ (?=#)/,2)
32
-
33
- end
34
-
35
- h = {}
36
- @hashtags = {}
37
-
38
- lines.each do |title, rawtags|
39
-
40
- rawtags.scan(/#(\w+)/).flatten(1).each do |rawtag|
41
- tag = rawtag.gsub(/ +/, '_')
42
- h[tag] ||= []
43
- h[tag] << title
44
- end
45
-
46
- end
47
-
48
- @hashtags = h.deep_clone.sort.map {|tag, fields| [tag, fields.sort]}.to_h
49
-
50
- # does the key exist as a field? Nesting of hash object is performed here.
51
-
52
- h.keys.each do |key|
53
-
54
- r = h.detect {|_, value| value.include? key}
55
- next unless r
56
- h[r.first].delete key
57
- h[r.first] << {key => h[key]}
58
- #puts r.inspect
59
- h.delete key
60
-
61
- end
62
-
63
- @h = h
64
-
65
- a = rexlize(h)
66
- doc = Rexle.new(['root', {}, '', *a])
67
-
68
-
69
- # remove duplicates which appear in the same branch above the nested node
70
- rm_duplicates(doc)
71
-
72
- # remove redundant nodes (outsiders)
73
- # a redundant node is where all children exist in existing nested nodes
74
-
75
- redundants = doc.root.elements.map do |e|
76
-
77
- r = e.elements.all? {|x| !x.has_elements?}
78
- puts "%s %s" % [e.name, r] if @debug
79
- dups = e.elements.all? {|x| doc.root.xpath('//' + x.name).length > 1}
80
- puts 'dups: ' + dups.inspect if @debug
81
- e.backtrack.to_s if dups
82
-
83
- end
84
-
85
- redundants.compact.each {|x| doc.element(x).delete }
86
- rm_duplicates(doc)
87
-
88
- node = if parent then
89
- found = doc.root.element('//' + parent)
90
- found ? found : doc.root
91
- else
92
- doc.root
93
- end
94
-
95
- @outline = treeize node
96
-
97
- node.root.each_recursive do |e|
98
-
99
- e.attributes[:id] = e.attributes[:title].downcase.gsub(/ +/,'-')
100
-
101
- s = e.parent.attributes[:breadcrumb] ? \
102
- e.parent.attributes[:breadcrumb].to_s + ' / ' : ''
103
- e.attributes[:breadcrumb] = s + e.value.strip
104
-
105
- r = @a.grep(/^#{e.attributes[:title]} #/i)
106
- next unless r.any?
107
- e.attributes[:hashtags] = r[0].scan(/(?<=#)\w+/).join(' ')
108
-
109
-
110
- end
111
-
112
- @xml = node.xml pretty: true
29
+ s, _ = RXFHelper.read raws
30
+ @lines = s.strip.gsub(/^\n/,'').lines
31
+ @lines.shift if @lines.first =~ /<\?mindwords\?>/
113
32
 
114
33
  end
115
34
 
@@ -119,11 +38,12 @@ class MindWords
119
38
  e = doc.root.element("//*[@id='#{id}']")
120
39
  #e.attributes[:breadcrumb].to_s if e
121
40
 
122
- end
41
+ end
42
+
123
43
 
124
44
  def search(keyword)
125
45
 
126
- a = @a.grep(/#{keyword}/i).map do |line|
46
+ a = @lines.grep(/#{keyword}/i).map do |line|
127
47
 
128
48
  puts 'line: ' + line.inspect if @debug
129
49
 
@@ -145,7 +65,7 @@ class MindWords
145
65
  end
146
66
 
147
67
  def sort()
148
- s = @a.sort.join
68
+ s = @lines.sort.join
149
69
 
150
70
  def s.to_s()
151
71
  self.lines.map do |x|
@@ -158,13 +78,13 @@ class MindWords
158
78
  end
159
79
 
160
80
  def sort!()
161
- @a = sort().lines
81
+ @lines = sort().lines
162
82
  self
163
83
  end
164
84
 
165
85
  def tag_sort()
166
86
 
167
- h = @a.group_by {|x| x[/#\w+/]}
87
+ h = @lines.group_by {|x| x[/#\w+/]}
168
88
  s = h.sort.map {|key, value| value.sort }.join
169
89
 
170
90
  def s.to_s()
@@ -179,7 +99,7 @@ class MindWords
179
99
  end
180
100
 
181
101
  def tag_sort!()
182
- @a = tag_sort().lines
102
+ @lines = tag_sort().lines
183
103
  self
184
104
  end
185
105
 
@@ -192,15 +112,16 @@ class MindWords
192
112
  end
193
113
 
194
114
  def to_outline(sort: true)
115
+ build()
195
116
  sort ? a2tree(tree_sort(LineTree.new(@outline).to_a)) : @outline
196
117
  end
197
118
 
198
119
  def to_s(colour: false)
199
120
 
200
121
  header = "<?mindwords?>\n\n"
201
- return header + @a.join unless colour
122
+ return header + @lines.join unless colour
202
123
 
203
- body = @a.map do |x|
124
+ body = @lines.map do |x|
204
125
  title, hashtags = x.split(/(?=#)/,2)
205
126
  title + hashtags.chomp.brown
206
127
  end.join("\n")
@@ -210,7 +131,7 @@ class MindWords
210
131
  end
211
132
 
212
133
  def to_words()
213
- to_outline.lines.map {|x| x[/\w[\w ]+/] }
134
+ to_outline.lines.map {|x| x[/\w[\w ]+/] }.uniq
214
135
  end
215
136
 
216
137
  def to_xml()
@@ -219,6 +140,91 @@ class MindWords
219
140
 
220
141
  private
221
142
 
143
+ def build()
144
+
145
+ h = {}
146
+
147
+ @lines.each do |line|
148
+
149
+ title, rawtags = line.split(/ (?=#)/,2)
150
+
151
+ rawtags.scan(/#(\w+)/).flatten(1).each do |rawtag|
152
+ tag = rawtag.gsub(/ +/, '_')
153
+ h[tag] ||= []
154
+ h[tag] << title
155
+ end
156
+
157
+ end
158
+
159
+ @hashtags = h.deep_clone.sort.map {|tag, fields| [tag, fields.sort]}.to_h
160
+
161
+
162
+ a = rexlize(h)
163
+ doc = Rexle.new(['root', {}, '', *a])
164
+
165
+ # apply node nesting
166
+
167
+ doc.root.elements.each do |e|
168
+
169
+ doc.root.xpath('//' + e.name).each do |e2|
170
+
171
+ next if e2 === e
172
+
173
+ e2.parent.add e
174
+ e2.delete
175
+
176
+ end
177
+
178
+ end
179
+
180
+
181
+ # remove duplicates which appear in the same branch above the nested node
182
+ rm_duplicates(doc)
183
+
184
+ # remove redundant nodes (outsiders)
185
+ # a redundant node is where all children exist in existing nested nodes
186
+
187
+ redundants = doc.root.elements.map do |e|
188
+
189
+ r = e.elements.all? {|x| !x.has_elements?}
190
+ puts "%s %s" % [e.name, r] if @debug
191
+ dups = e.elements.all? {|x| doc.root.xpath('//' + x.name).length > 1}
192
+ puts 'dups: ' + dups.inspect if @debug
193
+ e.backtrack.to_s if dups
194
+
195
+ end
196
+
197
+ redundants.compact.each {|x| doc.element(x).delete }
198
+
199
+
200
+ node = if @parent then
201
+ found = doc.root.element('//' + @parent)
202
+ found ? found : doc.root
203
+ else
204
+ doc.root
205
+ end
206
+
207
+ @outline = treeize node
208
+
209
+ node.root.each_recursive do |e|
210
+
211
+ e.attributes[:id] = e.attributes[:title].downcase.gsub(/ +/,'-')
212
+
213
+ s = e.parent.attributes[:breadcrumb] ? \
214
+ e.parent.attributes[:breadcrumb].to_s + ' / ' : ''
215
+ e.attributes[:breadcrumb] = s + e.value.strip
216
+
217
+ r = @lines.grep(/^#{e.attributes[:title]} #/i)
218
+ next unless r.any?
219
+ e.attributes[:hashtags] = r[0].scan(/(?<=#)\w+/).join(' ')
220
+
221
+
222
+ end
223
+
224
+ @xml = node.xml pretty: true
225
+
226
+ end
227
+
222
228
  def rexlize(a)
223
229
 
224
230
  a.map do |x|
@@ -227,16 +233,19 @@ class MindWords
227
233
 
228
234
  case x
229
235
  when String
230
- [x.gsub(/ +/,'_'), {title: x}, x]
236
+ [x.downcase.gsub(/ +/,''), {title: x}, x]
231
237
  when Hash
232
238
  [
233
- x.keys.first.gsub(/_/,' '),
239
+ x.keys.first.downcase.gsub(/_/,' '),
234
240
  {title: x.keys.first},
235
241
  x.keys.first,
236
242
  *rexlize(x.values.first)
237
243
  ]
238
244
  when Array
239
- [x.first.gsub(/_/,' '), {title: x.first}, x.first, *rexlize(x.last)]
245
+ [
246
+ x.first.downcase.gsub(/_/,' '),
247
+ {title: x.first}, x.first, *rexlize(x.last)
248
+ ]
240
249
  end
241
250
  end
242
251
 
@@ -245,24 +254,22 @@ class MindWords
245
254
  def rm_duplicates(doc)
246
255
 
247
256
  duplicates = []
257
+
248
258
  doc.root.each_recursive do |e|
249
259
 
250
- puts 'e: ' + e.name.inspect if @debug
251
260
  rows = e.parent.xpath('//' + e.name)
252
261
  next if rows.length < 2
253
262
 
254
- rows[1..-1].each do |e2|
255
- puts 'e2: ' + e2.name.inspect if @debug
256
- duplicates << [e.backtrack.to_s, e2.backtrack.to_s]
257
- end
263
+ rows[0..-2].each {|e2| duplicates << e.backtrack.to_s }
264
+
258
265
  end
259
266
 
260
- duplicates.each do |path, oldpath|
261
- e = doc.element(path);
262
- e2 = doc.element(oldpath);
263
- next unless e2
264
- e2.parent.add e
265
- e2.delete
267
+ duplicates.each do |path|
268
+
269
+ puts 'path: ' + path.inspect if @debug
270
+ e = doc.element(path)
271
+ e.delete if e
272
+
266
273
  end
267
274
 
268
275
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mindwords
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -35,7 +35,7 @@ cert_chain:
35
35
  aWH7D2AmhOpqNwWnPHzWR/yzpigAVTrvpHfRxZleQj6Z/090nIH2KR0RdioMmPFq
36
36
  3+574KQzs/gR9Y5a+iMcvHRN
37
37
  -----END CERTIFICATE-----
38
- date: 2021-01-20 00:00:00.000000000 Z
38
+ date: 2021-01-25 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: line-tree
@@ -57,6 +57,26 @@ dependencies:
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
59
  version: 0.9.1
60
+ - !ruby/object:Gem::Dependency
61
+ name: rxfhelper
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '1.1'
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 1.1.3
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '1.1'
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 1.1.3
60
80
  description:
61
81
  email: digital.robertson@gmail.com
62
82
  executables: []
metadata.gz.sig CHANGED
Binary file