mindwords 0.4.1 → 0.5.3
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +4 -3
- data/lib/mindwords.rb +126 -99
- metadata +22 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0d833b4c7bb6f1226f6c6d5a8489fed1ba6c8d5a2410bbb6df2b61a9285bc4d
|
4
|
+
data.tar.gz: 0cc6c2b9ac7cb8e829b52ba224d04579ad0fb20eb15b8bcf8c39c2ba365c6a3c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f2608e84d67e2303cc61a349a50147028b54f6f537aefb92bd0a6bf15dade2d5e418b84f3a9a543d545d0235fb65d171fd106ad24e9b6ca7239ecef131a961e
|
7
|
+
data.tar.gz: bd98ce9223b9343b1c827946f972f5ac1420c79484bf11e26e60f8fead39f42a4323682ed684fcee5e0cefa1239ffd9c387623fff31e99567d3ec7319ecd7e34
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
`X�_�ݪF�y�$.��u��P�ރE�N�@�� �O���#G��E���g�����
|
2
|
+
���=˲�7{�ߤ����|�$��,
|
3
|
+
YX9�qo�Pb��o�~���4�Q��w]v&�@�G��i�G��QFy��ܻs�<��rg}����I ���{AU ��Q���P��3i�,���ui�qf� Q��9���+�NT��ng��ļj��gۖF_v������2ySƧ��K��0�I���S
|
4
|
+
f6R1��)�����w��:�O�0�K5�����IQ�����c��v�@���Z��d:�_`��Q|QN*���kn�]%ڧ1+������4D-���ZH/1�K�'T��3e�ٯ���$��
|
data/lib/mindwords.rb
CHANGED
@@ -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,112 +20,47 @@ class MindWords
|
|
19
20
|
using ColouredText
|
20
21
|
using HashCopy
|
21
22
|
|
23
|
+
attr_accessor :lines, :filepath
|
22
24
|
|
23
|
-
def initialize(
|
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\?>/
|
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
|
-
|
51
|
-
a = rexlize(h)
|
52
|
-
doc = Rexle.new(['root', {}, '', *a])
|
53
|
-
|
54
|
-
# apply node nesting
|
55
|
-
|
56
|
-
doc.root.elements.each do |e|
|
57
|
-
|
58
|
-
doc.root.xpath('//' + e.name).each do |e2|
|
27
|
+
@parent, @debug = parent, debug
|
59
28
|
|
60
|
-
|
61
|
-
|
62
|
-
e2.parent.add e
|
63
|
-
e2.delete
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
|
29
|
+
s, type = RXFHelper.read raws
|
69
30
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
# remove redundant nodes (outsiders)
|
74
|
-
# a redundant node is where all children exist in existing nested nodes
|
75
|
-
|
76
|
-
redundants = doc.root.elements.map do |e|
|
77
|
-
|
78
|
-
r = e.elements.all? {|x| !x.has_elements?}
|
79
|
-
puts "%s %s" % [e.name, r] if @debug
|
80
|
-
dups = e.elements.all? {|x| doc.root.xpath('//' + x.name).length > 1}
|
81
|
-
puts 'dups: ' + dups.inspect if @debug
|
82
|
-
e.backtrack.to_s if dups
|
83
|
-
|
84
|
-
end
|
85
|
-
|
86
|
-
redundants.compact.each {|x| doc.element(x).delete }
|
87
|
-
|
88
|
-
|
89
|
-
node = if parent then
|
90
|
-
found = doc.root.element('//' + parent)
|
91
|
-
found ? found : doc.root
|
92
|
-
else
|
93
|
-
doc.root
|
94
|
-
end
|
95
|
-
|
96
|
-
@outline = treeize node
|
97
|
-
|
98
|
-
node.root.each_recursive do |e|
|
99
|
-
|
100
|
-
e.attributes[:id] = e.attributes[:title].downcase.gsub(/ +/,'-')
|
101
|
-
|
102
|
-
s = e.parent.attributes[:breadcrumb] ? \
|
103
|
-
e.parent.attributes[:breadcrumb].to_s + ' / ' : ''
|
104
|
-
e.attributes[:breadcrumb] = s + e.value.strip
|
105
|
-
|
106
|
-
r = @a.grep(/^#{e.attributes[:title]} #/i)
|
107
|
-
next unless r.any?
|
108
|
-
e.attributes[:hashtags] = r[0].scan(/(?<=#)\w+/).join(' ')
|
109
|
-
|
110
|
-
|
111
|
-
end
|
112
|
-
|
113
|
-
@xml = node.xml pretty: true
|
31
|
+
@filepath = raws if type == :file or type == :dfs
|
32
|
+
@lines = s.strip.gsub(/^\n/,'').lines
|
33
|
+
@lines.shift if @lines.first =~ /<\?mindwords\?>/
|
114
34
|
|
115
35
|
end
|
116
36
|
|
37
|
+
def breadcrumb()
|
38
|
+
@parent.attributes[:breadcrumb].split(/ +\/ +/) if @parent
|
39
|
+
end
|
40
|
+
|
41
|
+
|
117
42
|
def element(id)
|
118
43
|
|
119
|
-
doc = Rexle.new(
|
44
|
+
doc = Rexle.new(to_xml())
|
120
45
|
e = doc.root.element("//*[@id='#{id}']")
|
121
46
|
#e.attributes[:breadcrumb].to_s if e
|
122
47
|
|
123
|
-
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def hashtags()
|
51
|
+
@parent.attributes[:hashtags].split if @parent
|
52
|
+
end
|
53
|
+
|
54
|
+
def save(file=@filepath)
|
55
|
+
|
56
|
+
puts 'before save' if @debug
|
57
|
+
File.write file, to_s()
|
58
|
+
|
59
|
+
end
|
124
60
|
|
125
61
|
def search(keyword)
|
126
62
|
|
127
|
-
a = @
|
63
|
+
a = @lines.grep(/#{keyword}/i).map do |line|
|
128
64
|
|
129
65
|
puts 'line: ' + line.inspect if @debug
|
130
66
|
|
@@ -141,12 +77,16 @@ class MindWords
|
|
141
77
|
|
142
78
|
a2 = a.sort_by(&:last).map(&:first)
|
143
79
|
puts 'a2: ' + a2.inspect if @debug
|
144
|
-
|
80
|
+
e = element(keyword.downcase.gsub(/ +/,'-'))
|
81
|
+
|
82
|
+
return nil if e.nil?
|
83
|
+
|
84
|
+
MindWords.new(a2.join, parent: e, debug: @debug)
|
145
85
|
|
146
86
|
end
|
147
87
|
|
148
88
|
def sort()
|
149
|
-
s = @
|
89
|
+
s = @lines.sort.join
|
150
90
|
|
151
91
|
def s.to_s()
|
152
92
|
self.lines.map do |x|
|
@@ -159,13 +99,13 @@ class MindWords
|
|
159
99
|
end
|
160
100
|
|
161
101
|
def sort!()
|
162
|
-
@
|
102
|
+
@lines = sort().lines
|
163
103
|
self
|
164
104
|
end
|
165
105
|
|
166
106
|
def tag_sort()
|
167
107
|
|
168
|
-
h = @
|
108
|
+
h = @lines.group_by {|x| x[/#\w+/]}
|
169
109
|
s = h.sort.map {|key, value| value.sort }.join
|
170
110
|
|
171
111
|
def s.to_s()
|
@@ -180,7 +120,7 @@ class MindWords
|
|
180
120
|
end
|
181
121
|
|
182
122
|
def tag_sort!()
|
183
|
-
@
|
123
|
+
@lines = tag_sort().lines
|
184
124
|
self
|
185
125
|
end
|
186
126
|
|
@@ -193,15 +133,16 @@ class MindWords
|
|
193
133
|
end
|
194
134
|
|
195
135
|
def to_outline(sort: true)
|
136
|
+
build()
|
196
137
|
sort ? a2tree(tree_sort(LineTree.new(@outline).to_a)) : @outline
|
197
138
|
end
|
198
139
|
|
199
140
|
def to_s(colour: false)
|
200
141
|
|
201
142
|
header = "<?mindwords?>\n\n"
|
202
|
-
return header + @
|
143
|
+
return header + @lines.join unless colour
|
203
144
|
|
204
|
-
body = @
|
145
|
+
body = @lines.map do |x|
|
205
146
|
title, hashtags = x.split(/(?=#)/,2)
|
206
147
|
title + hashtags.chomp.brown
|
207
148
|
end.join("\n")
|
@@ -211,15 +152,101 @@ class MindWords
|
|
211
152
|
end
|
212
153
|
|
213
154
|
def to_words()
|
214
|
-
to_outline.lines.map {|x| x[/\w[\w ]+/] }
|
155
|
+
to_outline.lines.map {|x| x[/\w[\w ]+/] }.uniq
|
215
156
|
end
|
216
157
|
|
217
158
|
def to_xml()
|
159
|
+
build() unless @xml
|
218
160
|
@xml
|
219
161
|
end
|
220
162
|
|
221
163
|
private
|
222
164
|
|
165
|
+
def build()
|
166
|
+
|
167
|
+
h = {}
|
168
|
+
|
169
|
+
@lines.each do |line|
|
170
|
+
|
171
|
+
title, rawtags = line.split(/ (?=#)/,2)
|
172
|
+
|
173
|
+
rawtags.scan(/#(\w+)/).flatten(1).each do |rawtag|
|
174
|
+
tag = rawtag.gsub(/ +/, '_')
|
175
|
+
h[tag] ||= []
|
176
|
+
h[tag] << title
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
@hashtags = h.deep_clone.sort.map {|tag, fields| [tag, fields.sort]}.to_h
|
182
|
+
|
183
|
+
|
184
|
+
a = rexlize(h)
|
185
|
+
doc = Rexle.new(['root', {}, '', *a])
|
186
|
+
|
187
|
+
# apply node nesting
|
188
|
+
|
189
|
+
doc.root.elements.each do |e|
|
190
|
+
|
191
|
+
doc.root.xpath('//' + e.name).each do |e2|
|
192
|
+
|
193
|
+
next if e2 === e
|
194
|
+
|
195
|
+
e2.parent.add e
|
196
|
+
e2.delete
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
201
|
+
|
202
|
+
|
203
|
+
# remove duplicates which appear in the same branch above the nested node
|
204
|
+
rm_duplicates(doc)
|
205
|
+
|
206
|
+
# remove redundant nodes (outsiders)
|
207
|
+
# a redundant node is where all children exist in existing nested nodes
|
208
|
+
|
209
|
+
redundants = doc.root.elements.map do |e|
|
210
|
+
|
211
|
+
r = e.elements.all? {|x| !x.has_elements?}
|
212
|
+
puts "%s %s" % [e.name, r] if @debug
|
213
|
+
dups = e.elements.all? {|x| doc.root.xpath('//' + x.name).length > 1}
|
214
|
+
puts 'dups: ' + dups.inspect if @debug
|
215
|
+
e.backtrack.to_s if dups
|
216
|
+
|
217
|
+
end
|
218
|
+
|
219
|
+
redundants.compact.each {|x| doc.element(x).delete }
|
220
|
+
|
221
|
+
|
222
|
+
node = if @parent then
|
223
|
+
found = doc.root.element('//' + @parent.name)
|
224
|
+
found ? found : doc.root
|
225
|
+
else
|
226
|
+
doc.root
|
227
|
+
end
|
228
|
+
|
229
|
+
@outline = treeize node
|
230
|
+
|
231
|
+
node.root.each_recursive do |e|
|
232
|
+
|
233
|
+
e.attributes[:id] = e.attributes[:title].downcase.gsub(/ +/,'-')
|
234
|
+
|
235
|
+
s = e.parent.attributes[:breadcrumb] ? \
|
236
|
+
e.parent.attributes[:breadcrumb].to_s + ' / ' : ''
|
237
|
+
e.attributes[:breadcrumb] = s + e.value.strip
|
238
|
+
|
239
|
+
r = @lines.grep(/^#{e.attributes[:title]} #/i)
|
240
|
+
next unless r.any?
|
241
|
+
e.attributes[:hashtags] = r[0].scan(/(?<=#)\w+/).join(' ')
|
242
|
+
|
243
|
+
|
244
|
+
end
|
245
|
+
|
246
|
+
@xml = node.xml pretty: true
|
247
|
+
|
248
|
+
end
|
249
|
+
|
223
250
|
def rexlize(a)
|
224
251
|
|
225
252
|
a.map do |x|
|
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.
|
4
|
+
version: 0.5.3
|
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-
|
38
|
+
date: 2021-01-28 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
|