pxindex 0.2.0 → 0.3.0

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 +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/pxindex.rb +155 -61
  4. data.tar.gz.sig +0 -0
  5. metadata +54 -30
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7180ae0be92aec1948a8592f67fd96c6138ac5a3
4
- data.tar.gz: 040f39f96f57dd9554bd16292f21ea22a1a551db
2
+ SHA256:
3
+ metadata.gz: 1668eb3de6636f0cf6ee89fd247de311c2a5564c48de17a46049663a7748e2cf
4
+ data.tar.gz: '018283918b471eb3ec25193a1fc5e07b523caedacb5dc633f34ba8974c8f3b13'
5
5
  SHA512:
6
- metadata.gz: 91b355f5c224817cada42a6ae93d57c7287cbddb1a1d04d5f5e1e16c9741a13f82c84626f499030bc6fb1864c5481ade05e78aa34b76aa1888d0d7507b8daa54
7
- data.tar.gz: 682442727286c7e103d833345ad3916f7b29ec07aeacac41c665a2e6fdd19666ef791c2d97541cc6a7b754c6abbc6c685b3647bfae39e6fc4feabf1dc6fe16e1
6
+ metadata.gz: 646bed272d796dc7fbcde32f82b7326ff896bea9bbeb095befe83d71bdad634ef953534072aa26c1f30078f43dfd6fb4c025288206ed5f6d20076838626c03fa
7
+ data.tar.gz: 26666a0d64048cbbf39616581a009ade96f9101d197398bf2f5cded6c14aee8aa3f3a09860aaf81b40d98070a2d0a915feb204edefb0a88035cdf11e41d13c0d
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/pxindex.rb CHANGED
@@ -2,9 +2,10 @@
2
2
 
3
3
  # file: pxindex.rb
4
4
 
5
+ require 'nokogiri'
5
6
  require 'pxindex-builder'
6
7
  require 'polyrex-headings'
7
-
8
+ require 'rxfreader'
8
9
 
9
10
 
10
11
  class PxIndex
@@ -12,8 +13,8 @@ class PxIndex
12
13
  def initialize(raw_s=nil, debug: false, allsorted: false, indexsorted: false)
13
14
 
14
15
  @allsorted, @indexsorted = allsorted, indexsorted
15
- @debug = debug
16
-
16
+ @debug = debug
17
+
17
18
  read raw_s if raw_s
18
19
 
19
20
  end
@@ -21,97 +22,140 @@ class PxIndex
21
22
  # Returns a PxIndexBuilder object which can build from am index or phrases
22
23
  #
23
24
  def import(s)
24
-
25
+
25
26
  read(PxIndexBuilder.new(s, debug: @debug).to_s)
26
-
27
+
27
28
  end
28
-
29
+
29
30
  def parent()
30
31
  @rs.first
31
32
  end
32
33
 
33
34
  def q?(s)
34
-
35
+
35
36
  return @a.last if s == @s
36
37
  puts '@s : ' + @s.inspect if @debug
37
38
  puts 's: ' + s.inspect if @debug
38
-
39
- # @s is used to store the previous string input to compare it with
39
+
40
+ # @s is used to store the previous string input to compare it with
40
41
  # the new string input
41
-
42
+
42
43
  if (s.length - @s.length).abs >= 1 or s[0..-2] != @s then
43
-
44
- @s = s
44
+
45
+ @s = s
45
46
 
46
47
  @rs = @px.records.flat_map(&:records)
47
-
48
+
48
49
  s2 = ''
49
-
50
+
50
51
  @a = s.chars.map do |x|
51
52
 
52
53
  s2 += x
53
54
  found = search_records(s2, @rs)
54
-
55
+
55
56
  break if not found
56
57
  found
57
-
58
+
58
59
  end
59
60
 
60
61
  return @a ? @a.last : nil
61
-
62
+
62
63
  end
63
-
64
+
64
65
  return []
65
-
66
+
66
67
  end
67
68
 
68
69
  alias query q?
69
-
70
+
71
+ def build_html()
72
+
73
+ @px.each_recursive do |x, parent|
74
+
75
+ if x.is_a? Entry then
76
+
77
+ trail = parent.attributes[:trail]
78
+ s = x.title.gsub(/ +/,'-')
79
+ x.attributes[:trail] = trail.nil? ? s : trail + '/' + s
80
+
81
+ end
82
+
83
+ end
84
+
85
+ doc = Nokogiri::XML(@px.to_xml)
86
+ xsl = Nokogiri::XSLT(xslt())
87
+
88
+ html_doc = Rexle.new(xsl.transform(doc).to_s)
89
+
90
+ html_doc.root.css('.atopic').each do |e|
91
+
92
+ puts 'e: ' + e.parent.parent.xml.inspect if @debug
93
+
94
+ href = e.attributes[:href]
95
+ if href.empty? or href[0] == '!' then
96
+
97
+ if block_given? then
98
+
99
+ yield(e)
100
+
101
+ else
102
+
103
+ e.attributes[:href] = '#' + e.attributes[:trail].split('/')\
104
+ .last.downcase
105
+
106
+ end
107
+ end
108
+ end
109
+
110
+ html_doc.xml(pretty: true, declaration: false)
111
+
112
+ end
113
+
70
114
  def to_px()
