theme_bandit 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +15 -6
- data/bin/bandit +1 -1
- data/lib/theme_bandit/document_writer.rb +49 -13
- data/lib/theme_bandit/parser/css.rb +26 -0
- data/lib/theme_bandit/parser/html.rb +5 -0
- data/lib/theme_bandit/rack_generator.rb +1 -1
- data/lib/theme_bandit/util/version.rb +1 -1
- data/test/fixtures/css/import.css +1 -0
- data/test/fixtures/css/style.css +1 -0
- data/test/fixtures/css/style_with_import.css +2 -0
- data/test/fixtures/index.html +1 -0
- data/test/helper.rb +35 -7
- data/test/test_document_writer.rb +29 -6
- data/test/test_rack_generator.rb +8 -7
- data/theme_bandit.gemspec +1 -1
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 81c723824fb7b4fc26fdffc3fced9bac1977b425
|
4
|
+
data.tar.gz: 186064cc76b40f3bcf43b5783b7e7153906e55af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c282373169582e752f8b333f638424fe79f33f23a37782e6bf2b21e79f48ea31321bb628828f85dd4b167ca78d71c346ec3466f765c81f66504d5481cf22bbe6
|
7
|
+
data.tar.gz: 8c8f7d1ffffa25f0ac7788fdb023cfaf21474a1be1b1f986e8a69c03a9d7a9ab29b5f620aa7a828a3afa7a6c4cc43001d43fc3ce8fc456634457434a83c00af2
|
data/README.md
CHANGED
@@ -2,10 +2,12 @@
|
|
2
2
|
|
3
3
|
Enjoy rapid prototyping with theme bandit :heart:
|
4
4
|
|
5
|
-
|
6
|
-
simple sinatra rack application.
|
5
|
+
Wordpress themes are beautiful! Now you can easily convert your favorite wordpress theme to a small ruby app.
|
7
6
|
|
8
|
-
|
7
|
+
This gem converts any site template (Wordpress, Joomla, HTML) into a small and
|
8
|
+
simple sinatra rack application, handling all of the JS and CSS for you.
|
9
|
+
|
10
|
+
Usage from the command line: `bandit`
|
9
11
|
- Select a url to download
|
10
12
|
- Select a templating engine (erb, haml, slim)
|
11
13
|
- Start your rack app!
|
@@ -25,7 +27,7 @@ Or install it yourself as:
|
|
25
27
|
$ gem install theme_bandit
|
26
28
|
|
27
29
|
## Usage
|
28
|
-
|
30
|
+
`bandit` -> Builds a rack application in the `theme` directory of
|
29
31
|
your project root.
|
30
32
|
|
31
33
|
## Caveats
|
@@ -33,11 +35,18 @@ Not all templating engines play nicely with html. If you run into
|
|
33
35
|
templating issues, `erb` will be your safest bet because it renders as
|
34
36
|
pure html.
|
35
37
|
|
36
|
-
|
38
|
+
Example: The gem converts html for page A to slim, erb, or haml.
|
39
|
+
Sometimes the html for page A is messy and in turn produces bad slim,
|
40
|
+
which can cause the application to blow up until corrected.
|
41
|
+
|
42
|
+
## TODO / Coming Soon
|
43
|
+
- Replace & fetch @import declarations in CSS
|
44
|
+
- Fetch ajax resources
|
45
|
+
- HTML Sanitization
|
37
46
|
- Support for binaries (images + fonts + embeds)
|
38
47
|
- Support for multiple pages
|
39
|
-
- HTML Sanitization
|
40
48
|
- HTML Formatting
|
49
|
+
- Verfiy inline tags
|
41
50
|
|
42
51
|
## Tests
|
43
52
|
|
data/bin/bandit
CHANGED
@@ -21,36 +21,72 @@ module ThemeBandit
|
|
21
21
|
write_html_revision
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
document.to_html
|
26
|
-
end
|
24
|
+
private
|
27
25
|
|
28
26
|
def write_html_revision
|
27
|
+
make_dir(CSS_FOLDER)
|
28
|
+
make_dir(JS_FOLDER)
|
29
29
|
download_css(get_css_files)
|
30
30
|
download_js(get_js_files)
|
31
31
|
revise_head_tags
|
32
32
|
write_html_file
|
33
33
|
end
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
|
36
|
+
def html
|
37
|
+
document.to_html
|
38
|
+
end
|
38
39
|
|
39
40
|
def make_dir(folder)
|
40
41
|
FileUtils.mkdir_p folder
|
41
42
|
end
|
42
43
|
|
43
|
-
def download_css(files)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
def download_css(files, these_are_import_files=false)
|
45
|
+
files.each_with_index do |file, order|
|
46
|
+
if these_are_import_files
|
47
|
+
download_and_replace_import_in_css_file(file, order)
|
48
|
+
else
|
49
|
+
download_single_css_file(file, order)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def download_and_replace_import_in_css_file(file, order)
|
55
|
+
destination = file[:destination]
|
56
|
+
rule = file[:rule]
|
57
|
+
doc = Downloader.fetch(destination, {}).body
|
58
|
+
new_doc = @doc_with_imports.gsub(rule, doc)
|
59
|
+
new_file_name = @file_with_imports.split('/').last
|
60
|
+
File.open("#{CSS_FOLDER}#{order}_#{new_file_name}", 'w') { |f| f.write(new_doc) }
|
61
|
+
download_css_imports(new_doc, destination) do |imports|
|
62
|
+
download_css(imports, true) if imports
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def download_single_css_file(file_name, order)
|
67
|
+
doc = Downloader.fetch(file_name, {}).body
|
68
|
+
download_css_imports(doc, file_name) do |imports|
|
69
|
+
if imports
|
70
|
+
download_css(imports, true)
|
71
|
+
else
|
72
|
+
new_file_name = file_name.split('/').last
|
73
|
+
File.open("#{CSS_FOLDER}#{order}_#{new_file_name}", 'w') { |file| file.write(doc) }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Use recurison to get to deepest level
|
79
|
+
def download_css_imports(doc, file_name)
|
80
|
+
if imports = get_import_urls(doc, file_name)
|
81
|
+
@doc_with_imports = doc
|
82
|
+
@file_with_imports = file_name
|
83
|
+
yield imports
|
84
|
+
else
|
85
|
+
yield false
|
49
86
|
end
|
50
87
|
end
|
51
88
|
|
52
89
|
def download_js(files)
|
53
|
-
make_dir(JS_FOLDER)
|
54
90
|
files.each_with_index do |file_name, order|
|
55
91
|
doc = Downloader.fetch(file_name, {})
|
56
92
|
new_file = file_name.split('/').last
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module ThemeBandit
|
2
2
|
module CSSParser
|
3
|
+
|
3
4
|
include ThemeBandit::URLFormatter
|
4
5
|
|
6
|
+
RE_IMPORT = /\@import\s*(?:url\s*)?(?:\()?(?:\s*)["']?([^'"\s\)]*)["']?\)?([\w\s\,^\]\(\))]*)\)?[;\n]?/
|
7
|
+
|
5
8
|
def get_css_files
|
6
9
|
link_tag_values
|
7
10
|
end
|
@@ -22,5 +25,28 @@ module ThemeBandit
|
|
22
25
|
end
|
23
26
|
end
|
24
27
|
end
|
28
|
+
|
29
|
+
def get_import_urls(file, file_name)
|
30
|
+
imports = file.scan(RE_IMPORT).map { |import| import.first }.select {|import| import[/\.css/] }
|
31
|
+
imports_arr = []
|
32
|
+
imports.each do |import|
|
33
|
+
dot_dots_length = import.split('/').select { |x| x[/\.\./] }.length
|
34
|
+
if dot_dots_length > 0
|
35
|
+
file_uri = URI.parse(file_name)
|
36
|
+
matcher = file_uri.path.split('/').last(dot_dots_length + 1).join('/')
|
37
|
+
destination = import.split('/').last(2).join('/')
|
38
|
+
dest_file = file_name.gsub(matcher, destination)
|
39
|
+
imports_arr << { destination: dest_file, rule: file.match(/\@import.*#{import}(.*\;)?/)[0] }
|
40
|
+
else
|
41
|
+
file_uri = URI.parse(file_name)
|
42
|
+
matcher = file_uri.path.split('/').last
|
43
|
+
destination = import
|
44
|
+
dest_file = file_name.gsub(matcher, destination)
|
45
|
+
imports_arr << { destination: dest_file, rule: file.match(/\@import.*#{import}(.*\;)?/)[0] }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
imports_arr.length > 0 ? imports_arr : nil
|
49
|
+
end
|
50
|
+
|
25
51
|
end
|
26
52
|
end
|
@@ -1,12 +1,17 @@
|
|
1
1
|
module ThemeBandit
|
2
2
|
module HTMLParser
|
3
3
|
def revise_head_tags
|
4
|
+
remove_base_tags
|
4
5
|
remove_link_tags
|
5
6
|
remove_script_tags
|
6
7
|
inject_link_nodes
|
7
8
|
inject_script_nodes
|
8
9
|
end
|
9
10
|
|
11
|
+
def remove_base_tags
|
12
|
+
document.search('base').remove
|
13
|
+
end
|
14
|
+
|
10
15
|
def remove_link_tags
|
11
16
|
document.search('link').remove
|
12
17
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
h1 {color:blue;}
|
data/test/fixtures/css/style.css
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
body {color:red}
|
data/test/fixtures/index.html
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
<title>A very simple webpage</title>
|
6
6
|
<basefont size=4>
|
7
7
|
<link rel='stylesheet' href='/css/style.css'></link>
|
8
|
+
<link rel='stylesheet' href='/css/style_with_import.css'></link>
|
8
9
|
<script type='text/javascripts' src='/js/script.js'></script>
|
9
10
|
<script type='text/javascripts' src='/js/script_2.js'></script>
|
10
11
|
</head>
|
data/test/helper.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'rubygems'
|
2
1
|
require 'pry'
|
2
|
+
require 'rubygems'
|
3
3
|
require 'minitest/autorun'
|
4
4
|
require 'webmock/minitest'
|
5
5
|
|
@@ -11,29 +11,57 @@ def load_html_fixture
|
|
11
11
|
@fixture ||= File.read(File.open("#{Dir.pwd}/test/fixtures/index.html", 'r'))
|
12
12
|
end
|
13
13
|
|
14
|
+
def load_css_fixture
|
15
|
+
File.read(File.open("#{Dir.pwd}/test/fixtures/css/style.css", 'r'))
|
16
|
+
end
|
17
|
+
|
18
|
+
def load_import_fixture
|
19
|
+
File.read(File.open("#{Dir.pwd}/test/fixtures/css/import.css", 'r'))
|
20
|
+
end
|
21
|
+
|
22
|
+
def load_style_with_import_fixture
|
23
|
+
File.read(File.open("#{Dir.pwd}/test/fixtures/css/style_with_import.css", 'r'))
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_url
|
27
|
+
'http://www.example.com'
|
28
|
+
end
|
29
|
+
|
14
30
|
def stub_request_stack
|
15
|
-
|
16
|
-
stub_request(:get, @url).to_return(body: load_html_fixture)
|
31
|
+
stub_request(:any, test_url).to_return(body: load_html_fixture)
|
17
32
|
stub_css
|
33
|
+
stub_import_css
|
34
|
+
stub_style_with_import_css
|
18
35
|
stub_js
|
19
36
|
end
|
20
37
|
|
21
38
|
def prep_config
|
22
39
|
ThemeBandit.configure do |config|
|
23
40
|
config.template_engine = 'erb'
|
24
|
-
config.url =
|
41
|
+
config.url = test_url
|
25
42
|
config.gem_root = Dir.pwd
|
26
43
|
end
|
27
44
|
end
|
28
45
|
|
29
46
|
def stub_css
|
30
47
|
url = 'http://www.example.com/css/style.css'
|
31
|
-
stub_request(:
|
48
|
+
stub_request(:any, url).to_return(body: load_css_fixture)
|
49
|
+
end
|
50
|
+
|
51
|
+
def stub_import_css
|
52
|
+
url = 'http://www.example.com/css/import.css'
|
53
|
+
stub_request(:any, url).to_return(body: load_import_fixture)
|
32
54
|
end
|
33
55
|
|
56
|
+
def stub_style_with_import_css
|
57
|
+
url = 'http://www.example.com/css/style_with_import.css'
|
58
|
+
stub_request(:any, url).to_return(body: load_style_with_import_fixture)
|
59
|
+
end
|
60
|
+
|
61
|
+
|
34
62
|
def stub_js
|
35
63
|
url = 'http://www.example.com/js/script.js'
|
36
|
-
stub_request(:
|
64
|
+
stub_request(:any, url).to_return(body: '')
|
37
65
|
url = 'http://www.example.com/js/script_2.js'
|
38
|
-
stub_request(:
|
66
|
+
stub_request(:any, url).to_return(body: '')
|
39
67
|
end
|
@@ -3,9 +3,9 @@ require 'helper'
|
|
3
3
|
describe ThemeBandit::DocumentWriter do
|
4
4
|
|
5
5
|
before do
|
6
|
-
stub_request_stack
|
7
6
|
prep_config
|
8
|
-
|
7
|
+
stub_request_stack
|
8
|
+
@subject = ThemeBandit::DocumentWriter.new(load_html_fixture, test_url)
|
9
9
|
end
|
10
10
|
|
11
11
|
after do
|
@@ -32,9 +32,12 @@ describe ThemeBandit::DocumentWriter do
|
|
32
32
|
it 'writes index.html' do
|
33
33
|
assert File.file?("#{Dir.pwd}/theme/public/index.html")
|
34
34
|
end
|
35
|
+
|
35
36
|
it 'writes styles' do
|
36
|
-
|
37
|
+
|
38
|
+
assert File.file?("#{Dir.pwd}/theme/public/css/0_style.css")
|
37
39
|
end
|
40
|
+
|
38
41
|
describe 'script writers' do
|
39
42
|
# Preserve order of script tags
|
40
43
|
it 'orders and renames script 1' do
|
@@ -44,18 +47,38 @@ describe ThemeBandit::DocumentWriter do
|
|
44
47
|
assert File.file?("#{Dir.pwd}/theme/public/js/1_script_2.js")
|
45
48
|
end
|
46
49
|
end
|
50
|
+
|
51
|
+
describe 'import output' do
|
52
|
+
it 'merges css files' do
|
53
|
+
contents = File.read(File.open("#{Dir.pwd}/theme/public/css/0_style_with_import.css", 'r'))
|
54
|
+
expected = "h1 {color:blue;}\n\nbody {color:red}\n"
|
55
|
+
assert_equal contents, expected
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
47
59
|
end
|
48
60
|
|
49
|
-
describe '
|
61
|
+
describe 'parser mixin behavior' do
|
62
|
+
|
50
63
|
describe ThemeBandit::CSSParser do
|
51
64
|
it '#get_css_files' do
|
52
|
-
assert_equal(@subject.get_css_files, [
|
65
|
+
assert_equal(@subject.get_css_files, ["http://www.example.com#{Dir.pwd}/theme/public/css/0_style.css", "http://www.example.com#{Dir.pwd}/theme/public/css/0_style_with_import.css" ])
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#get_import_urls' do
|
69
|
+
it 'returns false if none found' do
|
70
|
+
assert_equal(@subject.get_import_urls(load_css_fixture, 'import.css'), nil )
|
71
|
+
end
|
72
|
+
it 'returns import urls' do
|
73
|
+
expected = [{:destination=>"import.css", :rule=>"@import url('import.css');"}]
|
74
|
+
assert_equal(@subject.get_import_urls(load_style_with_import_fixture, 'style_with_import.css'), expected)
|
75
|
+
end
|
53
76
|
end
|
54
77
|
end
|
55
78
|
|
56
79
|
describe ThemeBandit::JSParser do
|
57
80
|
it '#get_js_files' do
|
58
|
-
assert_equal(@subject.get_js_files, [
|
81
|
+
assert_equal(@subject.get_js_files, ["http://www.example.com#{Dir.pwd}/theme/public/js/0_script.js", "http://www.example.com#{Dir.pwd}/theme/public/js/1_script_2.js"])
|
59
82
|
end
|
60
83
|
end
|
61
84
|
end
|
data/test/test_rack_generator.rb
CHANGED
@@ -5,10 +5,9 @@ describe ThemeBandit::RackGenerator do
|
|
5
5
|
supported_engines = %w(slim haml erb)
|
6
6
|
|
7
7
|
supported_engines.each do |engine|
|
8
|
-
describe "#builds
|
8
|
+
describe "#builds #{engine} recipe" do
|
9
9
|
|
10
10
|
before do
|
11
|
-
stub_request_stack
|
12
11
|
@engine = engine
|
13
12
|
configure_and_write_files
|
14
13
|
ThemeBandit::RackGenerator.build
|
@@ -26,13 +25,13 @@ describe ThemeBandit::RackGenerator do
|
|
26
25
|
assert File.file?("#{Dir.pwd}/theme/config.ru")
|
27
26
|
end
|
28
27
|
|
29
|
-
it '
|
28
|
+
it 'application.rb' do
|
30
29
|
assert File.file?("#{Dir.pwd}/theme/app/application.rb")
|
31
30
|
end
|
32
31
|
|
33
32
|
describe 'app/views/templates' do
|
34
|
-
it "build .#{
|
35
|
-
assert File.file?("#{Dir.pwd}/theme/app/views/templates/index.#{
|
33
|
+
it "build .#{engine} file" do
|
34
|
+
assert File.file?("#{Dir.pwd}/theme/app/views/templates/index.#{engine}")
|
36
35
|
end
|
37
36
|
end
|
38
37
|
end
|
@@ -40,12 +39,14 @@ describe ThemeBandit::RackGenerator do
|
|
40
39
|
private
|
41
40
|
|
42
41
|
def configure_and_write_files
|
42
|
+
prep_config
|
43
43
|
ThemeBandit.configure do |config|
|
44
44
|
config.template_engine = @engine
|
45
|
+
config.url = test_url
|
45
46
|
config.gem_root = Dir.pwd
|
46
|
-
config.url = 'http://www.example.com'
|
47
47
|
end
|
48
|
-
|
48
|
+
stub_request_stack
|
49
|
+
ThemeBandit::DocumentWriter.new(load_html_fixture, ThemeBandit.configuration.url).write
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
data/theme_bandit.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.authors = ['Luke Fender']
|
11
11
|
spec.summary = 'Convert any site to a simple rack app'
|
12
12
|
spec.description = 'Convert any site to a simple rack app'
|
13
|
-
spec.homepage = ''
|
13
|
+
spec.homepage = 'https://github.com/lfender6445/theme_bandit'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: theme_bandit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luke Fender
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -159,7 +159,9 @@ files:
|
|
159
159
|
- lib/theme_bandit/url_formatter.rb
|
160
160
|
- lib/theme_bandit/util/configure.rb
|
161
161
|
- lib/theme_bandit/util/version.rb
|
162
|
+
- test/fixtures/css/import.css
|
162
163
|
- test/fixtures/css/style.css
|
164
|
+
- test/fixtures/css/style_with_import.css
|
163
165
|
- test/fixtures/index.html
|
164
166
|
- test/fixtures/js/script.js
|
165
167
|
- test/fixtures/js/script_2.js
|
@@ -170,7 +172,7 @@ files:
|
|
170
172
|
- test/test_rack_generator.rb
|
171
173
|
- test/test_url_formatter.rb
|
172
174
|
- theme_bandit.gemspec
|
173
|
-
homepage:
|
175
|
+
homepage: https://github.com/lfender6445/theme_bandit
|
174
176
|
licenses:
|
175
177
|
- MIT
|
176
178
|
metadata: {}
|
@@ -195,7 +197,9 @@ signing_key:
|
|
195
197
|
specification_version: 4
|
196
198
|
summary: Convert any site to a simple rack app
|
197
199
|
test_files:
|
200
|
+
- test/fixtures/css/import.css
|
198
201
|
- test/fixtures/css/style.css
|
202
|
+
- test/fixtures/css/style_with_import.css
|
199
203
|
- test/fixtures/index.html
|
200
204
|
- test/fixtures/js/script.js
|
201
205
|
- test/fixtures/js/script_2.js
|