jstreebuilder 0.1.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 +7 -0
- checksums.yaml.gz.sig +0 -0
- data/lib/jstreebuilder.rb +214 -0
- data.tar.gz.sig +0 -0
- metadata +130 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f98c98e0ff99dffced50db848f6f9ce57845c10c097bef510a26ceb1b3c8dcb8
|
4
|
+
data.tar.gz: 3dae6f056654e23b0ae5c77f59a616702675fdaf9cb66e63fc4ad0b6f60c454b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3aef11d3b58a5b25b70ad72f9101ec95c8de4d55c8dbf42e765f9fed3999e142befdb5b3eb29d13595ba1a222de571dd16ef7c0213ce1adf3f930477c4b36d86
|
7
|
+
data.tar.gz: def0b33e5777d7b780f9d5805cc3f57cee0b2ba5cb82faf697fc71fa02286d1982e5248f80f174e72bc73d9da3f921230a39ec3f9ec7849049c94dfec1fc8628
|
checksums.yaml.gz.sig
ADDED
Binary file
|
@@ -0,0 +1,214 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# file: jstreebuilder.rb
|
4
|
+
|
5
|
+
require 'nokogiri'
|
6
|
+
require 'polyrex-xslt'
|
7
|
+
require 'polyrex'
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
XSLT = %q[
|
12
|
+
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
|
13
|
+
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
|
14
|
+
<xsl:template match='entries'>
|
15
|
+
|
16
|
+
<xsl:element name='ul'>
|
17
|
+
<xsl:attribute name='id'>myUL</xsl:attribute>
|
18
|
+
<xsl:apply-templates select='records/entry' />
|
19
|
+
</xsl:element>
|
20
|
+
|
21
|
+
</xsl:template>
|
22
|
+
|
23
|
+
<xsl:template match='entry'>
|
24
|
+
|
25
|
+
<xsl:choose>
|
26
|
+
<xsl:when test='records/entry'>
|
27
|
+
|
28
|
+
<xsl:element name='li'>
|
29
|
+
|
30
|
+
<span class="caret"><xsl:value-of select='summary/title'/></span>
|
31
|
+
<ul class='nested'>
|
32
|
+
<xsl:apply-templates select='records/entry' />
|
33
|
+
</ul>
|
34
|
+
</xsl:element>
|
35
|
+
|
36
|
+
</xsl:when>
|
37
|
+
<xsl:otherwise>
|
38
|
+
<xsl:element name='li'>
|
39
|
+
<xsl:value-of select='summary/title'/>
|
40
|
+
</xsl:element>
|
41
|
+
</xsl:otherwise>
|
42
|
+
</xsl:choose>
|
43
|
+
|
44
|
+
</xsl:template>
|
45
|
+
|
46
|
+
</xsl:stylesheet>
|
47
|
+
]
|
48
|
+
|
49
|
+
|
50
|
+
class JsTreeBuilder
|
51
|
+
using ColouredText
|
52
|
+
|
53
|
+
TREE_CSS = %q[
|
54
|
+
/* Remove default bullets */
|
55
|
+
ul, #myUL {
|
56
|
+
list-style-type: none;
|
57
|
+
}
|
58
|
+
|
59
|
+
/* Remove margins and padding from the parent ul */
|
60
|
+
#myUL {
|
61
|
+
margin: 0;
|
62
|
+
padding: 0;
|
63
|
+
}
|
64
|
+
|
65
|
+
/* Style the caret/arrow */
|
66
|
+
.caret {
|
67
|
+
cursor: pointer;
|
68
|
+
user-select: none; /* Prevent text selection */
|
69
|
+
}
|
70
|
+
|
71
|
+
/* Create the caret/arrow with a unicode, and style it */
|
72
|
+
.caret::before {
|
73
|
+
content: "\25B6";
|
74
|
+
color: black;
|
75
|
+
display: inline-block;
|
76
|
+
margin-right: 6px;
|
77
|
+
}
|
78
|
+
|
79
|
+
/* Rotate the caret/arrow icon when clicked on (using JavaScript) */
|
80
|
+
.caret-down::before {
|
81
|
+
transform: rotate(90deg);
|
82
|
+
}
|
83
|
+
|
84
|
+
/* Hide the nested list */
|
85
|
+
.nested {
|
86
|
+
display: none;
|
87
|
+
}
|
88
|
+
|
89
|
+
/* Show the nested list when the user clicks on the caret/arrow (with JavaScript) */
|
90
|
+
.active {
|
91
|
+
display: block;
|
92
|
+
}
|
93
|
+
]
|
94
|
+
|
95
|
+
TREE_JS =<<EOF
|
96
|
+
var toggler = document.getElementsByClassName("caret");
|
97
|
+
var i;
|
98
|
+
|
99
|
+
for (i = 0; i < toggler.length; i++) {
|
100
|
+
toggler[i].addEventListener("click", function() {
|
101
|
+
this.parentElement.querySelector(".nested").classList.toggle("active");
|
102
|
+
this.classList.toggle("caret-down");
|
103
|
+
});
|
104
|
+
}
|
105
|
+
EOF
|
106
|
+
|
107
|
+
|
108
|
+
attr_reader :html, :css, :js
|
109
|
+
|
110
|
+
def initialize(unknown=nil, options={})
|
111
|
+
|
112
|
+
if unknown.is_a? String or unknown.is_a? Symbol then
|
113
|
+
type = unknown.to_sym
|
114
|
+
elsif unknown.is_a? Hash
|
115
|
+
options = unknown
|
116
|
+
end
|
117
|
+
|
118
|
+
@debug = options[:debug]
|
119
|
+
|
120
|
+
@types = %i(tree)
|
121
|
+
|
122
|
+
build(type, options) if type
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
def to_css()
|
127
|
+
@css
|
128
|
+
end
|
129
|
+
|
130
|
+
def to_html()
|
131
|
+
@html
|
132
|
+
end
|
133
|
+
|
134
|
+
def to_js()
|
135
|
+
@js
|
136
|
+
end
|
137
|
+
|
138
|
+
def to_ul()
|
139
|
+
@ul
|
140
|
+
end
|
141
|
+
|
142
|
+
def to_webpage()
|
143
|
+
|
144
|
+
a = RexleBuilder.build do |xml|
|
145
|
+
xml.html do
|
146
|
+
xml.head do
|
147
|
+
xml.meta name: "viewport", content: \
|
148
|
+
"width=device-width, initial-scale=1"
|
149
|
+
xml.style "\nbody {font-family: Arial;}\n\n" + @css
|
150
|
+
end
|
151
|
+
xml.body @ul
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
doc = Rexle.new(a)
|
156
|
+
|
157
|
+
doc.root.element('body').add \
|
158
|
+
Rexle::Element.new('script').add_text "\n" +
|
159
|
+
@js.gsub(/^ +\/\/[^\n]+\n/,'')
|
160
|
+
|
161
|
+
"<!DOCTYPE html>\n" + doc.xml(pretty: true, declaration: false)\
|
162
|
+
.gsub(/<\/div>/,'\0' + "\n").gsub(/\n *<!--[^>]+>/,'')
|
163
|
+
|
164
|
+
end
|
165
|
+
|
166
|
+
def to_xml()
|
167
|
+
@xml
|
168
|
+
end
|
169
|
+
|
170
|
+
|
171
|
+
private
|
172
|
+
|
173
|
+
def build(type, options)
|
174
|
+
|
175
|
+
puts 'inside build'.info if @debug
|
176
|
+
puts "type: %s\noptions: %s".debug % [type, options] if @debug
|
177
|
+
|
178
|
+
return unless @types.include? type.to_sym
|
179
|
+
|
180
|
+
s = method(type.to_sym).call(options)
|
181
|
+
|
182
|
+
@html = s.gsub(/<\/div>/,'\0' + "\n").strip.lines[1..-2]\
|
183
|
+
.map {|x| x.sub(/^ /,'') }.join
|
184
|
+
|
185
|
+
@css = Object.const_get 'JsTreeBuilder::' + type.to_s.upcase + '_CSS'
|
186
|
+
@js = Object.const_get 'JsTreeBuilder::' + type.to_s.upcase + '_JS'
|
187
|
+
|
188
|
+
end
|
189
|
+
|
190
|
+
|
191
|
+
def tree(opt={})
|
192
|
+
|
193
|
+
tree = opt[:xml]
|
194
|
+
|
195
|
+
schema = 'entries/entry[title]'
|
196
|
+
xslt_schema = 'tree/item[@title:title]'
|
197
|
+
|
198
|
+
# transform the tree xml into a polyrex document
|
199
|
+
pxsl = PolyrexXSLT.new(schema: schema, xslt_schema: xslt_schema).to_xslt
|
200
|
+
puts 'pxsl: ' + pxsl if @debug
|
201
|
+
px = Polyrex.new(Rexslt.new(pxsl, tree).to_s)
|
202
|
+
|
203
|
+
# transform the polyrex xml into a nested HTML list
|
204
|
+
#@ul = Rexslt.new(px.to_xml, XSLT).to_xml
|
205
|
+
|
206
|
+
doc = Nokogiri::XML(px.to_xml)
|
207
|
+
xslt = Nokogiri::XSLT(XSLT)
|
208
|
+
|
209
|
+
@ul = xslt.transform(doc).to_s.lines[1..-1].join
|
210
|
+
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
214
|
+
|
data.tar.gz.sig
ADDED
Binary file
|
metadata
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jstreebuilder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- James Robertson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
|
14
|
+
YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTkwODA1MjExNDQ4WhcN
|
15
|
+
MjAwODA0MjExNDQ4WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
|
16
|
+
cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCxe/SK
|
17
|
+
P63fEkWwc5zLyS7cQUh1CpPliXajuIL1pUxMyF0FBxs+GId3IZhCF8/3+RMVnz/e
|
18
|
+
Gs0J9nDBrCctAHSi6VsjFocmiXqu96sx9Fxfs5wTqyT4fD22LoTBNVUZ0pZfxaBm
|
19
|
+
G6ztBF1dmnrmsSCtLnqioX2rQFyrbIty+y0GkKGbqiV2CMKheQXvfg/4TOElklND
|
20
|
+
jGe1sMwfvOKKR0Xrwfp6V/AU4ecf9jLqVttS+cPspdDowzhDrHmWBGhIEo0ccRXb
|
21
|
+
OpTN30OrA+q/WVZBUIiySYcpW1W8JJFhLDi0WMfoPoQ5C2D91adRaQKHwZT4iDen
|
22
|
+
usRE9oHWuebCV8wW/I2MqexyBrbDu2k9qQryhufDxeRZT1dbx7meNPSHQ1Ktm21D
|
23
|
+
qOOPYpl7OlSr+UP7NwPBWxXB3jLxhe5onyIXKTP/vUQ19Swo2Kx2YJyWpOfrNOOA
|
24
|
+
ODSx83g/N/FdgI+dUkAPvtefU9+IQuCRWsQAk1XycafEFcTkNVD5D0Hqp6sCAwEA
|
25
|
+
AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU54E03Y+Y
|
26
|
+
1F5Sszs2IG3vqhesBXYwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
|
27
|
+
c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
|
28
|
+
BgkqhkiG9w0BAQsFAAOCAYEAW1T6VR0ML0Xu0ryrjPVwPa3x5h2tj/YcHEmWDre+
|
29
|
+
7nN5I8Rrgg76JYkjBWIf3Dr2WYPsga4w5NK0wPScphv5U9cwfIA5r0gFroflcug+
|
30
|
+
DlC5yiNmOyih46eCeoLfyzmIORM0Ejn0Vq2pqcyEW+vEUB1EFvqMKgfcdRfplKil
|
31
|
+
qT2TvvEPSatX8dBwGXEEE03ID2NA4xU/fXEfLu22zO1aMKuwSNJm1wnJAcErkVnF
|
32
|
+
ddfalc7UNj3/gt2eE3EZo1x1U7Gbnwzix6AU2XFAzjMhlVgg+iCW4ie2tkaEF52z
|
33
|
+
3JGvpw6sa5K3VjrnW146I3D1yhCuCToLwLZ4evDjS9HWifxzwWBQmAMhvZf4YOCv
|
34
|
+
uBJ1bPJvkq1hhYuPfw6FEXgyodyKcU98x77XUgJk7leb6jN1nXiWx5Ox1/TQL8WX
|
35
|
+
/YHvF368/KpwUw6rBLVUbFvCsNvDTe+bPAG72P5om2g/aope7mb9Qc4kATQgWiys
|
36
|
+
rqRI7UAQ3N9ojGSXl6KSySfi
|
37
|
+
-----END CERTIFICATE-----
|
38
|
+
date: 2019-08-05 00:00:00.000000000 Z
|
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.10'
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 1.10.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.10'
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 1.10.3
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: polyrex
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 1.3.0
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '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.3.0
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.3'
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: polyrex-xslt
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: 0.2.0
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.2'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.2.0
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0.2'
|
100
|
+
description:
|
101
|
+
email: james@jamesrobertson.eu
|
102
|
+
executables: []
|
103
|
+
extensions: []
|
104
|
+
extra_rdoc_files: []
|
105
|
+
files:
|
106
|
+
- lib/jstreebuilder.rb
|
107
|
+
homepage: https://github.com/jrobertson/jstreebuilder
|
108
|
+
licenses:
|
109
|
+
- MIT
|
110
|
+
metadata: {}
|
111
|
+
post_install_message:
|
112
|
+
rdoc_options: []
|
113
|
+
require_paths:
|
114
|
+
- lib
|
115
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
requirements: []
|
126
|
+
rubygems_version: 3.0.1
|
127
|
+
signing_key:
|
128
|
+
specification_version: 4
|
129
|
+
summary: Generates an HTML tree from XML.
|
130
|
+
test_files: []
|
metadata.gz.sig
ADDED
Binary file
|