71
115
  @px
72
116
  end
73
-
117
+
74
118
  def to_s()
75
119
  @raw_px
76
120
  end
77
121
 
78
122
  private
79
-
123
+
80
124
  def read(raw_s)
81
-
82
- s, _ = RXFHelper.read raw_s
83
-
125
+
126
+ s, _ = RXFReader.read raw_s
127
+
84
128
  lines = s.lines
85
129
 
86
130
  header = []
87
131
  header << lines.shift until lines[0].strip.empty?
88
-
132
+
89
133
  a = LineTree.new(lines.join.gsub(/^# [a-z]\n/,'')).to_a
90
134
  a2 = a.group_by {|x| x.first[0] }.sort.to_a
91
-
92
- s2 = a2.map do |x|
135
+
136
+ s2 = a2.map do |x|
93
137
  '# ' + x[0] + "\n\n" + \
94
138
  treeize(@allsorted || @indexsorted ? sort(x[-1]) : x[-1])
95
139
  end.join("\n\n")
96
-
140
+
97
141
  puts 's2: ' + s2.inspect if @debug
98
142
  @raw_px = header.join + "\n" + s2
99
143
 
100
- @px = PolyrexHeadings.new(@raw_px).to_polyrex
144
+ @px = PolyrexHeadings.new(@raw_px).to_polyrex
101
145
  @rs = @px.records.flat_map()
102
146
 
103
147
  @s = ''
104
- @a = []
148
+ @a = []
105
149
  end
106
150
 
107
151
  def search_records(raw_s, rs=@rs)
108
-
152
+
109
153
  puts 'raw_s : ' + raw_s.inspect if @debug
110
-
154
+
111
155
  if raw_s[-1] == ' ' then
112
156
 
113
157
  child_records = rs.flat_map(&:records)
114
-
158
+
115
159
  if child_records.length > 0 then
116
160
  @rs = child_records
117
161
  return child_records
@@ -121,67 +165,67 @@ class PxIndex
121
165
  end
122
166
 
123
167
  keywords = raw_s.split(/ /)
124
-
168
+
125
169
  s = keywords.length > 1 ? keywords.last : raw_s
126
-
127
- a = rs.select {|x| x.title[0..s.length-1] == s}
128
-
170
+
171
+ a = rs.select {|x| x.title[0..s.length-1] == s}
172
+
129
173
  if @debug then
130
- puts 'a: ' + a.inspect
174
+ puts 'a: ' + a.inspect
131
175
  if a.any? then
132
176
  puts 'a.map ' + a.map(&:title).inspect
133
177
  end
134
178
  end
135
-
136
- if s.length == 1 and a.any? and keywords.length < 2 then
137
- #a = a.first.records
138
- end
139
-
179
+
140
180
  if a.any? then
141
-
181
+
142
182
  @rs = a
143
-
183
+
144
184
  else
145
185
 
146
186
  return nil unless keywords.length > 1
147
-
148
- r = rs #.flat_map(&:records)
187
+
188
+ r = rs
149
189
 
150
190
  if r.any? then
151
-
152
- @rs = r
191
+
192
+ @rs = r
153
193
  search_records(s, rs)
154
-
194
+
155
195
  else
156
-
196
+
157
197
  return nil
158
-
198
+
159
199
  end
160
-
200
+
161
201
  end
162
202
 
163
203
  end
164
-
204
+
165
205
  def sort(a)
206
+
166
207
  puts 'sorting ... a: ' + a.inspect if @debug
167
208
  return sort_children(a) if a.first.is_a? String
168
-
169
- r = a.sort_by do |x|
209
+
210
+ r = a.sort_by do |x|
170
211
  next unless x[0].is_a? String
171
212
  x[0]
172
213
  end
214
+
173
215
  puts 'after sort: ' + r.inspect if @debug
216
+
174
217
  r
218
+
175
219
  end
176
-
220
+
177
221
  def sort_children(a)
178
222
  [a[0]] + a[1..-1].sort_by {|x| x[0]}
179
223
  end
180
-
224
+
181
225
  def treeize(obj, indent=-2)
182
226
 
183
227
  if obj.is_a? Array then
184
-
228
+
185
229
  r = (@allsorted ? sort(obj) : obj).map {|x| treeize(x, indent+1)}.join("\n")
186
230
  puts 'r: ' + r.inspect if @debug
187
231
  r
@@ -191,6 +235,56 @@ class PxIndex
191
235
  ' ' * indent + obj
192
236
 
193
237
  end
194
- end
238
+ end
239
+
240
+
241
+ def xslt()
242
+ <<EOF
243
+ <?xml version="1.0" encoding="UTF-8"?>
244
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
245
+ <xsl:output method="xml" indent="yes" />
246
+
247
+ <xsl:template match='entries'>
248
+ <ul>
249
+ <xsl:apply-templates select='summary'/>
250
+ <xsl:apply-templates select='records'/>
251
+ </ul>
252
+ </xsl:template>
253
+
254
+ <xsl:template match='entries/summary'>
255
+ </xsl:template>
256
+
257
+ <xsl:template match='records/section'>
258
+ <li><h1><xsl:value-of select="summary/heading"/></h1><xsl:text>
259
+ </xsl:text>
260
+
261
+ <xsl:apply-templates select='records'/>
262
+
263
+ <xsl:text>
264
+ </xsl:text>
265
+ </li>
266
+ </xsl:template>
267
+
268
+
269
+ <xsl:template match='records/entry'>
270
+ <ul id="{summary/title}">
271
+ <li><xsl:text>
272
+ </xsl:text>
273
+ <a href="{summary/url}" class='atopic' id='{@id}' trail='{@trail}'>
274
+ <xsl:value-of select="summary/title"/></a><xsl:text>
275
+ </xsl:text>
276
+
277
+ <xsl:apply-templates select='records'/>
278
+
279
+ <xsl:text>
280
+ </xsl:text>
281
+ </li>
282
+ </ul>
283
+ </xsl:template>
284
+
285
+
286
+ </xsl:stylesheet>
287
+ EOF
288
+ end
195
289
 
196
290
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pxindex
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,28 +10,53 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDXjCCAkagAwIBAgIBATANBgkqhkiG9w0BAQUFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTgwMzE0MjEwMzUxWhcN
15
- MTkwMzE0MjEwMzUxWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCjAGJU
17
- TtLHBA8kLkGItpBBYflhiLbF0zNnLqg+DWs/73aI1hZLkFVoQA5/Mjq4YnC/4NPY
18
- g8ZXddJ6v9kitiDByucN/6oZnS91CGmS1umm2IRorXVl48cMzx/GO96f7uh8pf7l
19
- 5VR2Rzb0hJyXu0f9GYdaBe1jVbNdupYSHFdpxW3QRPK+QUiz/0l3qlcmruDmpCsI
20
- hqbFQ8OJS3SLhs3uEl2hqQvS8ijZQaGzOT9vnQVYRELBzBTv42YLyc28E7yRbGfK
21
- uevJOPVG/XUEcmp6TuVvc46ZWXb/nyyPodjkEavZibUi2hB7+uMDuA0w/R8A5CHG
22
- MubZkWqInhFzGfupAgMBAAGjgYowgYcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
23
- HQYDVR0OBBYEFOhfK0sNndycIhAs8HMtP/FRjAifMCYGA1UdEQQfMB2BG2dlbW1h
24
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTAmBgNVHRIEHzAdgRtnZW1tYXN0ZXJAamFt
25
- ZXNyb2JlcnRzb24uZXUwDQYJKoZIhvcNAQEFBQADggEBAAroYSMOhaICSkEuGHWH
26
- UEm5PquvRm0uBLj5zMqG2sEPdzdH0LdR0Ta4n6lCEo1nZ+v2RtKhKGZ+F8z7fI8v
27
- fp9AGztXcKpguspH/WkOxfFOxQG91gMBNDV/5Zhl/2/JMM2lSt64iz12qZPqvDWa
28
- n7Yk5vUX3gcZnfRl34Q5g+irPcjvBRMvYtcGdGR9S5rFoRBIwL11Air5U3W1A59m
29
- WtDnRyUCYAhLf/9oAoeeFNFp1H13yw2yiO+upixRUEt6pqQFl3++eDh82JS/2nqL
30
- IIkRAfg3vUhmtNQu26Gsi9aZcJAGPKIjdRuYc9oyiGpJv0cQ02HBGRUXnoKS7XYT
31
- QDc=
13
+ MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjIwMjIzMTUzMzE5WhcN
15
+ MjMwMjIzMTUzMzE5WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDWmjYL
17
+ IR4zoF/hk/SSxW9ZZzMGjubXOClxkkl2RGOAZ5oGgZeD6YdMMor9B73meQTMpxM+
18
+ EMmGBnZmKzdEhvBoDxNI2UWIOCwqyfFKT2Ze+1q5vaBK0TFDjjkKxUnRKNiRO5hM
19
+ JCHn7Bd+V1Tgnb4nRACYQPKFG0625tiDkd089e6tBrVNFABu+YW5sC7rzV8/XXJ7
20
+ 7M36D+ItmQiDf0UlA8wCC0StjAgaM6bf7IHwSVJWpM065U+oTmujZ9rcZ2VuIzw2
21
+ ZQ+h/94kA56xj+2XKWGSmQk6mUZ4HP6z34+ZzQU+YN/fxtT1aISbvAZZ8lGYwQG4
22
+ RG9D87HMPCW3Q8SaKhzinA8rvhcFHRe9WJoHn6ulpK0jOGM9u7Du5V1uNV9PItK+
23
+ YxfZ+a6dQ6hSZRcYpNubYu5dp12AIX/8Du1qjMhvsk7mFsGzkJ4NvtwtmIqc3qP5
24
+ hXIZIIMpwGZ4xmpWLjg3vqu1gnVc5p+2vngvSxrkngufYF9ZDEq7u4uGf8kCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUZ3pWGV05
26
+ 7oGraWfSUYyZHLGZH1swJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
+ c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
+ BgkqhkiG9w0BAQsFAAOCAYEABVd3ECVIm82hELIIyaVOsQ8ZdxVmCI5isFhjalJo
29
+ upTEFiZsS/KOTaycNi5U0K72E540R/MB6opipy58heaVh/ie+aPhrI5ct5aOu/RG
30
+ fIh2wiyDTshvCcGWjwWevePD/VaeFEBoSaim8ockSx5TISpIFrodxErcqvKySntb
31
+ 4mOS6YHEQsAC0/C7Ub9s7HY6ArJtuOqL4gmX4OrxwbSZATqz2LVtckKWweCnyo7m
32
+ 4sVS12iJ0rgRvnnhyehZu6ByXw8MVb3kWWG6jknwaWRj5B2fZffle9kZwIuZMd/R
33
+ cReZ9fcYojHfZw/h5kYBkCLA0pHhob+WtF1zY2TUfi6g6NTVRPaCyMZcxY+EAiGY
34
+ 2zF4H0zwaFRpQPz7UD7JUDgbXZaVGEMWULk6GFFC+sQ3k7OwsnaBUiFc0YI/i6eI
35
+ tOVtEJTcR/mCCj9KJXJqr+WfYnPrHMAUTU1yY/yIYUC3PRK4iCVNABYrrx1/knM5
36
+ P80D+02gWIUT41dw6mBHO32N
32
37
  -----END CERTIFICATE-----
33
- date: 2018-04-14 00:00:00.000000000 Z
38
+ date: 2022-02-23 00:00:00.000000000 Z
34
39
  dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: nokogiri
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.13'
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 1.13.3
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '1.13'
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 1.13.3
35
60
  - !ruby/object:Gem::Dependency
36
61
  name: pxindex-builder
37
62
  requirement: !ruby/object:Gem::Requirement
@@ -41,7 +66,7 @@ dependencies:
41
66
  version: '0.2'
42
67
  - - ">="
43
68
  - !ruby/object:Gem::Version
44
- version: 0.2.0
69
+ version: 0.2.1
45
70
  type: :runtime
46
71
  prerelease: false
47
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -51,29 +76,29 @@ dependencies:
51
76
  version: '0.2'
52
77
  - - ">="
53
78
  - !ruby/object:Gem::Version
54
- version: 0.2.0
79
+ version: 0.2.1
55
80
  - !ruby/object:Gem::Dependency
56
81
  name: polyrex-headings
57
82
  requirement: !ruby/object:Gem::Requirement
58
83
  requirements:
59
84
  - - "~>"
60
85
  - !ruby/object:Gem::Version
61
- version: '0.1'
86
+ version: '0.3'
62
87
  - - ">="
63
88
  - !ruby/object:Gem::Version
64
- version: 0.1.9
89
+ version: 0.3.0
65
90
  type: :runtime
66
91
  prerelease: false
67
92
  version_requirements: !ruby/object:Gem::Requirement
68
93
  requirements:
69
94
  - - "~>"
70
95
  - !ruby/object:Gem::Version
71
- version: '0.1'
96
+ version: '0.3'
72
97
  - - ">="
73
98
  - !ruby/object:Gem::Version
74
- version: 0.1.9
99
+ version: 0.3.0
75
100
  description:
76
- email: james@jamesrobertson.eu
101
+ email: digital.robertson@gmail.com
77
102
  executables: []
78
103
  extensions: []
79
104
  extra_rdoc_files: []
@@ -98,8 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
123
  - !ruby/object:Gem::Version
99
124
  version: '0'
100
125
  requirements: []
101
- rubyforge_project:
102
- rubygems_version: 2.6.13
126
+ rubygems_version: 3.2.22
103
127
  signing_key:
104
128
  specification_version: 4
105
129
  summary: Experimental gem to facilitate a keyword search, by querying a Polyrex document
metadata.gz.sig CHANGED
Binary file