mini_transformer 0.0.1
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.
- data/.gitignore +28 -0
- data/.rvmrc +3 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/Guardfile +22 -0
- data/LICENSE.txt +20 -0
- data/README.md +75 -0
- data/Rakefile +10 -0
- data/bin/mini_transform +7 -0
- data/lib/mini_transformer.rb +124 -0
- data/lib/mini_transformer/book.rb +17 -0
- data/lib/mini_transformer/cli.rb +33 -0
- data/lib/mini_transformer/entry.rb +13 -0
- data/lib/mini_transformer/format.xsl +45 -0
- data/lib/mini_transformer/html.rb +94 -0
- data/lib/mini_transformer/key_list.rb +14 -0
- data/lib/mini_transformer/version.rb +3 -0
- data/mini_transformer.gemspec +36 -0
- data/spec/fixtures/TP40010215.html +31 -0
- data/spec/fixtures/bad_xml.xml +4 -0
- data/spec/fixtures/input.json +5 -0
- data/spec/fixtures/input.xml +27 -0
- data/spec/fixtures/mapping.yml +3 -0
- data/spec/fixtures/no_uid.json +4 -0
- data/spec/fixtures/ol_mapping.yml +3 -0
- data/spec/fixtures/table_mapping.yml +4 -0
- data/spec/fixtures/ul_mapping.yml +3 -0
- data/spec/mini_transformer/book_spec.rb +21 -0
- data/spec/mini_transformer/cli_spec.rb +46 -0
- data/spec/mini_transformer/entry_spec.rb +24 -0
- data/spec/mini_transformer/key_list_spec.rb +16 -0
- data/spec/mini_transformer_spec.rb +146 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/support/helpers.rb +57 -0
- data/spec/support/ruby_ext.rb +20 -0
- metadata +208 -0
data/.gitignore
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
*.gem
|
2
|
+
.bundle
|
3
|
+
Gemfile.lock
|
4
|
+
pkg/*
|
5
|
+
*.gem
|
6
|
+
*.rbc
|
7
|
+
.bundle
|
8
|
+
.config
|
9
|
+
coverage
|
10
|
+
InstalledFiles
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
|
19
|
+
.DS_Store
|
20
|
+
|
21
|
+
# Thumbnails
|
22
|
+
._*
|
23
|
+
|
24
|
+
# Files that might appear on external disk
|
25
|
+
.Spotlight-V100
|
26
|
+
.Trashes
|
27
|
+
|
28
|
+
.idea/workspace.xml
|
data/.rvmrc
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'rspec', :version => 2 do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
|
9
|
+
# Rails example
|
10
|
+
watch(%r{^spec/.+_spec\.rb$})
|
11
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
12
|
+
watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
13
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
14
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
15
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
16
|
+
watch('spec/spec_helper.rb') { "spec" }
|
17
|
+
watch('config/routes.rb') { "spec/routing" }
|
18
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
19
|
+
# Capybara request specs
|
20
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
|
21
|
+
end
|
22
|
+
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 John Wang, http://johntwang.com
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# Mini Transformer - [](http://travis-ci.org/jwang/mini_transformer)
|
2
|
+
|
3
|
+
# Description
|
4
|
+
Mini Transformer takes a pair of input files, JSON and XML, then converts it to HTML5 or JSON format. It also supports a mapping of the children elements to HTML elements via YAML mapping file.
|
5
|
+
|
6
|
+
# Installation
|
7
|
+
`gem install mini_transformer`
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
`mini_transform transform [JSON, XML, OUTPUT=nil, FORMAT=html, MAPPING=nil]`
|
11
|
+
|
12
|
+
Requires the input.json and input.xml, if neither is provided or found, a File Not Found error will occur.
|
13
|
+
|
14
|
+
#### Options
|
15
|
+
* An output file name such as output.html. Defaults to UID tag or output if not available.
|
16
|
+
* 2 different output formats supported, html or json. Defaults to html.
|
17
|
+
* A YAML mapping configuration file for the entries tags to convert to HTML tags. Only available for html output format. Defaults to dt and dd tags.
|
18
|
+
|
19
|
+
#### Example Usage
|
20
|
+
`mini_transform transform input.json, input.xml`
|
21
|
+
`mini_transform transform input.json, input.xml, out.json, json`
|
22
|
+
`mini_transform transform input.json, input.xml, nil, json`
|
23
|
+
`mini_transform transform input.json, input.xml, out.html, html, mapping.yml`
|
24
|
+
`mini_transform transform input.json, input.xml, nil, html, mapping.yml`
|
25
|
+
|
26
|
+
#### Configuration
|
27
|
+
Example Mapping YAML - mapping.yml
|
28
|
+
`entries: dl
|
29
|
+
key-name: dt
|
30
|
+
key-description: dd`
|
31
|
+
|
32
|
+
## Dependencies
|
33
|
+
* [Nokogiri](nokogiri.org)
|
34
|
+
* ActiveSupport
|
35
|
+
* [JSON](http://flori.github.com/json)
|
36
|
+
* [Thor](https://github.com/wycats/thor)
|
37
|
+
|
38
|
+
### Development Dependencies
|
39
|
+
* [RSpec 2](https://www.relishapp.com/rspec)
|
40
|
+
* [guard](https://github.com/guard/guard)
|
41
|
+
* [guard-rspec](https://github.com/guard/guard-rspec)
|
42
|
+
* [simplecov](https://github.com/colszowka/simplecov)
|
43
|
+
* rb-fsevent (Mac OSX only)
|
44
|
+
* [growl_notify (Mac OSX only)](https://github.com/scottdavis/growl_notify)
|
45
|
+
|
46
|
+
### Additional Information
|
47
|
+
* [Test Coverage](http://johntwang.com/mini_transformer/coverage)
|
48
|
+
* [Travis CI Build Status](http://travis-ci.org/jwang/mini_transformer)
|
49
|
+
|
50
|
+
|
51
|
+
#### Known Issues
|
52
|
+
* Ruby 1.8.7 alphabetizes the meta tags. Meaning :id and :content are swapped when written to file.
|
53
|
+
|
54
|
+
|
55
|
+
## MIT License
|
56
|
+
Copyright (c) 2011 John Wang, http://johntwang.com
|
57
|
+
|
58
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
59
|
+
a copy of this software and associated documentation files (the
|
60
|
+
"Software"), to deal in the Software without restriction, including
|
61
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
62
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
63
|
+
permit persons to whom the Software is furnished to do so, subject to
|
64
|
+
the following conditions:
|
65
|
+
|
66
|
+
The above copyright notice and this permission notice shall be
|
67
|
+
included in all copies or substantial portions of the Software.
|
68
|
+
|
69
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
70
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
71
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
72
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
73
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
74
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
75
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
data/bin/mini_transform
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'open-uri'
|
4
|
+
require 'json'
|
5
|
+
require 'yaml'
|
6
|
+
require 'nokogiri'
|
7
|
+
require 'active_support/inflector' # added for .underscore and .dasherize
|
8
|
+
require "thor"
|
9
|
+
require "mini_transformer/version"
|
10
|
+
require "mini_transformer/cli"
|
11
|
+
require "mini_transformer/book"
|
12
|
+
require "mini_transformer/key_list"
|
13
|
+
require "mini_transformer/entry"
|
14
|
+
require "mini_transformer/html"
|
15
|
+
|
16
|
+
module MiniTransformer
|
17
|
+
class Parser
|
18
|
+
def setup(json_input_filename, xml_input_filename, output=nil, format="html", mapping=nil)
|
19
|
+
if File.exists?(xml_input_filename) && File.exists?(json_input_filename)
|
20
|
+
xml_input_file = File.open(xml_input_filename)
|
21
|
+
json_input = File.open(json_input_filename)
|
22
|
+
json_contents = ""
|
23
|
+
json_input.each do |line|
|
24
|
+
json_contents = json_contents + line
|
25
|
+
end
|
26
|
+
json_data = JSON.parse json_contents
|
27
|
+
|
28
|
+
if File.extname(xml_input_filename) == ".xml"
|
29
|
+
@document = Nokogiri::XML(xml_input_file, nil, 'UTF-8')
|
30
|
+
end
|
31
|
+
else
|
32
|
+
raise "File Not Found."
|
33
|
+
end
|
34
|
+
|
35
|
+
unless output.nil?
|
36
|
+
# set up the ouput HTML file to write to
|
37
|
+
@output = output
|
38
|
+
end
|
39
|
+
|
40
|
+
unless mapping.nil?
|
41
|
+
@mapping = open(mapping) {|f| YAML.load(f) }
|
42
|
+
end
|
43
|
+
|
44
|
+
@book = Book.new
|
45
|
+
@book.key_list = KeyList.new
|
46
|
+
|
47
|
+
@book.title = json_data["title"] if json_data["title"]
|
48
|
+
@book.type = json_data["type"] if json_data["type"]
|
49
|
+
@book.uid = json_data["uid"] if json_data["uid"]
|
50
|
+
|
51
|
+
xml_input_file.close
|
52
|
+
json_input.close
|
53
|
+
end
|
54
|
+
|
55
|
+
def validate
|
56
|
+
if !@document.errors.empty?
|
57
|
+
raise "Malformed XML"
|
58
|
+
end
|
59
|
+
@document.errors
|
60
|
+
end
|
61
|
+
|
62
|
+
def parse
|
63
|
+
@book.id = @document.root.attribute_nodes.first.content if @document.root.attribute_nodes.size > 0
|
64
|
+
@book.introduction = @document.xpath("//Book//Introduction//Para")
|
65
|
+
|
66
|
+
keylist = @document.xpath("//Book//KeyList")
|
67
|
+
entries = @document.xpath("//Book//KeyList//Entries")
|
68
|
+
|
69
|
+
@book.key_list.name = keylist.at_xpath("//Name").text
|
70
|
+
@book.key_list.key_label = keylist.at_xpath("//KeyLabel").text
|
71
|
+
@book.key_list.description_label = keylist.at_xpath("//DescriptionLabel").text
|
72
|
+
@book.key_list.entries = Array.new
|
73
|
+
|
74
|
+
entries.children.each do |entry|
|
75
|
+
if entry.class == Nokogiri::XML::Element
|
76
|
+
book_entry = Entry.new
|
77
|
+
entry.children.each do |child|
|
78
|
+
if child.class == Nokogiri::XML::Element
|
79
|
+
if child.name == "KeyName"
|
80
|
+
book_entry.key_name = child.content
|
81
|
+
elsif child.name == "Description"
|
82
|
+
book_entry.description = child.content
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
@book.key_list.entries << book_entry
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def to_json
|
92
|
+
json = JSON.pretty_generate @book
|
93
|
+
# Save the JSON file
|
94
|
+
if @output
|
95
|
+
File.open(@output, "w") { |f| f << json }
|
96
|
+
else
|
97
|
+
if @book.uid.nil?
|
98
|
+
File.open("output.json", "w") { |f| f << json }
|
99
|
+
else
|
100
|
+
File.open("#{@book.uid}.json", "w") { |f| f << json }
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def to_html
|
106
|
+
html = MiniTransformer::generate_html(@book, @mapping)
|
107
|
+
|
108
|
+
# Save the HTML file
|
109
|
+
if @output
|
110
|
+
File.open(@output, "w") { |f| f << html }
|
111
|
+
else
|
112
|
+
if @book.uid.nil?
|
113
|
+
File.open("output.html", "w") { |f| f << html }
|
114
|
+
else
|
115
|
+
File.open("#{@book.uid}.html", "w") { |f| f << html }
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# return the HTML file as a string
|
120
|
+
html
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module MiniTransformer
|
2
|
+
class Book
|
3
|
+
attr_accessor :id, :title, :uid, :type, :introduction, :key_list
|
4
|
+
|
5
|
+
def to_json(*a)
|
6
|
+
{
|
7
|
+
'uid' => self.uid,
|
8
|
+
'type' => self.type,
|
9
|
+
'title' => self.title,
|
10
|
+
'id' => self.id,
|
11
|
+
'introduction' => self.introduction,
|
12
|
+
"key-list" => self.key_list.to_json
|
13
|
+
}.to_json(*a)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module MiniTransformer
|
2
|
+
class CLI < Thor
|
3
|
+
include Thor::Actions
|
4
|
+
|
5
|
+
desc "transform [JSON, XML, OUTPUT, FORMAT, MAPPING]", "Transform the files into format"
|
6
|
+
def transform(json, xml, output=nil, format="html", mapping=nil)
|
7
|
+
if output.nil?
|
8
|
+
output = "#{Dir.pwd}/test.html"
|
9
|
+
end
|
10
|
+
|
11
|
+
@parser = MiniTransformer::Parser.new
|
12
|
+
@parser.setup(json, xml, output, format, mapping)
|
13
|
+
@parser.validate
|
14
|
+
@parser.parse
|
15
|
+
|
16
|
+
if format == "json"
|
17
|
+
@parser.to_json
|
18
|
+
else
|
19
|
+
@parser.to_html
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
map %w(-t --transform) => :transform
|
24
|
+
|
25
|
+
desc "version", "Prints the bundler's version information"
|
26
|
+
def version
|
27
|
+
puts "Mini Transform version #{MiniTransformer::VERSION}"
|
28
|
+
"Mini Transform version #{MiniTransformer::VERSION}"
|
29
|
+
#Bundler.ui.info "Bundler version #{Bundler::VERSION}"
|
30
|
+
end
|
31
|
+
map %w(-v --version) => :version
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
2
|
+
<xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes"/>
|
3
|
+
<xsl:param name="indent-increment" select="' '"/>
|
4
|
+
<xsl:template name="newline">
|
5
|
+
<xsl:text disable-output-escaping="yes">
|
6
|
+
</xsl:text>
|
7
|
+
</xsl:template>
|
8
|
+
|
9
|
+
<xsl:template match="comment() | processing-instruction()">
|
10
|
+
<xsl:param name="indent" select="''"/>
|
11
|
+
<xsl:call-template name="newline"/>
|
12
|
+
<xsl:value-of select="$indent"/>
|
13
|
+
<xsl:copy />
|
14
|
+
</xsl:template>
|
15
|
+
|
16
|
+
<xsl:template match="text()">
|
17
|
+
<xsl:param name="indent" select="''"/>
|
18
|
+
<xsl:call-template name="newline"/>
|
19
|
+
<xsl:value-of select="$indent"/>
|
20
|
+
<xsl:value-of select="normalize-space(.)"/>
|
21
|
+
</xsl:template>
|
22
|
+
|
23
|
+
<xsl:template match="text()[normalize-space(.)='']"/>
|
24
|
+
|
25
|
+
<xsl:template match="*">
|
26
|
+
<xsl:param name="indent" select="''"/>
|
27
|
+
<xsl:call-template name="newline"/>
|
28
|
+
<xsl:value-of select="$indent"/>
|
29
|
+
<xsl:choose>
|
30
|
+
<xsl:when test="count(child::*) > 0">
|
31
|
+
<xsl:copy>
|
32
|
+
<xsl:copy-of select="@*"/>
|
33
|
+
<xsl:apply-templates select="*|text()">
|
34
|
+
<xsl:with-param name="indent" select="concat ($indent, $indent-increment)"/>
|
35
|
+
</xsl:apply-templates>
|
36
|
+
<xsl:call-template name="newline"/>
|
37
|
+
<xsl:value-of select="$indent"/>
|
38
|
+
</xsl:copy>
|
39
|
+
</xsl:when>
|
40
|
+
<xsl:otherwise>
|
41
|
+
<xsl:copy-of select="."/>
|
42
|
+
</xsl:otherwise>
|
43
|
+
</xsl:choose>
|
44
|
+
</xsl:template>
|
45
|
+
</xsl:stylesheet>
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module MiniTransformer
|
2
|
+
|
3
|
+
def self.generate_html(resource, mapping=nil)
|
4
|
+
#puts "generate html"
|
5
|
+
builder = Nokogiri::HTML::Builder.new(:encoding => 'utf-8') do |doc|
|
6
|
+
doc.html(:lang=> "en") {
|
7
|
+
doc.head {
|
8
|
+
doc.meta(:id => "book-resource-type", :content => resource.type)
|
9
|
+
doc.meta(:id => "identifier", :content => "//apple_ref/doc/uid/#{resource.uid}")
|
10
|
+
doc.title(resource.title)
|
11
|
+
}
|
12
|
+
|
13
|
+
doc.body() {
|
14
|
+
doc.header {
|
15
|
+
doc.text "\n"
|
16
|
+
resource.introduction.children.each do |para|
|
17
|
+
doc.p(para.text)
|
18
|
+
end
|
19
|
+
doc.text "\n"
|
20
|
+
}
|
21
|
+
|
22
|
+
doc.text "\n"
|
23
|
+
|
24
|
+
doc.details {
|
25
|
+
doc.text "\n"
|
26
|
+
doc.summary(:class => "key-list-name") {doc.text resource.key_list.name}
|
27
|
+
doc.text "\n"
|
28
|
+
}
|
29
|
+
|
30
|
+
doc.div(:class => "key-list") {
|
31
|
+
doc.text "\n"
|
32
|
+
doc.span(:class => "key-label") {
|
33
|
+
doc.text resource.key_list.key_label
|
34
|
+
}
|
35
|
+
doc.text "\n"
|
36
|
+
doc.span(:class => "description-label") {
|
37
|
+
doc.text resource.key_list.description_label
|
38
|
+
}
|
39
|
+
doc.text "\n"
|
40
|
+
|
41
|
+
if mapping
|
42
|
+
doc.send(mapping['entries'], :class => 'entries') {
|
43
|
+
resource.key_list.entries.each do |entry|
|
44
|
+
if mapping['entry']
|
45
|
+
doc.send(mapping['entry'], :class => 'entry') {
|
46
|
+
doc.send(mapping['key-name'], :class => 'key-name') {
|
47
|
+
doc.text entry.key_name
|
48
|
+
}
|
49
|
+
doc.send(mapping['key-description'], :class => 'key-description') {
|
50
|
+
doc.text entry.description
|
51
|
+
}
|
52
|
+
}
|
53
|
+
else
|
54
|
+
doc.send(mapping['key-name'], :class => 'key-name') {
|
55
|
+
doc.text entry.key_name
|
56
|
+
}
|
57
|
+
doc.send(mapping['key-description'], :class => 'key-description') {
|
58
|
+
doc.text entry.description
|
59
|
+
}
|
60
|
+
end
|
61
|
+
end
|
62
|
+
}
|
63
|
+
else
|
64
|
+
doc.dl(:class => "entries") {
|
65
|
+
resource.key_list.entries.each do |entry|
|
66
|
+
doc.dt(:class => 'key-name') {
|
67
|
+
doc.text entry.key_name
|
68
|
+
}
|
69
|
+
doc.dd(:class => 'key-description') {
|
70
|
+
doc.text entry.description
|
71
|
+
}
|
72
|
+
end
|
73
|
+
}
|
74
|
+
end
|
75
|
+
}
|
76
|
+
}
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
html = builder.to_html
|
81
|
+
|
82
|
+
# Use an XSLT Stylesheet to pretty generate the HTML file. Adjustments follow.
|
83
|
+
xsl = Nokogiri::XSLT(File.read(File.join(File.dirname(__FILE__), "format.xsl")))
|
84
|
+
html = xsl.apply_to(Nokogiri::HTML html).to_s
|
85
|
+
|
86
|
+
# Nokogiri's HTML Builder creates an HTML4 file and cannot be easily changed due to DTD Validation
|
87
|
+
html = html.gsub(/<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd">\n/, '<!DOCTYPE html>')
|
88
|
+
|
89
|
+
# Realign the meta tag that is added by the XSLT transform with Nokogiri
|
90
|
+
html = html.gsub(/<meta http-equiv=\"Content-Type\" content=\"text\/html; charset=UTF-8\">\s+$/, ' <meta http-equiv="Content-Type" content="text/html; charset=utf-8">')
|
91
|
+
html = html.gsub(/UTF-8/, 'utf-8')
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module MiniTransformer
|
2
|
+
class KeyList
|
3
|
+
attr_accessor :name, :key_label, :description_label, :entries
|
4
|
+
|
5
|
+
def to_json(*a)
|
6
|
+
{
|
7
|
+
'name' => self.name,
|
8
|
+
'key-label' => self.key_label,
|
9
|
+
'description-label' => self.description_label#,
|
10
|
+
}.to_json(*a)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "mini_transformer/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "mini_transformer"
|
7
|
+
s.version = MiniTransformer::VERSION
|
8
|
+
s.authors = ["John Wang"]
|
9
|
+
s.email = ["john@johntwang.com"]
|
10
|
+
s.homepage = "https://github.com/jwang/mini_transformer"
|
11
|
+
s.summary = %q{A converter for XML and JSON to HTML and JSON.}
|
12
|
+
s.description = %q{A configurable converter for XML and JSON to HTML and JSON.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "mini_transformer"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
#s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.executables = %w(mini_transform)
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
|
23
|
+
s.add_development_dependency "rspec"
|
24
|
+
s.add_development_dependency 'guard-rspec'
|
25
|
+
s.add_development_dependency 'mocha'
|
26
|
+
#s.add_development_dependency 'rb-fsevent'
|
27
|
+
#s.add_development_dependency 'growl_notify'
|
28
|
+
s.add_development_dependency 'rake'
|
29
|
+
s.add_development_dependency 'simplecov'
|
30
|
+
|
31
|
+
s.add_runtime_dependency "nokogiri"
|
32
|
+
s.add_runtime_dependency 'activesupport'
|
33
|
+
s.add_runtime_dependency 'i18n'
|
34
|
+
s.add_runtime_dependency 'json'
|
35
|
+
s.add_runtime_dependency "thor"
|
36
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
5
|
+
<meta id="book-resource-type" content="Reference">
|
6
|
+
<meta id="identifier" content="//apple_ref/doc/uid/TP40010215">
|
7
|
+
<title>Example of a Key List (a list of key/value pairs)</title>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<header>
|
11
|
+
<p>This book describes some common User Interface elements.</p>
|
12
|
+
<p>Use standard elements in favor of custom elements.
|
13
|
+
Do not create custom elements without a good reason.</p>
|
14
|
+
</header>
|
15
|
+
<details>
|
16
|
+
<summary class="key-list-name">Standard symbols for use in menus</summary>
|
17
|
+
</details>
|
18
|
+
<div class="key-list">
|
19
|
+
<span class="key-label">Symbol</span>
|
20
|
+
<span class="description-label">Meaning</span>
|
21
|
+
<dl class="entries">
|
22
|
+
<dt class="key-name">✓</dt>
|
23
|
+
<dd class="key-description">In the Window menu, the active document; in other menus, a setting that applies to the entire selection</dd>
|
24
|
+
<dt class="key-name">–</dt>
|
25
|
+
<dd class="key-description">A setting that applies to only part of the selection</dd>
|
26
|
+
<dt class="key-name">•</dt>
|
27
|
+
<dd class="key-description">A window with unsaved changes (typically, when Auto Save is not available)</dd>
|
28
|
+
</dl>
|
29
|
+
</div>
|
30
|
+
</body>
|
31
|
+
</html>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
2
|
+
<Book id="23">
|
3
|
+
<Introduction>
|
4
|
+
<Para>This book describes some common User Interface elements.</Para>
|
5
|
+
<Para>Use standard elements in favor of custom elements.
|
6
|
+
Do not create custom elements without a good reason.</Para>
|
7
|
+
</Introduction>
|
8
|
+
<KeyList>
|
9
|
+
<Name>Standard symbols for use in menus</Name>
|
10
|
+
<KeyLabel>Symbol</KeyLabel>
|
11
|
+
<DescriptionLabel>Meaning</DescriptionLabel>
|
12
|
+
<Entries>
|
13
|
+
<Entry>
|
14
|
+
<KeyName>✓</KeyName>
|
15
|
+
<Description>In the Window menu, the active document; in other menus, a setting that applies to the entire selection</Description>
|
16
|
+
</Entry>
|
17
|
+
<Entry>
|
18
|
+
<KeyName>–</KeyName>
|
19
|
+
<Description>A setting that applies to only part of the selection</Description>
|
20
|
+
</Entry>
|
21
|
+
<Entry>
|
22
|
+
<KeyName>•</KeyName>
|
23
|
+
<Description>A window with unsaved changes (typically, when Auto Save is not available)</Description>
|
24
|
+
</Entry>
|
25
|
+
</Entries>
|
26
|
+
</KeyList>
|
27
|
+
</Book>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'mini_transformer'
|
3
|
+
require 'mini_transformer/book'
|
4
|
+
|
5
|
+
describe "Book" do
|
6
|
+
|
7
|
+
context "Given a new Book" do
|
8
|
+
it "should respond to all Book attributes" do
|
9
|
+
@book = MiniTransformer::Book.new
|
10
|
+
expect { @book.title }.to_not raise_error
|
11
|
+
@book.respond_to?(:title).should be_true
|
12
|
+
@book.respond_to?(:id).should be_true
|
13
|
+
@book.respond_to?(:uid).should be_true
|
14
|
+
@book.respond_to?(:introduction).should be_true
|
15
|
+
@book.respond_to?(:key_list).should be_true
|
16
|
+
@book.respond_to?(:type).should be_true
|
17
|
+
|
18
|
+
@book.respond_to?(:adfadfasfasdff).should be_false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'mini_transformer'
|
3
|
+
require 'mini_transformer/cli'
|
4
|
+
|
5
|
+
describe "CLI" do
|
6
|
+
it "should check for a version" do
|
7
|
+
mini_transform :version, :exitstatus => true
|
8
|
+
@exitstatus.should eq(0)
|
9
|
+
out.should == "Mini Transform version 0.0.1"
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should be able to check version with -v" do
|
13
|
+
mini_transform "-v"
|
14
|
+
out.should == "Mini Transform version 0.0.1"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be able to check version with --version" do
|
18
|
+
mini_transform "--version"
|
19
|
+
out.should == "Mini Transform version 0.0.1"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "MiniTransformer::CLI" do
|
24
|
+
|
25
|
+
before(:all) do
|
26
|
+
@cli = MiniTransformer::CLI.new
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should check version" do
|
30
|
+
@cli.version.should == "Mini Transform version 0.0.1"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should run a minitransformer with input.json input.xml" do
|
34
|
+
@cli.transform("#{FIXTURES_DIR}/input.json", "#{FIXTURES_DIR}/input.xml")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should raise an error if the either the input.json or input.xml cannot be found" do
|
38
|
+
expect { @cli.transform("input.json", "input.xml") }.to raise_error(RuntimeError, "File Not Found.")
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
it "should be able to export out to json if format=json is given" do
|
43
|
+
@cli.transform("#{FIXTURES_DIR}/input.json", "#{FIXTURES_DIR}/input.xml", "ouput.json", "json")
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'mini_transformer'
|
3
|
+
require 'mini_transformer/entry'
|
4
|
+
|
5
|
+
describe "Entry" do
|
6
|
+
|
7
|
+
context "Given a new Entry" do
|
8
|
+
it "should respond to all Entry attributes" do
|
9
|
+
@entry = MiniTransformer::Entry.new
|
10
|
+
expect { @entry.key_name }.to_not raise_error
|
11
|
+
@entry.respond_to?(:key_name).should be_true
|
12
|
+
@entry.respond_to?(:description).should be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should convert to JSON" do
|
16
|
+
@entry = MiniTransformer::Entry.new
|
17
|
+
@entry.key_name = "-"
|
18
|
+
@entry.description = "A setting that applies to only part of the selection"
|
19
|
+
json = @entry.to_json
|
20
|
+
expect { JSON.parse json }.to_not raise_error(JSON::JSONError)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'mini_transformer'
|
3
|
+
require 'mini_transformer/key_list'
|
4
|
+
|
5
|
+
describe "KeyList" do
|
6
|
+
context "Given a new KeyList" do
|
7
|
+
it "should respond to all KeyList attributes" do
|
8
|
+
@key_list = MiniTransformer::KeyList.new
|
9
|
+
expect { @key_list.name }.to_not raise_error
|
10
|
+
@key_list.respond_to?(:name).should be_true
|
11
|
+
@key_list.respond_to?(:key_label).should be_true
|
12
|
+
@key_list.respond_to?(:description_label).should be_true
|
13
|
+
@key_list.respond_to?(:entries).should be_true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'mini_transformer'
|
3
|
+
require 'nokogiri'
|
4
|
+
|
5
|
+
describe MiniTransformer do
|
6
|
+
FIXTURES_DIR = File.join(File.dirname(__FILE__), "fixtures")
|
7
|
+
describe "Version" do
|
8
|
+
it "should have a version" do
|
9
|
+
MiniTransformer::VERSION.should_not be_nil
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "Parser" do
|
14
|
+
before(:all) do
|
15
|
+
@parser = MiniTransformer::Parser.new
|
16
|
+
@file = File.new(File.join(FIXTURES_DIR, "input.xml"), 'rb')
|
17
|
+
@json = File.new(File.join(FIXTURES_DIR, "input.json"), 'rb')
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should Ensure Valid file" do
|
21
|
+
badly_formed = <<-EOXML
|
22
|
+
<root>
|
23
|
+
<open>foo
|
24
|
+
<closed>bar</closed>
|
25
|
+
</root>
|
26
|
+
EOXML
|
27
|
+
|
28
|
+
bad_doc = Nokogiri::XML badly_formed
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should raise exception if passed in a bad file" do
|
32
|
+
expect { @parser.setup(@json, "input.xml") }.to raise_error(RuntimeError, "File Not Found.")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should setup with good XML" do
|
36
|
+
expect { @parser.setup(@json.path, @file.path) }.to_not raise_error
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should validate the XML format before continuing" do
|
40
|
+
@parser.setup(@json.path, @file.path)
|
41
|
+
@parser.validate.should be_empty
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should have errors on invalid XML" do
|
45
|
+
@bad_file = File.new(File.join(FIXTURES_DIR, "bad_xml.xml"), 'rb')
|
46
|
+
@parser.setup(@json.path, @bad_file.path)
|
47
|
+
expect { @parser.validate }.to raise_error(RuntimeError, "Malformed XML")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should parse" do
|
51
|
+
@parser.setup(@json.path, @file.path)
|
52
|
+
@parser.validate
|
53
|
+
@parser.parse
|
54
|
+
end
|
55
|
+
|
56
|
+
context "HTML" do
|
57
|
+
it "should create a HTML doc" do
|
58
|
+
@result_file = File.open(File.join(FIXTURES_DIR, "TP40010215.html"), 'rb:UTF-8')
|
59
|
+
@parser.setup(@json.path, @file.path)
|
60
|
+
@parser.validate
|
61
|
+
@parser.parse
|
62
|
+
|
63
|
+
@result_doc = ""
|
64
|
+
@result_file.each do |line|
|
65
|
+
@result_doc = @result_doc + line
|
66
|
+
end
|
67
|
+
@result_file.close
|
68
|
+
@parser.to_html.should eq(@result_doc)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should create an output.html file if UID is not present in JSON" do
|
72
|
+
json_uid = File.new(File.join(FIXTURES_DIR, "no_uid.json"), 'rb')
|
73
|
+
@parser.setup(json_uid.path, @file.path)
|
74
|
+
@parser.validate
|
75
|
+
@parser.parse
|
76
|
+
@parser.to_html
|
77
|
+
File.exists?('output.html').should be_true
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
context "JSON Format" do
|
83
|
+
it "should export to JSON with uid if filename is nil" do
|
84
|
+
@parser.setup(@json.path, @file.path, nil, 'json')
|
85
|
+
@parser.validate
|
86
|
+
@parser.parse
|
87
|
+
@parser.to_json
|
88
|
+
File.exists?('TP40010215.json').should be_true
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should export to output.json if no UID exists in json input" do
|
92
|
+
json_uid = File.new(File.join(FIXTURES_DIR, "no_uid.json"), 'rb')
|
93
|
+
@parser.setup(json_uid.path, @file.path, nil, 'json')
|
94
|
+
@parser.validate
|
95
|
+
@parser.parse
|
96
|
+
@parser.to_json
|
97
|
+
File.exists?('output.json').should be_true
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should export to JSON if the format specified is 'json'" do
|
101
|
+
@parser.setup(@json.path, @file.path, "output.json", 'json')
|
102
|
+
@parser.validate
|
103
|
+
@parser.parse
|
104
|
+
@parser.to_json
|
105
|
+
File.exists?('output.json').should be_true
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
context "Mappings" do
|
111
|
+
it "should accept a valid mapping for the children" do
|
112
|
+
mapping = File.open(File.join(FIXTURES_DIR, "mapping.yml"), 'rb:UTF-8')
|
113
|
+
@parser.setup(@json.path, @file.path, "altered.html", 'html', mapping.path)
|
114
|
+
@parser.validate
|
115
|
+
@parser.parse
|
116
|
+
@parser.to_html
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should accept a valid ol mapping for the children" do
|
120
|
+
mapping = File.open(File.join(FIXTURES_DIR, "ol_mapping.yml"), 'rb:UTF-8')
|
121
|
+
@parser.setup(@json.path, @file.path, "ol.html", 'html', mapping.path)
|
122
|
+
@parser.validate
|
123
|
+
@parser.parse
|
124
|
+
@parser.to_html
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should accept a valid ul mapping for the children" do
|
128
|
+
mapping = File.open(File.join(FIXTURES_DIR, "ul_mapping.yml"), 'rb:UTF-8')
|
129
|
+
@parser.setup(@json.path, @file.path, "ul.html", 'html', mapping.path)
|
130
|
+
@parser.validate
|
131
|
+
@parser.parse
|
132
|
+
@parser.to_html
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should accept a valid table mapping for the children" do
|
136
|
+
mapping = File.open(File.join(FIXTURES_DIR, "table_mapping.yml"), 'rb:UTF-8')
|
137
|
+
@parser.setup(@json.path, @file.path, "table.html", 'html', mapping.path)
|
138
|
+
@parser.validate
|
139
|
+
@parser.parse
|
140
|
+
@parser.to_html
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start do
|
3
|
+
add_filter "/spec/"
|
4
|
+
end
|
5
|
+
$:.unshift File.expand_path('..', __FILE__)
|
6
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
7
|
+
require 'rspec'
|
8
|
+
require 'mini_transformer'
|
9
|
+
|
10
|
+
# Require the correct version of popen for the current platform
|
11
|
+
if RbConfig::CONFIG['host_os'] =~ /mingw|mswin/
|
12
|
+
begin
|
13
|
+
require 'win32/open3'
|
14
|
+
rescue LoadError
|
15
|
+
abort "Run `gem install win32-open3` to be able to run specs"
|
16
|
+
end
|
17
|
+
else
|
18
|
+
require 'open3'
|
19
|
+
end
|
20
|
+
|
21
|
+
Dir["#{File.expand_path('../support', __FILE__)}/*.rb"].each do |file|
|
22
|
+
require file
|
23
|
+
end
|
24
|
+
|
25
|
+
RSpec.configure do |config|
|
26
|
+
#config.include Spec::Builders
|
27
|
+
config.include Spec::Helpers
|
28
|
+
#config.include Spec::Indexes
|
29
|
+
#config.include Spec::Matchers
|
30
|
+
#config.include Spec::Path
|
31
|
+
#config.include Spec::Rubygems
|
32
|
+
#config.include Spec::Platforms
|
33
|
+
#config.include Spec::Sudo
|
34
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Spec
|
2
|
+
module Helpers
|
3
|
+
attr_reader :out, :err, :exitstatus
|
4
|
+
|
5
|
+
def lib
|
6
|
+
File.expand_path('../../../lib', __FILE__)
|
7
|
+
end
|
8
|
+
|
9
|
+
def mini_transform(cmd, options = {})
|
10
|
+
#p "mini transforming"
|
11
|
+
expect_err = options.delete(:expect_err)
|
12
|
+
exitstatus = options.delete(:exitstatus)
|
13
|
+
#options["no-color"] = true unless options.key?("no-color") || cmd.to_s[0..3] == "exec"
|
14
|
+
|
15
|
+
mini_transform = File.expand_path('../../../bin/mini_transform', __FILE__)
|
16
|
+
|
17
|
+
#requires = options.delete(:requires) || []
|
18
|
+
#requires << File.expand_path('../fakeweb/'+options.delete(:fakeweb)+'.rb', __FILE__) if options.key?(:fakeweb)
|
19
|
+
#requires << File.expand_path('../artifice/'+options.delete(:artifice)+'.rb', __FILE__) if options.key?(:artifice)
|
20
|
+
#requires_str = requires.map{|r| "-r#{r}"}.join(" ")
|
21
|
+
|
22
|
+
#env = (options.delete(:env) || {}).map{|k,v| "#{k}='#{v}' "}.join
|
23
|
+
args = options.map do |k,v|
|
24
|
+
v == true ? " --#{k}" : " --#{k} #{v}" if v
|
25
|
+
end.join
|
26
|
+
|
27
|
+
cmd = "#{Gem.ruby} -I#{lib} #{mini_transform} #{cmd}#{args}"
|
28
|
+
#p "cmd: #{cmd}"
|
29
|
+
if exitstatus
|
30
|
+
sys_status(cmd)
|
31
|
+
else
|
32
|
+
sys_exec(cmd, expect_err){|i| yield i if block_given? }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def sys_status(cmd)
|
37
|
+
@err = nil
|
38
|
+
@out = %x{#{cmd}}.strip
|
39
|
+
@exitstatus = $?.exitstatus
|
40
|
+
end
|
41
|
+
|
42
|
+
def sys_exec(cmd, expect_err = false)
|
43
|
+
Open3.popen3(cmd.to_s) do |stdin, stdout, stderr|
|
44
|
+
@in_p, @out_p, @err_p = stdin, stdout, stderr
|
45
|
+
|
46
|
+
yield @in_p if block_given?
|
47
|
+
@in_p.close
|
48
|
+
@out = @out_p.read_available_bytes.strip unless @out_p.closed?
|
49
|
+
@err = @err_p.read_available_bytes.strip unless @err_p.closed?
|
50
|
+
end
|
51
|
+
|
52
|
+
puts @err unless expect_err || @err.empty? || !$show_err
|
53
|
+
@out
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class IO
|
2
|
+
def read_available_bytes(chunk_size = 16384, select_timeout = 0.02)
|
3
|
+
buffer = []
|
4
|
+
|
5
|
+
return "" if closed? || eof?
|
6
|
+
# IO.select cannot be used here due to the fact that it
|
7
|
+
# just does not work on windows
|
8
|
+
while true
|
9
|
+
begin
|
10
|
+
IO.select([self], nil, nil, select_timeout)
|
11
|
+
break if eof? # stop raising :-(
|
12
|
+
buffer << self.readpartial(chunk_size)
|
13
|
+
rescue(EOFError)
|
14
|
+
break
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
return buffer.join
|
19
|
+
end
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,208 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mini_transformer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- John Wang
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-11-07 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &70175232360960 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70175232360960
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: guard-rspec
|
27
|
+
requirement: &70175232360540 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70175232360540
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: mocha
|
38
|
+
requirement: &70175232360120 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70175232360120
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: &70175232359640 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70175232359640
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: simplecov
|
60
|
+
requirement: &70175232359160 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70175232359160
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: nokogiri
|
71
|
+
requirement: &70175232358680 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70175232358680
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: activesupport
|
82
|
+
requirement: &70175232358120 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :runtime
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70175232358120
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: i18n
|
93
|
+
requirement: &70175232357500 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ! '>='
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
type: :runtime
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *70175232357500
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: json
|
104
|
+
requirement: &70175232356540 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :runtime
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: *70175232356540
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: thor
|
115
|
+
requirement: &70175232356120 !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ! '>='
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
type: :runtime
|
122
|
+
prerelease: false
|
123
|
+
version_requirements: *70175232356120
|
124
|
+
description: A configurable converter for XML and JSON to HTML and JSON.
|
125
|
+
email:
|
126
|
+
- john@johntwang.com
|
127
|
+
executables:
|
128
|
+
- mini_transform
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- .gitignore
|
133
|
+
- .rvmrc
|
134
|
+
- .travis.yml
|
135
|
+
- Gemfile
|
136
|
+
- Guardfile
|
137
|
+
- LICENSE.txt
|
138
|
+
- README.md
|
139
|
+
- Rakefile
|
140
|
+
- bin/mini_transform
|
141
|
+
- lib/mini_transformer.rb
|
142
|
+
- lib/mini_transformer/book.rb
|
143
|
+
- lib/mini_transformer/cli.rb
|
144
|
+
- lib/mini_transformer/entry.rb
|
145
|
+
- lib/mini_transformer/format.xsl
|
146
|
+
- lib/mini_transformer/html.rb
|
147
|
+
- lib/mini_transformer/key_list.rb
|
148
|
+
- lib/mini_transformer/version.rb
|
149
|
+
- mini_transformer.gemspec
|
150
|
+
- spec/fixtures/TP40010215.html
|
151
|
+
- spec/fixtures/bad_xml.xml
|
152
|
+
- spec/fixtures/input.json
|
153
|
+
- spec/fixtures/input.xml
|
154
|
+
- spec/fixtures/mapping.yml
|
155
|
+
- spec/fixtures/no_uid.json
|
156
|
+
- spec/fixtures/ol_mapping.yml
|
157
|
+
- spec/fixtures/table_mapping.yml
|
158
|
+
- spec/fixtures/ul_mapping.yml
|
159
|
+
- spec/mini_transformer/book_spec.rb
|
160
|
+
- spec/mini_transformer/cli_spec.rb
|
161
|
+
- spec/mini_transformer/entry_spec.rb
|
162
|
+
- spec/mini_transformer/key_list_spec.rb
|
163
|
+
- spec/mini_transformer_spec.rb
|
164
|
+
- spec/spec_helper.rb
|
165
|
+
- spec/support/helpers.rb
|
166
|
+
- spec/support/ruby_ext.rb
|
167
|
+
homepage: https://github.com/jwang/mini_transformer
|
168
|
+
licenses: []
|
169
|
+
post_install_message:
|
170
|
+
rdoc_options: []
|
171
|
+
require_paths:
|
172
|
+
- lib
|
173
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
174
|
+
none: false
|
175
|
+
requirements:
|
176
|
+
- - ! '>='
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: '0'
|
179
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
180
|
+
none: false
|
181
|
+
requirements:
|
182
|
+
- - ! '>='
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '0'
|
185
|
+
requirements: []
|
186
|
+
rubyforge_project: mini_transformer
|
187
|
+
rubygems_version: 1.8.10
|
188
|
+
signing_key:
|
189
|
+
specification_version: 3
|
190
|
+
summary: A converter for XML and JSON to HTML and JSON.
|
191
|
+
test_files:
|
192
|
+
- spec/fixtures/TP40010215.html
|
193
|
+
- spec/fixtures/bad_xml.xml
|
194
|
+
- spec/fixtures/input.json
|
195
|
+
- spec/fixtures/input.xml
|
196
|
+
- spec/fixtures/mapping.yml
|
197
|
+
- spec/fixtures/no_uid.json
|
198
|
+
- spec/fixtures/ol_mapping.yml
|
199
|
+
- spec/fixtures/table_mapping.yml
|
200
|
+
- spec/fixtures/ul_mapping.yml
|
201
|
+
- spec/mini_transformer/book_spec.rb
|
202
|
+
- spec/mini_transformer/cli_spec.rb
|
203
|
+
- spec/mini_transformer/entry_spec.rb
|
204
|
+
- spec/mini_transformer/key_list_spec.rb
|
205
|
+
- spec/mini_transformer_spec.rb
|
206
|
+
- spec/spec_helper.rb
|
207
|
+
- spec/support/helpers.rb
|
208
|
+
- spec/support/ruby_ext.rb
|